{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE NoImplicitPrelude  #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}

{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- |
-- Module      : Network.Google.Dataproc.Types.Product
-- Copyright   : (c) 2015-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
module Network.Google.Dataproc.Types.Product where

import           Network.Google.Dataproc.Types.Sum
import           Network.Google.Prelude

-- | Encapsulates the full scoping used to reference a job.
--
-- /See:/ 'jobReference' smart constructor.
data JobReference = JobReference'
    { _jrJobId     :: !(Maybe Text)
    , _jrProjectId :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobReference' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jrJobId'
--
-- * 'jrProjectId'
jobReference
    :: JobReference
jobReference =
    JobReference'
    { _jrJobId = Nothing
    , _jrProjectId = Nothing
    }

-- | Optional. The job ID, which must be unique within the project. The job
-- ID is generated by the server upon job submission or provided by the
-- user as a means to perform retries without creating duplicate jobs. The
-- ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_),
-- or hyphens (-). The maximum length is 100 characters.
jrJobId :: Lens' JobReference (Maybe Text)
jrJobId = lens _jrJobId (\ s a -> s{_jrJobId = a})

-- | Required. The ID of the Google Cloud Platform project that the job
-- belongs to.
jrProjectId :: Lens' JobReference (Maybe Text)
jrProjectId
  = lens _jrProjectId (\ s a -> s{_jrProjectId = a})

instance FromJSON JobReference where
        parseJSON
          = withObject "JobReference"
              (\ o ->
                 JobReference' <$>
                   (o .:? "jobId") <*> (o .:? "projectId"))

instance ToJSON JobReference where
        toJSON JobReference'{..}
          = object
              (catMaybes
                 [("jobId" .=) <$> _jrJobId,
                  ("projectId" .=) <$> _jrProjectId])

-- | The Status type defines a logical error model that is suitable for
-- different programming environments, including REST APIs and RPC APIs. It
-- is used by gRPC (https:\/\/github.com\/grpc). The error model is
-- designed to be: Simple to use and understand for most users Flexible
-- enough to meet unexpected needsOverviewThe Status message contains three
-- pieces of data: error code, error message, and error details. The error
-- code should be an enum value of google.rpc.Code, but it may accept
-- additional error codes if needed. The error message should be a
-- developer-facing English message that helps developers understand and
-- resolve the error. If a localized user-facing error message is needed,
-- put the localized message in the error details or localize it in the
-- client. The optional error details may contain arbitrary information
-- about the error. There is a predefined set of error detail types in the
-- package google.rpc that can be used for common error conditions.Language
-- mappingThe Status message is the logical representation of the error
-- model, but it is not necessarily the actual wire format. When the Status
-- message is exposed in different client libraries and different wire
-- protocols, it can be mapped differently. For example, it will likely be
-- mapped to some exceptions in Java, but more likely mapped to some error
-- codes in C.Other usesThe error model and the Status message can be used
-- in a variety of environments, either with or without APIs, to provide a
-- consistent developer experience across different environments.Example
-- uses of this error model include: Partial errors. If a service needs to
-- return partial errors to the client, it may embed the Status in the
-- normal response to indicate the partial errors. Workflow errors. A
-- typical workflow has multiple steps. Each step may have a Status message
-- for error reporting. Batch operations. If a client uses batch request
-- and batch response, the Status message should be used directly inside
-- batch response, one for each error sub-response. Asynchronous
-- operations. If an API call embeds asynchronous operation results in its
-- response, the status of those operations should be represented directly
-- using the Status message. Logging. If some API errors are stored in
-- logs, the message Status could be used directly after any stripping
-- needed for security\/privacy reasons.
--
-- /See:/ 'status' smart constructor.
data Status = Status'
    { _sDetails :: !(Maybe [StatusDetailsItem])
    , _sCode    :: !(Maybe (Textual Int32))
    , _sMessage :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Status' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sDetails'
--
-- * 'sCode'
--
-- * 'sMessage'
status
    :: Status
status =
    Status'
    { _sDetails = Nothing
    , _sCode = Nothing
    , _sMessage = Nothing
    }

-- | A list of messages that carry the error details. There is a common set
-- of message types for APIs to use.
sDetails :: Lens' Status [StatusDetailsItem]
sDetails
  = lens _sDetails (\ s a -> s{_sDetails = a}) .
      _Default
      . _Coerce

-- | The status code, which should be an enum value of google.rpc.Code.
sCode :: Lens' Status (Maybe Int32)
sCode
  = lens _sCode (\ s a -> s{_sCode = a}) .
      mapping _Coerce

-- | A developer-facing error message, which should be in English. Any
-- user-facing error message should be localized and sent in the
-- google.rpc.Status.details field, or localized by the client.
sMessage :: Lens' Status (Maybe Text)
sMessage = lens _sMessage (\ s a -> s{_sMessage = a})

instance FromJSON Status where
        parseJSON
          = withObject "Status"
              (\ o ->
                 Status' <$>
                   (o .:? "details" .!= mempty) <*> (o .:? "code") <*>
                     (o .:? "message"))

instance ToJSON Status where
        toJSON Status'{..}
          = object
              (catMaybes
                 [("details" .=) <$> _sDetails,
                  ("code" .=) <$> _sCode,
                  ("message" .=) <$> _sMessage])

-- | Optional. A mapping of property names to values, used to configure
-- PySpark. Properties that conflict with values set by the Cloud Dataproc
-- API may be overwritten. Can include properties set in
-- \/etc\/spark\/conf\/spark-defaults.conf and classes in user code.
--
-- /See:/ 'pySparkJobProperties' smart constructor.
newtype PySparkJobProperties = PySparkJobProperties'
    { _psjpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PySparkJobProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'psjpAddtional'
pySparkJobProperties
    :: HashMap Text Text -- ^ 'psjpAddtional'
    -> PySparkJobProperties
pySparkJobProperties pPsjpAddtional_ =
    PySparkJobProperties'
    { _psjpAddtional = _Coerce # pPsjpAddtional_
    }

psjpAddtional :: Lens' PySparkJobProperties (HashMap Text Text)
psjpAddtional
  = lens _psjpAddtional
      (\ s a -> s{_psjpAddtional = a})
      . _Coerce

instance FromJSON PySparkJobProperties where
        parseJSON
          = withObject "PySparkJobProperties"
              (\ o ->
                 PySparkJobProperties' <$> (parseJSONObject o))

instance ToJSON PySparkJobProperties where
        toJSON = toJSON . _psjpAddtional

-- | The location of diagnostic output.
--
-- /See:/ 'diagnoseClusterResults' smart constructor.
newtype DiagnoseClusterResults = DiagnoseClusterResults'
    { _dcrOutputURI :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DiagnoseClusterResults' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dcrOutputURI'
diagnoseClusterResults
    :: DiagnoseClusterResults
diagnoseClusterResults =
    DiagnoseClusterResults'
    { _dcrOutputURI = Nothing
    }

-- | Output only. The Cloud Storage URI of the diagnostic output. The output
-- report is a plain text file with a summary of collected diagnostics.
dcrOutputURI :: Lens' DiagnoseClusterResults (Maybe Text)
dcrOutputURI
  = lens _dcrOutputURI (\ s a -> s{_dcrOutputURI = a})

instance FromJSON DiagnoseClusterResults where
        parseJSON
          = withObject "DiagnoseClusterResults"
              (\ o ->
                 DiagnoseClusterResults' <$> (o .:? "outputUri"))

instance ToJSON DiagnoseClusterResults where
        toJSON DiagnoseClusterResults'{..}
          = object
              (catMaybes [("outputUri" .=) <$> _dcrOutputURI])

-- | Optional. The config settings for Compute Engine resources in an
-- instance group, such as a master or worker group.
--
-- /See:/ 'instanceGroupConfig' smart constructor.
data InstanceGroupConfig = InstanceGroupConfig'
    { _igcNumInstances       :: !(Maybe (Textual Int32))
    , _igcDiskConfig         :: !(Maybe DiskConfig)
    , _igcIsPreemptible      :: !(Maybe Bool)
    , _igcImageURI           :: !(Maybe Text)
    , _igcAccelerators       :: !(Maybe [AcceleratorConfig])
    , _igcInstanceNames      :: !(Maybe [Text])
    , _igcManagedGroupConfig :: !(Maybe ManagedGroupConfig)
    , _igcMachineTypeURI     :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'InstanceGroupConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'igcNumInstances'
--
-- * 'igcDiskConfig'
--
-- * 'igcIsPreemptible'
--
-- * 'igcImageURI'
--
-- * 'igcAccelerators'
--
-- * 'igcInstanceNames'
--
-- * 'igcManagedGroupConfig'
--
-- * 'igcMachineTypeURI'
instanceGroupConfig
    :: InstanceGroupConfig
instanceGroupConfig =
    InstanceGroupConfig'
    { _igcNumInstances = Nothing
    , _igcDiskConfig = Nothing
    , _igcIsPreemptible = Nothing
    , _igcImageURI = Nothing
    , _igcAccelerators = Nothing
    , _igcInstanceNames = Nothing
    , _igcManagedGroupConfig = Nothing
    , _igcMachineTypeURI = Nothing
    }

-- | Optional. The number of VM instances in the instance group. For master
-- instance groups, must be set to 1.
igcNumInstances :: Lens' InstanceGroupConfig (Maybe Int32)
igcNumInstances
  = lens _igcNumInstances
      (\ s a -> s{_igcNumInstances = a})
      . mapping _Coerce

-- | Optional. Disk option config settings.
igcDiskConfig :: Lens' InstanceGroupConfig (Maybe DiskConfig)
igcDiskConfig
  = lens _igcDiskConfig
      (\ s a -> s{_igcDiskConfig = a})

-- | Optional. Specifies that this instance group contains preemptible
-- instances.
igcIsPreemptible :: Lens' InstanceGroupConfig (Maybe Bool)
igcIsPreemptible
  = lens _igcIsPreemptible
      (\ s a -> s{_igcIsPreemptible = a})

-- | Optional. The Compute Engine image resource used for cluster instances.
-- It can be specified or may be inferred from
-- SoftwareConfig.image_version.
igcImageURI :: Lens' InstanceGroupConfig (Maybe Text)
igcImageURI
  = lens _igcImageURI (\ s a -> s{_igcImageURI = a})

-- | Optional. The Compute Engine accelerator configuration for these
-- instances.Beta Feature: This feature is still under development. It may
-- be changed before final release.
igcAccelerators :: Lens' InstanceGroupConfig [AcceleratorConfig]
igcAccelerators
  = lens _igcAccelerators
      (\ s a -> s{_igcAccelerators = a})
      . _Default
      . _Coerce

-- | Output only. The list of instance names. Cloud Dataproc derives the
-- names from cluster_name, num_instances, and the instance group.
igcInstanceNames :: Lens' InstanceGroupConfig [Text]
igcInstanceNames
  = lens _igcInstanceNames
      (\ s a -> s{_igcInstanceNames = a})
      . _Default
      . _Coerce

-- | Output only. The config for Compute Engine Instance Group Manager that
-- manages this group. This is only used for preemptible instance groups.
igcManagedGroupConfig :: Lens' InstanceGroupConfig (Maybe ManagedGroupConfig)
igcManagedGroupConfig
  = lens _igcManagedGroupConfig
      (\ s a -> s{_igcManagedGroupConfig = a})

-- | Optional. The Compute Engine machine type used for cluster instances.A
-- full URL, partial URI, or short name are valid. Examples:
-- https:\/\/www.googleapis.com\/compute\/v1\/projects\/[project_id]\/zones\/us-east1-a\/machineTypes\/n1-standard-2
-- projects\/[project_id]\/zones\/us-east1-a\/machineTypes\/n1-standard-2
-- n1-standard-2Auto Zone Exception: If you are using the Cloud Dataproc
-- Auto Zone Placement feature, you must use the short name of the machine
-- type resource, for example, n1-standard-2.
igcMachineTypeURI :: Lens' InstanceGroupConfig (Maybe Text)
igcMachineTypeURI
  = lens _igcMachineTypeURI
      (\ s a -> s{_igcMachineTypeURI = a})

instance FromJSON InstanceGroupConfig where
        parseJSON
          = withObject "InstanceGroupConfig"
              (\ o ->
                 InstanceGroupConfig' <$>
                   (o .:? "numInstances") <*> (o .:? "diskConfig") <*>
                     (o .:? "isPreemptible")
                     <*> (o .:? "imageUri")
                     <*> (o .:? "accelerators" .!= mempty)
                     <*> (o .:? "instanceNames" .!= mempty)
                     <*> (o .:? "managedGroupConfig")
                     <*> (o .:? "machineTypeUri"))

instance ToJSON InstanceGroupConfig where
        toJSON InstanceGroupConfig'{..}
          = object
              (catMaybes
                 [("numInstances" .=) <$> _igcNumInstances,
                  ("diskConfig" .=) <$> _igcDiskConfig,
                  ("isPreemptible" .=) <$> _igcIsPreemptible,
                  ("imageUri" .=) <$> _igcImageURI,
                  ("accelerators" .=) <$> _igcAccelerators,
                  ("instanceNames" .=) <$> _igcInstanceNames,
                  ("managedGroupConfig" .=) <$> _igcManagedGroupConfig,
                  ("machineTypeUri" .=) <$> _igcMachineTypeURI])

-- | A Cloud Dataproc job for running Apache Spark
-- (http:\/\/spark.apache.org\/) applications on YARN.
--
-- /See:/ 'sparkJob' smart constructor.
data SparkJob = SparkJob'
    { _sjArgs           :: !(Maybe [Text])
    , _sjMainJarFileURI :: !(Maybe Text)
    , _sjJarFileURIs    :: !(Maybe [Text])
    , _sjFileURIs       :: !(Maybe [Text])
    , _sjArchiveURIs    :: !(Maybe [Text])
    , _sjMainClass      :: !(Maybe Text)
    , _sjLoggingConfig  :: !(Maybe LoggingConfig)
    , _sjProperties     :: !(Maybe SparkJobProperties)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SparkJob' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sjArgs'
--
-- * 'sjMainJarFileURI'
--
-- * 'sjJarFileURIs'
--
-- * 'sjFileURIs'
--
-- * 'sjArchiveURIs'
--
-- * 'sjMainClass'
--
-- * 'sjLoggingConfig'
--
-- * 'sjProperties'
sparkJob
    :: SparkJob
sparkJob =
    SparkJob'
    { _sjArgs = Nothing
    , _sjMainJarFileURI = Nothing
    , _sjJarFileURIs = Nothing
    , _sjFileURIs = Nothing
    , _sjArchiveURIs = Nothing
    , _sjMainClass = Nothing
    , _sjLoggingConfig = Nothing
    , _sjProperties = Nothing
    }

-- | Optional. The arguments to pass to the driver. Do not include arguments,
-- such as --conf, that can be set as job properties, since a collision may
-- occur that causes an incorrect job submission.
sjArgs :: Lens' SparkJob [Text]
sjArgs
  = lens _sjArgs (\ s a -> s{_sjArgs = a}) . _Default .
      _Coerce

-- | The HCFS URI of the jar file that contains the main class.
sjMainJarFileURI :: Lens' SparkJob (Maybe Text)
sjMainJarFileURI
  = lens _sjMainJarFileURI
      (\ s a -> s{_sjMainJarFileURI = a})

-- | Optional. HCFS URIs of jar files to add to the CLASSPATHs of the Spark
-- driver and tasks.
sjJarFileURIs :: Lens' SparkJob [Text]
sjJarFileURIs
  = lens _sjJarFileURIs
      (\ s a -> s{_sjJarFileURIs = a})
      . _Default
      . _Coerce

-- | Optional. HCFS URIs of files to be copied to the working directory of
-- Spark drivers and distributed tasks. Useful for naively parallel tasks.
sjFileURIs :: Lens' SparkJob [Text]
sjFileURIs
  = lens _sjFileURIs (\ s a -> s{_sjFileURIs = a}) .
      _Default
      . _Coerce

-- | Optional. HCFS URIs of archives to be extracted in the working directory
-- of Spark drivers and tasks. Supported file types: .jar, .tar, .tar.gz,
-- .tgz, and .zip.
sjArchiveURIs :: Lens' SparkJob [Text]
sjArchiveURIs
  = lens _sjArchiveURIs
      (\ s a -> s{_sjArchiveURIs = a})
      . _Default
      . _Coerce

-- | The name of the driver\'s main class. The jar file that contains the
-- class must be in the default CLASSPATH or specified in jar_file_uris.
sjMainClass :: Lens' SparkJob (Maybe Text)
sjMainClass
  = lens _sjMainClass (\ s a -> s{_sjMainClass = a})

-- | Optional. The runtime log config for job execution.
sjLoggingConfig :: Lens' SparkJob (Maybe LoggingConfig)
sjLoggingConfig
  = lens _sjLoggingConfig
      (\ s a -> s{_sjLoggingConfig = a})

-- | Optional. A mapping of property names to values, used to configure
-- Spark. Properties that conflict with values set by the Cloud Dataproc
-- API may be overwritten. Can include properties set in
-- \/etc\/spark\/conf\/spark-defaults.conf and classes in user code.
sjProperties :: Lens' SparkJob (Maybe SparkJobProperties)
sjProperties
  = lens _sjProperties (\ s a -> s{_sjProperties = a})

instance FromJSON SparkJob where
        parseJSON
          = withObject "SparkJob"
              (\ o ->
                 SparkJob' <$>
                   (o .:? "args" .!= mempty) <*>
                     (o .:? "mainJarFileUri")
                     <*> (o .:? "jarFileUris" .!= mempty)
                     <*> (o .:? "fileUris" .!= mempty)
                     <*> (o .:? "archiveUris" .!= mempty)
                     <*> (o .:? "mainClass")
                     <*> (o .:? "loggingConfig")
                     <*> (o .:? "properties"))

instance ToJSON SparkJob where
        toJSON SparkJob'{..}
          = object
              (catMaybes
                 [("args" .=) <$> _sjArgs,
                  ("mainJarFileUri" .=) <$> _sjMainJarFileURI,
                  ("jarFileUris" .=) <$> _sjJarFileURIs,
                  ("fileUris" .=) <$> _sjFileURIs,
                  ("archiveUris" .=) <$> _sjArchiveURIs,
                  ("mainClass" .=) <$> _sjMainClass,
                  ("loggingConfig" .=) <$> _sjLoggingConfig,
                  ("properties" .=) <$> _sjProperties])

-- | Optional. The properties to set on daemon config files.Property keys are
-- specified in prefix:property format, such as core:fs.defaultFS. The
-- following are supported prefixes and their mappings: capacity-scheduler:
-- capacity-scheduler.xml core: core-site.xml distcp: distcp-default.xml
-- hdfs: hdfs-site.xml hive: hive-site.xml mapred: mapred-site.xml pig:
-- pig.properties spark: spark-defaults.conf yarn: yarn-site.xmlFor more
-- information, see Cluster properties.
--
-- /See:/ 'softwareConfigProperties' smart constructor.
newtype SoftwareConfigProperties = SoftwareConfigProperties'
    { _scpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SoftwareConfigProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'scpAddtional'
softwareConfigProperties
    :: HashMap Text Text -- ^ 'scpAddtional'
    -> SoftwareConfigProperties
softwareConfigProperties pScpAddtional_ =
    SoftwareConfigProperties'
    { _scpAddtional = _Coerce # pScpAddtional_
    }

scpAddtional :: Lens' SoftwareConfigProperties (HashMap Text Text)
scpAddtional
  = lens _scpAddtional (\ s a -> s{_scpAddtional = a})
      . _Coerce

instance FromJSON SoftwareConfigProperties where
        parseJSON
          = withObject "SoftwareConfigProperties"
              (\ o ->
                 SoftwareConfigProperties' <$> (parseJSONObject o))

instance ToJSON SoftwareConfigProperties where
        toJSON = toJSON . _scpAddtional

-- | The workflow graph.
--
-- /See:/ 'workflowGraph' smart constructor.
newtype WorkflowGraph = WorkflowGraph'
    { _wgNodes :: Maybe [WorkflowNode]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkflowGraph' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wgNodes'
workflowGraph
    :: WorkflowGraph
workflowGraph =
    WorkflowGraph'
    { _wgNodes = Nothing
    }

-- | Output only. The workflow nodes.
wgNodes :: Lens' WorkflowGraph [WorkflowNode]
wgNodes
  = lens _wgNodes (\ s a -> s{_wgNodes = a}) . _Default
      . _Coerce

instance FromJSON WorkflowGraph where
        parseJSON
          = withObject "WorkflowGraph"
              (\ o ->
                 WorkflowGraph' <$> (o .:? "nodes" .!= mempty))

instance ToJSON WorkflowGraph where
        toJSON WorkflowGraph'{..}
          = object (catMaybes [("nodes" .=) <$> _wgNodes])

-- | The cluster operation triggered by a workflow.
--
-- /See:/ 'clusterOperation' smart constructor.
data ClusterOperation = ClusterOperation'
    { _coDone        :: !(Maybe Bool)
    , _coError       :: !(Maybe Text)
    , _coOperationId :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterOperation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'coDone'
--
-- * 'coError'
--
-- * 'coOperationId'
clusterOperation
    :: ClusterOperation
clusterOperation =
    ClusterOperation'
    { _coDone = Nothing
    , _coError = Nothing
    , _coOperationId = Nothing
    }

-- | Output only. Indicates the operation is done.
coDone :: Lens' ClusterOperation (Maybe Bool)
coDone = lens _coDone (\ s a -> s{_coDone = a})

-- | Output only. Error, if operation failed.
coError :: Lens' ClusterOperation (Maybe Text)
coError = lens _coError (\ s a -> s{_coError = a})

-- | Output only. The id of the cluster operation.
coOperationId :: Lens' ClusterOperation (Maybe Text)
coOperationId
  = lens _coOperationId
      (\ s a -> s{_coOperationId = a})

instance FromJSON ClusterOperation where
        parseJSON
          = withObject "ClusterOperation"
              (\ o ->
                 ClusterOperation' <$>
                   (o .:? "done") <*> (o .:? "error") <*>
                     (o .:? "operationId"))

instance ToJSON ClusterOperation where
        toJSON ClusterOperation'{..}
          = object
              (catMaybes
                 [("done" .=) <$> _coDone, ("error" .=) <$> _coError,
                  ("operationId" .=) <$> _coOperationId])

-- | A selector that chooses target cluster for jobs based on metadata.
--
-- /See:/ 'clusterSelector' smart constructor.
data ClusterSelector = ClusterSelector'
    { _csZone          :: !(Maybe Text)
    , _csClusterLabels :: !(Maybe ClusterSelectorClusterLabels)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterSelector' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'csZone'
--
-- * 'csClusterLabels'
clusterSelector
    :: ClusterSelector
clusterSelector =
    ClusterSelector'
    { _csZone = Nothing
    , _csClusterLabels = Nothing
    }

-- | Optional. The zone where workflow process executes. This parameter does
-- not affect the selection of the cluster.If unspecified, the zone of the
-- first cluster matching the selector is used.
csZone :: Lens' ClusterSelector (Maybe Text)
csZone = lens _csZone (\ s a -> s{_csZone = a})

-- | Required. The cluster labels. Cluster must have all labels to match.
csClusterLabels :: Lens' ClusterSelector (Maybe ClusterSelectorClusterLabels)
csClusterLabels
  = lens _csClusterLabels
      (\ s a -> s{_csClusterLabels = a})

instance FromJSON ClusterSelector where
        parseJSON
          = withObject "ClusterSelector"
              (\ o ->
                 ClusterSelector' <$>
                   (o .:? "zone") <*> (o .:? "clusterLabels"))

instance ToJSON ClusterSelector where
        toJSON ClusterSelector'{..}
          = object
              (catMaybes
                 [("zone" .=) <$> _csZone,
                  ("clusterLabels" .=) <$> _csClusterLabels])

-- | Job scheduling options.
--
-- /See:/ 'jobScheduling' smart constructor.
newtype JobScheduling = JobScheduling'
    { _jsMaxFailuresPerHour :: Maybe (Textual Int32)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobScheduling' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jsMaxFailuresPerHour'
jobScheduling
    :: JobScheduling
jobScheduling =
    JobScheduling'
    { _jsMaxFailuresPerHour = Nothing
    }

-- | Optional. Maximum number of times per hour a driver may be restarted as
-- a result of driver terminating with non-zero code before job is reported
-- failed.A job may be reported as thrashing if driver exits with non-zero
-- code 4 times within 10 minute window.Maximum value is 10.
jsMaxFailuresPerHour :: Lens' JobScheduling (Maybe Int32)
jsMaxFailuresPerHour
  = lens _jsMaxFailuresPerHour
      (\ s a -> s{_jsMaxFailuresPerHour = a})
      . mapping _Coerce

instance FromJSON JobScheduling where
        parseJSON
          = withObject "JobScheduling"
              (\ o ->
                 JobScheduling' <$> (o .:? "maxFailuresPerHour"))

instance ToJSON JobScheduling where
        toJSON JobScheduling'{..}
          = object
              (catMaybes
                 [("maxFailuresPerHour" .=) <$>
                    _jsMaxFailuresPerHour])

-- | Specifies the config of disk options for a group of VM instances.
--
-- /See:/ 'diskConfig' smart constructor.
data DiskConfig = DiskConfig'
    { _dcNumLocalSsds   :: !(Maybe (Textual Int32))
    , _dcBootDiskType   :: !(Maybe Text)
    , _dcBootDiskSizeGb :: !(Maybe (Textual Int32))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DiskConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dcNumLocalSsds'
--
-- * 'dcBootDiskType'
--
-- * 'dcBootDiskSizeGb'
diskConfig
    :: DiskConfig
diskConfig =
    DiskConfig'
    { _dcNumLocalSsds = Nothing
    , _dcBootDiskType = Nothing
    , _dcBootDiskSizeGb = Nothing
    }

-- | Optional. Number of attached SSDs, from 0 to 4 (default is 0). If SSDs
-- are not attached, the boot disk is used to store runtime logs and HDFS
-- (https:\/\/hadoop.apache.org\/docs\/r1.2.1\/hdfs_user_guide.html) data.
-- If one or more SSDs are attached, this runtime bulk data is spread
-- across them, and the boot disk contains only basic config and installed
-- binaries.
dcNumLocalSsds :: Lens' DiskConfig (Maybe Int32)
dcNumLocalSsds
  = lens _dcNumLocalSsds
      (\ s a -> s{_dcNumLocalSsds = a})
      . mapping _Coerce

-- | Optional. Type of the boot disk (default is \"pd-standard\"). Valid
-- values: \"pd-ssd\" (Persistent Disk Solid State Drive) or
-- \"pd-standard\" (Persistent Disk Hard Disk Drive).
dcBootDiskType :: Lens' DiskConfig (Maybe Text)
dcBootDiskType
  = lens _dcBootDiskType
      (\ s a -> s{_dcBootDiskType = a})

-- | Optional. Size in GB of the boot disk (default is 500GB).
dcBootDiskSizeGb :: Lens' DiskConfig (Maybe Int32)
dcBootDiskSizeGb
  = lens _dcBootDiskSizeGb
      (\ s a -> s{_dcBootDiskSizeGb = a})
      . mapping _Coerce

instance FromJSON DiskConfig where
        parseJSON
          = withObject "DiskConfig"
              (\ o ->
                 DiskConfig' <$>
                   (o .:? "numLocalSsds") <*> (o .:? "bootDiskType") <*>
                     (o .:? "bootDiskSizeGb"))

instance ToJSON DiskConfig where
        toJSON DiskConfig'{..}
          = object
              (catMaybes
                 [("numLocalSsds" .=) <$> _dcNumLocalSsds,
                  ("bootDiskType" .=) <$> _dcBootDiskType,
                  ("bootDiskSizeGb" .=) <$> _dcBootDiskSizeGb])

-- | Output only. Labels associated with the operation
--
-- /See:/ 'clusterOperationMetadataLabels' smart constructor.
newtype ClusterOperationMetadataLabels = ClusterOperationMetadataLabels'
    { _comlAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterOperationMetadataLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'comlAddtional'
clusterOperationMetadataLabels
    :: HashMap Text Text -- ^ 'comlAddtional'
    -> ClusterOperationMetadataLabels
clusterOperationMetadataLabels pComlAddtional_ =
    ClusterOperationMetadataLabels'
    { _comlAddtional = _Coerce # pComlAddtional_
    }

comlAddtional :: Lens' ClusterOperationMetadataLabels (HashMap Text Text)
comlAddtional
  = lens _comlAddtional
      (\ s a -> s{_comlAddtional = a})
      . _Coerce

instance FromJSON ClusterOperationMetadataLabels
         where
        parseJSON
          = withObject "ClusterOperationMetadataLabels"
              (\ o ->
                 ClusterOperationMetadataLabels' <$>
                   (parseJSONObject o))

instance ToJSON ClusterOperationMetadataLabels where
        toJSON = toJSON . _comlAddtional

-- | Represents an expression text. Example: title: \"User account presence\"
-- description: \"Determines whether the request has a user account\"
-- expression: \"size(request.user) > 0\"
--
-- /See:/ 'expr' smart constructor.
data Expr = Expr'
    { _eLocation    :: !(Maybe Text)
    , _eExpression  :: !(Maybe Text)
    , _eTitle       :: !(Maybe Text)
    , _eDescription :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Expr' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eLocation'
--
-- * 'eExpression'
--
-- * 'eTitle'
--
-- * 'eDescription'
expr
    :: Expr
expr =
    Expr'
    { _eLocation = Nothing
    , _eExpression = Nothing
    , _eTitle = Nothing
    , _eDescription = Nothing
    }

-- | An optional string indicating the location of the expression for error
-- reporting, e.g. a file name and a position in the file.
eLocation :: Lens' Expr (Maybe Text)
eLocation
  = lens _eLocation (\ s a -> s{_eLocation = a})

-- | Textual representation of an expression in Common Expression Language
-- syntax.The application context of the containing message determines
-- which well-known feature set of CEL is supported.
eExpression :: Lens' Expr (Maybe Text)
eExpression
  = lens _eExpression (\ s a -> s{_eExpression = a})

-- | An optional title for the expression, i.e. a short string describing its
-- purpose. This can be used e.g. in UIs which allow to enter the
-- expression.
eTitle :: Lens' Expr (Maybe Text)
eTitle = lens _eTitle (\ s a -> s{_eTitle = a})

-- | An optional description of the expression. This is a longer text which
-- describes the expression, e.g. when hovered over it in a UI.
eDescription :: Lens' Expr (Maybe Text)
eDescription
  = lens _eDescription (\ s a -> s{_eDescription = a})

instance FromJSON Expr where
        parseJSON
          = withObject "Expr"
              (\ o ->
                 Expr' <$>
                   (o .:? "location") <*> (o .:? "expression") <*>
                     (o .:? "title")
                     <*> (o .:? "description"))

instance ToJSON Expr where
        toJSON Expr'{..}
          = object
              (catMaybes
                 [("location" .=) <$> _eLocation,
                  ("expression" .=) <$> _eExpression,
                  ("title" .=) <$> _eTitle,
                  ("description" .=) <$> _eDescription])

-- | The response message for Operations.ListOperations.
--
-- /See:/ 'listOperationsResponse' smart constructor.
data ListOperationsResponse = ListOperationsResponse'
    { _lorNextPageToken :: !(Maybe Text)
    , _lorOperations    :: !(Maybe [Operation])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListOperationsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lorNextPageToken'
--
-- * 'lorOperations'
listOperationsResponse
    :: ListOperationsResponse
listOperationsResponse =
    ListOperationsResponse'
    { _lorNextPageToken = Nothing
    , _lorOperations = Nothing
    }

-- | The standard List next-page token.
lorNextPageToken :: Lens' ListOperationsResponse (Maybe Text)
lorNextPageToken
  = lens _lorNextPageToken
      (\ s a -> s{_lorNextPageToken = a})

-- | A list of operations that matches the specified filter in the request.
lorOperations :: Lens' ListOperationsResponse [Operation]
lorOperations
  = lens _lorOperations
      (\ s a -> s{_lorOperations = a})
      . _Default
      . _Coerce

instance FromJSON ListOperationsResponse where
        parseJSON
          = withObject "ListOperationsResponse"
              (\ o ->
                 ListOperationsResponse' <$>
                   (o .:? "nextPageToken") <*>
                     (o .:? "operations" .!= mempty))

instance ToJSON ListOperationsResponse where
        toJSON ListOperationsResponse'{..}
          = object
              (catMaybes
                 [("nextPageToken" .=) <$> _lorNextPageToken,
                  ("operations" .=) <$> _lorOperations])

-- | Optional. Mapping of query variable names to values (equivalent to the
-- Hive command: SET name=\"value\";).
--
-- /See:/ 'hiveJobScriptVariables' smart constructor.
newtype HiveJobScriptVariables = HiveJobScriptVariables'
    { _hjsvAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'HiveJobScriptVariables' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'hjsvAddtional'
hiveJobScriptVariables
    :: HashMap Text Text -- ^ 'hjsvAddtional'
    -> HiveJobScriptVariables
hiveJobScriptVariables pHjsvAddtional_ =
    HiveJobScriptVariables'
    { _hjsvAddtional = _Coerce # pHjsvAddtional_
    }

hjsvAddtional :: Lens' HiveJobScriptVariables (HashMap Text Text)
hjsvAddtional
  = lens _hjsvAddtional
      (\ s a -> s{_hjsvAddtional = a})
      . _Coerce

instance FromJSON HiveJobScriptVariables where
        parseJSON
          = withObject "HiveJobScriptVariables"
              (\ o ->
                 HiveJobScriptVariables' <$> (parseJSONObject o))

instance ToJSON HiveJobScriptVariables where
        toJSON = toJSON . _hjsvAddtional

-- | Request message for GetIamPolicy method.
--
-- /See:/ 'getIAMPolicyRequest' smart constructor.
data GetIAMPolicyRequest =
    GetIAMPolicyRequest'
    deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetIAMPolicyRequest' with the minimum fields required to make a request.
--
getIAMPolicyRequest
    :: GetIAMPolicyRequest
getIAMPolicyRequest = GetIAMPolicyRequest'

instance FromJSON GetIAMPolicyRequest where
        parseJSON
          = withObject "GetIAMPolicyRequest"
              (\ o -> pure GetIAMPolicyRequest')

instance ToJSON GetIAMPolicyRequest where
        toJSON = const emptyObject

-- | Specifies workflow execution target.Either managed_cluster or
-- cluster_selector is required.
--
-- /See:/ 'workflowTemplatePlacement' smart constructor.
data WorkflowTemplatePlacement = WorkflowTemplatePlacement'
    { _wtpClusterSelector :: !(Maybe ClusterSelector)
    , _wtpManagedCluster  :: !(Maybe ManagedCluster)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkflowTemplatePlacement' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wtpClusterSelector'
--
-- * 'wtpManagedCluster'
workflowTemplatePlacement
    :: WorkflowTemplatePlacement
workflowTemplatePlacement =
    WorkflowTemplatePlacement'
    { _wtpClusterSelector = Nothing
    , _wtpManagedCluster = Nothing
    }

-- | Optional. A selector that chooses target cluster for jobs based on
-- metadata.The selector is evaluated at the time each job is submitted.
wtpClusterSelector :: Lens' WorkflowTemplatePlacement (Maybe ClusterSelector)
wtpClusterSelector
  = lens _wtpClusterSelector
      (\ s a -> s{_wtpClusterSelector = a})

-- | Optional. A cluster that is managed by the workflow.
wtpManagedCluster :: Lens' WorkflowTemplatePlacement (Maybe ManagedCluster)
wtpManagedCluster
  = lens _wtpManagedCluster
      (\ s a -> s{_wtpManagedCluster = a})

instance FromJSON WorkflowTemplatePlacement where
        parseJSON
          = withObject "WorkflowTemplatePlacement"
              (\ o ->
                 WorkflowTemplatePlacement' <$>
                   (o .:? "clusterSelector") <*>
                     (o .:? "managedCluster"))

instance ToJSON WorkflowTemplatePlacement where
        toJSON WorkflowTemplatePlacement'{..}
          = object
              (catMaybes
                 [("clusterSelector" .=) <$> _wtpClusterSelector,
                  ("managedCluster" .=) <$> _wtpManagedCluster])

-- | Describes the identifying information, config, and status of a cluster
-- of Compute Engine instances.
--
-- /See:/ 'cluster' smart constructor.
data Cluster = Cluster'
    { _cStatus        :: !(Maybe ClusterStatus)
    , _cMetrics       :: !(Maybe ClusterMetrics)
    , _cClusterUuid   :: !(Maybe Text)
    , _cConfig        :: !(Maybe ClusterConfig)
    , _cClusterName   :: !(Maybe Text)
    , _cLabels        :: !(Maybe ClusterLabels)
    , _cProjectId     :: !(Maybe Text)
    , _cStatusHistory :: !(Maybe [ClusterStatus])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Cluster' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cStatus'
--
-- * 'cMetrics'
--
-- * 'cClusterUuid'
--
-- * 'cConfig'
--
-- * 'cClusterName'
--
-- * 'cLabels'
--
-- * 'cProjectId'
--
-- * 'cStatusHistory'
cluster
    :: Cluster
cluster =
    Cluster'
    { _cStatus = Nothing
    , _cMetrics = Nothing
    , _cClusterUuid = Nothing
    , _cConfig = Nothing
    , _cClusterName = Nothing
    , _cLabels = Nothing
    , _cProjectId = Nothing
    , _cStatusHistory = Nothing
    }

-- | Output only. Cluster status.
cStatus :: Lens' Cluster (Maybe ClusterStatus)
cStatus = lens _cStatus (\ s a -> s{_cStatus = a})

-- | Contains cluster daemon metrics such as HDFS and YARN stats.Beta
-- Feature: This report is available for testing purposes only. It may be
-- changed before final release.
cMetrics :: Lens' Cluster (Maybe ClusterMetrics)
cMetrics = lens _cMetrics (\ s a -> s{_cMetrics = a})

-- | Output only. A cluster UUID (Unique Universal Identifier). Cloud
-- Dataproc generates this value when it creates the cluster.
cClusterUuid :: Lens' Cluster (Maybe Text)
cClusterUuid
  = lens _cClusterUuid (\ s a -> s{_cClusterUuid = a})

-- | Required. The cluster config. Note that Cloud Dataproc may set default
-- values, and values may change when clusters are updated.
cConfig :: Lens' Cluster (Maybe ClusterConfig)
cConfig = lens _cConfig (\ s a -> s{_cConfig = a})

-- | Required. The cluster name. Cluster names within a project must be
-- unique. Names of deleted clusters can be reused.
cClusterName :: Lens' Cluster (Maybe Text)
cClusterName
  = lens _cClusterName (\ s a -> s{_cClusterName = a})

-- | Optional. The labels to associate with this cluster. Label keys must
-- contain 1 to 63 characters, and must conform to RFC 1035
-- (https:\/\/www.ietf.org\/rfc\/rfc1035.txt). Label values may be empty,
-- but, if present, must contain 1 to 63 characters, and must conform to
-- RFC 1035 (https:\/\/www.ietf.org\/rfc\/rfc1035.txt). No more than 32
-- labels can be associated with a cluster.
cLabels :: Lens' Cluster (Maybe ClusterLabels)
cLabels = lens _cLabels (\ s a -> s{_cLabels = a})

-- | Required. The Google Cloud Platform project ID that the cluster belongs
-- to.
cProjectId :: Lens' Cluster (Maybe Text)
cProjectId
  = lens _cProjectId (\ s a -> s{_cProjectId = a})

-- | Output only. The previous cluster status.
cStatusHistory :: Lens' Cluster [ClusterStatus]
cStatusHistory
  = lens _cStatusHistory
      (\ s a -> s{_cStatusHistory = a})
      . _Default
      . _Coerce

instance FromJSON Cluster where
        parseJSON
          = withObject "Cluster"
              (\ o ->
                 Cluster' <$>
                   (o .:? "status") <*> (o .:? "metrics") <*>
                     (o .:? "clusterUuid")
                     <*> (o .:? "config")
                     <*> (o .:? "clusterName")
                     <*> (o .:? "labels")
                     <*> (o .:? "projectId")
                     <*> (o .:? "statusHistory" .!= mempty))

instance ToJSON Cluster where
        toJSON Cluster'{..}
          = object
              (catMaybes
                 [("status" .=) <$> _cStatus,
                  ("metrics" .=) <$> _cMetrics,
                  ("clusterUuid" .=) <$> _cClusterUuid,
                  ("config" .=) <$> _cConfig,
                  ("clusterName" .=) <$> _cClusterName,
                  ("labels" .=) <$> _cLabels,
                  ("projectId" .=) <$> _cProjectId,
                  ("statusHistory" .=) <$> _cStatusHistory])

-- | Optional. The labels to associate with this cluster.Label keys must be
-- between 1 and 63 characters long, and must conform to the following PCRE
-- regular expression: \\p{Ll}\\p{Lo}{0,62}Label values must be between 1
-- and 63 characters long, and must conform to the following PCRE regular
-- expression: \\p{Ll}\\p{Lo}\\p{N}_-{0,63}No more than 32 labels can be
-- associated with a given cluster.
--
-- /See:/ 'managedClusterLabels' smart constructor.
newtype ManagedClusterLabels = ManagedClusterLabels'
    { _mclAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ManagedClusterLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mclAddtional'
managedClusterLabels
    :: HashMap Text Text -- ^ 'mclAddtional'
    -> ManagedClusterLabels
managedClusterLabels pMclAddtional_ =
    ManagedClusterLabels'
    { _mclAddtional = _Coerce # pMclAddtional_
    }

mclAddtional :: Lens' ManagedClusterLabels (HashMap Text Text)
mclAddtional
  = lens _mclAddtional (\ s a -> s{_mclAddtional = a})
      . _Coerce

instance FromJSON ManagedClusterLabels where
        parseJSON
          = withObject "ManagedClusterLabels"
              (\ o ->
                 ManagedClusterLabels' <$> (parseJSONObject o))

instance ToJSON ManagedClusterLabels where
        toJSON = toJSON . _mclAddtional

-- | Configuration for parameter validation.
--
-- /See:/ 'parameterValidation' smart constructor.
data ParameterValidation = ParameterValidation'
    { _pvRegex  :: !(Maybe RegexValidation)
    , _pvValues :: !(Maybe ValueValidation)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ParameterValidation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pvRegex'
--
-- * 'pvValues'
parameterValidation
    :: ParameterValidation
parameterValidation =
    ParameterValidation'
    { _pvRegex = Nothing
    , _pvValues = Nothing
    }

-- | Validation based on regular expressions.
pvRegex :: Lens' ParameterValidation (Maybe RegexValidation)
pvRegex = lens _pvRegex (\ s a -> s{_pvRegex = a})

-- | Validation based on a list of allowed values.
pvValues :: Lens' ParameterValidation (Maybe ValueValidation)
pvValues = lens _pvValues (\ s a -> s{_pvValues = a})

instance FromJSON ParameterValidation where
        parseJSON
          = withObject "ParameterValidation"
              (\ o ->
                 ParameterValidation' <$>
                   (o .:? "regex") <*> (o .:? "values"))

instance ToJSON ParameterValidation where
        toJSON ParameterValidation'{..}
          = object
              (catMaybes
                 [("regex" .=) <$> _pvRegex,
                  ("values" .=) <$> _pvValues])

-- | Optional. The labels to associate with this job. Label keys must contain
-- 1 to 63 characters, and must conform to RFC 1035
-- (https:\/\/www.ietf.org\/rfc\/rfc1035.txt). Label values may be empty,
-- but, if present, must contain 1 to 63 characters, and must conform to
-- RFC 1035 (https:\/\/www.ietf.org\/rfc\/rfc1035.txt). No more than 32
-- labels can be associated with a job.
--
-- /See:/ 'jobLabels' smart constructor.
newtype JobLabels = JobLabels'
    { _jlAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jlAddtional'
jobLabels
    :: HashMap Text Text -- ^ 'jlAddtional'
    -> JobLabels
jobLabels pJlAddtional_ =
    JobLabels'
    { _jlAddtional = _Coerce # pJlAddtional_
    }

jlAddtional :: Lens' JobLabels (HashMap Text Text)
jlAddtional
  = lens _jlAddtional (\ s a -> s{_jlAddtional = a}) .
      _Coerce

instance FromJSON JobLabels where
        parseJSON
          = withObject "JobLabels"
              (\ o -> JobLabels' <$> (parseJSONObject o))

instance ToJSON JobLabels where
        toJSON = toJSON . _jlAddtional

-- | A request to submit a job.
--
-- /See:/ 'submitJobRequest' smart constructor.
data SubmitJobRequest = SubmitJobRequest'
    { _sjrRequestId :: !(Maybe Text)
    , _sjrJob       :: !(Maybe Job)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SubmitJobRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sjrRequestId'
--
-- * 'sjrJob'
submitJobRequest
    :: SubmitJobRequest
submitJobRequest =
    SubmitJobRequest'
    { _sjrRequestId = Nothing
    , _sjrJob = Nothing
    }

-- | Optional. A unique id used to identify the request. If the server
-- receives two SubmitJobRequest requests with the same id, then the second
-- request will be ignored and the first Job created and stored in the
-- backend is returned.It is recommended to always set this value to a UUID
-- (https:\/\/en.wikipedia.org\/wiki\/Universally_unique_identifier).The id
-- must contain only letters (a-z, A-Z), numbers (0-9), underscores (_),
-- and hyphens (-). The maximum length is 40 characters.
sjrRequestId :: Lens' SubmitJobRequest (Maybe Text)
sjrRequestId
  = lens _sjrRequestId (\ s a -> s{_sjrRequestId = a})

-- | Required. The job resource.
sjrJob :: Lens' SubmitJobRequest (Maybe Job)
sjrJob = lens _sjrJob (\ s a -> s{_sjrJob = a})

instance FromJSON SubmitJobRequest where
        parseJSON
          = withObject "SubmitJobRequest"
              (\ o ->
                 SubmitJobRequest' <$>
                   (o .:? "requestId") <*> (o .:? "job"))

instance ToJSON SubmitJobRequest where
        toJSON SubmitJobRequest'{..}
          = object
              (catMaybes
                 [("requestId" .=) <$> _sjrRequestId,
                  ("job" .=) <$> _sjrJob])

-- | Contains cluster daemon metrics, such as HDFS and YARN stats.Beta
-- Feature: This report is available for testing purposes only. It may be
-- changed before final release.
--
-- /See:/ 'clusterMetrics' smart constructor.
data ClusterMetrics = ClusterMetrics'
    { _cmYarnMetrics :: !(Maybe ClusterMetricsYarnMetrics)
    , _cmHdfsMetrics :: !(Maybe ClusterMetricsHdfsMetrics)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterMetrics' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cmYarnMetrics'
--
-- * 'cmHdfsMetrics'
clusterMetrics
    :: ClusterMetrics
clusterMetrics =
    ClusterMetrics'
    { _cmYarnMetrics = Nothing
    , _cmHdfsMetrics = Nothing
    }

-- | The YARN metrics.
cmYarnMetrics :: Lens' ClusterMetrics (Maybe ClusterMetricsYarnMetrics)
cmYarnMetrics
  = lens _cmYarnMetrics
      (\ s a -> s{_cmYarnMetrics = a})

-- | The HDFS metrics.
cmHdfsMetrics :: Lens' ClusterMetrics (Maybe ClusterMetricsHdfsMetrics)
cmHdfsMetrics
  = lens _cmHdfsMetrics
      (\ s a -> s{_cmHdfsMetrics = a})

instance FromJSON ClusterMetrics where
        parseJSON
          = withObject "ClusterMetrics"
              (\ o ->
                 ClusterMetrics' <$>
                   (o .:? "yarnMetrics") <*> (o .:? "hdfsMetrics"))

instance ToJSON ClusterMetrics where
        toJSON ClusterMetrics'{..}
          = object
              (catMaybes
                 [("yarnMetrics" .=) <$> _cmYarnMetrics,
                  ("hdfsMetrics" .=) <$> _cmHdfsMetrics])

-- | This resource represents a long-running operation that is the result of
-- a network API call.
--
-- /See:/ 'operation' smart constructor.
data Operation = Operation'
    { _oDone     :: !(Maybe Bool)
    , _oError    :: !(Maybe Status)
    , _oResponse :: !(Maybe OperationResponse)
    , _oName     :: !(Maybe Text)
    , _oMetadata :: !(Maybe OperationMetadata)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Operation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'oDone'
--
-- * 'oError'
--
-- * 'oResponse'
--
-- * 'oName'
--
-- * 'oMetadata'
operation
    :: Operation
operation =
    Operation'
    { _oDone = Nothing
    , _oError = Nothing
    , _oResponse = Nothing
    , _oName = Nothing
    , _oMetadata = Nothing
    }

-- | If the value is false, it means the operation is still in progress. If
-- true, the operation is completed, and either error or response is
-- available.
oDone :: Lens' Operation (Maybe Bool)
oDone = lens _oDone (\ s a -> s{_oDone = a})

-- | The error result of the operation in case of failure or cancellation.
oError :: Lens' Operation (Maybe Status)
oError = lens _oError (\ s a -> s{_oError = a})

-- | The normal response of the operation in case of success. If the original
-- method returns no data on success, such as Delete, the response is
-- google.protobuf.Empty. If the original method is standard
-- Get\/Create\/Update, the response should be the resource. For other
-- methods, the response should have the type XxxResponse, where Xxx is the
-- original method name. For example, if the original method name is
-- TakeSnapshot(), the inferred response type is TakeSnapshotResponse.
oResponse :: Lens' Operation (Maybe OperationResponse)
oResponse
  = lens _oResponse (\ s a -> s{_oResponse = a})

-- | The server-assigned name, which is only unique within the same service
-- that originally returns it. If you use the default HTTP mapping, the
-- name should have the format of operations\/some\/unique\/name.
oName :: Lens' Operation (Maybe Text)
oName = lens _oName (\ s a -> s{_oName = a})

-- | Service-specific metadata associated with the operation. It typically
-- contains progress information and common metadata such as create time.
-- Some services might not provide such metadata. Any method that returns a
-- long-running operation should document the metadata type, if any.
oMetadata :: Lens' Operation (Maybe OperationMetadata)
oMetadata
  = lens _oMetadata (\ s a -> s{_oMetadata = a})

instance FromJSON Operation where
        parseJSON
          = withObject "Operation"
              (\ o ->
                 Operation' <$>
                   (o .:? "done") <*> (o .:? "error") <*>
                     (o .:? "response")
                     <*> (o .:? "name")
                     <*> (o .:? "metadata"))

instance ToJSON Operation where
        toJSON Operation'{..}
          = object
              (catMaybes
                 [("done" .=) <$> _oDone, ("error" .=) <$> _oError,
                  ("response" .=) <$> _oResponse,
                  ("name" .=) <$> _oName,
                  ("metadata" .=) <$> _oMetadata])

-- | A generic empty message that you can re-use to avoid defining duplicated
-- empty messages in your APIs. A typical example is to use it as the
-- request or the response type of an API method. For instance: service Foo
-- { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The
-- JSON representation for Empty is empty JSON object {}.
--
-- /See:/ 'empty' smart constructor.
data Empty =
    Empty'
    deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Empty' with the minimum fields required to make a request.
--
empty
    :: Empty
empty = Empty'

instance FromJSON Empty where
        parseJSON = withObject "Empty" (\ o -> pure Empty')

instance ToJSON Empty where
        toJSON = const emptyObject

-- | A Cloud Dataproc job for running Apache Hive
-- (https:\/\/hive.apache.org\/) queries on YARN.
--
-- /See:/ 'hiveJob' smart constructor.
data HiveJob = HiveJob'
    { _hjQueryFileURI      :: !(Maybe Text)
    , _hjJarFileURIs       :: !(Maybe [Text])
    , _hjScriptVariables   :: !(Maybe HiveJobScriptVariables)
    , _hjQueryList         :: !(Maybe QueryList)
    , _hjContinueOnFailure :: !(Maybe Bool)
    , _hjProperties        :: !(Maybe HiveJobProperties)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'HiveJob' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'hjQueryFileURI'
--
-- * 'hjJarFileURIs'
--
-- * 'hjScriptVariables'
--
-- * 'hjQueryList'
--
-- * 'hjContinueOnFailure'
--
-- * 'hjProperties'
hiveJob
    :: HiveJob
hiveJob =
    HiveJob'
    { _hjQueryFileURI = Nothing
    , _hjJarFileURIs = Nothing
    , _hjScriptVariables = Nothing
    , _hjQueryList = Nothing
    , _hjContinueOnFailure = Nothing
    , _hjProperties = Nothing
    }

-- | The HCFS URI of the script that contains Hive queries.
hjQueryFileURI :: Lens' HiveJob (Maybe Text)
hjQueryFileURI
  = lens _hjQueryFileURI
      (\ s a -> s{_hjQueryFileURI = a})

-- | Optional. HCFS URIs of jar files to add to the CLASSPATH of the Hive
-- server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and
-- UDFs.
hjJarFileURIs :: Lens' HiveJob [Text]
hjJarFileURIs
  = lens _hjJarFileURIs
      (\ s a -> s{_hjJarFileURIs = a})
      . _Default
      . _Coerce

-- | Optional. Mapping of query variable names to values (equivalent to the
-- Hive command: SET name=\"value\";).
hjScriptVariables :: Lens' HiveJob (Maybe HiveJobScriptVariables)
hjScriptVariables
  = lens _hjScriptVariables
      (\ s a -> s{_hjScriptVariables = a})

-- | A list of queries.
hjQueryList :: Lens' HiveJob (Maybe QueryList)
hjQueryList
  = lens _hjQueryList (\ s a -> s{_hjQueryList = a})

-- | Optional. Whether to continue executing queries if a query fails. The
-- default value is false. Setting to true can be useful when executing
-- independent parallel queries.
hjContinueOnFailure :: Lens' HiveJob (Maybe Bool)
hjContinueOnFailure
  = lens _hjContinueOnFailure
      (\ s a -> s{_hjContinueOnFailure = a})

-- | Optional. A mapping of property names and values, used to configure
-- Hive. Properties that conflict with values set by the Cloud Dataproc API
-- may be overwritten. Can include properties set in
-- \/etc\/hadoop\/conf\/*-site.xml, \/etc\/hive\/conf\/hive-site.xml, and
-- classes in user code.
hjProperties :: Lens' HiveJob (Maybe HiveJobProperties)
hjProperties
  = lens _hjProperties (\ s a -> s{_hjProperties = a})

instance FromJSON HiveJob where
        parseJSON
          = withObject "HiveJob"
              (\ o ->
                 HiveJob' <$>
                   (o .:? "queryFileUri") <*>
                     (o .:? "jarFileUris" .!= mempty)
                     <*> (o .:? "scriptVariables")
                     <*> (o .:? "queryList")
                     <*> (o .:? "continueOnFailure")
                     <*> (o .:? "properties"))

instance ToJSON HiveJob where
        toJSON HiveJob'{..}
          = object
              (catMaybes
                 [("queryFileUri" .=) <$> _hjQueryFileURI,
                  ("jarFileUris" .=) <$> _hjJarFileURIs,
                  ("scriptVariables" .=) <$> _hjScriptVariables,
                  ("queryList" .=) <$> _hjQueryList,
                  ("continueOnFailure" .=) <$> _hjContinueOnFailure,
                  ("properties" .=) <$> _hjProperties])

-- | Optional. The labels to associate with this job.Label keys must be
-- between 1 and 63 characters long, and must conform to the following
-- regular expression: \\p{Ll}\\p{Lo}{0,62}Label values must be between 1
-- and 63 characters long, and must conform to the following regular
-- expression: \\p{Ll}\\p{Lo}\\p{N}_-{0,63}No more than 32 labels can be
-- associated with a given job.
--
-- /See:/ 'orderedJobLabels' smart constructor.
newtype OrderedJobLabels = OrderedJobLabels'
    { _ojlAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'OrderedJobLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ojlAddtional'
orderedJobLabels
    :: HashMap Text Text -- ^ 'ojlAddtional'
    -> OrderedJobLabels
orderedJobLabels pOjlAddtional_ =
    OrderedJobLabels'
    { _ojlAddtional = _Coerce # pOjlAddtional_
    }

ojlAddtional :: Lens' OrderedJobLabels (HashMap Text Text)
ojlAddtional
  = lens _ojlAddtional (\ s a -> s{_ojlAddtional = a})
      . _Coerce

instance FromJSON OrderedJobLabels where
        parseJSON
          = withObject "OrderedJobLabels"
              (\ o -> OrderedJobLabels' <$> (parseJSONObject o))

instance ToJSON OrderedJobLabels where
        toJSON = toJSON . _ojlAddtional

-- | Required. The cluster labels. Cluster must have all labels to match.
--
-- /See:/ 'clusterSelectorClusterLabels' smart constructor.
newtype ClusterSelectorClusterLabels = ClusterSelectorClusterLabels'
    { _csclAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterSelectorClusterLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'csclAddtional'
clusterSelectorClusterLabels
    :: HashMap Text Text -- ^ 'csclAddtional'
    -> ClusterSelectorClusterLabels
clusterSelectorClusterLabels pCsclAddtional_ =
    ClusterSelectorClusterLabels'
    { _csclAddtional = _Coerce # pCsclAddtional_
    }

csclAddtional :: Lens' ClusterSelectorClusterLabels (HashMap Text Text)
csclAddtional
  = lens _csclAddtional
      (\ s a -> s{_csclAddtional = a})
      . _Coerce

instance FromJSON ClusterSelectorClusterLabels where
        parseJSON
          = withObject "ClusterSelectorClusterLabels"
              (\ o ->
                 ClusterSelectorClusterLabels' <$>
                   (parseJSONObject o))

instance ToJSON ClusterSelectorClusterLabels where
        toJSON = toJSON . _csclAddtional

-- | Optional. Mapping of query variable names to values (equivalent to the
-- Spark SQL command: SET name=\"value\";).
--
-- /See:/ 'sparkSQLJobScriptVariables' smart constructor.
newtype SparkSQLJobScriptVariables = SparkSQLJobScriptVariables'
    { _ssqljsvAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SparkSQLJobScriptVariables' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ssqljsvAddtional'
sparkSQLJobScriptVariables
    :: HashMap Text Text -- ^ 'ssqljsvAddtional'
    -> SparkSQLJobScriptVariables
sparkSQLJobScriptVariables pSsqljsvAddtional_ =
    SparkSQLJobScriptVariables'
    { _ssqljsvAddtional = _Coerce # pSsqljsvAddtional_
    }

ssqljsvAddtional :: Lens' SparkSQLJobScriptVariables (HashMap Text Text)
ssqljsvAddtional
  = lens _ssqljsvAddtional
      (\ s a -> s{_ssqljsvAddtional = a})
      . _Coerce

instance FromJSON SparkSQLJobScriptVariables where
        parseJSON
          = withObject "SparkSQLJobScriptVariables"
              (\ o ->
                 SparkSQLJobScriptVariables' <$> (parseJSONObject o))

instance ToJSON SparkSQLJobScriptVariables where
        toJSON = toJSON . _ssqljsvAddtional

-- | Optional. A mapping of property names to values, used to configure Pig.
-- Properties that conflict with values set by the Cloud Dataproc API may
-- be overwritten. Can include properties set in
-- \/etc\/hadoop\/conf\/*-site.xml, \/etc\/pig\/conf\/pig.properties, and
-- classes in user code.
--
-- /See:/ 'pigJobProperties' smart constructor.
newtype PigJobProperties = PigJobProperties'
    { _pjpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PigJobProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pjpAddtional'
pigJobProperties
    :: HashMap Text Text -- ^ 'pjpAddtional'
    -> PigJobProperties
pigJobProperties pPjpAddtional_ =
    PigJobProperties'
    { _pjpAddtional = _Coerce # pPjpAddtional_
    }

pjpAddtional :: Lens' PigJobProperties (HashMap Text Text)
pjpAddtional
  = lens _pjpAddtional (\ s a -> s{_pjpAddtional = a})
      . _Coerce

instance FromJSON PigJobProperties where
        parseJSON
          = withObject "PigJobProperties"
              (\ o -> PigJobProperties' <$> (parseJSONObject o))

instance ToJSON PigJobProperties where
        toJSON = toJSON . _pjpAddtional

-- | The cluster config.
--
-- /See:/ 'clusterConfig' smart constructor.
data ClusterConfig = ClusterConfig'
    { _ccWorkerConfig          :: !(Maybe InstanceGroupConfig)
    , _ccInitializationActions :: !(Maybe [NodeInitializationAction])
    , _ccMasterConfig          :: !(Maybe InstanceGroupConfig)
    , _ccGceClusterConfig      :: !(Maybe GceClusterConfig)
    , _ccConfigBucket          :: !(Maybe Text)
    , _ccEncryptionConfig      :: !(Maybe EncryptionConfig)
    , _ccSoftwareConfig        :: !(Maybe SoftwareConfig)
    , _ccSecondaryWorkerConfig :: !(Maybe InstanceGroupConfig)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ccWorkerConfig'
--
-- * 'ccInitializationActions'
--
-- * 'ccMasterConfig'
--
-- * 'ccGceClusterConfig'
--
-- * 'ccConfigBucket'
--
-- * 'ccEncryptionConfig'
--
-- * 'ccSoftwareConfig'
--
-- * 'ccSecondaryWorkerConfig'
clusterConfig
    :: ClusterConfig
clusterConfig =
    ClusterConfig'
    { _ccWorkerConfig = Nothing
    , _ccInitializationActions = Nothing
    , _ccMasterConfig = Nothing
    , _ccGceClusterConfig = Nothing
    , _ccConfigBucket = Nothing
    , _ccEncryptionConfig = Nothing
    , _ccSoftwareConfig = Nothing
    , _ccSecondaryWorkerConfig = Nothing
    }

-- | Optional. The Compute Engine config settings for worker instances in a
-- cluster.
ccWorkerConfig :: Lens' ClusterConfig (Maybe InstanceGroupConfig)
ccWorkerConfig
  = lens _ccWorkerConfig
      (\ s a -> s{_ccWorkerConfig = a})

-- | Optional. Commands to execute on each node after config is completed. By
-- default, executables are run on master and all worker nodes. You can
-- test a node\'s role metadata to run an executable on a master or worker
-- node, as shown below using curl (you can also use wget):
-- ROLE=$(curl -H Metadata-Flavor:Google http:\/\/metadata\/computeMetadata\/v1\/instance\/attributes\/dataproc-role) if [[ \"${ROLE}\"
-- == \'Master\' ]]; then ... master specific actions ... else ... worker
-- specific actions ... fi
ccInitializationActions :: Lens' ClusterConfig [NodeInitializationAction]
ccInitializationActions
  = lens _ccInitializationActions
      (\ s a -> s{_ccInitializationActions = a})
      . _Default
      . _Coerce

-- | Optional. The Compute Engine config settings for the master instance in
-- a cluster.
ccMasterConfig :: Lens' ClusterConfig (Maybe InstanceGroupConfig)
ccMasterConfig
  = lens _ccMasterConfig
      (\ s a -> s{_ccMasterConfig = a})

-- | Required. The shared Compute Engine config settings for all instances in
-- a cluster.
ccGceClusterConfig :: Lens' ClusterConfig (Maybe GceClusterConfig)
ccGceClusterConfig
  = lens _ccGceClusterConfig
      (\ s a -> s{_ccGceClusterConfig = a})

-- | Optional. A Cloud Storage staging bucket used for sharing generated SSH
-- keys and config. If you do not specify a staging bucket, Cloud Dataproc
-- will determine an appropriate Cloud Storage location (US, ASIA, or EU)
-- for your cluster\'s staging bucket according to the Google Compute
-- Engine zone where your cluster is deployed, and then it will create and
-- manage this project-level, per-location bucket for you.
ccConfigBucket :: Lens' ClusterConfig (Maybe Text)
ccConfigBucket
  = lens _ccConfigBucket
      (\ s a -> s{_ccConfigBucket = a})

-- | Optional. Encryption settings for the cluster.
ccEncryptionConfig :: Lens' ClusterConfig (Maybe EncryptionConfig)
ccEncryptionConfig
  = lens _ccEncryptionConfig
      (\ s a -> s{_ccEncryptionConfig = a})

-- | Optional. The config settings for software inside the cluster.
ccSoftwareConfig :: Lens' ClusterConfig (Maybe SoftwareConfig)
ccSoftwareConfig
  = lens _ccSoftwareConfig
      (\ s a -> s{_ccSoftwareConfig = a})

-- | Optional. The Compute Engine config settings for additional worker
-- instances in a cluster.
ccSecondaryWorkerConfig :: Lens' ClusterConfig (Maybe InstanceGroupConfig)
ccSecondaryWorkerConfig
  = lens _ccSecondaryWorkerConfig
      (\ s a -> s{_ccSecondaryWorkerConfig = a})

instance FromJSON ClusterConfig where
        parseJSON
          = withObject "ClusterConfig"
              (\ o ->
                 ClusterConfig' <$>
                   (o .:? "workerConfig") <*>
                     (o .:? "initializationActions" .!= mempty)
                     <*> (o .:? "masterConfig")
                     <*> (o .:? "gceClusterConfig")
                     <*> (o .:? "configBucket")
                     <*> (o .:? "encryptionConfig")
                     <*> (o .:? "softwareConfig")
                     <*> (o .:? "secondaryWorkerConfig"))

instance ToJSON ClusterConfig where
        toJSON ClusterConfig'{..}
          = object
              (catMaybes
                 [("workerConfig" .=) <$> _ccWorkerConfig,
                  ("initializationActions" .=) <$>
                    _ccInitializationActions,
                  ("masterConfig" .=) <$> _ccMasterConfig,
                  ("gceClusterConfig" .=) <$> _ccGceClusterConfig,
                  ("configBucket" .=) <$> _ccConfigBucket,
                  ("encryptionConfig" .=) <$> _ccEncryptionConfig,
                  ("softwareConfig" .=) <$> _ccSoftwareConfig,
                  ("secondaryWorkerConfig" .=) <$>
                    _ccSecondaryWorkerConfig])

-- | A request to instantiate a workflow template.
--
-- /See:/ 'instantiateWorkflowTemplateRequest' smart constructor.
data InstantiateWorkflowTemplateRequest = InstantiateWorkflowTemplateRequest'
    { _iwtrRequestId  :: !(Maybe Text)
    , _iwtrVersion    :: !(Maybe (Textual Int32))
    , _iwtrParameters :: !(Maybe InstantiateWorkflowTemplateRequestParameters)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'InstantiateWorkflowTemplateRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'iwtrRequestId'
--
-- * 'iwtrVersion'
--
-- * 'iwtrParameters'
instantiateWorkflowTemplateRequest
    :: InstantiateWorkflowTemplateRequest
instantiateWorkflowTemplateRequest =
    InstantiateWorkflowTemplateRequest'
    { _iwtrRequestId = Nothing
    , _iwtrVersion = Nothing
    , _iwtrParameters = Nothing
    }

-- | Optional. A tag that prevents multiple concurrent workflow instances
-- with the same tag from running. This mitigates risk of concurrent
-- instances started due to retries.It is recommended to always set this
-- value to a UUID
-- (https:\/\/en.wikipedia.org\/wiki\/Universally_unique_identifier).The
-- tag must contain only letters (a-z, A-Z), numbers (0-9), underscores
-- (_), and hyphens (-). The maximum length is 40 characters.
iwtrRequestId :: Lens' InstantiateWorkflowTemplateRequest (Maybe Text)
iwtrRequestId
  = lens _iwtrRequestId
      (\ s a -> s{_iwtrRequestId = a})

-- | Optional. The version of workflow template to instantiate. If specified,
-- the workflow will be instantiated only if the current version of the
-- workflow template has the supplied version.This option cannot be used to
-- instantiate a previous version of workflow template.
iwtrVersion :: Lens' InstantiateWorkflowTemplateRequest (Maybe Int32)
iwtrVersion
  = lens _iwtrVersion (\ s a -> s{_iwtrVersion = a}) .
      mapping _Coerce

-- | Optional. Map from parameter names to values that should be used for
-- those parameters. Values may not exceed 100 characters.
iwtrParameters :: Lens' InstantiateWorkflowTemplateRequest (Maybe InstantiateWorkflowTemplateRequestParameters)
iwtrParameters
  = lens _iwtrParameters
      (\ s a -> s{_iwtrParameters = a})

instance FromJSON InstantiateWorkflowTemplateRequest
         where
        parseJSON
          = withObject "InstantiateWorkflowTemplateRequest"
              (\ o ->
                 InstantiateWorkflowTemplateRequest' <$>
                   (o .:? "requestId") <*> (o .:? "version") <*>
                     (o .:? "parameters"))

instance ToJSON InstantiateWorkflowTemplateRequest
         where
        toJSON InstantiateWorkflowTemplateRequest'{..}
          = object
              (catMaybes
                 [("requestId" .=) <$> _iwtrRequestId,
                  ("version" .=) <$> _iwtrVersion,
                  ("parameters" .=) <$> _iwtrParameters])

-- | Optional. A mapping of property names to values, used to configure
-- Hadoop. Properties that conflict with values set by the Cloud Dataproc
-- API may be overwritten. Can include properties set in
-- \/etc\/hadoop\/conf\/*-site and classes in user code.
--
-- /See:/ 'hadoopJobProperties' smart constructor.
newtype HadoopJobProperties = HadoopJobProperties'
    { _hjpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'HadoopJobProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'hjpAddtional'
hadoopJobProperties
    :: HashMap Text Text -- ^ 'hjpAddtional'
    -> HadoopJobProperties
hadoopJobProperties pHjpAddtional_ =
    HadoopJobProperties'
    { _hjpAddtional = _Coerce # pHjpAddtional_
    }

hjpAddtional :: Lens' HadoopJobProperties (HashMap Text Text)
hjpAddtional
  = lens _hjpAddtional (\ s a -> s{_hjpAddtional = a})
      . _Coerce

instance FromJSON HadoopJobProperties where
        parseJSON
          = withObject "HadoopJobProperties"
              (\ o -> HadoopJobProperties' <$> (parseJSONObject o))

instance ToJSON HadoopJobProperties where
        toJSON = toJSON . _hjpAddtional

-- | A Cloud Dataproc workflow template resource.
--
-- /See:/ 'workflowTemplate' smart constructor.
data WorkflowTemplate = WorkflowTemplate'
    { _wtJobs       :: !(Maybe [OrderedJob])
    , _wtUpdateTime :: !(Maybe DateTime')
    , _wtName       :: !(Maybe Text)
    , _wtVersion    :: !(Maybe (Textual Int32))
    , _wtParameters :: !(Maybe [TemplateParameter])
    , _wtId         :: !(Maybe Text)
    , _wtLabels     :: !(Maybe WorkflowTemplateLabels)
    , _wtCreateTime :: !(Maybe DateTime')
    , _wtPlacement  :: !(Maybe WorkflowTemplatePlacement)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkflowTemplate' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wtJobs'
--
-- * 'wtUpdateTime'
--
-- * 'wtName'
--
-- * 'wtVersion'
--
-- * 'wtParameters'
--
-- * 'wtId'
--
-- * 'wtLabels'
--
-- * 'wtCreateTime'
--
-- * 'wtPlacement'
workflowTemplate
    :: WorkflowTemplate
workflowTemplate =
    WorkflowTemplate'
    { _wtJobs = Nothing
    , _wtUpdateTime = Nothing
    , _wtName = Nothing
    , _wtVersion = Nothing
    , _wtParameters = Nothing
    , _wtId = Nothing
    , _wtLabels = Nothing
    , _wtCreateTime = Nothing
    , _wtPlacement = Nothing
    }

-- | Required. The Directed Acyclic Graph of Jobs to submit.
wtJobs :: Lens' WorkflowTemplate [OrderedJob]
wtJobs
  = lens _wtJobs (\ s a -> s{_wtJobs = a}) . _Default .
      _Coerce

-- | Output only. The time template was last updated.
wtUpdateTime :: Lens' WorkflowTemplate (Maybe UTCTime)
wtUpdateTime
  = lens _wtUpdateTime (\ s a -> s{_wtUpdateTime = a})
      . mapping _DateTime

-- | Output only. The \"resource name\" of the template, as described in
-- https:\/\/cloud.google.com\/apis\/design\/resource_names of the form
-- projects\/{project_id}\/regions\/{region}\/workflowTemplates\/{template_id}
wtName :: Lens' WorkflowTemplate (Maybe Text)
wtName = lens _wtName (\ s a -> s{_wtName = a})

-- | Optional. Used to perform a consistent read-modify-write.This field
-- should be left blank for a CreateWorkflowTemplate request. It is
-- required for an UpdateWorkflowTemplate request, and must match the
-- current server version. A typical update template flow would fetch the
-- current template with a GetWorkflowTemplate request, which will return
-- the current template with the version field filled in with the current
-- server version. The user updates other fields in the template, then
-- returns it as part of the UpdateWorkflowTemplate request.
wtVersion :: Lens' WorkflowTemplate (Maybe Int32)
wtVersion
  = lens _wtVersion (\ s a -> s{_wtVersion = a}) .
      mapping _Coerce

-- | Optional. Template parameters whose values are substituted into the
-- template. Values for parameters must be provided when the template is
-- instantiated.
wtParameters :: Lens' WorkflowTemplate [TemplateParameter]
wtParameters
  = lens _wtParameters (\ s a -> s{_wtParameters = a})
      . _Default
      . _Coerce

-- | Required. The template id.The id must contain only letters (a-z, A-Z),
-- numbers (0-9), underscores (_), and hyphens (-). Cannot begin or end
-- with underscore or hyphen. Must consist of between 3 and 50 characters.
wtId :: Lens' WorkflowTemplate (Maybe Text)
wtId = lens _wtId (\ s a -> s{_wtId = a})

-- | Optional. The labels to associate with this template. These labels will
-- be propagated to all jobs and clusters created by the workflow
-- instance.Label keys must contain 1 to 63 characters, and must conform to
-- RFC 1035 (https:\/\/www.ietf.org\/rfc\/rfc1035.txt).Label values may be
-- empty, but, if present, must contain 1 to 63 characters, and must
-- conform to RFC 1035 (https:\/\/www.ietf.org\/rfc\/rfc1035.txt).No more
-- than 32 labels can be associated with a template.
wtLabels :: Lens' WorkflowTemplate (Maybe WorkflowTemplateLabels)
wtLabels = lens _wtLabels (\ s a -> s{_wtLabels = a})

-- | Output only. The time template was created.
wtCreateTime :: Lens' WorkflowTemplate (Maybe UTCTime)
wtCreateTime
  = lens _wtCreateTime (\ s a -> s{_wtCreateTime = a})
      . mapping _DateTime

-- | Required. WorkflowTemplate scheduling information.
wtPlacement :: Lens' WorkflowTemplate (Maybe WorkflowTemplatePlacement)
wtPlacement
  = lens _wtPlacement (\ s a -> s{_wtPlacement = a})

instance FromJSON WorkflowTemplate where
        parseJSON
          = withObject "WorkflowTemplate"
              (\ o ->
                 WorkflowTemplate' <$>
                   (o .:? "jobs" .!= mempty) <*> (o .:? "updateTime")
                     <*> (o .:? "name")
                     <*> (o .:? "version")
                     <*> (o .:? "parameters" .!= mempty)
                     <*> (o .:? "id")
                     <*> (o .:? "labels")
                     <*> (o .:? "createTime")
                     <*> (o .:? "placement"))

instance ToJSON WorkflowTemplate where
        toJSON WorkflowTemplate'{..}
          = object
              (catMaybes
                 [("jobs" .=) <$> _wtJobs,
                  ("updateTime" .=) <$> _wtUpdateTime,
                  ("name" .=) <$> _wtName,
                  ("version" .=) <$> _wtVersion,
                  ("parameters" .=) <$> _wtParameters,
                  ("id" .=) <$> _wtId, ("labels" .=) <$> _wtLabels,
                  ("createTime" .=) <$> _wtCreateTime,
                  ("placement" .=) <$> _wtPlacement])

-- | The status of the operation.
--
-- /See:/ 'clusterOperationStatus' smart constructor.
data ClusterOperationStatus = ClusterOperationStatus'
    { _cosState          :: !(Maybe ClusterOperationStatusState)
    , _cosInnerState     :: !(Maybe Text)
    , _cosStateStartTime :: !(Maybe DateTime')
    , _cosDetails        :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterOperationStatus' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cosState'
--
-- * 'cosInnerState'
--
-- * 'cosStateStartTime'
--
-- * 'cosDetails'
clusterOperationStatus
    :: ClusterOperationStatus
clusterOperationStatus =
    ClusterOperationStatus'
    { _cosState = Nothing
    , _cosInnerState = Nothing
    , _cosStateStartTime = Nothing
    , _cosDetails = Nothing
    }

-- | Output only. A message containing the operation state.
cosState :: Lens' ClusterOperationStatus (Maybe ClusterOperationStatusState)
cosState = lens _cosState (\ s a -> s{_cosState = a})

-- | Output only. A message containing the detailed operation state.
cosInnerState :: Lens' ClusterOperationStatus (Maybe Text)
cosInnerState
  = lens _cosInnerState
      (\ s a -> s{_cosInnerState = a})

-- | Output only. The time this state was entered.
cosStateStartTime :: Lens' ClusterOperationStatus (Maybe UTCTime)
cosStateStartTime
  = lens _cosStateStartTime
      (\ s a -> s{_cosStateStartTime = a})
      . mapping _DateTime

-- | Output only. A message containing any operation metadata details.
cosDetails :: Lens' ClusterOperationStatus (Maybe Text)
cosDetails
  = lens _cosDetails (\ s a -> s{_cosDetails = a})

instance FromJSON ClusterOperationStatus where
        parseJSON
          = withObject "ClusterOperationStatus"
              (\ o ->
                 ClusterOperationStatus' <$>
                   (o .:? "state") <*> (o .:? "innerState") <*>
                     (o .:? "stateStartTime")
                     <*> (o .:? "details"))

instance ToJSON ClusterOperationStatus where
        toJSON ClusterOperationStatus'{..}
          = object
              (catMaybes
                 [("state" .=) <$> _cosState,
                  ("innerState" .=) <$> _cosInnerState,
                  ("stateStartTime" .=) <$> _cosStateStartTime,
                  ("details" .=) <$> _cosDetails])

--
-- /See:/ 'statusDetailsItem' smart constructor.
newtype StatusDetailsItem = StatusDetailsItem'
    { _sdiAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StatusDetailsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sdiAddtional'
statusDetailsItem
    :: HashMap Text JSONValue -- ^ 'sdiAddtional'
    -> StatusDetailsItem
statusDetailsItem pSdiAddtional_ =
    StatusDetailsItem'
    { _sdiAddtional = _Coerce # pSdiAddtional_
    }

-- | Properties of the object. Contains field \'type with type URL.
sdiAddtional :: Lens' StatusDetailsItem (HashMap Text JSONValue)
sdiAddtional
  = lens _sdiAddtional (\ s a -> s{_sdiAddtional = a})
      . _Coerce

instance FromJSON StatusDetailsItem where
        parseJSON
          = withObject "StatusDetailsItem"
              (\ o -> StatusDetailsItem' <$> (parseJSONObject o))

instance ToJSON StatusDetailsItem where
        toJSON = toJSON . _sdiAddtional

-- | Optional. A mapping of property names to values, used to configure Spark
-- SQL\'s SparkConf. Properties that conflict with values set by the Cloud
-- Dataproc API may be overwritten.
--
-- /See:/ 'sparkSQLJobProperties' smart constructor.
newtype SparkSQLJobProperties = SparkSQLJobProperties'
    { _ssqljpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SparkSQLJobProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ssqljpAddtional'
sparkSQLJobProperties
    :: HashMap Text Text -- ^ 'ssqljpAddtional'
    -> SparkSQLJobProperties
sparkSQLJobProperties pSsqljpAddtional_ =
    SparkSQLJobProperties'
    { _ssqljpAddtional = _Coerce # pSsqljpAddtional_
    }

ssqljpAddtional :: Lens' SparkSQLJobProperties (HashMap Text Text)
ssqljpAddtional
  = lens _ssqljpAddtional
      (\ s a -> s{_ssqljpAddtional = a})
      . _Coerce

instance FromJSON SparkSQLJobProperties where
        parseJSON
          = withObject "SparkSQLJobProperties"
              (\ o ->
                 SparkSQLJobProperties' <$> (parseJSONObject o))

instance ToJSON SparkSQLJobProperties where
        toJSON = toJSON . _ssqljpAddtional

-- | Optional. The labels to associate with this template. These labels will
-- be propagated to all jobs and clusters created by the workflow
-- instance.Label keys must contain 1 to 63 characters, and must conform to
-- RFC 1035 (https:\/\/www.ietf.org\/rfc\/rfc1035.txt).Label values may be
-- empty, but, if present, must contain 1 to 63 characters, and must
-- conform to RFC 1035 (https:\/\/www.ietf.org\/rfc\/rfc1035.txt).No more
-- than 32 labels can be associated with a template.
--
-- /See:/ 'workflowTemplateLabels' smart constructor.
newtype WorkflowTemplateLabels = WorkflowTemplateLabels'
    { _wtlAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkflowTemplateLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wtlAddtional'
workflowTemplateLabels
    :: HashMap Text Text -- ^ 'wtlAddtional'
    -> WorkflowTemplateLabels
workflowTemplateLabels pWtlAddtional_ =
    WorkflowTemplateLabels'
    { _wtlAddtional = _Coerce # pWtlAddtional_
    }

wtlAddtional :: Lens' WorkflowTemplateLabels (HashMap Text Text)
wtlAddtional
  = lens _wtlAddtional (\ s a -> s{_wtlAddtional = a})
      . _Coerce

instance FromJSON WorkflowTemplateLabels where
        parseJSON
          = withObject "WorkflowTemplateLabels"
              (\ o ->
                 WorkflowTemplateLabels' <$> (parseJSONObject o))

instance ToJSON WorkflowTemplateLabels where
        toJSON = toJSON . _wtlAddtional

-- | Specifies an executable to run on a fully configured node and a timeout
-- period for executable completion.
--
-- /See:/ 'nodeInitializationAction' smart constructor.
data NodeInitializationAction = NodeInitializationAction'
    { _niaExecutionTimeout :: !(Maybe GDuration)
    , _niaExecutableFile   :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'NodeInitializationAction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'niaExecutionTimeout'
--
-- * 'niaExecutableFile'
nodeInitializationAction
    :: NodeInitializationAction
nodeInitializationAction =
    NodeInitializationAction'
    { _niaExecutionTimeout = Nothing
    , _niaExecutableFile = Nothing
    }

-- | Optional. Amount of time executable has to complete. Default is 10
-- minutes. Cluster creation fails with an explanatory error message (the
-- name of the executable that caused the error and the exceeded timeout
-- period) if the executable is not completed at end of the timeout period.
niaExecutionTimeout :: Lens' NodeInitializationAction (Maybe Scientific)
niaExecutionTimeout
  = lens _niaExecutionTimeout
      (\ s a -> s{_niaExecutionTimeout = a})
      . mapping _GDuration

-- | Required. Cloud Storage URI of executable file.
niaExecutableFile :: Lens' NodeInitializationAction (Maybe Text)
niaExecutableFile
  = lens _niaExecutableFile
      (\ s a -> s{_niaExecutableFile = a})

instance FromJSON NodeInitializationAction where
        parseJSON
          = withObject "NodeInitializationAction"
              (\ o ->
                 NodeInitializationAction' <$>
                   (o .:? "executionTimeout") <*>
                     (o .:? "executableFile"))

instance ToJSON NodeInitializationAction where
        toJSON NodeInitializationAction'{..}
          = object
              (catMaybes
                 [("executionTimeout" .=) <$> _niaExecutionTimeout,
                  ("executableFile" .=) <$> _niaExecutableFile])

-- | The YARN metrics.
--
-- /See:/ 'clusterMetricsYarnMetrics' smart constructor.
newtype ClusterMetricsYarnMetrics = ClusterMetricsYarnMetrics'
    { _cmymAddtional :: HashMap Text (Textual Int64)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterMetricsYarnMetrics' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cmymAddtional'
clusterMetricsYarnMetrics
    :: HashMap Text Int64 -- ^ 'cmymAddtional'
    -> ClusterMetricsYarnMetrics
clusterMetricsYarnMetrics pCmymAddtional_ =
    ClusterMetricsYarnMetrics'
    { _cmymAddtional = _Coerce # pCmymAddtional_
    }

cmymAddtional :: Lens' ClusterMetricsYarnMetrics (HashMap Text Int64)
cmymAddtional
  = lens _cmymAddtional
      (\ s a -> s{_cmymAddtional = a})
      . _Coerce

instance FromJSON ClusterMetricsYarnMetrics where
        parseJSON
          = withObject "ClusterMetricsYarnMetrics"
              (\ o ->
                 ClusterMetricsYarnMetrics' <$> (parseJSONObject o))

instance ToJSON ClusterMetricsYarnMetrics where
        toJSON = toJSON . _cmymAddtional

-- | Validation based on regular expressions.
--
-- /See:/ 'regexValidation' smart constructor.
newtype RegexValidation = RegexValidation'
    { _rvRegexes :: Maybe [Text]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'RegexValidation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rvRegexes'
regexValidation
    :: RegexValidation
regexValidation =
    RegexValidation'
    { _rvRegexes = Nothing
    }

-- | Required. RE2 regular expressions used to validate the parameter\'s
-- value. The value must match the regex in its entirety (substring matches
-- are not sufficient).
rvRegexes :: Lens' RegexValidation [Text]
rvRegexes
  = lens _rvRegexes (\ s a -> s{_rvRegexes = a}) .
      _Default
      . _Coerce

instance FromJSON RegexValidation where
        parseJSON
          = withObject "RegexValidation"
              (\ o ->
                 RegexValidation' <$> (o .:? "regexes" .!= mempty))

instance ToJSON RegexValidation where
        toJSON RegexValidation'{..}
          = object (catMaybes [("regexes" .=) <$> _rvRegexes])

-- | Cloud Dataproc job config.
--
-- /See:/ 'jobPlacement' smart constructor.
data JobPlacement = JobPlacement'
    { _jpClusterUuid :: !(Maybe Text)
    , _jpClusterName :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobPlacement' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jpClusterUuid'
--
-- * 'jpClusterName'
jobPlacement
    :: JobPlacement
jobPlacement =
    JobPlacement'
    { _jpClusterUuid = Nothing
    , _jpClusterName = Nothing
    }

-- | Output only. A cluster UUID generated by the Cloud Dataproc service when
-- the job is submitted.
jpClusterUuid :: Lens' JobPlacement (Maybe Text)
jpClusterUuid
  = lens _jpClusterUuid
      (\ s a -> s{_jpClusterUuid = a})

-- | Required. The name of the cluster where the job will be submitted.
jpClusterName :: Lens' JobPlacement (Maybe Text)
jpClusterName
  = lens _jpClusterName
      (\ s a -> s{_jpClusterName = a})

instance FromJSON JobPlacement where
        parseJSON
          = withObject "JobPlacement"
              (\ o ->
                 JobPlacement' <$>
                   (o .:? "clusterUuid") <*> (o .:? "clusterName"))

instance ToJSON JobPlacement where
        toJSON JobPlacement'{..}
          = object
              (catMaybes
                 [("clusterUuid" .=) <$> _jpClusterUuid,
                  ("clusterName" .=) <$> _jpClusterName])

-- | Request message for SetIamPolicy method.
--
-- /See:/ 'setIAMPolicyRequest' smart constructor.
newtype SetIAMPolicyRequest = SetIAMPolicyRequest'
    { _siprPolicy :: Maybe Policy
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SetIAMPolicyRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'siprPolicy'
setIAMPolicyRequest
    :: SetIAMPolicyRequest
setIAMPolicyRequest =
    SetIAMPolicyRequest'
    { _siprPolicy = Nothing
    }

-- | REQUIRED: The complete policy to be applied to the resource. The size of
-- the policy is limited to a few 10s of KB. An empty policy is a valid
-- policy but certain Cloud Platform services (such as Projects) might
-- reject them.
siprPolicy :: Lens' SetIAMPolicyRequest (Maybe Policy)
siprPolicy
  = lens _siprPolicy (\ s a -> s{_siprPolicy = a})

instance FromJSON SetIAMPolicyRequest where
        parseJSON
          = withObject "SetIAMPolicyRequest"
              (\ o -> SetIAMPolicyRequest' <$> (o .:? "policy"))

instance ToJSON SetIAMPolicyRequest where
        toJSON SetIAMPolicyRequest'{..}
          = object (catMaybes [("policy" .=) <$> _siprPolicy])

-- | A configurable parameter that replaces one or more fields in the
-- template. Parameterizable fields: - Labels - File uris - Job properties
-- - Job arguments - Script variables - Main class (in HadoopJob and
-- SparkJob) - Zone (in ClusterSelector)
--
-- /See:/ 'templateParameter' smart constructor.
data TemplateParameter = TemplateParameter'
    { _tpName        :: !(Maybe Text)
    , _tpValidation  :: !(Maybe ParameterValidation)
    , _tpDescription :: !(Maybe Text)
    , _tpFields      :: !(Maybe [Text])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'TemplateParameter' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tpName'
--
-- * 'tpValidation'
--
-- * 'tpDescription'
--
-- * 'tpFields'
templateParameter
    :: TemplateParameter
templateParameter =
    TemplateParameter'
    { _tpName = Nothing
    , _tpValidation = Nothing
    , _tpDescription = Nothing
    , _tpFields = Nothing
    }

-- | Required. Parameter name. The parameter name is used as the key, and
-- paired with the parameter value, which are passed to the template when
-- the template is instantiated. The name must contain only capital letters
-- (A-Z), numbers (0-9), and underscores (_), and must not start with a
-- number. The maximum length is 40 characters.
tpName :: Lens' TemplateParameter (Maybe Text)
tpName = lens _tpName (\ s a -> s{_tpName = a})

-- | Optional. Validation rules to be applied to this parameter\'s value.
tpValidation :: Lens' TemplateParameter (Maybe ParameterValidation)
tpValidation
  = lens _tpValidation (\ s a -> s{_tpValidation = a})

-- | Optional. Brief description of the parameter. Must not exceed 1024
-- characters.
tpDescription :: Lens' TemplateParameter (Maybe Text)
tpDescription
  = lens _tpDescription
      (\ s a -> s{_tpDescription = a})

-- | Required. Paths to all fields that the parameter replaces. A field is
-- allowed to appear in at most one parameter\'s list of field paths.A
-- field path is similar in syntax to a google.protobuf.FieldMask. For
-- example, a field path that references the zone field of a workflow
-- template\'s cluster selector would be specified as
-- placement.clusterSelector.zone.Also, field paths can reference fields
-- using the following syntax: Values in maps can be referenced by key:
-- labels\'key\' placement.clusterSelector.clusterLabels\'key\'
-- placement.managedCluster.labels\'key\'
-- placement.clusterSelector.clusterLabels\'key\'
-- jobs\'step-id\'.labels\'key\' Jobs in the jobs list can be referenced by
-- step-id: jobs\'step-id\'.hadoopJob.mainJarFileUri
-- jobs\'step-id\'.hiveJob.queryFileUri
-- jobs\'step-id\'.pySparkJob.mainPythonFileUri
-- jobs\'step-id\'.hadoopJob.jarFileUris0
-- jobs\'step-id\'.hadoopJob.archiveUris0
-- jobs\'step-id\'.hadoopJob.fileUris0
-- jobs\'step-id\'.pySparkJob.pythonFileUris0 Items in repeated fields can
-- be referenced by a zero-based index: jobs\'step-id\'.sparkJob.args0
-- Other examples: jobs\'step-id\'.hadoopJob.properties\'key\'
-- jobs\'step-id\'.hadoopJob.args0
-- jobs\'step-id\'.hiveJob.scriptVariables\'key\'
-- jobs\'step-id\'.hadoopJob.mainJarFileUri
-- placement.clusterSelector.zoneIt may not be possible to parameterize
-- maps and repeated fields in their entirety since only individual map
-- values and individual items in repeated fields can be referenced. For
-- example, the following field paths are invalid:
-- placement.clusterSelector.clusterLabels jobs\'step-id\'.sparkJob.args
tpFields :: Lens' TemplateParameter [Text]
tpFields
  = lens _tpFields (\ s a -> s{_tpFields = a}) .
      _Default
      . _Coerce

instance FromJSON TemplateParameter where
        parseJSON
          = withObject "TemplateParameter"
              (\ o ->
                 TemplateParameter' <$>
                   (o .:? "name") <*> (o .:? "validation") <*>
                     (o .:? "description")
                     <*> (o .:? "fields" .!= mempty))

instance ToJSON TemplateParameter where
        toJSON TemplateParameter'{..}
          = object
              (catMaybes
                 [("name" .=) <$> _tpName,
                  ("validation" .=) <$> _tpValidation,
                  ("description" .=) <$> _tpDescription,
                  ("fields" .=) <$> _tpFields])

-- | Common config settings for resources of Compute Engine cluster
-- instances, applicable to all instances in the cluster.
--
-- /See:/ 'gceClusterConfig' smart constructor.
data GceClusterConfig = GceClusterConfig'
    { _gccSubnetworkURI        :: !(Maybe Text)
    , _gccInternalIPOnly       :: !(Maybe Bool)
    , _gccNetworkURI           :: !(Maybe Text)
    , _gccZoneURI              :: !(Maybe Text)
    , _gccServiceAccount       :: !(Maybe Text)
    , _gccMetadata             :: !(Maybe GceClusterConfigMetadata)
    , _gccServiceAccountScopes :: !(Maybe [Text])
    , _gccTags                 :: !(Maybe [Text])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'GceClusterConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gccSubnetworkURI'
--
-- * 'gccInternalIPOnly'
--
-- * 'gccNetworkURI'
--
-- * 'gccZoneURI'
--
-- * 'gccServiceAccount'
--
-- * 'gccMetadata'
--
-- * 'gccServiceAccountScopes'
--
-- * 'gccTags'
gceClusterConfig
    :: GceClusterConfig
gceClusterConfig =
    GceClusterConfig'
    { _gccSubnetworkURI = Nothing
    , _gccInternalIPOnly = Nothing
    , _gccNetworkURI = Nothing
    , _gccZoneURI = Nothing
    , _gccServiceAccount = Nothing
    , _gccMetadata = Nothing
    , _gccServiceAccountScopes = Nothing
    , _gccTags = Nothing
    }

-- | Optional. The Compute Engine subnetwork to be used for machine
-- communications. Cannot be specified with network_uri.A full URL, partial
-- URI, or short name are valid. Examples:
-- https:\/\/www.googleapis.com\/compute\/v1\/projects\/[project_id]\/regions\/us-east1\/sub0
-- projects\/[project_id]\/regions\/us-east1\/sub0 sub0
gccSubnetworkURI :: Lens' GceClusterConfig (Maybe Text)
gccSubnetworkURI
  = lens _gccSubnetworkURI
      (\ s a -> s{_gccSubnetworkURI = a})

-- | Optional. If true, all instances in the cluster will only have internal
-- IP addresses. By default, clusters are not restricted to internal IP
-- addresses, and will have ephemeral external IP addresses assigned to
-- each instance. This internal_ip_only restriction can only be enabled for
-- subnetwork enabled networks, and all off-cluster dependencies must be
-- configured to be accessible without external IP addresses.
gccInternalIPOnly :: Lens' GceClusterConfig (Maybe Bool)
gccInternalIPOnly
  = lens _gccInternalIPOnly
      (\ s a -> s{_gccInternalIPOnly = a})

-- | Optional. The Compute Engine network to be used for machine
-- communications. Cannot be specified with subnetwork_uri. If neither
-- network_uri nor subnetwork_uri is specified, the \"default\" network of
-- the project is used, if it exists. Cannot be a \"Custom Subnet Network\"
-- (see Using Subnetworks for more information).A full URL, partial URI, or
-- short name are valid. Examples:
-- https:\/\/www.googleapis.com\/compute\/v1\/projects\/[project_id]\/regions\/global\/default
-- projects\/[project_id]\/regions\/global\/default default
gccNetworkURI :: Lens' GceClusterConfig (Maybe Text)
gccNetworkURI
  = lens _gccNetworkURI
      (\ s a -> s{_gccNetworkURI = a})

-- | Optional. The zone where the Compute Engine cluster will be located. On
-- a create request, it is required in the \"global\" region. If omitted in
-- a non-global Cloud Dataproc region, the service will pick a zone in the
-- corresponding Compute Engine region. On a get request, zone will always
-- be present.A full URL, partial URI, or short name are valid. Examples:
-- https:\/\/www.googleapis.com\/compute\/v1\/projects\/[project_id]\/zones\/[zone]
-- projects\/[project_id]\/zones\/[zone] us-central1-f
gccZoneURI :: Lens' GceClusterConfig (Maybe Text)
gccZoneURI
  = lens _gccZoneURI (\ s a -> s{_gccZoneURI = a})

-- | Optional. The service account of the instances. Defaults to the default
-- Compute Engine service account. Custom service accounts need permissions
-- equivalent to the following IAM roles: roles\/logging.logWriter
-- roles\/storage.objectAdmin(see
-- https:\/\/cloud.google.com\/compute\/docs\/access\/service-accounts#custom_service_accounts
-- for more information). Example:
-- [account_id]\'[project_id].iam.gserviceaccount.com
gccServiceAccount :: Lens' GceClusterConfig (Maybe Text)
gccServiceAccount
  = lens _gccServiceAccount
      (\ s a -> s{_gccServiceAccount = a})

-- | The Compute Engine metadata entries to add to all instances (see Project
-- and instance metadata
-- (https:\/\/cloud.google.com\/compute\/docs\/storing-retrieving-metadata#project_and_instance_metadata)).
gccMetadata :: Lens' GceClusterConfig (Maybe GceClusterConfigMetadata)
gccMetadata
  = lens _gccMetadata (\ s a -> s{_gccMetadata = a})

-- | Optional. The URIs of service account scopes to be included in Compute
-- Engine instances. The following base set of scopes is always included:
-- https:\/\/www.googleapis.com\/auth\/cloud.useraccounts.readonly
-- https:\/\/www.googleapis.com\/auth\/devstorage.read_write
-- https:\/\/www.googleapis.com\/auth\/logging.writeIf no scopes are
-- specified, the following defaults are also provided:
-- https:\/\/www.googleapis.com\/auth\/bigquery
-- https:\/\/www.googleapis.com\/auth\/bigtable.admin.table
-- https:\/\/www.googleapis.com\/auth\/bigtable.data
-- https:\/\/www.googleapis.com\/auth\/devstorage.full_control
gccServiceAccountScopes :: Lens' GceClusterConfig [Text]
gccServiceAccountScopes
  = lens _gccServiceAccountScopes
      (\ s a -> s{_gccServiceAccountScopes = a})
      . _Default
      . _Coerce

-- | The Compute Engine tags to add to all instances (see Tagging instances).
gccTags :: Lens' GceClusterConfig [Text]
gccTags
  = lens _gccTags (\ s a -> s{_gccTags = a}) . _Default
      . _Coerce

instance FromJSON GceClusterConfig where
        parseJSON
          = withObject "GceClusterConfig"
              (\ o ->
                 GceClusterConfig' <$>
                   (o .:? "subnetworkUri") <*> (o .:? "internalIpOnly")
                     <*> (o .:? "networkUri")
                     <*> (o .:? "zoneUri")
                     <*> (o .:? "serviceAccount")
                     <*> (o .:? "metadata")
                     <*> (o .:? "serviceAccountScopes" .!= mempty)
                     <*> (o .:? "tags" .!= mempty))

instance ToJSON GceClusterConfig where
        toJSON GceClusterConfig'{..}
          = object
              (catMaybes
                 [("subnetworkUri" .=) <$> _gccSubnetworkURI,
                  ("internalIpOnly" .=) <$> _gccInternalIPOnly,
                  ("networkUri" .=) <$> _gccNetworkURI,
                  ("zoneUri" .=) <$> _gccZoneURI,
                  ("serviceAccount" .=) <$> _gccServiceAccount,
                  ("metadata" .=) <$> _gccMetadata,
                  ("serviceAccountScopes" .=) <$>
                    _gccServiceAccountScopes,
                  ("tags" .=) <$> _gccTags])

-- | A response to a request to list workflow templates in a project.
--
-- /See:/ 'listWorkflowTemplatesResponse' smart constructor.
data ListWorkflowTemplatesResponse = ListWorkflowTemplatesResponse'
    { _lwtrNextPageToken :: !(Maybe Text)
    , _lwtrTemplates     :: !(Maybe [WorkflowTemplate])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListWorkflowTemplatesResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lwtrNextPageToken'
--
-- * 'lwtrTemplates'
listWorkflowTemplatesResponse
    :: ListWorkflowTemplatesResponse
listWorkflowTemplatesResponse =
    ListWorkflowTemplatesResponse'
    { _lwtrNextPageToken = Nothing
    , _lwtrTemplates = Nothing
    }

-- | Output only. This token is included in the response if there are more
-- results to fetch. To fetch additional results, provide this value as the
-- page_token in a subsequent 'ListWorkflowTemplatesRequest'.
lwtrNextPageToken :: Lens' ListWorkflowTemplatesResponse (Maybe Text)
lwtrNextPageToken
  = lens _lwtrNextPageToken
      (\ s a -> s{_lwtrNextPageToken = a})

-- | Output only. WorkflowTemplates list.
lwtrTemplates :: Lens' ListWorkflowTemplatesResponse [WorkflowTemplate]
lwtrTemplates
  = lens _lwtrTemplates
      (\ s a -> s{_lwtrTemplates = a})
      . _Default
      . _Coerce

instance FromJSON ListWorkflowTemplatesResponse where
        parseJSON
          = withObject "ListWorkflowTemplatesResponse"
              (\ o ->
                 ListWorkflowTemplatesResponse' <$>
                   (o .:? "nextPageToken") <*>
                     (o .:? "templates" .!= mempty))

instance ToJSON ListWorkflowTemplatesResponse where
        toJSON ListWorkflowTemplatesResponse'{..}
          = object
              (catMaybes
                 [("nextPageToken" .=) <$> _lwtrNextPageToken,
                  ("templates" .=) <$> _lwtrTemplates])

-- | The Compute Engine metadata entries to add to all instances (see Project
-- and instance metadata
-- (https:\/\/cloud.google.com\/compute\/docs\/storing-retrieving-metadata#project_and_instance_metadata)).
--
-- /See:/ 'gceClusterConfigMetadata' smart constructor.
newtype GceClusterConfigMetadata = GceClusterConfigMetadata'
    { _gccmAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'GceClusterConfigMetadata' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gccmAddtional'
gceClusterConfigMetadata
    :: HashMap Text Text -- ^ 'gccmAddtional'
    -> GceClusterConfigMetadata
gceClusterConfigMetadata pGccmAddtional_ =
    GceClusterConfigMetadata'
    { _gccmAddtional = _Coerce # pGccmAddtional_
    }

gccmAddtional :: Lens' GceClusterConfigMetadata (HashMap Text Text)
gccmAddtional
  = lens _gccmAddtional
      (\ s a -> s{_gccmAddtional = a})
      . _Coerce

instance FromJSON GceClusterConfigMetadata where
        parseJSON
          = withObject "GceClusterConfigMetadata"
              (\ o ->
                 GceClusterConfigMetadata' <$> (parseJSONObject o))

instance ToJSON GceClusterConfigMetadata where
        toJSON = toJSON . _gccmAddtional

-- | Optional. A mapping of property names and values, used to configure
-- Hive. Properties that conflict with values set by the Cloud Dataproc API
-- may be overwritten. Can include properties set in
-- \/etc\/hadoop\/conf\/*-site.xml, \/etc\/hive\/conf\/hive-site.xml, and
-- classes in user code.
--
-- /See:/ 'hiveJobProperties' smart constructor.
newtype HiveJobProperties = HiveJobProperties'
    { _hAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'HiveJobProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'hAddtional'
hiveJobProperties
    :: HashMap Text Text -- ^ 'hAddtional'
    -> HiveJobProperties
hiveJobProperties pHAddtional_ =
    HiveJobProperties'
    { _hAddtional = _Coerce # pHAddtional_
    }

hAddtional :: Lens' HiveJobProperties (HashMap Text Text)
hAddtional
  = lens _hAddtional (\ s a -> s{_hAddtional = a}) .
      _Coerce

instance FromJSON HiveJobProperties where
        parseJSON
          = withObject "HiveJobProperties"
              (\ o -> HiveJobProperties' <$> (parseJSONObject o))

instance ToJSON HiveJobProperties where
        toJSON = toJSON . _hAddtional

-- | Map from parameter names to values that were used for those parameters.
--
-- /See:/ 'workflowMetadataParameters' smart constructor.
newtype WorkflowMetadataParameters = WorkflowMetadataParameters'
    { _wmpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkflowMetadataParameters' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wmpAddtional'
workflowMetadataParameters
    :: HashMap Text Text -- ^ 'wmpAddtional'
    -> WorkflowMetadataParameters
workflowMetadataParameters pWmpAddtional_ =
    WorkflowMetadataParameters'
    { _wmpAddtional = _Coerce # pWmpAddtional_
    }

wmpAddtional :: Lens' WorkflowMetadataParameters (HashMap Text Text)
wmpAddtional
  = lens _wmpAddtional (\ s a -> s{_wmpAddtional = a})
      . _Coerce

instance FromJSON WorkflowMetadataParameters where
        parseJSON
          = withObject "WorkflowMetadataParameters"
              (\ o ->
                 WorkflowMetadataParameters' <$> (parseJSONObject o))

instance ToJSON WorkflowMetadataParameters where
        toJSON = toJSON . _wmpAddtional

-- | Cluster that is managed by the workflow.
--
-- /See:/ 'managedCluster' smart constructor.
data ManagedCluster = ManagedCluster'
    { _mcConfig      :: !(Maybe ClusterConfig)
    , _mcClusterName :: !(Maybe Text)
    , _mcLabels      :: !(Maybe ManagedClusterLabels)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ManagedCluster' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mcConfig'
--
-- * 'mcClusterName'
--
-- * 'mcLabels'
managedCluster
    :: ManagedCluster
managedCluster =
    ManagedCluster'
    { _mcConfig = Nothing
    , _mcClusterName = Nothing
    , _mcLabels = Nothing
    }

-- | Required. The cluster configuration.
mcConfig :: Lens' ManagedCluster (Maybe ClusterConfig)
mcConfig = lens _mcConfig (\ s a -> s{_mcConfig = a})

-- | Required. The cluster name prefix. A unique cluster name will be formed
-- by appending a random suffix.The name must contain only lower-case
-- letters (a-z), numbers (0-9), and hyphens (-). Must begin with a letter.
-- Cannot begin or end with hyphen. Must consist of between 2 and 35
-- characters.
mcClusterName :: Lens' ManagedCluster (Maybe Text)
mcClusterName
  = lens _mcClusterName
      (\ s a -> s{_mcClusterName = a})

-- | Optional. The labels to associate with this cluster.Label keys must be
-- between 1 and 63 characters long, and must conform to the following PCRE
-- regular expression: \\p{Ll}\\p{Lo}{0,62}Label values must be between 1
-- and 63 characters long, and must conform to the following PCRE regular
-- expression: \\p{Ll}\\p{Lo}\\p{N}_-{0,63}No more than 32 labels can be
-- associated with a given cluster.
mcLabels :: Lens' ManagedCluster (Maybe ManagedClusterLabels)
mcLabels = lens _mcLabels (\ s a -> s{_mcLabels = a})

instance FromJSON ManagedCluster where
        parseJSON
          = withObject "ManagedCluster"
              (\ o ->
                 ManagedCluster' <$>
                   (o .:? "config") <*> (o .:? "clusterName") <*>
                     (o .:? "labels"))

instance ToJSON ManagedCluster where
        toJSON ManagedCluster'{..}
          = object
              (catMaybes
                 [("config" .=) <$> _mcConfig,
                  ("clusterName" .=) <$> _mcClusterName,
                  ("labels" .=) <$> _mcLabels])

-- | Optional. The labels to associate with this cluster. Label keys must
-- contain 1 to 63 characters, and must conform to RFC 1035
-- (https:\/\/www.ietf.org\/rfc\/rfc1035.txt). Label values may be empty,
-- but, if present, must contain 1 to 63 characters, and must conform to
-- RFC 1035 (https:\/\/www.ietf.org\/rfc\/rfc1035.txt). No more than 32
-- labels can be associated with a cluster.
--
-- /See:/ 'clusterLabels' smart constructor.
newtype ClusterLabels = ClusterLabels'
    { _clAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'clAddtional'
clusterLabels
    :: HashMap Text Text -- ^ 'clAddtional'
    -> ClusterLabels
clusterLabels pClAddtional_ =
    ClusterLabels'
    { _clAddtional = _Coerce # pClAddtional_
    }

clAddtional :: Lens' ClusterLabels (HashMap Text Text)
clAddtional
  = lens _clAddtional (\ s a -> s{_clAddtional = a}) .
      _Coerce

instance FromJSON ClusterLabels where
        parseJSON
          = withObject "ClusterLabels"
              (\ o -> ClusterLabels' <$> (parseJSONObject o))

instance ToJSON ClusterLabels where
        toJSON = toJSON . _clAddtional

-- | A Cloud Dataproc job resource.
--
-- /See:/ 'job' smart constructor.
data Job = Job'
    { _jSparkJob                :: !(Maybe SparkJob)
    , _jStatus                  :: !(Maybe JobStatus)
    , _jDriverControlFilesURI   :: !(Maybe Text)
    , _jHiveJob                 :: !(Maybe HiveJob)
    , _jReference               :: !(Maybe JobReference)
    , _jSparkSQLJob             :: !(Maybe SparkSQLJob)
    , _jHadoopJob               :: !(Maybe HadoopJob)
    , _jJobUuid                 :: !(Maybe Text)
    , _jYarnApplications        :: !(Maybe [YarnApplication])
    , _jLabels                  :: !(Maybe JobLabels)
    , _jPysparkJob              :: !(Maybe PySparkJob)
    , _jDriverOutputResourceURI :: !(Maybe Text)
    , _jScheduling              :: !(Maybe JobScheduling)
    , _jStatusHistory           :: !(Maybe [JobStatus])
    , _jPlacement               :: !(Maybe JobPlacement)
    , _jPigJob                  :: !(Maybe PigJob)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Job' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jSparkJob'
--
-- * 'jStatus'
--
-- * 'jDriverControlFilesURI'
--
-- * 'jHiveJob'
--
-- * 'jReference'
--
-- * 'jSparkSQLJob'
--
-- * 'jHadoopJob'
--
-- * 'jJobUuid'
--
-- * 'jYarnApplications'
--
-- * 'jLabels'
--
-- * 'jPysparkJob'
--
-- * 'jDriverOutputResourceURI'
--
-- * 'jScheduling'
--
-- * 'jStatusHistory'
--
-- * 'jPlacement'
--
-- * 'jPigJob'
job
    :: Job
job =
    Job'
    { _jSparkJob = Nothing
    , _jStatus = Nothing
    , _jDriverControlFilesURI = Nothing
    , _jHiveJob = Nothing
    , _jReference = Nothing
    , _jSparkSQLJob = Nothing
    , _jHadoopJob = Nothing
    , _jJobUuid = Nothing
    , _jYarnApplications = Nothing
    , _jLabels = Nothing
    , _jPysparkJob = Nothing
    , _jDriverOutputResourceURI = Nothing
    , _jScheduling = Nothing
    , _jStatusHistory = Nothing
    , _jPlacement = Nothing
    , _jPigJob = Nothing
    }

-- | Job is a Spark job.
jSparkJob :: Lens' Job (Maybe SparkJob)
jSparkJob
  = lens _jSparkJob (\ s a -> s{_jSparkJob = a})

-- | Output only. The job status. Additional application-specific status
-- information may be contained in the 'type_job' and 'yarn_applications'
-- fields.
jStatus :: Lens' Job (Maybe JobStatus)
jStatus = lens _jStatus (\ s a -> s{_jStatus = a})

-- | Output only. If present, the location of miscellaneous control files
-- which may be used as part of job setup and handling. If not present,
-- control files may be placed in the same location as driver_output_uri.
jDriverControlFilesURI :: Lens' Job (Maybe Text)
jDriverControlFilesURI
  = lens _jDriverControlFilesURI
      (\ s a -> s{_jDriverControlFilesURI = a})

-- | Job is a Hive job.
jHiveJob :: Lens' Job (Maybe HiveJob)
jHiveJob = lens _jHiveJob (\ s a -> s{_jHiveJob = a})

-- | Optional. The fully qualified reference to the job, which can be used to
-- obtain the equivalent REST path of the job resource. If this property is
-- not specified when a job is created, the server generates a 'job_id'.
jReference :: Lens' Job (Maybe JobReference)
jReference
  = lens _jReference (\ s a -> s{_jReference = a})

-- | Job is a SparkSql job.
jSparkSQLJob :: Lens' Job (Maybe SparkSQLJob)
jSparkSQLJob
  = lens _jSparkSQLJob (\ s a -> s{_jSparkSQLJob = a})

-- | Job is a Hadoop job.
jHadoopJob :: Lens' Job (Maybe HadoopJob)
jHadoopJob
  = lens _jHadoopJob (\ s a -> s{_jHadoopJob = a})

-- | Output only. A UUID that uniquely identifies a job within the project
-- over time. This is in contrast to a user-settable reference.job_id that
-- may be reused over time.
jJobUuid :: Lens' Job (Maybe Text)
jJobUuid = lens _jJobUuid (\ s a -> s{_jJobUuid = a})

-- | Output only. The collection of YARN applications spun up by this
-- job.Beta Feature: This report is available for testing purposes only. It
-- may be changed before final release.
jYarnApplications :: Lens' Job [YarnApplication]
jYarnApplications
  = lens _jYarnApplications
      (\ s a -> s{_jYarnApplications = a})
      . _Default
      . _Coerce

-- | Optional. The labels to associate with this job. Label keys must contain
-- 1 to 63 characters, and must conform to RFC 1035
-- (https:\/\/www.ietf.org\/rfc\/rfc1035.txt). Label values may be empty,
-- but, if present, must contain 1 to 63 characters, and must conform to
-- RFC 1035 (https:\/\/www.ietf.org\/rfc\/rfc1035.txt). No more than 32
-- labels can be associated with a job.
jLabels :: Lens' Job (Maybe JobLabels)
jLabels = lens _jLabels (\ s a -> s{_jLabels = a})

-- | Job is a Pyspark job.
jPysparkJob :: Lens' Job (Maybe PySparkJob)
jPysparkJob
  = lens _jPysparkJob (\ s a -> s{_jPysparkJob = a})

-- | Output only. A URI pointing to the location of the stdout of the job\'s
-- driver program.
jDriverOutputResourceURI :: Lens' Job (Maybe Text)
jDriverOutputResourceURI
  = lens _jDriverOutputResourceURI
      (\ s a -> s{_jDriverOutputResourceURI = a})

-- | Optional. Job scheduling configuration.
jScheduling :: Lens' Job (Maybe JobScheduling)
jScheduling
  = lens _jScheduling (\ s a -> s{_jScheduling = a})

-- | Output only. The previous job status.
jStatusHistory :: Lens' Job [JobStatus]
jStatusHistory
  = lens _jStatusHistory
      (\ s a -> s{_jStatusHistory = a})
      . _Default
      . _Coerce

-- | Required. Job information, including how, when, and where to run the
-- job.
jPlacement :: Lens' Job (Maybe JobPlacement)
jPlacement
  = lens _jPlacement (\ s a -> s{_jPlacement = a})

-- | Job is a Pig job.
jPigJob :: Lens' Job (Maybe PigJob)
jPigJob = lens _jPigJob (\ s a -> s{_jPigJob = a})

instance FromJSON Job where
        parseJSON
          = withObject "Job"
              (\ o ->
                 Job' <$>
                   (o .:? "sparkJob") <*> (o .:? "status") <*>
                     (o .:? "driverControlFilesUri")
                     <*> (o .:? "hiveJob")
                     <*> (o .:? "reference")
                     <*> (o .:? "sparkSqlJob")
                     <*> (o .:? "hadoopJob")
                     <*> (o .:? "jobUuid")
                     <*> (o .:? "yarnApplications" .!= mempty)
                     <*> (o .:? "labels")
                     <*> (o .:? "pysparkJob")
                     <*> (o .:? "driverOutputResourceUri")
                     <*> (o .:? "scheduling")
                     <*> (o .:? "statusHistory" .!= mempty)
                     <*> (o .:? "placement")
                     <*> (o .:? "pigJob"))

instance ToJSON Job where
        toJSON Job'{..}
          = object
              (catMaybes
                 [("sparkJob" .=) <$> _jSparkJob,
                  ("status" .=) <$> _jStatus,
                  ("driverControlFilesUri" .=) <$>
                    _jDriverControlFilesURI,
                  ("hiveJob" .=) <$> _jHiveJob,
                  ("reference" .=) <$> _jReference,
                  ("sparkSqlJob" .=) <$> _jSparkSQLJob,
                  ("hadoopJob" .=) <$> _jHadoopJob,
                  ("jobUuid" .=) <$> _jJobUuid,
                  ("yarnApplications" .=) <$> _jYarnApplications,
                  ("labels" .=) <$> _jLabels,
                  ("pysparkJob" .=) <$> _jPysparkJob,
                  ("driverOutputResourceUri" .=) <$>
                    _jDriverOutputResourceURI,
                  ("scheduling" .=) <$> _jScheduling,
                  ("statusHistory" .=) <$> _jStatusHistory,
                  ("placement" .=) <$> _jPlacement,
                  ("pigJob" .=) <$> _jPigJob])

-- | A request to collect cluster diagnostic information.
--
-- /See:/ 'diagnoseClusterRequest' smart constructor.
data DiagnoseClusterRequest =
    DiagnoseClusterRequest'
    deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DiagnoseClusterRequest' with the minimum fields required to make a request.
--
diagnoseClusterRequest
    :: DiagnoseClusterRequest
diagnoseClusterRequest = DiagnoseClusterRequest'

instance FromJSON DiagnoseClusterRequest where
        parseJSON
          = withObject "DiagnoseClusterRequest"
              (\ o -> pure DiagnoseClusterRequest')

instance ToJSON DiagnoseClusterRequest where
        toJSON = const emptyObject

-- | A Cloud Dataproc job for running Apache Hadoop MapReduce
-- (https:\/\/hadoop.apache.org\/docs\/current\/hadoop-mapreduce-client\/hadoop-mapreduce-client-core\/MapReduceTutorial.html)
-- jobs on Apache Hadoop YARN
-- (https:\/\/hadoop.apache.org\/docs\/r2.7.1\/hadoop-yarn\/hadoop-yarn-site\/YARN.html).
--
-- /See:/ 'hadoopJob' smart constructor.
data HadoopJob = HadoopJob'
    { _hArgs           :: !(Maybe [Text])
    , _hMainJarFileURI :: !(Maybe Text)
    , _hJarFileURIs    :: !(Maybe [Text])
    , _hFileURIs       :: !(Maybe [Text])
    , _hArchiveURIs    :: !(Maybe [Text])
    , _hMainClass      :: !(Maybe Text)
    , _hLoggingConfig  :: !(Maybe LoggingConfig)
    , _hProperties     :: !(Maybe HadoopJobProperties)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'HadoopJob' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'hArgs'
--
-- * 'hMainJarFileURI'
--
-- * 'hJarFileURIs'
--
-- * 'hFileURIs'
--
-- * 'hArchiveURIs'
--
-- * 'hMainClass'
--
-- * 'hLoggingConfig'
--
-- * 'hProperties'
hadoopJob
    :: HadoopJob
hadoopJob =
    HadoopJob'
    { _hArgs = Nothing
    , _hMainJarFileURI = Nothing
    , _hJarFileURIs = Nothing
    , _hFileURIs = Nothing
    , _hArchiveURIs = Nothing
    , _hMainClass = Nothing
    , _hLoggingConfig = Nothing
    , _hProperties = Nothing
    }

-- | Optional. The arguments to pass to the driver. Do not include arguments,
-- such as -libjars or -Dfoo=bar, that can be set as job properties, since
-- a collision may occur that causes an incorrect job submission.
hArgs :: Lens' HadoopJob [Text]
hArgs
  = lens _hArgs (\ s a -> s{_hArgs = a}) . _Default .
      _Coerce

-- | The HCFS URI of the jar file containing the main class. Examples:
-- \'gs:\/\/foo-bucket\/analytics-binaries\/extract-useful-metrics-mr.jar\'
-- \'hdfs:\/tmp\/test-samples\/custom-wordcount.jar\'
-- \'file:\/\/\/home\/usr\/lib\/hadoop-mapreduce\/hadoop-mapreduce-examples.jar\'
hMainJarFileURI :: Lens' HadoopJob (Maybe Text)
hMainJarFileURI
  = lens _hMainJarFileURI
      (\ s a -> s{_hMainJarFileURI = a})

-- | Optional. Jar file URIs to add to the CLASSPATHs of the Hadoop driver
-- and tasks.
hJarFileURIs :: Lens' HadoopJob [Text]
hJarFileURIs
  = lens _hJarFileURIs (\ s a -> s{_hJarFileURIs = a})
      . _Default
      . _Coerce

-- | Optional. HCFS (Hadoop Compatible Filesystem) URIs of files to be copied
-- to the working directory of Hadoop drivers and distributed tasks. Useful
-- for naively parallel tasks.
hFileURIs :: Lens' HadoopJob [Text]
hFileURIs
  = lens _hFileURIs (\ s a -> s{_hFileURIs = a}) .
      _Default
      . _Coerce

-- | Optional. HCFS URIs of archives to be extracted in the working directory
-- of Hadoop drivers and tasks. Supported file types: .jar, .tar, .tar.gz,
-- .tgz, or .zip.
hArchiveURIs :: Lens' HadoopJob [Text]
hArchiveURIs
  = lens _hArchiveURIs (\ s a -> s{_hArchiveURIs = a})
      . _Default
      . _Coerce

-- | The name of the driver\'s main class. The jar file containing the class
-- must be in the default CLASSPATH or specified in jar_file_uris.
hMainClass :: Lens' HadoopJob (Maybe Text)
hMainClass
  = lens _hMainClass (\ s a -> s{_hMainClass = a})

-- | Optional. The runtime log config for job execution.
hLoggingConfig :: Lens' HadoopJob (Maybe LoggingConfig)
hLoggingConfig
  = lens _hLoggingConfig
      (\ s a -> s{_hLoggingConfig = a})

-- | Optional. A mapping of property names to values, used to configure
-- Hadoop. Properties that conflict with values set by the Cloud Dataproc
-- API may be overwritten. Can include properties set in
-- \/etc\/hadoop\/conf\/*-site and classes in user code.
hProperties :: Lens' HadoopJob (Maybe HadoopJobProperties)
hProperties
  = lens _hProperties (\ s a -> s{_hProperties = a})

instance FromJSON HadoopJob where
        parseJSON
          = withObject "HadoopJob"
              (\ o ->
                 HadoopJob' <$>
                   (o .:? "args" .!= mempty) <*>
                     (o .:? "mainJarFileUri")
                     <*> (o .:? "jarFileUris" .!= mempty)
                     <*> (o .:? "fileUris" .!= mempty)
                     <*> (o .:? "archiveUris" .!= mempty)
                     <*> (o .:? "mainClass")
                     <*> (o .:? "loggingConfig")
                     <*> (o .:? "properties"))

instance ToJSON HadoopJob where
        toJSON HadoopJob'{..}
          = object
              (catMaybes
                 [("args" .=) <$> _hArgs,
                  ("mainJarFileUri" .=) <$> _hMainJarFileURI,
                  ("jarFileUris" .=) <$> _hJarFileURIs,
                  ("fileUris" .=) <$> _hFileURIs,
                  ("archiveUris" .=) <$> _hArchiveURIs,
                  ("mainClass" .=) <$> _hMainClass,
                  ("loggingConfig" .=) <$> _hLoggingConfig,
                  ("properties" .=) <$> _hProperties])

-- | Optional. Map from parameter names to values that should be used for
-- those parameters. Values may not exceed 100 characters.
--
-- /See:/ 'instantiateWorkflowTemplateRequestParameters' smart constructor.
newtype InstantiateWorkflowTemplateRequestParameters = InstantiateWorkflowTemplateRequestParameters'
    { _iwtrpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'InstantiateWorkflowTemplateRequestParameters' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'iwtrpAddtional'
instantiateWorkflowTemplateRequestParameters
    :: HashMap Text Text -- ^ 'iwtrpAddtional'
    -> InstantiateWorkflowTemplateRequestParameters
instantiateWorkflowTemplateRequestParameters pIwtrpAddtional_ =
    InstantiateWorkflowTemplateRequestParameters'
    { _iwtrpAddtional = _Coerce # pIwtrpAddtional_
    }

iwtrpAddtional :: Lens' InstantiateWorkflowTemplateRequestParameters (HashMap Text Text)
iwtrpAddtional
  = lens _iwtrpAddtional
      (\ s a -> s{_iwtrpAddtional = a})
      . _Coerce

instance FromJSON
         InstantiateWorkflowTemplateRequestParameters where
        parseJSON
          = withObject
              "InstantiateWorkflowTemplateRequestParameters"
              (\ o ->
                 InstantiateWorkflowTemplateRequestParameters' <$>
                   (parseJSONObject o))

instance ToJSON
         InstantiateWorkflowTemplateRequestParameters where
        toJSON = toJSON . _iwtrpAddtional

-- | Metadata describing the operation.
--
-- /See:/ 'clusterOperationMetadata' smart constructor.
data ClusterOperationMetadata = ClusterOperationMetadata'
    { _comStatus        :: !(Maybe ClusterOperationStatus)
    , _comClusterUuid   :: !(Maybe Text)
    , _comWarnings      :: !(Maybe [Text])
    , _comClusterName   :: !(Maybe Text)
    , _comLabels        :: !(Maybe ClusterOperationMetadataLabels)
    , _comOperationType :: !(Maybe Text)
    , _comStatusHistory :: !(Maybe [ClusterOperationStatus])
    , _comDescription   :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterOperationMetadata' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'comStatus'
--
-- * 'comClusterUuid'
--
-- * 'comWarnings'
--
-- * 'comClusterName'
--
-- * 'comLabels'
--
-- * 'comOperationType'
--
-- * 'comStatusHistory'
--
-- * 'comDescription'
clusterOperationMetadata
    :: ClusterOperationMetadata
clusterOperationMetadata =
    ClusterOperationMetadata'
    { _comStatus = Nothing
    , _comClusterUuid = Nothing
    , _comWarnings = Nothing
    , _comClusterName = Nothing
    , _comLabels = Nothing
    , _comOperationType = Nothing
    , _comStatusHistory = Nothing
    , _comDescription = Nothing
    }

-- | Output only. Current operation status.
comStatus :: Lens' ClusterOperationMetadata (Maybe ClusterOperationStatus)
comStatus
  = lens _comStatus (\ s a -> s{_comStatus = a})

-- | Output only. Cluster UUID for the operation.
comClusterUuid :: Lens' ClusterOperationMetadata (Maybe Text)
comClusterUuid
  = lens _comClusterUuid
      (\ s a -> s{_comClusterUuid = a})

-- | Output only. Errors encountered during operation execution.
comWarnings :: Lens' ClusterOperationMetadata [Text]
comWarnings
  = lens _comWarnings (\ s a -> s{_comWarnings = a}) .
      _Default
      . _Coerce

-- | Output only. Name of the cluster for the operation.
comClusterName :: Lens' ClusterOperationMetadata (Maybe Text)
comClusterName
  = lens _comClusterName
      (\ s a -> s{_comClusterName = a})

-- | Output only. Labels associated with the operation
comLabels :: Lens' ClusterOperationMetadata (Maybe ClusterOperationMetadataLabels)
comLabels
  = lens _comLabels (\ s a -> s{_comLabels = a})

-- | Output only. The operation type.
comOperationType :: Lens' ClusterOperationMetadata (Maybe Text)
comOperationType
  = lens _comOperationType
      (\ s a -> s{_comOperationType = a})

-- | Output only. The previous operation status.
comStatusHistory :: Lens' ClusterOperationMetadata [ClusterOperationStatus]
comStatusHistory
  = lens _comStatusHistory
      (\ s a -> s{_comStatusHistory = a})
      . _Default
      . _Coerce

-- | Output only. Short description of operation.
comDescription :: Lens' ClusterOperationMetadata (Maybe Text)
comDescription
  = lens _comDescription
      (\ s a -> s{_comDescription = a})

instance FromJSON ClusterOperationMetadata where
        parseJSON
          = withObject "ClusterOperationMetadata"
              (\ o ->
                 ClusterOperationMetadata' <$>
                   (o .:? "status") <*> (o .:? "clusterUuid") <*>
                     (o .:? "warnings" .!= mempty)
                     <*> (o .:? "clusterName")
                     <*> (o .:? "labels")
                     <*> (o .:? "operationType")
                     <*> (o .:? "statusHistory" .!= mempty)
                     <*> (o .:? "description"))

instance ToJSON ClusterOperationMetadata where
        toJSON ClusterOperationMetadata'{..}
          = object
              (catMaybes
                 [("status" .=) <$> _comStatus,
                  ("clusterUuid" .=) <$> _comClusterUuid,
                  ("warnings" .=) <$> _comWarnings,
                  ("clusterName" .=) <$> _comClusterName,
                  ("labels" .=) <$> _comLabels,
                  ("operationType" .=) <$> _comOperationType,
                  ("statusHistory" .=) <$> _comStatusHistory,
                  ("description" .=) <$> _comDescription])

-- | Request message for TestIamPermissions method.
--
-- /See:/ 'testIAMPermissionsRequest' smart constructor.
newtype TestIAMPermissionsRequest = TestIAMPermissionsRequest'
    { _tiprPermissions :: Maybe [Text]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'TestIAMPermissionsRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tiprPermissions'
testIAMPermissionsRequest
    :: TestIAMPermissionsRequest
testIAMPermissionsRequest =
    TestIAMPermissionsRequest'
    { _tiprPermissions = Nothing
    }

-- | The set of permissions to check for the resource. Permissions with
-- wildcards (such as \'*\' or \'storage.*\') are not allowed. For more
-- information see IAM Overview
-- (https:\/\/cloud.google.com\/iam\/docs\/overview#permissions).
tiprPermissions :: Lens' TestIAMPermissionsRequest [Text]
tiprPermissions
  = lens _tiprPermissions
      (\ s a -> s{_tiprPermissions = a})
      . _Default
      . _Coerce

instance FromJSON TestIAMPermissionsRequest where
        parseJSON
          = withObject "TestIAMPermissionsRequest"
              (\ o ->
                 TestIAMPermissionsRequest' <$>
                   (o .:? "permissions" .!= mempty))

instance ToJSON TestIAMPermissionsRequest where
        toJSON TestIAMPermissionsRequest'{..}
          = object
              (catMaybes [("permissions" .=) <$> _tiprPermissions])

-- | A Cloud Dataproc job for running Apache Spark SQL
-- (http:\/\/spark.apache.org\/sql\/) queries.
--
-- /See:/ 'sparkSQLJob' smart constructor.
data SparkSQLJob = SparkSQLJob'
    { _ssqljQueryFileURI    :: !(Maybe Text)
    , _ssqljJarFileURIs     :: !(Maybe [Text])
    , _ssqljScriptVariables :: !(Maybe SparkSQLJobScriptVariables)
    , _ssqljQueryList       :: !(Maybe QueryList)
    , _ssqljLoggingConfig   :: !(Maybe LoggingConfig)
    , _ssqljProperties      :: !(Maybe SparkSQLJobProperties)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SparkSQLJob' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ssqljQueryFileURI'
--
-- * 'ssqljJarFileURIs'
--
-- * 'ssqljScriptVariables'
--
-- * 'ssqljQueryList'
--
-- * 'ssqljLoggingConfig'
--
-- * 'ssqljProperties'
sparkSQLJob
    :: SparkSQLJob
sparkSQLJob =
    SparkSQLJob'
    { _ssqljQueryFileURI = Nothing
    , _ssqljJarFileURIs = Nothing
    , _ssqljScriptVariables = Nothing
    , _ssqljQueryList = Nothing
    , _ssqljLoggingConfig = Nothing
    , _ssqljProperties = Nothing
    }

-- | The HCFS URI of the script that contains SQL queries.
ssqljQueryFileURI :: Lens' SparkSQLJob (Maybe Text)
ssqljQueryFileURI
  = lens _ssqljQueryFileURI
      (\ s a -> s{_ssqljQueryFileURI = a})

-- | Optional. HCFS URIs of jar files to be added to the Spark CLASSPATH.
ssqljJarFileURIs :: Lens' SparkSQLJob [Text]
ssqljJarFileURIs
  = lens _ssqljJarFileURIs
      (\ s a -> s{_ssqljJarFileURIs = a})
      . _Default
      . _Coerce

-- | Optional. Mapping of query variable names to values (equivalent to the
-- Spark SQL command: SET name=\"value\";).
ssqljScriptVariables :: Lens' SparkSQLJob (Maybe SparkSQLJobScriptVariables)
ssqljScriptVariables
  = lens _ssqljScriptVariables
      (\ s a -> s{_ssqljScriptVariables = a})

-- | A list of queries.
ssqljQueryList :: Lens' SparkSQLJob (Maybe QueryList)
ssqljQueryList
  = lens _ssqljQueryList
      (\ s a -> s{_ssqljQueryList = a})

-- | Optional. The runtime log config for job execution.
ssqljLoggingConfig :: Lens' SparkSQLJob (Maybe LoggingConfig)
ssqljLoggingConfig
  = lens _ssqljLoggingConfig
      (\ s a -> s{_ssqljLoggingConfig = a})

-- | Optional. A mapping of property names to values, used to configure Spark
-- SQL\'s SparkConf. Properties that conflict with values set by the Cloud
-- Dataproc API may be overwritten.
ssqljProperties :: Lens' SparkSQLJob (Maybe SparkSQLJobProperties)
ssqljProperties
  = lens _ssqljProperties
      (\ s a -> s{_ssqljProperties = a})

instance FromJSON SparkSQLJob where
        parseJSON
          = withObject "SparkSQLJob"
              (\ o ->
                 SparkSQLJob' <$>
                   (o .:? "queryFileUri") <*>
                     (o .:? "jarFileUris" .!= mempty)
                     <*> (o .:? "scriptVariables")
                     <*> (o .:? "queryList")
                     <*> (o .:? "loggingConfig")
                     <*> (o .:? "properties"))

instance ToJSON SparkSQLJob where
        toJSON SparkSQLJob'{..}
          = object
              (catMaybes
                 [("queryFileUri" .=) <$> _ssqljQueryFileURI,
                  ("jarFileUris" .=) <$> _ssqljJarFileURIs,
                  ("scriptVariables" .=) <$> _ssqljScriptVariables,
                  ("queryList" .=) <$> _ssqljQueryList,
                  ("loggingConfig" .=) <$> _ssqljLoggingConfig,
                  ("properties" .=) <$> _ssqljProperties])

-- | Specifies the selection and config of software inside the cluster.
--
-- /See:/ 'softwareConfig' smart constructor.
data SoftwareConfig = SoftwareConfig'
    { _scImageVersion :: !(Maybe Text)
    , _scProperties   :: !(Maybe SoftwareConfigProperties)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SoftwareConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'scImageVersion'
--
-- * 'scProperties'
softwareConfig
    :: SoftwareConfig
softwareConfig =
    SoftwareConfig'
    { _scImageVersion = Nothing
    , _scProperties = Nothing
    }

-- | Optional. The version of software inside the cluster. It must be one of
-- the supported Cloud Dataproc Versions, such as \"1.2\" (including a
-- subminor version, such as \"1.2.29\"), or the \"preview\" version. If
-- unspecified, it defaults to the latest version.
scImageVersion :: Lens' SoftwareConfig (Maybe Text)
scImageVersion
  = lens _scImageVersion
      (\ s a -> s{_scImageVersion = a})

-- | Optional. The properties to set on daemon config files.Property keys are
-- specified in prefix:property format, such as core:fs.defaultFS. The
-- following are supported prefixes and their mappings: capacity-scheduler:
-- capacity-scheduler.xml core: core-site.xml distcp: distcp-default.xml
-- hdfs: hdfs-site.xml hive: hive-site.xml mapred: mapred-site.xml pig:
-- pig.properties spark: spark-defaults.conf yarn: yarn-site.xmlFor more
-- information, see Cluster properties.
scProperties :: Lens' SoftwareConfig (Maybe SoftwareConfigProperties)
scProperties
  = lens _scProperties (\ s a -> s{_scProperties = a})

instance FromJSON SoftwareConfig where
        parseJSON
          = withObject "SoftwareConfig"
              (\ o ->
                 SoftwareConfig' <$>
                   (o .:? "imageVersion") <*> (o .:? "properties"))

instance ToJSON SoftwareConfig where
        toJSON SoftwareConfig'{..}
          = object
              (catMaybes
                 [("imageVersion" .=) <$> _scImageVersion,
                  ("properties" .=) <$> _scProperties])

-- | A list of jobs in a project.
--
-- /See:/ 'listJobsResponse' smart constructor.
data ListJobsResponse = ListJobsResponse'
    { _ljrNextPageToken :: !(Maybe Text)
    , _ljrJobs          :: !(Maybe [Job])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListJobsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ljrNextPageToken'
--
-- * 'ljrJobs'
listJobsResponse
    :: ListJobsResponse
listJobsResponse =
    ListJobsResponse'
    { _ljrNextPageToken = Nothing
    , _ljrJobs = Nothing
    }

-- | Optional. This token is included in the response if there are more
-- results to fetch. To fetch additional results, provide this value as the
-- page_token in a subsequent 'ListJobsRequest'.
ljrNextPageToken :: Lens' ListJobsResponse (Maybe Text)
ljrNextPageToken
  = lens _ljrNextPageToken
      (\ s a -> s{_ljrNextPageToken = a})

-- | Output only. Jobs list.
ljrJobs :: Lens' ListJobsResponse [Job]
ljrJobs
  = lens _ljrJobs (\ s a -> s{_ljrJobs = a}) . _Default
      . _Coerce

instance FromJSON ListJobsResponse where
        parseJSON
          = withObject "ListJobsResponse"
              (\ o ->
                 ListJobsResponse' <$>
                   (o .:? "nextPageToken") <*>
                     (o .:? "jobs" .!= mempty))

instance ToJSON ListJobsResponse where
        toJSON ListJobsResponse'{..}
          = object
              (catMaybes
                 [("nextPageToken" .=) <$> _ljrNextPageToken,
                  ("jobs" .=) <$> _ljrJobs])

-- | Specifies the type and number of accelerator cards attached to the
-- instances of an instance. See GPUs on Compute Engine.
--
-- /See:/ 'acceleratorConfig' smart constructor.
data AcceleratorConfig = AcceleratorConfig'
    { _acAcceleratorCount   :: !(Maybe (Textual Int32))
    , _acAcceleratorTypeURI :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'AcceleratorConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'acAcceleratorCount'
--
-- * 'acAcceleratorTypeURI'
acceleratorConfig
    :: AcceleratorConfig
acceleratorConfig =
    AcceleratorConfig'
    { _acAcceleratorCount = Nothing
    , _acAcceleratorTypeURI = Nothing
    }

-- | The number of the accelerator cards of this type exposed to this
-- instance.
acAcceleratorCount :: Lens' AcceleratorConfig (Maybe Int32)
acAcceleratorCount
  = lens _acAcceleratorCount
      (\ s a -> s{_acAcceleratorCount = a})
      . mapping _Coerce

-- | Full URL, partial URI, or short name of the accelerator type resource to
-- expose to this instance. See Compute Engine AcceleratorTypes.Examples:
-- https:\/\/www.googleapis.com\/compute\/beta\/projects\/[project_id]\/zones\/us-east1-a\/acceleratorTypes\/nvidia-tesla-k80
-- projects\/[project_id]\/zones\/us-east1-a\/acceleratorTypes\/nvidia-tesla-k80
-- nvidia-tesla-k80Auto Zone Exception: If you are using the Cloud Dataproc
-- Auto Zone Placement feature, you must use the short name of the
-- accelerator type resource, for example, nvidia-tesla-k80.
acAcceleratorTypeURI :: Lens' AcceleratorConfig (Maybe Text)
acAcceleratorTypeURI
  = lens _acAcceleratorTypeURI
      (\ s a -> s{_acAcceleratorTypeURI = a})

instance FromJSON AcceleratorConfig where
        parseJSON
          = withObject "AcceleratorConfig"
              (\ o ->
                 AcceleratorConfig' <$>
                   (o .:? "acceleratorCount") <*>
                     (o .:? "acceleratorTypeUri"))

instance ToJSON AcceleratorConfig where
        toJSON AcceleratorConfig'{..}
          = object
              (catMaybes
                 [("acceleratorCount" .=) <$> _acAcceleratorCount,
                  ("acceleratorTypeUri" .=) <$> _acAcceleratorTypeURI])

-- | Optional. A mapping of property names to values, used to configure
-- Spark. Properties that conflict with values set by the Cloud Dataproc
-- API may be overwritten. Can include properties set in
-- \/etc\/spark\/conf\/spark-defaults.conf and classes in user code.
--
-- /See:/ 'sparkJobProperties' smart constructor.
newtype SparkJobProperties = SparkJobProperties'
    { _sjpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SparkJobProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sjpAddtional'
sparkJobProperties
    :: HashMap Text Text -- ^ 'sjpAddtional'
    -> SparkJobProperties
sparkJobProperties pSjpAddtional_ =
    SparkJobProperties'
    { _sjpAddtional = _Coerce # pSjpAddtional_
    }

sjpAddtional :: Lens' SparkJobProperties (HashMap Text Text)
sjpAddtional
  = lens _sjpAddtional (\ s a -> s{_sjpAddtional = a})
      . _Coerce

instance FromJSON SparkJobProperties where
        parseJSON
          = withObject "SparkJobProperties"
              (\ o -> SparkJobProperties' <$> (parseJSONObject o))

instance ToJSON SparkJobProperties where
        toJSON = toJSON . _sjpAddtional

-- | Encryption settings for the cluster.
--
-- /See:/ 'encryptionConfig' smart constructor.
newtype EncryptionConfig = EncryptionConfig'
    { _ecGcePdKmsKeyName :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'EncryptionConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ecGcePdKmsKeyName'
encryptionConfig
    :: EncryptionConfig
encryptionConfig =
    EncryptionConfig'
    { _ecGcePdKmsKeyName = Nothing
    }

-- | Optional. The Cloud KMS key name to use for PD disk encryption for all
-- instances in the cluster.
ecGcePdKmsKeyName :: Lens' EncryptionConfig (Maybe Text)
ecGcePdKmsKeyName
  = lens _ecGcePdKmsKeyName
      (\ s a -> s{_ecGcePdKmsKeyName = a})

instance FromJSON EncryptionConfig where
        parseJSON
          = withObject "EncryptionConfig"
              (\ o ->
                 EncryptionConfig' <$> (o .:? "gcePdKmsKeyName"))

instance ToJSON EncryptionConfig where
        toJSON EncryptionConfig'{..}
          = object
              (catMaybes
                 [("gcePdKmsKeyName" .=) <$> _ecGcePdKmsKeyName])

-- | A Cloud Dataproc job for running Apache PySpark
-- (https:\/\/spark.apache.org\/docs\/0.9.0\/python-programming-guide.html)
-- applications on YARN.
--
-- /See:/ 'pySparkJob' smart constructor.
data PySparkJob = PySparkJob'
    { _psjPythonFileURIs    :: !(Maybe [Text])
    , _psjMainPythonFileURI :: !(Maybe Text)
    , _psjArgs              :: !(Maybe [Text])
    , _psjJarFileURIs       :: !(Maybe [Text])
    , _psjFileURIs          :: !(Maybe [Text])
    , _psjArchiveURIs       :: !(Maybe [Text])
    , _psjLoggingConfig     :: !(Maybe LoggingConfig)
    , _psjProperties        :: !(Maybe PySparkJobProperties)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PySparkJob' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'psjPythonFileURIs'
--
-- * 'psjMainPythonFileURI'
--
-- * 'psjArgs'
--
-- * 'psjJarFileURIs'
--
-- * 'psjFileURIs'
--
-- * 'psjArchiveURIs'
--
-- * 'psjLoggingConfig'
--
-- * 'psjProperties'
pySparkJob
    :: PySparkJob
pySparkJob =
    PySparkJob'
    { _psjPythonFileURIs = Nothing
    , _psjMainPythonFileURI = Nothing
    , _psjArgs = Nothing
    , _psjJarFileURIs = Nothing
    , _psjFileURIs = Nothing
    , _psjArchiveURIs = Nothing
    , _psjLoggingConfig = Nothing
    , _psjProperties = Nothing
    }

-- | Optional. HCFS file URIs of Python files to pass to the PySpark
-- framework. Supported file types: .py, .egg, and .zip.
psjPythonFileURIs :: Lens' PySparkJob [Text]
psjPythonFileURIs
  = lens _psjPythonFileURIs
      (\ s a -> s{_psjPythonFileURIs = a})
      . _Default
      . _Coerce

-- | Required. The HCFS URI of the main Python file to use as the driver.
-- Must be a .py file.
psjMainPythonFileURI :: Lens' PySparkJob (Maybe Text)
psjMainPythonFileURI
  = lens _psjMainPythonFileURI
      (\ s a -> s{_psjMainPythonFileURI = a})

-- | Optional. The arguments to pass to the driver. Do not include arguments,
-- such as --conf, that can be set as job properties, since a collision may
-- occur that causes an incorrect job submission.
psjArgs :: Lens' PySparkJob [Text]
psjArgs
  = lens _psjArgs (\ s a -> s{_psjArgs = a}) . _Default
      . _Coerce

-- | Optional. HCFS URIs of jar files to add to the CLASSPATHs of the Python
-- driver and tasks.
psjJarFileURIs :: Lens' PySparkJob [Text]
psjJarFileURIs
  = lens _psjJarFileURIs
      (\ s a -> s{_psjJarFileURIs = a})
      . _Default
      . _Coerce

-- | Optional. HCFS URIs of files to be copied to the working directory of
-- Python drivers and distributed tasks. Useful for naively parallel tasks.
psjFileURIs :: Lens' PySparkJob [Text]
psjFileURIs
  = lens _psjFileURIs (\ s a -> s{_psjFileURIs = a}) .
      _Default
      . _Coerce

-- | Optional. HCFS URIs of archives to be extracted in the working directory
-- of .jar, .tar, .tar.gz, .tgz, and .zip.
psjArchiveURIs :: Lens' PySparkJob [Text]
psjArchiveURIs
  = lens _psjArchiveURIs
      (\ s a -> s{_psjArchiveURIs = a})
      . _Default
      . _Coerce

-- | Optional. The runtime log config for job execution.
psjLoggingConfig :: Lens' PySparkJob (Maybe LoggingConfig)
psjLoggingConfig
  = lens _psjLoggingConfig
      (\ s a -> s{_psjLoggingConfig = a})

-- | Optional. A mapping of property names to values, used to configure
-- PySpark. Properties that conflict with values set by the Cloud Dataproc
-- API may be overwritten. Can include properties set in
-- \/etc\/spark\/conf\/spark-defaults.conf and classes in user code.
psjProperties :: Lens' PySparkJob (Maybe PySparkJobProperties)
psjProperties
  = lens _psjProperties
      (\ s a -> s{_psjProperties = a})

instance FromJSON PySparkJob where
        parseJSON
          = withObject "PySparkJob"
              (\ o ->
                 PySparkJob' <$>
                   (o .:? "pythonFileUris" .!= mempty) <*>
                     (o .:? "mainPythonFileUri")
                     <*> (o .:? "args" .!= mempty)
                     <*> (o .:? "jarFileUris" .!= mempty)
                     <*> (o .:? "fileUris" .!= mempty)
                     <*> (o .:? "archiveUris" .!= mempty)
                     <*> (o .:? "loggingConfig")
                     <*> (o .:? "properties"))

instance ToJSON PySparkJob where
        toJSON PySparkJob'{..}
          = object
              (catMaybes
                 [("pythonFileUris" .=) <$> _psjPythonFileURIs,
                  ("mainPythonFileUri" .=) <$> _psjMainPythonFileURI,
                  ("args" .=) <$> _psjArgs,
                  ("jarFileUris" .=) <$> _psjJarFileURIs,
                  ("fileUris" .=) <$> _psjFileURIs,
                  ("archiveUris" .=) <$> _psjArchiveURIs,
                  ("loggingConfig" .=) <$> _psjLoggingConfig,
                  ("properties" .=) <$> _psjProperties])

-- | Specifies the resources used to actively manage an instance group.
--
-- /See:/ 'managedGroupConfig' smart constructor.
data ManagedGroupConfig = ManagedGroupConfig'
    { _mgcInstanceTemplateName     :: !(Maybe Text)
    , _mgcInstanceGroupManagerName :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ManagedGroupConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mgcInstanceTemplateName'
--
-- * 'mgcInstanceGroupManagerName'
managedGroupConfig
    :: ManagedGroupConfig
managedGroupConfig =
    ManagedGroupConfig'
    { _mgcInstanceTemplateName = Nothing
    , _mgcInstanceGroupManagerName = Nothing
    }

-- | Output only. The name of the Instance Template used for the Managed
-- Instance Group.
mgcInstanceTemplateName :: Lens' ManagedGroupConfig (Maybe Text)
mgcInstanceTemplateName
  = lens _mgcInstanceTemplateName
      (\ s a -> s{_mgcInstanceTemplateName = a})

-- | Output only. The name of the Instance Group Manager for this group.
mgcInstanceGroupManagerName :: Lens' ManagedGroupConfig (Maybe Text)
mgcInstanceGroupManagerName
  = lens _mgcInstanceGroupManagerName
      (\ s a -> s{_mgcInstanceGroupManagerName = a})

instance FromJSON ManagedGroupConfig where
        parseJSON
          = withObject "ManagedGroupConfig"
              (\ o ->
                 ManagedGroupConfig' <$>
                   (o .:? "instanceTemplateName") <*>
                     (o .:? "instanceGroupManagerName"))

instance ToJSON ManagedGroupConfig where
        toJSON ManagedGroupConfig'{..}
          = object
              (catMaybes
                 [("instanceTemplateName" .=) <$>
                    _mgcInstanceTemplateName,
                  ("instanceGroupManagerName" .=) <$>
                    _mgcInstanceGroupManagerName])

-- | Response message for TestIamPermissions method.
--
-- /See:/ 'testIAMPermissionsResponse' smart constructor.
newtype TestIAMPermissionsResponse = TestIAMPermissionsResponse'
    { _tiamprPermissions :: Maybe [Text]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'TestIAMPermissionsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tiamprPermissions'
testIAMPermissionsResponse
    :: TestIAMPermissionsResponse
testIAMPermissionsResponse =
    TestIAMPermissionsResponse'
    { _tiamprPermissions = Nothing
    }

-- | A subset of TestPermissionsRequest.permissions that the caller is
-- allowed.
tiamprPermissions :: Lens' TestIAMPermissionsResponse [Text]
tiamprPermissions
  = lens _tiamprPermissions
      (\ s a -> s{_tiamprPermissions = a})
      . _Default
      . _Coerce

instance FromJSON TestIAMPermissionsResponse where
        parseJSON
          = withObject "TestIAMPermissionsResponse"
              (\ o ->
                 TestIAMPermissionsResponse' <$>
                   (o .:? "permissions" .!= mempty))

instance ToJSON TestIAMPermissionsResponse where
        toJSON TestIAMPermissionsResponse'{..}
          = object
              (catMaybes
                 [("permissions" .=) <$> _tiamprPermissions])

-- | The list of all clusters in a project.
--
-- /See:/ 'listClustersResponse' smart constructor.
data ListClustersResponse = ListClustersResponse'
    { _lcrNextPageToken :: !(Maybe Text)
    , _lcrClusters      :: !(Maybe [Cluster])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListClustersResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lcrNextPageToken'
--
-- * 'lcrClusters'
listClustersResponse
    :: ListClustersResponse
listClustersResponse =
    ListClustersResponse'
    { _lcrNextPageToken = Nothing
    , _lcrClusters = Nothing
    }

-- | Output only. This token is included in the response if there are more
-- results to fetch. To fetch additional results, provide this value as the
-- page_token in a subsequent ListClustersRequest.
lcrNextPageToken :: Lens' ListClustersResponse (Maybe Text)
lcrNextPageToken
  = lens _lcrNextPageToken
      (\ s a -> s{_lcrNextPageToken = a})

-- | Output only. The clusters in the project.
lcrClusters :: Lens' ListClustersResponse [Cluster]
lcrClusters
  = lens _lcrClusters (\ s a -> s{_lcrClusters = a}) .
      _Default
      . _Coerce

instance FromJSON ListClustersResponse where
        parseJSON
          = withObject "ListClustersResponse"
              (\ o ->
                 ListClustersResponse' <$>
                   (o .:? "nextPageToken") <*>
                     (o .:? "clusters" .!= mempty))

instance ToJSON ListClustersResponse where
        toJSON ListClustersResponse'{..}
          = object
              (catMaybes
                 [("nextPageToken" .=) <$> _lcrNextPageToken,
                  ("clusters" .=) <$> _lcrClusters])

-- | Validation based on a list of allowed values.
--
-- /See:/ 'valueValidation' smart constructor.
newtype ValueValidation = ValueValidation'
    { _vvValues :: Maybe [Text]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ValueValidation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'vvValues'
valueValidation
    :: ValueValidation
valueValidation =
    ValueValidation'
    { _vvValues = Nothing
    }

-- | Required. List of allowed values for the parameter.
vvValues :: Lens' ValueValidation [Text]
vvValues
  = lens _vvValues (\ s a -> s{_vvValues = a}) .
      _Default
      . _Coerce

instance FromJSON ValueValidation where
        parseJSON
          = withObject "ValueValidation"
              (\ o ->
                 ValueValidation' <$> (o .:? "values" .!= mempty))

instance ToJSON ValueValidation where
        toJSON ValueValidation'{..}
          = object (catMaybes [("values" .=) <$> _vvValues])

-- | Defines an Identity and Access Management (IAM) policy. It is used to
-- specify access control policies for Cloud Platform resources.A Policy
-- consists of a list of bindings. A binding binds a list of members to a
-- role, where the members can be user accounts, Google groups, Google
-- domains, and service accounts. A role is a named list of permissions
-- defined by IAM.JSON Example { \"bindings\": [ { \"role\":
-- \"roles\/owner\", \"members\": [ \"user:mike\'example.com\",
-- \"group:admins\'example.com\", \"domain:google.com\",
-- \"serviceAccount:my-other-app\'appspot.gserviceaccount.com\" ] }, {
-- \"role\": \"roles\/viewer\", \"members\": [\"user:sean\'example.com\"] }
-- ] } YAML Example bindings: - members: - user:mike\'example.com -
-- group:admins\'example.com - domain:google.com -
-- serviceAccount:my-other-app\'appspot.gserviceaccount.com role:
-- roles\/owner - members: - user:sean\'example.com role: roles\/viewer For
-- a description of IAM and its features, see the IAM developer\'s guide
-- (https:\/\/cloud.google.com\/iam\/docs).
--
-- /See:/ 'policy' smart constructor.
data Policy = Policy'
    { _pEtag     :: !(Maybe Bytes)
    , _pVersion  :: !(Maybe (Textual Int32))
    , _pBindings :: !(Maybe [Binding])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Policy' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pEtag'
--
-- * 'pVersion'
--
-- * 'pBindings'
policy
    :: Policy
policy =
    Policy'
    { _pEtag = Nothing
    , _pVersion = Nothing
    , _pBindings = Nothing
    }

-- | etag is used for optimistic concurrency control as a way to help prevent
-- simultaneous updates of a policy from overwriting each other. It is
-- strongly suggested that systems make use of the etag in the
-- read-modify-write cycle to perform policy updates in order to avoid race
-- conditions: An etag is returned in the response to getIamPolicy, and
-- systems are expected to put that etag in the request to setIamPolicy to
-- ensure that their change will be applied to the same version of the
-- policy.If no etag is provided in the call to setIamPolicy, then the
-- existing policy is overwritten blindly.
pEtag :: Lens' Policy (Maybe ByteString)
pEtag
  = lens _pEtag (\ s a -> s{_pEtag = a}) .
      mapping _Bytes

-- | Deprecated.
pVersion :: Lens' Policy (Maybe Int32)
pVersion
  = lens _pVersion (\ s a -> s{_pVersion = a}) .
      mapping _Coerce

-- | Associates a list of members to a role. bindings with no members will
-- result in an error.
pBindings :: Lens' Policy [Binding]
pBindings
  = lens _pBindings (\ s a -> s{_pBindings = a}) .
      _Default
      . _Coerce

instance FromJSON Policy where
        parseJSON
          = withObject "Policy"
              (\ o ->
                 Policy' <$>
                   (o .:? "etag") <*> (o .:? "version") <*>
                     (o .:? "bindings" .!= mempty))

instance ToJSON Policy where
        toJSON Policy'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _pEtag,
                  ("version" .=) <$> _pVersion,
                  ("bindings" .=) <$> _pBindings])

-- | A job executed by the workflow.
--
-- /See:/ 'orderedJob' smart constructor.
data OrderedJob = OrderedJob'
    { _ojSparkJob            :: !(Maybe SparkJob)
    , _ojStepId              :: !(Maybe Text)
    , _ojPrerequisiteStepIds :: !(Maybe [Text])
    , _ojHiveJob             :: !(Maybe HiveJob)
    , _ojSparkSQLJob         :: !(Maybe SparkSQLJob)
    , _ojHadoopJob           :: !(Maybe HadoopJob)
    , _ojLabels              :: !(Maybe OrderedJobLabels)
    , _ojPysparkJob          :: !(Maybe PySparkJob)
    , _ojScheduling          :: !(Maybe JobScheduling)
    , _ojPigJob              :: !(Maybe PigJob)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'OrderedJob' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ojSparkJob'
--
-- * 'ojStepId'
--
-- * 'ojPrerequisiteStepIds'
--
-- * 'ojHiveJob'
--
-- * 'ojSparkSQLJob'
--
-- * 'ojHadoopJob'
--
-- * 'ojLabels'
--
-- * 'ojPysparkJob'
--
-- * 'ojScheduling'
--
-- * 'ojPigJob'
orderedJob
    :: OrderedJob
orderedJob =
    OrderedJob'
    { _ojSparkJob = Nothing
    , _ojStepId = Nothing
    , _ojPrerequisiteStepIds = Nothing
    , _ojHiveJob = Nothing
    , _ojSparkSQLJob = Nothing
    , _ojHadoopJob = Nothing
    , _ojLabels = Nothing
    , _ojPysparkJob = Nothing
    , _ojScheduling = Nothing
    , _ojPigJob = Nothing
    }

-- | Job is a Spark job.
ojSparkJob :: Lens' OrderedJob (Maybe SparkJob)
ojSparkJob
  = lens _ojSparkJob (\ s a -> s{_ojSparkJob = a})

-- | Required. The step id. The id must be unique among all jobs within the
-- template.The step id is used as prefix for job id, as job
-- goog-dataproc-workflow-step-id label, and in prerequisiteStepIds field
-- from other steps.The id must contain only letters (a-z, A-Z), numbers
-- (0-9), underscores (_), and hyphens (-). Cannot begin or end with
-- underscore or hyphen. Must consist of between 3 and 50 characters.
ojStepId :: Lens' OrderedJob (Maybe Text)
ojStepId = lens _ojStepId (\ s a -> s{_ojStepId = a})

-- | Optional. The optional list of prerequisite job step_ids. If not
-- specified, the job will start at the beginning of workflow.
ojPrerequisiteStepIds :: Lens' OrderedJob [Text]
ojPrerequisiteStepIds
  = lens _ojPrerequisiteStepIds
      (\ s a -> s{_ojPrerequisiteStepIds = a})
      . _Default
      . _Coerce

-- | Job is a Hive job.
ojHiveJob :: Lens' OrderedJob (Maybe HiveJob)
ojHiveJob
  = lens _ojHiveJob (\ s a -> s{_ojHiveJob = a})

-- | Job is a SparkSql job.
ojSparkSQLJob :: Lens' OrderedJob (Maybe SparkSQLJob)
ojSparkSQLJob
  = lens _ojSparkSQLJob
      (\ s a -> s{_ojSparkSQLJob = a})

-- | Job is a Hadoop job.
ojHadoopJob :: Lens' OrderedJob (Maybe HadoopJob)
ojHadoopJob
  = lens _ojHadoopJob (\ s a -> s{_ojHadoopJob = a})

-- | Optional. The labels to associate with this job.Label keys must be
-- between 1 and 63 characters long, and must conform to the following
-- regular expression: \\p{Ll}\\p{Lo}{0,62}Label values must be between 1
-- and 63 characters long, and must conform to the following regular
-- expression: \\p{Ll}\\p{Lo}\\p{N}_-{0,63}No more than 32 labels can be
-- associated with a given job.
ojLabels :: Lens' OrderedJob (Maybe OrderedJobLabels)
ojLabels = lens _ojLabels (\ s a -> s{_ojLabels = a})

-- | Job is a Pyspark job.
ojPysparkJob :: Lens' OrderedJob (Maybe PySparkJob)
ojPysparkJob
  = lens _ojPysparkJob (\ s a -> s{_ojPysparkJob = a})

-- | Optional. Job scheduling configuration.
ojScheduling :: Lens' OrderedJob (Maybe JobScheduling)
ojScheduling
  = lens _ojScheduling (\ s a -> s{_ojScheduling = a})

-- | Job is a Pig job.
ojPigJob :: Lens' OrderedJob (Maybe PigJob)
ojPigJob = lens _ojPigJob (\ s a -> s{_ojPigJob = a})

instance FromJSON OrderedJob where
        parseJSON
          = withObject "OrderedJob"
              (\ o ->
                 OrderedJob' <$>
                   (o .:? "sparkJob") <*> (o .:? "stepId") <*>
                     (o .:? "prerequisiteStepIds" .!= mempty)
                     <*> (o .:? "hiveJob")
                     <*> (o .:? "sparkSqlJob")
                     <*> (o .:? "hadoopJob")
                     <*> (o .:? "labels")
                     <*> (o .:? "pysparkJob")
                     <*> (o .:? "scheduling")
                     <*> (o .:? "pigJob"))

instance ToJSON OrderedJob where
        toJSON OrderedJob'{..}
          = object
              (catMaybes
                 [("sparkJob" .=) <$> _ojSparkJob,
                  ("stepId" .=) <$> _ojStepId,
                  ("prerequisiteStepIds" .=) <$>
                    _ojPrerequisiteStepIds,
                  ("hiveJob" .=) <$> _ojHiveJob,
                  ("sparkSqlJob" .=) <$> _ojSparkSQLJob,
                  ("hadoopJob" .=) <$> _ojHadoopJob,
                  ("labels" .=) <$> _ojLabels,
                  ("pysparkJob" .=) <$> _ojPysparkJob,
                  ("scheduling" .=) <$> _ojScheduling,
                  ("pigJob" .=) <$> _ojPigJob])

-- | A request to cancel a job.
--
-- /See:/ 'cancelJobRequest' smart constructor.
data CancelJobRequest =
    CancelJobRequest'
    deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CancelJobRequest' with the minimum fields required to make a request.
--
cancelJobRequest
    :: CancelJobRequest
cancelJobRequest = CancelJobRequest'

instance FromJSON CancelJobRequest where
        parseJSON
          = withObject "CancelJobRequest"
              (\ o -> pure CancelJobRequest')

instance ToJSON CancelJobRequest where
        toJSON = const emptyObject

-- | A list of queries to run on a cluster.
--
-- /See:/ 'queryList' smart constructor.
newtype QueryList = QueryList'
    { _qlQueries :: Maybe [Text]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'QueryList' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'qlQueries'
queryList
    :: QueryList
queryList =
    QueryList'
    { _qlQueries = Nothing
    }

-- | Required. The queries to execute. You do not need to terminate a query
-- with a semicolon. Multiple queries can be specified in one string by
-- separating each with a semicolon. Here is an example of an Cloud
-- Dataproc API snippet that uses a QueryList to specify a HiveJob:
-- \"hiveJob\": { \"queryList\": { \"queries\": [ \"query1\", \"query2\",
-- \"query3;query4\", ] } }
qlQueries :: Lens' QueryList [Text]
qlQueries
  = lens _qlQueries (\ s a -> s{_qlQueries = a}) .
      _Default
      . _Coerce

instance FromJSON QueryList where
        parseJSON
          = withObject "QueryList"
              (\ o -> QueryList' <$> (o .:? "queries" .!= mempty))

instance ToJSON QueryList where
        toJSON QueryList'{..}
          = object (catMaybes [("queries" .=) <$> _qlQueries])

-- | Service-specific metadata associated with the operation. It typically
-- contains progress information and common metadata such as create time.
-- Some services might not provide such metadata. Any method that returns a
-- long-running operation should document the metadata type, if any.
--
-- /See:/ 'operationMetadata' smart constructor.
newtype OperationMetadata = OperationMetadata'
    { _omAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'OperationMetadata' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'omAddtional'
operationMetadata
    :: HashMap Text JSONValue -- ^ 'omAddtional'
    -> OperationMetadata
operationMetadata pOmAddtional_ =
    OperationMetadata'
    { _omAddtional = _Coerce # pOmAddtional_
    }

-- | Properties of the object. Contains field \'type with type URL.
omAddtional :: Lens' OperationMetadata (HashMap Text JSONValue)
omAddtional
  = lens _omAddtional (\ s a -> s{_omAddtional = a}) .
      _Coerce

instance FromJSON OperationMetadata where
        parseJSON
          = withObject "OperationMetadata"
              (\ o -> OperationMetadata' <$> (parseJSONObject o))

instance ToJSON OperationMetadata where
        toJSON = toJSON . _omAddtional

-- | Cloud Dataproc job status.
--
-- /See:/ 'jobStatus' smart constructor.
data JobStatus = JobStatus'
    { _jsState          :: !(Maybe JobStatusState)
    , _jsSubState       :: !(Maybe JobStatusSubState)
    , _jsStateStartTime :: !(Maybe DateTime')
    , _jsDetails        :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobStatus' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jsState'
--
-- * 'jsSubState'
--
-- * 'jsStateStartTime'
--
-- * 'jsDetails'
jobStatus
    :: JobStatus
jobStatus =
    JobStatus'
    { _jsState = Nothing
    , _jsSubState = Nothing
    , _jsStateStartTime = Nothing
    , _jsDetails = Nothing
    }

-- | Output only. A state message specifying the overall job state.
jsState :: Lens' JobStatus (Maybe JobStatusState)
jsState = lens _jsState (\ s a -> s{_jsState = a})

-- | Output only. Additional state information, which includes status
-- reported by the agent.
jsSubState :: Lens' JobStatus (Maybe JobStatusSubState)
jsSubState
  = lens _jsSubState (\ s a -> s{_jsSubState = a})

-- | Output only. The time when this state was entered.
jsStateStartTime :: Lens' JobStatus (Maybe UTCTime)
jsStateStartTime
  = lens _jsStateStartTime
      (\ s a -> s{_jsStateStartTime = a})
      . mapping _DateTime

-- | Output only. Optional job state details, such as an error description if
-- the state is 'ERROR'.
jsDetails :: Lens' JobStatus (Maybe Text)
jsDetails
  = lens _jsDetails (\ s a -> s{_jsDetails = a})

instance FromJSON JobStatus where
        parseJSON
          = withObject "JobStatus"
              (\ o ->
                 JobStatus' <$>
                   (o .:? "state") <*> (o .:? "substate") <*>
                     (o .:? "stateStartTime")
                     <*> (o .:? "details"))

instance ToJSON JobStatus where
        toJSON JobStatus'{..}
          = object
              (catMaybes
                 [("state" .=) <$> _jsState,
                  ("substate" .=) <$> _jsSubState,
                  ("stateStartTime" .=) <$> _jsStateStartTime,
                  ("details" .=) <$> _jsDetails])

-- | Optional. Mapping of query variable names to values (equivalent to the
-- Pig command: name=[value]).
--
-- /See:/ 'pigJobScriptVariables' smart constructor.
newtype PigJobScriptVariables = PigJobScriptVariables'
    { _pjsvAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PigJobScriptVariables' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pjsvAddtional'
pigJobScriptVariables
    :: HashMap Text Text -- ^ 'pjsvAddtional'
    -> PigJobScriptVariables
pigJobScriptVariables pPjsvAddtional_ =
    PigJobScriptVariables'
    { _pjsvAddtional = _Coerce # pPjsvAddtional_
    }

pjsvAddtional :: Lens' PigJobScriptVariables (HashMap Text Text)
pjsvAddtional
  = lens _pjsvAddtional
      (\ s a -> s{_pjsvAddtional = a})
      . _Coerce

instance FromJSON PigJobScriptVariables where
        parseJSON
          = withObject "PigJobScriptVariables"
              (\ o ->
                 PigJobScriptVariables' <$> (parseJSONObject o))

instance ToJSON PigJobScriptVariables where
        toJSON = toJSON . _pjsvAddtional

-- | The HDFS metrics.
--
-- /See:/ 'clusterMetricsHdfsMetrics' smart constructor.
newtype ClusterMetricsHdfsMetrics = ClusterMetricsHdfsMetrics'
    { _cmhmAddtional :: HashMap Text (Textual Int64)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterMetricsHdfsMetrics' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cmhmAddtional'
clusterMetricsHdfsMetrics
    :: HashMap Text Int64 -- ^ 'cmhmAddtional'
    -> ClusterMetricsHdfsMetrics
clusterMetricsHdfsMetrics pCmhmAddtional_ =
    ClusterMetricsHdfsMetrics'
    { _cmhmAddtional = _Coerce # pCmhmAddtional_
    }

cmhmAddtional :: Lens' ClusterMetricsHdfsMetrics (HashMap Text Int64)
cmhmAddtional
  = lens _cmhmAddtional
      (\ s a -> s{_cmhmAddtional = a})
      . _Coerce

instance FromJSON ClusterMetricsHdfsMetrics where
        parseJSON
          = withObject "ClusterMetricsHdfsMetrics"
              (\ o ->
                 ClusterMetricsHdfsMetrics' <$> (parseJSONObject o))

instance ToJSON ClusterMetricsHdfsMetrics where
        toJSON = toJSON . _cmhmAddtional

-- | The workflow node.
--
-- /See:/ 'workflowNode' smart constructor.
data WorkflowNode = WorkflowNode'
    { _wnState               :: !(Maybe WorkflowNodeState)
    , _wnStepId              :: !(Maybe Text)
    , _wnJobId               :: !(Maybe Text)
    , _wnPrerequisiteStepIds :: !(Maybe [Text])
    , _wnError               :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkflowNode' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wnState'
--
-- * 'wnStepId'
--
-- * 'wnJobId'
--
-- * 'wnPrerequisiteStepIds'
--
-- * 'wnError'
workflowNode
    :: WorkflowNode
workflowNode =
    WorkflowNode'
    { _wnState = Nothing
    , _wnStepId = Nothing
    , _wnJobId = Nothing
    , _wnPrerequisiteStepIds = Nothing
    , _wnError = Nothing
    }

-- | Output only. The node state.
wnState :: Lens' WorkflowNode (Maybe WorkflowNodeState)
wnState = lens _wnState (\ s a -> s{_wnState = a})

-- | Output only. The name of the node.
wnStepId :: Lens' WorkflowNode (Maybe Text)
wnStepId = lens _wnStepId (\ s a -> s{_wnStepId = a})

-- | Output only. The job id; populated after the node enters RUNNING state.
wnJobId :: Lens' WorkflowNode (Maybe Text)
wnJobId = lens _wnJobId (\ s a -> s{_wnJobId = a})

-- | Output only. Node\'s prerequisite nodes.
wnPrerequisiteStepIds :: Lens' WorkflowNode [Text]
wnPrerequisiteStepIds
  = lens _wnPrerequisiteStepIds
      (\ s a -> s{_wnPrerequisiteStepIds = a})
      . _Default
      . _Coerce

-- | Output only. The error detail.
wnError :: Lens' WorkflowNode (Maybe Text)
wnError = lens _wnError (\ s a -> s{_wnError = a})

instance FromJSON WorkflowNode where
        parseJSON
          = withObject "WorkflowNode"
              (\ o ->
                 WorkflowNode' <$>
                   (o .:? "state") <*> (o .:? "stepId") <*>
                     (o .:? "jobId")
                     <*> (o .:? "prerequisiteStepIds" .!= mempty)
                     <*> (o .:? "error"))

instance ToJSON WorkflowNode where
        toJSON WorkflowNode'{..}
          = object
              (catMaybes
                 [("state" .=) <$> _wnState,
                  ("stepId" .=) <$> _wnStepId,
                  ("jobId" .=) <$> _wnJobId,
                  ("prerequisiteStepIds" .=) <$>
                    _wnPrerequisiteStepIds,
                  ("error" .=) <$> _wnError])

-- | A Cloud Dataproc workflow template resource.
--
-- /See:/ 'workflowMetadata' smart constructor.
data WorkflowMetadata = WorkflowMetadata'
    { _wmGraph         :: !(Maybe WorkflowGraph)
    , _wmState         :: !(Maybe WorkflowMetadataState)
    , _wmClusterUuid   :: !(Maybe Text)
    , _wmStartTime     :: !(Maybe DateTime')
    , _wmDeleteCluster :: !(Maybe ClusterOperation)
    , _wmCreateCluster :: !(Maybe ClusterOperation)
    , _wmVersion       :: !(Maybe (Textual Int32))
    , _wmEndTime       :: !(Maybe DateTime')
    , _wmParameters    :: !(Maybe WorkflowMetadataParameters)
    , _wmClusterName   :: !(Maybe Text)
    , _wmTemplate      :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkflowMetadata' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wmGraph'
--
-- * 'wmState'
--
-- * 'wmClusterUuid'
--
-- * 'wmStartTime'
--
-- * 'wmDeleteCluster'
--
-- * 'wmCreateCluster'
--
-- * 'wmVersion'
--
-- * 'wmEndTime'
--
-- * 'wmParameters'
--
-- * 'wmClusterName'
--
-- * 'wmTemplate'
workflowMetadata
    :: WorkflowMetadata
workflowMetadata =
    WorkflowMetadata'
    { _wmGraph = Nothing
    , _wmState = Nothing
    , _wmClusterUuid = Nothing
    , _wmStartTime = Nothing
    , _wmDeleteCluster = Nothing
    , _wmCreateCluster = Nothing
    , _wmVersion = Nothing
    , _wmEndTime = Nothing
    , _wmParameters = Nothing
    , _wmClusterName = Nothing
    , _wmTemplate = Nothing
    }

-- | Output only. The workflow graph.
wmGraph :: Lens' WorkflowMetadata (Maybe WorkflowGraph)
wmGraph = lens _wmGraph (\ s a -> s{_wmGraph = a})

-- | Output only. The workflow state.
wmState :: Lens' WorkflowMetadata (Maybe WorkflowMetadataState)
wmState = lens _wmState (\ s a -> s{_wmState = a})

-- | Output only. The UUID of target cluster.
wmClusterUuid :: Lens' WorkflowMetadata (Maybe Text)
wmClusterUuid
  = lens _wmClusterUuid
      (\ s a -> s{_wmClusterUuid = a})

-- | Output only. Workflow start time.
wmStartTime :: Lens' WorkflowMetadata (Maybe UTCTime)
wmStartTime
  = lens _wmStartTime (\ s a -> s{_wmStartTime = a}) .
      mapping _DateTime

-- | Output only. The delete cluster operation metadata.
wmDeleteCluster :: Lens' WorkflowMetadata (Maybe ClusterOperation)
wmDeleteCluster
  = lens _wmDeleteCluster
      (\ s a -> s{_wmDeleteCluster = a})

-- | Output only. The create cluster operation metadata.
wmCreateCluster :: Lens' WorkflowMetadata (Maybe ClusterOperation)
wmCreateCluster
  = lens _wmCreateCluster
      (\ s a -> s{_wmCreateCluster = a})

-- | Output only. The version of template at the time of workflow
-- instantiation.
wmVersion :: Lens' WorkflowMetadata (Maybe Int32)
wmVersion
  = lens _wmVersion (\ s a -> s{_wmVersion = a}) .
      mapping _Coerce

-- | Output only. Workflow end time.
wmEndTime :: Lens' WorkflowMetadata (Maybe UTCTime)
wmEndTime
  = lens _wmEndTime (\ s a -> s{_wmEndTime = a}) .
      mapping _DateTime

-- | Map from parameter names to values that were used for those parameters.
wmParameters :: Lens' WorkflowMetadata (Maybe WorkflowMetadataParameters)
wmParameters
  = lens _wmParameters (\ s a -> s{_wmParameters = a})

-- | Output only. The name of the target cluster.
wmClusterName :: Lens' WorkflowMetadata (Maybe Text)
wmClusterName
  = lens _wmClusterName
      (\ s a -> s{_wmClusterName = a})

-- | Output only. The \"resource name\" of the template.
wmTemplate :: Lens' WorkflowMetadata (Maybe Text)
wmTemplate
  = lens _wmTemplate (\ s a -> s{_wmTemplate = a})

instance FromJSON WorkflowMetadata where
        parseJSON
          = withObject "WorkflowMetadata"
              (\ o ->
                 WorkflowMetadata' <$>
                   (o .:? "graph") <*> (o .:? "state") <*>
                     (o .:? "clusterUuid")
                     <*> (o .:? "startTime")
                     <*> (o .:? "deleteCluster")
                     <*> (o .:? "createCluster")
                     <*> (o .:? "version")
                     <*> (o .:? "endTime")
                     <*> (o .:? "parameters")
                     <*> (o .:? "clusterName")
                     <*> (o .:? "template"))

instance ToJSON WorkflowMetadata where
        toJSON WorkflowMetadata'{..}
          = object
              (catMaybes
                 [("graph" .=) <$> _wmGraph,
                  ("state" .=) <$> _wmState,
                  ("clusterUuid" .=) <$> _wmClusterUuid,
                  ("startTime" .=) <$> _wmStartTime,
                  ("deleteCluster" .=) <$> _wmDeleteCluster,
                  ("createCluster" .=) <$> _wmCreateCluster,
                  ("version" .=) <$> _wmVersion,
                  ("endTime" .=) <$> _wmEndTime,
                  ("parameters" .=) <$> _wmParameters,
                  ("clusterName" .=) <$> _wmClusterName,
                  ("template" .=) <$> _wmTemplate])

-- | The normal response of the operation in case of success. If the original
-- method returns no data on success, such as Delete, the response is
-- google.protobuf.Empty. If the original method is standard
-- Get\/Create\/Update, the response should be the resource. For other
-- methods, the response should have the type XxxResponse, where Xxx is the
-- original method name. For example, if the original method name is
-- TakeSnapshot(), the inferred response type is TakeSnapshotResponse.
--
-- /See:/ 'operationResponse' smart constructor.
newtype OperationResponse = OperationResponse'
    { _orAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'OperationResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'orAddtional'
operationResponse
    :: HashMap Text JSONValue -- ^ 'orAddtional'
    -> OperationResponse
operationResponse pOrAddtional_ =
    OperationResponse'
    { _orAddtional = _Coerce # pOrAddtional_
    }

-- | Properties of the object. Contains field \'type with type URL.
orAddtional :: Lens' OperationResponse (HashMap Text JSONValue)
orAddtional
  = lens _orAddtional (\ s a -> s{_orAddtional = a}) .
      _Coerce

instance FromJSON OperationResponse where
        parseJSON
          = withObject "OperationResponse"
              (\ o -> OperationResponse' <$> (parseJSONObject o))

instance ToJSON OperationResponse where
        toJSON = toJSON . _orAddtional

-- | The per-package log levels for the driver. This may include \"root\"
-- package name to configure rootLogger. Examples: \'com.google = FATAL\',
-- \'root = INFO\', \'org.apache = DEBUG\'
--
-- /See:/ 'loggingConfigDriverLogLevels' smart constructor.
newtype LoggingConfigDriverLogLevels = LoggingConfigDriverLogLevels'
    { _lcdllAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'LoggingConfigDriverLogLevels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lcdllAddtional'
loggingConfigDriverLogLevels
    :: HashMap Text Text -- ^ 'lcdllAddtional'
    -> LoggingConfigDriverLogLevels
loggingConfigDriverLogLevels pLcdllAddtional_ =
    LoggingConfigDriverLogLevels'
    { _lcdllAddtional = _Coerce # pLcdllAddtional_
    }

lcdllAddtional :: Lens' LoggingConfigDriverLogLevels (HashMap Text Text)
lcdllAddtional
  = lens _lcdllAddtional
      (\ s a -> s{_lcdllAddtional = a})
      . _Coerce

instance FromJSON LoggingConfigDriverLogLevels where
        parseJSON
          = withObject "LoggingConfigDriverLogLevels"
              (\ o ->
                 LoggingConfigDriverLogLevels' <$>
                   (parseJSONObject o))

instance ToJSON LoggingConfigDriverLogLevels where
        toJSON = toJSON . _lcdllAddtional

-- | The status of a cluster and its instances.
--
-- /See:/ 'clusterStatus' smart constructor.
data ClusterStatus = ClusterStatus'
    { _csState          :: !(Maybe ClusterStatusState)
    , _csSubState       :: !(Maybe ClusterStatusSubState)
    , _csStateStartTime :: !(Maybe DateTime')
    , _csDetail         :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ClusterStatus' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'csState'
--
-- * 'csSubState'
--
-- * 'csStateStartTime'
--
-- * 'csDetail'
clusterStatus
    :: ClusterStatus
clusterStatus =
    ClusterStatus'
    { _csState = Nothing
    , _csSubState = Nothing
    , _csStateStartTime = Nothing
    , _csDetail = Nothing
    }

-- | Output only. The cluster\'s state.
csState :: Lens' ClusterStatus (Maybe ClusterStatusState)
csState = lens _csState (\ s a -> s{_csState = a})

-- | Output only. Additional state information that includes status reported
-- by the agent.
csSubState :: Lens' ClusterStatus (Maybe ClusterStatusSubState)
csSubState
  = lens _csSubState (\ s a -> s{_csSubState = a})

-- | Output only. Time when this state was entered.
csStateStartTime :: Lens' ClusterStatus (Maybe UTCTime)
csStateStartTime
  = lens _csStateStartTime
      (\ s a -> s{_csStateStartTime = a})
      . mapping _DateTime

-- | Output only. Optional details of cluster\'s state.
csDetail :: Lens' ClusterStatus (Maybe Text)
csDetail = lens _csDetail (\ s a -> s{_csDetail = a})

instance FromJSON ClusterStatus where
        parseJSON
          = withObject "ClusterStatus"
              (\ o ->
                 ClusterStatus' <$>
                   (o .:? "state") <*> (o .:? "substate") <*>
                     (o .:? "stateStartTime")
                     <*> (o .:? "detail"))

instance ToJSON ClusterStatus where
        toJSON ClusterStatus'{..}
          = object
              (catMaybes
                 [("state" .=) <$> _csState,
                  ("substate" .=) <$> _csSubState,
                  ("stateStartTime" .=) <$> _csStateStartTime,
                  ("detail" .=) <$> _csDetail])

-- | A YARN application created by a job. Application information is a subset
-- of 'org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto'.Beta
-- Feature: This report is available for testing purposes only. It may be
-- changed before final release.
--
-- /See:/ 'yarnApplication' smart constructor.
data YarnApplication = YarnApplication'
    { _yaTrackingURL :: !(Maybe Text)
    , _yaState       :: !(Maybe YarnApplicationState)
    , _yaProgress    :: !(Maybe (Textual Double))
    , _yaName        :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'YarnApplication' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'yaTrackingURL'
--
-- * 'yaState'
--
-- * 'yaProgress'
--
-- * 'yaName'
yarnApplication
    :: YarnApplication
yarnApplication =
    YarnApplication'
    { _yaTrackingURL = Nothing
    , _yaState = Nothing
    , _yaProgress = Nothing
    , _yaName = Nothing
    }

-- | Optional. The HTTP URL of the ApplicationMaster, HistoryServer, or
-- TimelineServer that provides application-specific information. The URL
-- uses the internal hostname, and requires a proxy server for resolution
-- and, possibly, access.
yaTrackingURL :: Lens' YarnApplication (Maybe Text)
yaTrackingURL
  = lens _yaTrackingURL
      (\ s a -> s{_yaTrackingURL = a})

-- | Required. The application state.
yaState :: Lens' YarnApplication (Maybe YarnApplicationState)
yaState = lens _yaState (\ s a -> s{_yaState = a})

-- | Required. The numerical progress of the application, from 1 to 100.
yaProgress :: Lens' YarnApplication (Maybe Double)
yaProgress
  = lens _yaProgress (\ s a -> s{_yaProgress = a}) .
      mapping _Coerce

-- | Required. The application name.
yaName :: Lens' YarnApplication (Maybe Text)
yaName = lens _yaName (\ s a -> s{_yaName = a})

instance FromJSON YarnApplication where
        parseJSON
          = withObject "YarnApplication"
              (\ o ->
                 YarnApplication' <$>
                   (o .:? "trackingUrl") <*> (o .:? "state") <*>
                     (o .:? "progress")
                     <*> (o .:? "name"))

instance ToJSON YarnApplication where
        toJSON YarnApplication'{..}
          = object
              (catMaybes
                 [("trackingUrl" .=) <$> _yaTrackingURL,
                  ("state" .=) <$> _yaState,
                  ("progress" .=) <$> _yaProgress,
                  ("name" .=) <$> _yaName])

-- | A Cloud Dataproc job for running Apache Pig (https:\/\/pig.apache.org\/)
-- queries on YARN.
--
-- /See:/ 'pigJob' smart constructor.
data PigJob = PigJob'
    { _pjQueryFileURI      :: !(Maybe Text)
    , _pjJarFileURIs       :: !(Maybe [Text])
    , _pjScriptVariables   :: !(Maybe PigJobScriptVariables)
    , _pjQueryList         :: !(Maybe QueryList)
    , _pjContinueOnFailure :: !(Maybe Bool)
    , _pjLoggingConfig     :: !(Maybe LoggingConfig)
    , _pjProperties        :: !(Maybe PigJobProperties)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PigJob' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pjQueryFileURI'
--
-- * 'pjJarFileURIs'
--
-- * 'pjScriptVariables'
--
-- * 'pjQueryList'
--
-- * 'pjContinueOnFailure'
--
-- * 'pjLoggingConfig'
--
-- * 'pjProperties'
pigJob
    :: PigJob
pigJob =
    PigJob'
    { _pjQueryFileURI = Nothing
    , _pjJarFileURIs = Nothing
    , _pjScriptVariables = Nothing
    , _pjQueryList = Nothing
    , _pjContinueOnFailure = Nothing
    , _pjLoggingConfig = Nothing
    , _pjProperties = Nothing
    }

-- | The HCFS URI of the script that contains the Pig queries.
pjQueryFileURI :: Lens' PigJob (Maybe Text)
pjQueryFileURI
  = lens _pjQueryFileURI
      (\ s a -> s{_pjQueryFileURI = a})

-- | Optional. HCFS URIs of jar files to add to the CLASSPATH of the Pig
-- Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs.
pjJarFileURIs :: Lens' PigJob [Text]
pjJarFileURIs
  = lens _pjJarFileURIs
      (\ s a -> s{_pjJarFileURIs = a})
      . _Default
      . _Coerce

-- | Optional. Mapping of query variable names to values (equivalent to the
-- Pig command: name=[value]).
pjScriptVariables :: Lens' PigJob (Maybe PigJobScriptVariables)
pjScriptVariables
  = lens _pjScriptVariables
      (\ s a -> s{_pjScriptVariables = a})

-- | A list of queries.
pjQueryList :: Lens' PigJob (Maybe QueryList)
pjQueryList
  = lens _pjQueryList (\ s a -> s{_pjQueryList = a})

-- | Optional. Whether to continue executing queries if a query fails. The
-- default value is false. Setting to true can be useful when executing
-- independent parallel queries.
pjContinueOnFailure :: Lens' PigJob (Maybe Bool)
pjContinueOnFailure
  = lens _pjContinueOnFailure
      (\ s a -> s{_pjContinueOnFailure = a})

-- | Optional. The runtime log config for job execution.
pjLoggingConfig :: Lens' PigJob (Maybe LoggingConfig)
pjLoggingConfig
  = lens _pjLoggingConfig
      (\ s a -> s{_pjLoggingConfig = a})

-- | Optional. A mapping of property names to values, used to configure Pig.
-- Properties that conflict with values set by the Cloud Dataproc API may
-- be overwritten. Can include properties set in
-- \/etc\/hadoop\/conf\/*-site.xml, \/etc\/pig\/conf\/pig.properties, and
-- classes in user code.
pjProperties :: Lens' PigJob (Maybe PigJobProperties)
pjProperties
  = lens _pjProperties (\ s a -> s{_pjProperties = a})

instance FromJSON PigJob where
        parseJSON
          = withObject "PigJob"
              (\ o ->
                 PigJob' <$>
                   (o .:? "queryFileUri") <*>
                     (o .:? "jarFileUris" .!= mempty)
                     <*> (o .:? "scriptVariables")
                     <*> (o .:? "queryList")
                     <*> (o .:? "continueOnFailure")
                     <*> (o .:? "loggingConfig")
                     <*> (o .:? "properties"))

instance ToJSON PigJob where
        toJSON PigJob'{..}
          = object
              (catMaybes
                 [("queryFileUri" .=) <$> _pjQueryFileURI,
                  ("jarFileUris" .=) <$> _pjJarFileURIs,
                  ("scriptVariables" .=) <$> _pjScriptVariables,
                  ("queryList" .=) <$> _pjQueryList,
                  ("continueOnFailure" .=) <$> _pjContinueOnFailure,
                  ("loggingConfig" .=) <$> _pjLoggingConfig,
                  ("properties" .=) <$> _pjProperties])

-- | The runtime logging config of the job.
--
-- /See:/ 'loggingConfig' smart constructor.
newtype LoggingConfig = LoggingConfig'
    { _lcDriverLogLevels :: Maybe LoggingConfigDriverLogLevels
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'LoggingConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lcDriverLogLevels'
loggingConfig
    :: LoggingConfig
loggingConfig =
    LoggingConfig'
    { _lcDriverLogLevels = Nothing
    }

-- | The per-package log levels for the driver. This may include \"root\"
-- package name to configure rootLogger. Examples: \'com.google = FATAL\',
-- \'root = INFO\', \'org.apache = DEBUG\'
lcDriverLogLevels :: Lens' LoggingConfig (Maybe LoggingConfigDriverLogLevels)
lcDriverLogLevels
  = lens _lcDriverLogLevels
      (\ s a -> s{_lcDriverLogLevels = a})

instance FromJSON LoggingConfig where
        parseJSON
          = withObject "LoggingConfig"
              (\ o -> LoggingConfig' <$> (o .:? "driverLogLevels"))

instance ToJSON LoggingConfig where
        toJSON LoggingConfig'{..}
          = object
              (catMaybes
                 [("driverLogLevels" .=) <$> _lcDriverLogLevels])

-- | Associates members with a role.
--
-- /See:/ 'binding' smart constructor.
data Binding = Binding'
    { _bMembers   :: !(Maybe [Text])
    , _bRole      :: !(Maybe Text)
    , _bCondition :: !(Maybe Expr)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Binding' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'bMembers'
--
-- * 'bRole'
--
-- * 'bCondition'
binding
    :: Binding
binding =
    Binding'
    { _bMembers = Nothing
    , _bRole = Nothing
    , _bCondition = Nothing
    }

-- | Specifies the identities requesting access for a Cloud Platform
-- resource. members can have the following values: allUsers: A special
-- identifier that represents anyone who is on the internet; with or
-- without a Google account. allAuthenticatedUsers: A special identifier
-- that represents anyone who is authenticated with a Google account or a
-- service account. user:{emailid}: An email address that represents a
-- specific Google account. For example, alice\'gmail.com .
-- serviceAccount:{emailid}: An email address that represents a service
-- account. For example, my-other-app\'appspot.gserviceaccount.com.
-- group:{emailid}: An email address that represents a Google group. For
-- example, admins\'example.com. domain:{domain}: A Google Apps domain name
-- that represents all the users of that domain. For example, google.com or
-- example.com.
bMembers :: Lens' Binding [Text]
bMembers
  = lens _bMembers (\ s a -> s{_bMembers = a}) .
      _Default
      . _Coerce

-- | Role that is assigned to members. For example, roles\/viewer,
-- roles\/editor, or roles\/owner.
bRole :: Lens' Binding (Maybe Text)
bRole = lens _bRole (\ s a -> s{_bRole = a})

-- | Unimplemented. The condition that is associated with this binding. NOTE:
-- an unsatisfied condition will not allow user access via current binding.
-- Different bindings, including their conditions, are examined
-- independently.
bCondition :: Lens' Binding (Maybe Expr)
bCondition
  = lens _bCondition (\ s a -> s{_bCondition = a})

instance FromJSON Binding where
        parseJSON
          = withObject "Binding"
              (\ o ->
                 Binding' <$>
                   (o .:? "members" .!= mempty) <*> (o .:? "role") <*>
                     (o .:? "condition"))

instance ToJSON Binding where
        toJSON Binding'{..}
          = object
              (catMaybes
                 [("members" .=) <$> _bMembers,
                  ("role" .=) <$> _bRole,
                  ("condition" .=) <$> _bCondition])