diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,28 @@
+# gogol-composer
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`0.3.0`
+
+
+## Description
+
+A client library for the Google Cloud Composer.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/gogol/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `gogol-gen` for more information.
+
+
+## Licence
+
+`gogol-composer` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import           Distribution.Simple
+main = defaultMain
diff --git a/gen/Network/Google/Composer.hs b/gen/Network/Google/Composer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Composer.hs
@@ -0,0 +1,214 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TypeOperators     #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- |
+-- Module      : Network.Google.Composer
+-- 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)
+--
+-- Manages Apache Airflow environments on Google Cloud Platform.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference>
+module Network.Google.Composer
+    (
+    -- * Service Configuration
+      composerService
+
+    -- * OAuth Scopes
+    , cloudPlatformScope
+
+    -- * API Declaration
+    , ComposerAPI
+
+    -- * Resources
+
+    -- ** composer.projects.locations.environments.create
+    , module Network.Google.Resource.Composer.Projects.Locations.Environments.Create
+
+    -- ** composer.projects.locations.environments.delete
+    , module Network.Google.Resource.Composer.Projects.Locations.Environments.Delete
+
+    -- ** composer.projects.locations.environments.get
+    , module Network.Google.Resource.Composer.Projects.Locations.Environments.Get
+
+    -- ** composer.projects.locations.environments.list
+    , module Network.Google.Resource.Composer.Projects.Locations.Environments.List
+
+    -- ** composer.projects.locations.environments.patch
+    , module Network.Google.Resource.Composer.Projects.Locations.Environments.Patch
+
+    -- ** composer.projects.locations.operations.delete
+    , module Network.Google.Resource.Composer.Projects.Locations.Operations.Delete
+
+    -- ** composer.projects.locations.operations.get
+    , module Network.Google.Resource.Composer.Projects.Locations.Operations.Get
+
+    -- ** composer.projects.locations.operations.list
+    , module Network.Google.Resource.Composer.Projects.Locations.Operations.List
+
+    -- * Types
+
+    -- ** Status
+    , Status
+    , status
+    , sDetails
+    , sCode
+    , sMessage
+
+    -- ** OperationSchema
+    , OperationSchema
+    , operationSchema
+    , osAddtional
+
+    -- ** ListEnvironmentsResponse
+    , ListEnvironmentsResponse
+    , listEnvironmentsResponse
+    , lerNextPageToken
+    , lerEnvironments
+
+    -- ** EnvironmentConfig
+    , EnvironmentConfig
+    , environmentConfig
+    , ecNodeConfig
+    , ecNodeCount
+    , ecSoftwareConfig
+    , ecDagGcsPrefix
+    , ecGkeCluster
+    , ecAirflowURI
+
+    -- ** ListOperationsResponse
+    , ListOperationsResponse
+    , listOperationsResponse
+    , lorNextPageToken
+    , lorOperations
+
+    -- ** NodeConfig
+    , NodeConfig
+    , nodeConfig
+    , ncDiskSizeGb
+    , ncLocation
+    , ncNetwork
+    , ncOAuthScopes
+    , ncServiceAccount
+    , ncSubnetwork
+    , ncMachineType
+    , ncTags
+
+    -- ** Operation
+    , Operation
+    , operation
+    , oDone
+    , oError
+    , oResponse
+    , oName
+    , oMetadata
+
+    -- ** Empty
+    , Empty
+    , empty
+
+    -- ** OperationMetadataOperationType
+    , OperationMetadataOperationType (..)
+
+    -- ** SoftwareConfigEnvVariables
+    , SoftwareConfigEnvVariables
+    , softwareConfigEnvVariables
+    , scevAddtional
+
+    -- ** Environment
+    , Environment
+    , environment
+    , eState
+    , eConfig
+    , eUuid
+    , eUpdateTime
+    , eName
+    , eLabels
+    , eCreateTime
+
+    -- ** SoftwareConfigAirflowConfigOverrides
+    , SoftwareConfigAirflowConfigOverrides
+    , softwareConfigAirflowConfigOverrides
+    , scacoAddtional
+
+    -- ** StatusDetailsItem
+    , StatusDetailsItem
+    , statusDetailsItem
+    , sdiAddtional
+
+    -- ** SoftwareConfigPypiPackages
+    , SoftwareConfigPypiPackages
+    , softwareConfigPypiPackages
+    , scppAddtional
+
+    -- ** OperationMetadataState
+    , OperationMetadataState (..)
+
+    -- ** EnvironmentState
+    , EnvironmentState (..)
+
+    -- ** Xgafv
+    , Xgafv (..)
+
+    -- ** SoftwareConfig
+    , SoftwareConfig
+    , softwareConfig
+    , scImageVersion
+    , scPythonVersion
+    , scPypiPackages
+    , scAirflowConfigOverrides
+    , scEnvVariables
+
+    -- ** EnvironmentLabels
+    , EnvironmentLabels
+    , environmentLabels
+    , elAddtional
+
+    -- ** OperationMetadata
+    , OperationMetadata
+    , operationMetadata
+    , omState
+    , omResourceUuid
+    , omResource
+    , omEndTime
+    , omOperationType
+    , omCreateTime
+
+    -- ** OperationResponse
+    , OperationResponse
+    , operationResponse
+    , orAddtional
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+import           Network.Google.Resource.Composer.Projects.Locations.Environments.Create
+import           Network.Google.Resource.Composer.Projects.Locations.Environments.Delete
+import           Network.Google.Resource.Composer.Projects.Locations.Environments.Get
+import           Network.Google.Resource.Composer.Projects.Locations.Environments.List
+import           Network.Google.Resource.Composer.Projects.Locations.Environments.Patch
+import           Network.Google.Resource.Composer.Projects.Locations.Operations.Delete
+import           Network.Google.Resource.Composer.Projects.Locations.Operations.Get
+import           Network.Google.Resource.Composer.Projects.Locations.Operations.List
+
+{- $resources
+TODO
+-}
+
+-- | Represents the entirety of the methods and resources available for the Cloud Composer API service.
+type ComposerAPI =
+     ProjectsLocationsOperationsListResource :<|>
+       ProjectsLocationsOperationsGetResource
+       :<|> ProjectsLocationsOperationsDeleteResource
+       :<|> ProjectsLocationsEnvironmentsListResource
+       :<|> ProjectsLocationsEnvironmentsPatchResource
+       :<|> ProjectsLocationsEnvironmentsGetResource
+       :<|> ProjectsLocationsEnvironmentsCreateResource
+       :<|> ProjectsLocationsEnvironmentsDeleteResource
diff --git a/gen/Network/Google/Composer/Types.hs b/gen/Network/Google/Composer/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Composer/Types.hs
@@ -0,0 +1,169 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Composer.Types
+-- 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.Composer.Types
+    (
+    -- * Service Configuration
+      composerService
+
+    -- * OAuth Scopes
+    , cloudPlatformScope
+
+    -- * Status
+    , Status
+    , status
+    , sDetails
+    , sCode
+    , sMessage
+
+    -- * OperationSchema
+    , OperationSchema
+    , operationSchema
+    , osAddtional
+
+    -- * ListEnvironmentsResponse
+    , ListEnvironmentsResponse
+    , listEnvironmentsResponse
+    , lerNextPageToken
+    , lerEnvironments
+
+    -- * EnvironmentConfig
+    , EnvironmentConfig
+    , environmentConfig
+    , ecNodeConfig
+    , ecNodeCount
+    , ecSoftwareConfig
+    , ecDagGcsPrefix
+    , ecGkeCluster
+    , ecAirflowURI
+
+    -- * ListOperationsResponse
+    , ListOperationsResponse
+    , listOperationsResponse
+    , lorNextPageToken
+    , lorOperations
+
+    -- * NodeConfig
+    , NodeConfig
+    , nodeConfig
+    , ncDiskSizeGb
+    , ncLocation
+    , ncNetwork
+    , ncOAuthScopes
+    , ncServiceAccount
+    , ncSubnetwork
+    , ncMachineType
+    , ncTags
+
+    -- * Operation
+    , Operation
+    , operation
+    , oDone
+    , oError
+    , oResponse
+    , oName
+    , oMetadata
+
+    -- * Empty
+    , Empty
+    , empty
+
+    -- * OperationMetadataOperationType
+    , OperationMetadataOperationType (..)
+
+    -- * SoftwareConfigEnvVariables
+    , SoftwareConfigEnvVariables
+    , softwareConfigEnvVariables
+    , scevAddtional
+
+    -- * Environment
+    , Environment
+    , environment
+    , eState
+    , eConfig
+    , eUuid
+    , eUpdateTime
+    , eName
+    , eLabels
+    , eCreateTime
+
+    -- * SoftwareConfigAirflowConfigOverrides
+    , SoftwareConfigAirflowConfigOverrides
+    , softwareConfigAirflowConfigOverrides
+    , scacoAddtional
+
+    -- * StatusDetailsItem
+    , StatusDetailsItem
+    , statusDetailsItem
+    , sdiAddtional
+
+    -- * SoftwareConfigPypiPackages
+    , SoftwareConfigPypiPackages
+    , softwareConfigPypiPackages
+    , scppAddtional
+
+    -- * OperationMetadataState
+    , OperationMetadataState (..)
+
+    -- * EnvironmentState
+    , EnvironmentState (..)
+
+    -- * Xgafv
+    , Xgafv (..)
+
+    -- * SoftwareConfig
+    , SoftwareConfig
+    , softwareConfig
+    , scImageVersion
+    , scPythonVersion
+    , scPypiPackages
+    , scAirflowConfigOverrides
+    , scEnvVariables
+
+    -- * EnvironmentLabels
+    , EnvironmentLabels
+    , environmentLabels
+    , elAddtional
+
+    -- * OperationMetadata
+    , OperationMetadata
+    , operationMetadata
+    , omState
+    , omResourceUuid
+    , omResource
+    , omEndTime
+    , omOperationType
+    , omCreateTime
+
+    -- * OperationResponse
+    , OperationResponse
+    , operationResponse
+    , orAddtional
+    ) where
+
+import           Network.Google.Composer.Types.Product
+import           Network.Google.Composer.Types.Sum
+import           Network.Google.Prelude
+
+-- | Default request referring to version 'v1' of the Cloud Composer API. This contains the host and root path used as a starting point for constructing service requests.
+composerService :: ServiceConfig
+composerService
+  = defaultService (ServiceId "composer:v1")
+      "composer.googleapis.com"
+
+-- | View and manage your data across Google Cloud Platform services
+cloudPlatformScope :: Proxy '["https://www.googleapis.com/auth/cloud-platform"]
+cloudPlatformScope = Proxy;
diff --git a/gen/Network/Google/Composer/Types/Product.hs b/gen/Network/Google/Composer/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Composer/Types/Product.hs
@@ -0,0 +1,1216 @@
+{-# 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.Composer.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.Composer.Types.Product where
+
+import           Network.Google.Composer.Types.Sum
+import           Network.Google.Prelude
+
+-- | 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 needs # Overview The \`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 mapping The \`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 uses The 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])
+
+-- | 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:/ 'operationSchema' smart constructor.
+newtype OperationSchema = OperationSchema'
+    { _osAddtional :: HashMap Text JSONValue
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'OperationSchema' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'osAddtional'
+operationSchema
+    :: HashMap Text JSONValue -- ^ 'osAddtional'
+    -> OperationSchema
+operationSchema pOsAddtional_ =
+    OperationSchema'
+    { _osAddtional = _Coerce # pOsAddtional_
+    }
+
+-- | Properties of the object. Contains field \'type with type URL.
+osAddtional :: Lens' OperationSchema (HashMap Text JSONValue)
+osAddtional
+  = lens _osAddtional (\ s a -> s{_osAddtional = a}) .
+      _Coerce
+
+instance FromJSON OperationSchema where
+        parseJSON
+          = withObject "OperationSchema"
+              (\ o -> OperationSchema' <$> (parseJSONObject o))
+
+instance ToJSON OperationSchema where
+        toJSON = toJSON . _osAddtional
+
+-- | The environments in a project and location.
+--
+-- /See:/ 'listEnvironmentsResponse' smart constructor.
+data ListEnvironmentsResponse = ListEnvironmentsResponse'
+    { _lerNextPageToken :: !(Maybe Text)
+    , _lerEnvironments  :: !(Maybe [Environment])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListEnvironmentsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lerNextPageToken'
+--
+-- * 'lerEnvironments'
+listEnvironmentsResponse
+    :: ListEnvironmentsResponse
+listEnvironmentsResponse =
+    ListEnvironmentsResponse'
+    { _lerNextPageToken = Nothing
+    , _lerEnvironments = Nothing
+    }
+
+-- | The page token used to query for the next page if one exists.
+lerNextPageToken :: Lens' ListEnvironmentsResponse (Maybe Text)
+lerNextPageToken
+  = lens _lerNextPageToken
+      (\ s a -> s{_lerNextPageToken = a})
+
+-- | The list of environments returned by a ListEnvironmentsRequest.
+lerEnvironments :: Lens' ListEnvironmentsResponse [Environment]
+lerEnvironments
+  = lens _lerEnvironments
+      (\ s a -> s{_lerEnvironments = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON ListEnvironmentsResponse where
+        parseJSON
+          = withObject "ListEnvironmentsResponse"
+              (\ o ->
+                 ListEnvironmentsResponse' <$>
+                   (o .:? "nextPageToken") <*>
+                     (o .:? "environments" .!= mempty))
+
+instance ToJSON ListEnvironmentsResponse where
+        toJSON ListEnvironmentsResponse'{..}
+          = object
+              (catMaybes
+                 [("nextPageToken" .=) <$> _lerNextPageToken,
+                  ("environments" .=) <$> _lerEnvironments])
+
+-- | Configuration information for an environment.
+--
+-- /See:/ 'environmentConfig' smart constructor.
+data EnvironmentConfig = EnvironmentConfig'
+    { _ecNodeConfig     :: !(Maybe NodeConfig)
+    , _ecNodeCount      :: !(Maybe (Textual Int32))
+    , _ecSoftwareConfig :: !(Maybe SoftwareConfig)
+    , _ecDagGcsPrefix   :: !(Maybe Text)
+    , _ecGkeCluster     :: !(Maybe Text)
+    , _ecAirflowURI     :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnvironmentConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ecNodeConfig'
+--
+-- * 'ecNodeCount'
+--
+-- * 'ecSoftwareConfig'
+--
+-- * 'ecDagGcsPrefix'
+--
+-- * 'ecGkeCluster'
+--
+-- * 'ecAirflowURI'
+environmentConfig
+    :: EnvironmentConfig
+environmentConfig =
+    EnvironmentConfig'
+    { _ecNodeConfig = Nothing
+    , _ecNodeCount = Nothing
+    , _ecSoftwareConfig = Nothing
+    , _ecDagGcsPrefix = Nothing
+    , _ecGkeCluster = Nothing
+    , _ecAirflowURI = Nothing
+    }
+
+-- | The configuration used for the Kubernetes Engine cluster.
+ecNodeConfig :: Lens' EnvironmentConfig (Maybe NodeConfig)
+ecNodeConfig
+  = lens _ecNodeConfig (\ s a -> s{_ecNodeConfig = a})
+
+-- | The number of nodes in the Kubernetes Engine cluster that will be used
+-- to run this environment.
+ecNodeCount :: Lens' EnvironmentConfig (Maybe Int32)
+ecNodeCount
+  = lens _ecNodeCount (\ s a -> s{_ecNodeCount = a}) .
+      mapping _Coerce
+
+-- | The configuration settings for software inside the environment.
+ecSoftwareConfig :: Lens' EnvironmentConfig (Maybe SoftwareConfig)
+ecSoftwareConfig
+  = lens _ecSoftwareConfig
+      (\ s a -> s{_ecSoftwareConfig = a})
+
+-- | Output only. The Cloud Storage prefix of the DAGs for this environment.
+-- Although Cloud Storage objects reside in a flat namespace, a
+-- hierarchical file tree can be simulated using \"\/\"-delimited object
+-- name prefixes. DAG objects for this environment reside in a simulated
+-- directory with the given prefix.
+ecDagGcsPrefix :: Lens' EnvironmentConfig (Maybe Text)
+ecDagGcsPrefix
+  = lens _ecDagGcsPrefix
+      (\ s a -> s{_ecDagGcsPrefix = a})
+
+-- | Output only. The Kubernetes Engine cluster used to run this environment.
+ecGkeCluster :: Lens' EnvironmentConfig (Maybe Text)
+ecGkeCluster
+  = lens _ecGkeCluster (\ s a -> s{_ecGkeCluster = a})
+
+-- | Output only. The URI of the Apache Airflow Web UI hosted within this
+-- environment (see [Airflow web
+-- interface](\/composer\/docs\/how-to\/accessing\/airflow-web-interface)).
+ecAirflowURI :: Lens' EnvironmentConfig (Maybe Text)
+ecAirflowURI
+  = lens _ecAirflowURI (\ s a -> s{_ecAirflowURI = a})
+
+instance FromJSON EnvironmentConfig where
+        parseJSON
+          = withObject "EnvironmentConfig"
+              (\ o ->
+                 EnvironmentConfig' <$>
+                   (o .:? "nodeConfig") <*> (o .:? "nodeCount") <*>
+                     (o .:? "softwareConfig")
+                     <*> (o .:? "dagGcsPrefix")
+                     <*> (o .:? "gkeCluster")
+                     <*> (o .:? "airflowUri"))
+
+instance ToJSON EnvironmentConfig where
+        toJSON EnvironmentConfig'{..}
+          = object
+              (catMaybes
+                 [("nodeConfig" .=) <$> _ecNodeConfig,
+                  ("nodeCount" .=) <$> _ecNodeCount,
+                  ("softwareConfig" .=) <$> _ecSoftwareConfig,
+                  ("dagGcsPrefix" .=) <$> _ecDagGcsPrefix,
+                  ("gkeCluster" .=) <$> _ecGkeCluster,
+                  ("airflowUri" .=) <$> _ecAirflowURI])
+
+-- | 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])
+
+-- | The configuration information for the Kubernetes Engine nodes running
+-- the Apache Airflow software.
+--
+-- /See:/ 'nodeConfig' smart constructor.
+data NodeConfig = NodeConfig'
+    { _ncDiskSizeGb     :: !(Maybe (Textual Int32))
+    , _ncLocation       :: !(Maybe Text)
+    , _ncNetwork        :: !(Maybe Text)
+    , _ncOAuthScopes    :: !(Maybe [Text])
+    , _ncServiceAccount :: !(Maybe Text)
+    , _ncSubnetwork     :: !(Maybe Text)
+    , _ncMachineType    :: !(Maybe Text)
+    , _ncTags           :: !(Maybe [Text])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NodeConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ncDiskSizeGb'
+--
+-- * 'ncLocation'
+--
+-- * 'ncNetwork'
+--
+-- * 'ncOAuthScopes'
+--
+-- * 'ncServiceAccount'
+--
+-- * 'ncSubnetwork'
+--
+-- * 'ncMachineType'
+--
+-- * 'ncTags'
+nodeConfig
+    :: NodeConfig
+nodeConfig =
+    NodeConfig'
+    { _ncDiskSizeGb = Nothing
+    , _ncLocation = Nothing
+    , _ncNetwork = Nothing
+    , _ncOAuthScopes = Nothing
+    , _ncServiceAccount = Nothing
+    , _ncSubnetwork = Nothing
+    , _ncMachineType = Nothing
+    , _ncTags = Nothing
+    }
+
+-- | Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
+-- If unspecified, defaults to 100GB. Cannot be updated.
+ncDiskSizeGb :: Lens' NodeConfig (Maybe Int32)
+ncDiskSizeGb
+  = lens _ncDiskSizeGb (\ s a -> s{_ncDiskSizeGb = a})
+      . mapping _Coerce
+
+-- | Optional. The Compute Engine [zone](\/compute\/docs\/regions-zones) in
+-- which to deploy the VMs used to run the Apache Airflow software,
+-- specified as a [relative resource
+-- name](\/apis\/design\/resource_names#relative_resource_name). For
+-- example: \"projects\/{projectId}\/zones\/{zoneId}\". This \`location\`
+-- must belong to the enclosing environment\'s project and location. If
+-- both this field and \`nodeConfig.machineType\` are specified,
+-- \`nodeConfig.machineType\` must belong to this \`location\`; if both are
+-- unspecified, the service will pick a zone in the Compute Engine region
+-- corresponding to the Cloud Composer location, and propagate that choice
+-- to both fields. If only one field (\`location\` or
+-- \`nodeConfig.machineType\`) is specified, the location information from
+-- the specified field will be propagated to the unspecified field.
+ncLocation :: Lens' NodeConfig (Maybe Text)
+ncLocation
+  = lens _ncLocation (\ s a -> s{_ncLocation = a})
+
+-- | Optional. The Compute Engine network to be used for machine
+-- communications, specified as a [relative resource
+-- name](\/apis\/design\/resource_names#relative_resource_name). For
+-- example: \"projects\/{projectId}\/global\/networks\/{networkId}\".
+-- [Shared VPC](\/vpc\/docs\/shared-vpc) is not currently supported. The
+-- network must belong to the environment\'s project. If unspecified, the
+-- \"default\" network ID in the environment\'s project is used. If a
+-- [Custom Subnet Network](\/vpc\/docs\/vpc#vpc_networks_and_subnets) is
+-- provided, \`nodeConfig.subnetwork\` must also be provided.
+ncNetwork :: Lens' NodeConfig (Maybe Text)
+ncNetwork
+  = lens _ncNetwork (\ s a -> s{_ncNetwork = a})
+
+-- | Optional. The set of Google API scopes to be made available on all node
+-- VMs. If \`oauth_scopes\` is empty, defaults to
+-- [\"https:\/\/www.googleapis.com\/auth\/cloud-platform\"]. Cannot be
+-- updated.
+ncOAuthScopes :: Lens' NodeConfig [Text]
+ncOAuthScopes
+  = lens _ncOAuthScopes
+      (\ s a -> s{_ncOAuthScopes = a})
+      . _Default
+      . _Coerce
+
+-- | Optional. The Google Cloud Platform Service Account to be used by the
+-- node VMs. If a service account is not specified, the \"default\" Compute
+-- Engine service account is used. Cannot be updated.
+ncServiceAccount :: Lens' NodeConfig (Maybe Text)
+ncServiceAccount
+  = lens _ncServiceAccount
+      (\ s a -> s{_ncServiceAccount = a})
+
+-- | Optional. The Compute Engine subnetwork to be used for machine
+-- communications, specified as a [relative resource
+-- name](\/apis\/design\/resource_names#relative_resource_name). For
+-- example:
+-- \"projects\/{projectId}\/regions\/{regionId}\/subnetworks\/{subnetworkId}\"
+-- If a subnetwork is provided, \`nodeConfig.network\` must also be
+-- provided, and the subnetwork must belong to the enclosing environment\'s
+-- project and location.
+ncSubnetwork :: Lens' NodeConfig (Maybe Text)
+ncSubnetwork
+  = lens _ncSubnetwork (\ s a -> s{_ncSubnetwork = a})
+
+-- | Optional. The Compute Engine [machine
+-- type](\/compute\/docs\/machine-types) used for cluster instances,
+-- specified as a [relative resource
+-- name](\/apis\/design\/resource_names#relative_resource_name). For
+-- example:
+-- \"projects\/{projectId}\/zones\/{zoneId}\/machineTypes\/{machineTypeId}\".
+-- The \`machineType\` must belong to the enclosing environment\'s project
+-- and location. If both this field and \`nodeConfig.location\` are
+-- specified, this \`machineType\` must belong to the
+-- \`nodeConfig.location\`; if both are unspecified, the service will pick
+-- a zone in the Compute Engine region corresponding to the Cloud Composer
+-- location, and propagate that choice to both fields. If exactly one of
+-- this field and \`nodeConfig.location\` is specified, the location
+-- information from the specified field will be propagated to the
+-- unspecified field. If this field is unspecified, the \`machineTypeId\`
+-- defaults to \"n1-standard-1\".
+ncMachineType :: Lens' NodeConfig (Maybe Text)
+ncMachineType
+  = lens _ncMachineType
+      (\ s a -> s{_ncMachineType = a})
+
+-- | Optional. The list of instance tags applied to all node VMs. Tags are
+-- used to identify valid sources or targets for network firewalls. Each
+-- tag within the list must comply with
+-- [RFC1035](https:\/\/www.ietf.org\/rfc\/rfc1035.txt). Cannot be updated.
+ncTags :: Lens' NodeConfig [Text]
+ncTags
+  = lens _ncTags (\ s a -> s{_ncTags = a}) . _Default .
+      _Coerce
+
+instance FromJSON NodeConfig where
+        parseJSON
+          = withObject "NodeConfig"
+              (\ o ->
+                 NodeConfig' <$>
+                   (o .:? "diskSizeGb") <*> (o .:? "location") <*>
+                     (o .:? "network")
+                     <*> (o .:? "oauthScopes" .!= mempty)
+                     <*> (o .:? "serviceAccount")
+                     <*> (o .:? "subnetwork")
+                     <*> (o .:? "machineType")
+                     <*> (o .:? "tags" .!= mempty))
+
+instance ToJSON NodeConfig where
+        toJSON NodeConfig'{..}
+          = object
+              (catMaybes
+                 [("diskSizeGb" .=) <$> _ncDiskSizeGb,
+                  ("location" .=) <$> _ncLocation,
+                  ("network" .=) <$> _ncNetwork,
+                  ("oauthScopes" .=) <$> _ncOAuthScopes,
+                  ("serviceAccount" .=) <$> _ncServiceAccount,
+                  ("subnetwork" .=) <$> _ncSubnetwork,
+                  ("machineType" .=) <$> _ncMachineType,
+                  ("tags" .=) <$> _ncTags])
+
+-- | 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 OperationSchema)
+    } 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 OperationSchema)
+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
+
+-- | Optional. Additional environment variables to provide to the Apache
+-- Airflow scheduler, worker, and webserver processes. Environment variable
+-- names must match the regular expression \`a-zA-Z_*\`. They cannot
+-- specify Apache Airflow software configuration overrides (they cannot
+-- match the regular expression \`AIRFLOW__[A-Z0-9_]+__[A-Z0-9_]+\`), and
+-- they cannot match any of the following reserved names: *
+-- \`AIRFLOW_HOME\` * \`C_FORCE_ROOT\` * \`CONTAINER_NAME\` *
+-- \`DAGS_FOLDER\` * \`GCP_PROJECT\` * \`GCS_BUCKET\` *
+-- \`GKE_CLUSTER_NAME\` * \`SQL_DATABASE\` * \`SQL_INSTANCE\` *
+-- \`SQL_PASSWORD\` * \`SQL_PROJECT\` * \`SQL_REGION\` * \`SQL_USER\`
+--
+-- /See:/ 'softwareConfigEnvVariables' smart constructor.
+newtype SoftwareConfigEnvVariables = SoftwareConfigEnvVariables'
+    { _scevAddtional :: HashMap Text Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SoftwareConfigEnvVariables' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'scevAddtional'
+softwareConfigEnvVariables
+    :: HashMap Text Text -- ^ 'scevAddtional'
+    -> SoftwareConfigEnvVariables
+softwareConfigEnvVariables pScevAddtional_ =
+    SoftwareConfigEnvVariables'
+    { _scevAddtional = _Coerce # pScevAddtional_
+    }
+
+scevAddtional :: Lens' SoftwareConfigEnvVariables (HashMap Text Text)
+scevAddtional
+  = lens _scevAddtional
+      (\ s a -> s{_scevAddtional = a})
+      . _Coerce
+
+instance FromJSON SoftwareConfigEnvVariables where
+        parseJSON
+          = withObject "SoftwareConfigEnvVariables"
+              (\ o ->
+                 SoftwareConfigEnvVariables' <$> (parseJSONObject o))
+
+instance ToJSON SoftwareConfigEnvVariables where
+        toJSON = toJSON . _scevAddtional
+
+-- | An environment for running orchestration tasks.
+--
+-- /See:/ 'environment' smart constructor.
+data Environment = Environment'
+    { _eState      :: !(Maybe EnvironmentState)
+    , _eConfig     :: !(Maybe EnvironmentConfig)
+    , _eUuid       :: !(Maybe Text)
+    , _eUpdateTime :: !(Maybe DateTime')
+    , _eName       :: !(Maybe Text)
+    , _eLabels     :: !(Maybe EnvironmentLabels)
+    , _eCreateTime :: !(Maybe DateTime')
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Environment' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eState'
+--
+-- * 'eConfig'
+--
+-- * 'eUuid'
+--
+-- * 'eUpdateTime'
+--
+-- * 'eName'
+--
+-- * 'eLabels'
+--
+-- * 'eCreateTime'
+environment
+    :: Environment
+environment =
+    Environment'
+    { _eState = Nothing
+    , _eConfig = Nothing
+    , _eUuid = Nothing
+    , _eUpdateTime = Nothing
+    , _eName = Nothing
+    , _eLabels = Nothing
+    , _eCreateTime = Nothing
+    }
+
+-- | The current state of the environment.
+eState :: Lens' Environment (Maybe EnvironmentState)
+eState = lens _eState (\ s a -> s{_eState = a})
+
+-- | Configuration parameters for this environment.
+eConfig :: Lens' Environment (Maybe EnvironmentConfig)
+eConfig = lens _eConfig (\ s a -> s{_eConfig = a})
+
+-- | Output only. The UUID (Universally Unique IDentifier) associated with
+-- this environment. This value is generated when the environment is
+-- created.
+eUuid :: Lens' Environment (Maybe Text)
+eUuid = lens _eUuid (\ s a -> s{_eUuid = a})
+
+-- | Output only. The time at which this environment was last modified.
+eUpdateTime :: Lens' Environment (Maybe UTCTime)
+eUpdateTime
+  = lens _eUpdateTime (\ s a -> s{_eUpdateTime = a}) .
+      mapping _DateTime
+
+-- | The resource name of the environment, in the form:
+-- \"projects\/{projectId}\/locations\/{locationId}\/environments\/{environmentId}\"
+eName :: Lens' Environment (Maybe Text)
+eName = lens _eName (\ s a -> s{_eName = a})
+
+-- | Optional. User-defined labels for this environment. The labels map can
+-- contain no more than 64 entries. Entries of the labels map are UTF8
+-- strings that comply with the following restrictions: * Keys must conform
+-- to regexp: \\p{Ll}\\p{Lo}{0,62} * Values must conform to regexp:
+-- [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} * Both keys and values are additionally
+-- constrained to be \<= 128 bytes in size.
+eLabels :: Lens' Environment (Maybe EnvironmentLabels)
+eLabels = lens _eLabels (\ s a -> s{_eLabels = a})
+
+-- | Output only. The time at which this environment was created.
+eCreateTime :: Lens' Environment (Maybe UTCTime)
+eCreateTime
+  = lens _eCreateTime (\ s a -> s{_eCreateTime = a}) .
+      mapping _DateTime
+
+instance FromJSON Environment where
+        parseJSON
+          = withObject "Environment"
+              (\ o ->
+                 Environment' <$>
+                   (o .:? "state") <*> (o .:? "config") <*>
+                     (o .:? "uuid")
+                     <*> (o .:? "updateTime")
+                     <*> (o .:? "name")
+                     <*> (o .:? "labels")
+                     <*> (o .:? "createTime"))
+
+instance ToJSON Environment where
+        toJSON Environment'{..}
+          = object
+              (catMaybes
+                 [("state" .=) <$> _eState,
+                  ("config" .=) <$> _eConfig, ("uuid" .=) <$> _eUuid,
+                  ("updateTime" .=) <$> _eUpdateTime,
+                  ("name" .=) <$> _eName, ("labels" .=) <$> _eLabels,
+                  ("createTime" .=) <$> _eCreateTime])
+
+-- | Optional. Apache Airflow configuration properties to override. Property
+-- keys contain the section and property names, separated by a hyphen, for
+-- example \"core-dags_are_paused_at_creation\". Section names must not
+-- contain hyphens (\"-\"), opening square brackets (\"[\"), or closing
+-- square brackets (\"]\"). The property name must not be empty and must
+-- not contain an equals sign (\"=\") or semicolon (\";\"). Section and
+-- property names must not contain a period (\".\"). Apache Airflow
+-- configuration property names must be written in
+-- [snake_case](https:\/\/en.wikipedia.org\/wiki\/Snake_case). Property
+-- values can contain any character, and can be written in any lower\/upper
+-- case format. Certain Apache Airflow configuration property values are
+-- [blacklisted](\/composer\/docs\/how-to\/managing\/setting-airflow-configurations#airflow_configuration_blacklists),
+-- and cannot be overridden.
+--
+-- /See:/ 'softwareConfigAirflowConfigOverrides' smart constructor.
+newtype SoftwareConfigAirflowConfigOverrides = SoftwareConfigAirflowConfigOverrides'
+    { _scacoAddtional :: HashMap Text Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SoftwareConfigAirflowConfigOverrides' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'scacoAddtional'
+softwareConfigAirflowConfigOverrides
+    :: HashMap Text Text -- ^ 'scacoAddtional'
+    -> SoftwareConfigAirflowConfigOverrides
+softwareConfigAirflowConfigOverrides pScacoAddtional_ =
+    SoftwareConfigAirflowConfigOverrides'
+    { _scacoAddtional = _Coerce # pScacoAddtional_
+    }
+
+scacoAddtional :: Lens' SoftwareConfigAirflowConfigOverrides (HashMap Text Text)
+scacoAddtional
+  = lens _scacoAddtional
+      (\ s a -> s{_scacoAddtional = a})
+      . _Coerce
+
+instance FromJSON
+         SoftwareConfigAirflowConfigOverrides where
+        parseJSON
+          = withObject "SoftwareConfigAirflowConfigOverrides"
+              (\ o ->
+                 SoftwareConfigAirflowConfigOverrides' <$>
+                   (parseJSONObject o))
+
+instance ToJSON SoftwareConfigAirflowConfigOverrides
+         where
+        toJSON = toJSON . _scacoAddtional
+
+--
+-- /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. Custom Python Package Index (PyPI) packages to be installed in
+-- the environment. Keys refer to the lowercase package name such as
+-- \"numpy\" and values are the lowercase extras and version specifier such
+-- as \"==1.12.0\", \"[devel,gcp_api]\", or \"[devel]>=1.8.2, \<1.9.2\". To
+-- specify a package without pinning it to a version specifier, use the
+-- empty string as the value.
+--
+-- /See:/ 'softwareConfigPypiPackages' smart constructor.
+newtype SoftwareConfigPypiPackages = SoftwareConfigPypiPackages'
+    { _scppAddtional :: HashMap Text Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SoftwareConfigPypiPackages' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'scppAddtional'
+softwareConfigPypiPackages
+    :: HashMap Text Text -- ^ 'scppAddtional'
+    -> SoftwareConfigPypiPackages
+softwareConfigPypiPackages pScppAddtional_ =
+    SoftwareConfigPypiPackages'
+    { _scppAddtional = _Coerce # pScppAddtional_
+    }
+
+scppAddtional :: Lens' SoftwareConfigPypiPackages (HashMap Text Text)
+scppAddtional
+  = lens _scppAddtional
+      (\ s a -> s{_scppAddtional = a})
+      . _Coerce
+
+instance FromJSON SoftwareConfigPypiPackages where
+        parseJSON
+          = withObject "SoftwareConfigPypiPackages"
+              (\ o ->
+                 SoftwareConfigPypiPackages' <$> (parseJSONObject o))
+
+instance ToJSON SoftwareConfigPypiPackages where
+        toJSON = toJSON . _scppAddtional
+
+-- | Specifies the selection and configuration of software inside the
+-- environment.
+--
+-- /See:/ 'softwareConfig' smart constructor.
+data SoftwareConfig = SoftwareConfig'
+    { _scImageVersion           :: !(Maybe Text)
+    , _scPythonVersion          :: !(Maybe Text)
+    , _scPypiPackages           :: !(Maybe SoftwareConfigPypiPackages)
+    , _scAirflowConfigOverrides :: !(Maybe SoftwareConfigAirflowConfigOverrides)
+    , _scEnvVariables           :: !(Maybe SoftwareConfigEnvVariables)
+    } 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'
+--
+-- * 'scPythonVersion'
+--
+-- * 'scPypiPackages'
+--
+-- * 'scAirflowConfigOverrides'
+--
+-- * 'scEnvVariables'
+softwareConfig
+    :: SoftwareConfig
+softwareConfig =
+    SoftwareConfig'
+    { _scImageVersion = Nothing
+    , _scPythonVersion = Nothing
+    , _scPypiPackages = Nothing
+    , _scAirflowConfigOverrides = Nothing
+    , _scEnvVariables = Nothing
+    }
+
+-- | Output only. The version of the software running in the environment.
+-- This encapsulates both the version of Cloud Composer functionality and
+-- the version of Apache Airflow. It must match the regular expression
+-- \`composer-[0-9]+\\.[0-9]+(\\.[0-9]+)?-airflow-[0-9]+\\.[0-9]+(\\.[0-9]+.*)?\`.
+-- The Cloud Composer portion of the version is a [semantic
+-- version](https:\/\/semver.org). The portion of the image version
+-- following _airflow-_ is an official Apache Airflow repository [release
+-- name](https:\/\/github.com\/apache\/incubator-airflow\/releases). See
+-- also [Release Notes](\/composer\/docs\/release-notes).
+scImageVersion :: Lens' SoftwareConfig (Maybe Text)
+scImageVersion
+  = lens _scImageVersion
+      (\ s a -> s{_scImageVersion = a})
+
+-- | Optional. The major version of Python used to run the Apache Airflow
+-- scheduler, worker, and webserver processes. Can be set to \'2\' or
+-- \'3\'. If not specified, the default is \'2\'. Cannot be updated.
+scPythonVersion :: Lens' SoftwareConfig (Maybe Text)
+scPythonVersion
+  = lens _scPythonVersion
+      (\ s a -> s{_scPythonVersion = a})
+
+-- | Optional. Custom Python Package Index (PyPI) packages to be installed in
+-- the environment. Keys refer to the lowercase package name such as
+-- \"numpy\" and values are the lowercase extras and version specifier such
+-- as \"==1.12.0\", \"[devel,gcp_api]\", or \"[devel]>=1.8.2, \<1.9.2\". To
+-- specify a package without pinning it to a version specifier, use the
+-- empty string as the value.
+scPypiPackages :: Lens' SoftwareConfig (Maybe SoftwareConfigPypiPackages)
+scPypiPackages
+  = lens _scPypiPackages
+      (\ s a -> s{_scPypiPackages = a})
+
+-- | Optional. Apache Airflow configuration properties to override. Property
+-- keys contain the section and property names, separated by a hyphen, for
+-- example \"core-dags_are_paused_at_creation\". Section names must not
+-- contain hyphens (\"-\"), opening square brackets (\"[\"), or closing
+-- square brackets (\"]\"). The property name must not be empty and must
+-- not contain an equals sign (\"=\") or semicolon (\";\"). Section and
+-- property names must not contain a period (\".\"). Apache Airflow
+-- configuration property names must be written in
+-- [snake_case](https:\/\/en.wikipedia.org\/wiki\/Snake_case). Property
+-- values can contain any character, and can be written in any lower\/upper
+-- case format. Certain Apache Airflow configuration property values are
+-- [blacklisted](\/composer\/docs\/how-to\/managing\/setting-airflow-configurations#airflow_configuration_blacklists),
+-- and cannot be overridden.
+scAirflowConfigOverrides :: Lens' SoftwareConfig (Maybe SoftwareConfigAirflowConfigOverrides)
+scAirflowConfigOverrides
+  = lens _scAirflowConfigOverrides
+      (\ s a -> s{_scAirflowConfigOverrides = a})
+
+-- | Optional. Additional environment variables to provide to the Apache
+-- Airflow scheduler, worker, and webserver processes. Environment variable
+-- names must match the regular expression \`a-zA-Z_*\`. They cannot
+-- specify Apache Airflow software configuration overrides (they cannot
+-- match the regular expression \`AIRFLOW__[A-Z0-9_]+__[A-Z0-9_]+\`), and
+-- they cannot match any of the following reserved names: *
+-- \`AIRFLOW_HOME\` * \`C_FORCE_ROOT\` * \`CONTAINER_NAME\` *
+-- \`DAGS_FOLDER\` * \`GCP_PROJECT\` * \`GCS_BUCKET\` *
+-- \`GKE_CLUSTER_NAME\` * \`SQL_DATABASE\` * \`SQL_INSTANCE\` *
+-- \`SQL_PASSWORD\` * \`SQL_PROJECT\` * \`SQL_REGION\` * \`SQL_USER\`
+scEnvVariables :: Lens' SoftwareConfig (Maybe SoftwareConfigEnvVariables)
+scEnvVariables
+  = lens _scEnvVariables
+      (\ s a -> s{_scEnvVariables = a})
+
+instance FromJSON SoftwareConfig where
+        parseJSON
+          = withObject "SoftwareConfig"
+              (\ o ->
+                 SoftwareConfig' <$>
+                   (o .:? "imageVersion") <*> (o .:? "pythonVersion")
+                     <*> (o .:? "pypiPackages")
+                     <*> (o .:? "airflowConfigOverrides")
+                     <*> (o .:? "envVariables"))
+
+instance ToJSON SoftwareConfig where
+        toJSON SoftwareConfig'{..}
+          = object
+              (catMaybes
+                 [("imageVersion" .=) <$> _scImageVersion,
+                  ("pythonVersion" .=) <$> _scPythonVersion,
+                  ("pypiPackages" .=) <$> _scPypiPackages,
+                  ("airflowConfigOverrides" .=) <$>
+                    _scAirflowConfigOverrides,
+                  ("envVariables" .=) <$> _scEnvVariables])
+
+-- | Optional. User-defined labels for this environment. The labels map can
+-- contain no more than 64 entries. Entries of the labels map are UTF8
+-- strings that comply with the following restrictions: * Keys must conform
+-- to regexp: \\p{Ll}\\p{Lo}{0,62} * Values must conform to regexp:
+-- [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} * Both keys and values are additionally
+-- constrained to be \<= 128 bytes in size.
+--
+-- /See:/ 'environmentLabels' smart constructor.
+newtype EnvironmentLabels = EnvironmentLabels'
+    { _elAddtional :: HashMap Text Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnvironmentLabels' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'elAddtional'
+environmentLabels
+    :: HashMap Text Text -- ^ 'elAddtional'
+    -> EnvironmentLabels
+environmentLabels pElAddtional_ =
+    EnvironmentLabels'
+    { _elAddtional = _Coerce # pElAddtional_
+    }
+
+elAddtional :: Lens' EnvironmentLabels (HashMap Text Text)
+elAddtional
+  = lens _elAddtional (\ s a -> s{_elAddtional = a}) .
+      _Coerce
+
+instance FromJSON EnvironmentLabels where
+        parseJSON
+          = withObject "EnvironmentLabels"
+              (\ o -> EnvironmentLabels' <$> (parseJSONObject o))
+
+instance ToJSON EnvironmentLabels where
+        toJSON = toJSON . _elAddtional
+
+-- | Metadata describing an operation.
+--
+-- /See:/ 'operationMetadata' smart constructor.
+data OperationMetadata = OperationMetadata'
+    { _omState         :: !(Maybe OperationMetadataState)
+    , _omResourceUuid  :: !(Maybe Text)
+    , _omResource      :: !(Maybe Text)
+    , _omEndTime       :: !(Maybe DateTime')
+    , _omOperationType :: !(Maybe OperationMetadataOperationType)
+    , _omCreateTime    :: !(Maybe DateTime')
+    } 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:
+--
+-- * 'omState'
+--
+-- * 'omResourceUuid'
+--
+-- * 'omResource'
+--
+-- * 'omEndTime'
+--
+-- * 'omOperationType'
+--
+-- * 'omCreateTime'
+operationMetadata
+    :: OperationMetadata
+operationMetadata =
+    OperationMetadata'
+    { _omState = Nothing
+    , _omResourceUuid = Nothing
+    , _omResource = Nothing
+    , _omEndTime = Nothing
+    , _omOperationType = Nothing
+    , _omCreateTime = Nothing
+    }
+
+-- | Output only. The current operation state.
+omState :: Lens' OperationMetadata (Maybe OperationMetadataState)
+omState = lens _omState (\ s a -> s{_omState = a})
+
+-- | Output only. The UUID of the resource being operated on.
+omResourceUuid :: Lens' OperationMetadata (Maybe Text)
+omResourceUuid
+  = lens _omResourceUuid
+      (\ s a -> s{_omResourceUuid = a})
+
+-- | Output only. The resource being operated on, as a [relative resource
+-- name]( \/apis\/design\/resource_names#relative_resource_name).
+omResource :: Lens' OperationMetadata (Maybe Text)
+omResource
+  = lens _omResource (\ s a -> s{_omResource = a})
+
+-- | Output only. The time when the operation terminated, regardless of its
+-- success. This field is unset if the operation is still ongoing.
+omEndTime :: Lens' OperationMetadata (Maybe UTCTime)
+omEndTime
+  = lens _omEndTime (\ s a -> s{_omEndTime = a}) .
+      mapping _DateTime
+
+-- | Output only. The type of operation being performed.
+omOperationType :: Lens' OperationMetadata (Maybe OperationMetadataOperationType)
+omOperationType
+  = lens _omOperationType
+      (\ s a -> s{_omOperationType = a})
+
+-- | Output only. The time the operation was submitted to the server.
+omCreateTime :: Lens' OperationMetadata (Maybe UTCTime)
+omCreateTime
+  = lens _omCreateTime (\ s a -> s{_omCreateTime = a})
+      . mapping _DateTime
+
+instance FromJSON OperationMetadata where
+        parseJSON
+          = withObject "OperationMetadata"
+              (\ o ->
+                 OperationMetadata' <$>
+                   (o .:? "state") <*> (o .:? "resourceUuid") <*>
+                     (o .:? "resource")
+                     <*> (o .:? "endTime")
+                     <*> (o .:? "operationType")
+                     <*> (o .:? "createTime"))
+
+instance ToJSON OperationMetadata where
+        toJSON OperationMetadata'{..}
+          = object
+              (catMaybes
+                 [("state" .=) <$> _omState,
+                  ("resourceUuid" .=) <$> _omResourceUuid,
+                  ("resource" .=) <$> _omResource,
+                  ("endTime" .=) <$> _omEndTime,
+                  ("operationType" .=) <$> _omOperationType,
+                  ("createTime" .=) <$> _omCreateTime])
+
+-- | 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
diff --git a/gen/Network/Google/Composer/Types/Sum.hs b/gen/Network/Google/Composer/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Composer/Types/Sum.hs
@@ -0,0 +1,185 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Composer.Types.Sum
+-- 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.Composer.Types.Sum where
+
+import           Network.Google.Prelude hiding (Bytes)
+
+-- | Output only. The type of operation being performed.
+data OperationMetadataOperationType
+    = TypeUnspecified
+      -- ^ @TYPE_UNSPECIFIED@
+      -- Unused.
+    | Create
+      -- ^ @CREATE@
+      -- A resource creation operation.
+    | Delete'
+      -- ^ @DELETE@
+      -- A resource deletion operation.
+    | Update
+      -- ^ @UPDATE@
+      -- A resource update operation.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable OperationMetadataOperationType
+
+instance FromHttpApiData OperationMetadataOperationType where
+    parseQueryParam = \case
+        "TYPE_UNSPECIFIED" -> Right TypeUnspecified
+        "CREATE" -> Right Create
+        "DELETE" -> Right Delete'
+        "UPDATE" -> Right Update
+        x -> Left ("Unable to parse OperationMetadataOperationType from: " <> x)
+
+instance ToHttpApiData OperationMetadataOperationType where
+    toQueryParam = \case
+        TypeUnspecified -> "TYPE_UNSPECIFIED"
+        Create -> "CREATE"
+        Delete' -> "DELETE"
+        Update -> "UPDATE"
+
+instance FromJSON OperationMetadataOperationType where
+    parseJSON = parseJSONText "OperationMetadataOperationType"
+
+instance ToJSON OperationMetadataOperationType where
+    toJSON = toJSONText
+
+-- | Output only. The current operation state.
+data OperationMetadataState
+    = StateUnspecified
+      -- ^ @STATE_UNSPECIFIED@
+      -- Unused.
+    | Pending
+      -- ^ @PENDING@
+      -- The operation has been created but is not yet started.
+    | Running
+      -- ^ @RUNNING@
+      -- The operation is underway.
+    | Succeeded
+      -- ^ @SUCCEEDED@
+      -- The operation completed successfully.
+    | Successful
+      -- ^ @SUCCESSFUL@
+    | Failed
+      -- ^ @FAILED@
+      -- The operation is no longer running but did not succeed.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable OperationMetadataState
+
+instance FromHttpApiData OperationMetadataState where
+    parseQueryParam = \case
+        "STATE_UNSPECIFIED" -> Right StateUnspecified
+        "PENDING" -> Right Pending
+        "RUNNING" -> Right Running
+        "SUCCEEDED" -> Right Succeeded
+        "SUCCESSFUL" -> Right Successful
+        "FAILED" -> Right Failed
+        x -> Left ("Unable to parse OperationMetadataState from: " <> x)
+
+instance ToHttpApiData OperationMetadataState where
+    toQueryParam = \case
+        StateUnspecified -> "STATE_UNSPECIFIED"
+        Pending -> "PENDING"
+        Running -> "RUNNING"
+        Succeeded -> "SUCCEEDED"
+        Successful -> "SUCCESSFUL"
+        Failed -> "FAILED"
+
+instance FromJSON OperationMetadataState where
+    parseJSON = parseJSONText "OperationMetadataState"
+
+instance ToJSON OperationMetadataState where
+    toJSON = toJSONText
+
+-- | The current state of the environment.
+data EnvironmentState
+    = ESStateUnspecified
+      -- ^ @STATE_UNSPECIFIED@
+      -- The state of the environment is unknown.
+    | ESCreating
+      -- ^ @CREATING@
+      -- The environment is in the process of being created.
+    | ESRunning
+      -- ^ @RUNNING@
+      -- The environment is currently running and healthy. It is ready for use.
+    | ESUpdating
+      -- ^ @UPDATING@
+      -- The environment is being updated. It remains usable but cannot receive
+      -- additional update requests or be deleted at this time.
+    | ESDeleting
+      -- ^ @DELETING@
+      -- The environment is undergoing deletion. It cannot be used.
+    | ESError'
+      -- ^ @ERROR@
+      -- The environment has encountered an error and cannot be used.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable EnvironmentState
+
+instance FromHttpApiData EnvironmentState where
+    parseQueryParam = \case
+        "STATE_UNSPECIFIED" -> Right ESStateUnspecified
+        "CREATING" -> Right ESCreating
+        "RUNNING" -> Right ESRunning
+        "UPDATING" -> Right ESUpdating
+        "DELETING" -> Right ESDeleting
+        "ERROR" -> Right ESError'
+        x -> Left ("Unable to parse EnvironmentState from: " <> x)
+
+instance ToHttpApiData EnvironmentState where
+    toQueryParam = \case
+        ESStateUnspecified -> "STATE_UNSPECIFIED"
+        ESCreating -> "CREATING"
+        ESRunning -> "RUNNING"
+        ESUpdating -> "UPDATING"
+        ESDeleting -> "DELETING"
+        ESError' -> "ERROR"
+
+instance FromJSON EnvironmentState where
+    parseJSON = parseJSONText "EnvironmentState"
+
+instance ToJSON EnvironmentState where
+    toJSON = toJSONText
+
+-- | V1 error format.
+data Xgafv
+    = X1
+      -- ^ @1@
+      -- v1 error format
+    | X2
+      -- ^ @2@
+      -- v2 error format
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable Xgafv
+
+instance FromHttpApiData Xgafv where
+    parseQueryParam = \case
+        "1" -> Right X1
+        "2" -> Right X2
+        x -> Left ("Unable to parse Xgafv from: " <> x)
+
+instance ToHttpApiData Xgafv where
+    toQueryParam = \case
+        X1 -> "1"
+        X2 -> "2"
+
+instance FromJSON Xgafv where
+    parseJSON = parseJSONText "Xgafv"
+
+instance ToJSON Xgafv where
+    toJSON = toJSONText
diff --git a/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Create.hs b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Create.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Create.hs
@@ -0,0 +1,165 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Composer.Projects.Locations.Environments.Create
+-- 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)
+--
+-- Create a new environment.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference> for @composer.projects.locations.environments.create@.
+module Network.Google.Resource.Composer.Projects.Locations.Environments.Create
+    (
+    -- * REST Resource
+      ProjectsLocationsEnvironmentsCreateResource
+
+    -- * Creating a Request
+    , projectsLocationsEnvironmentsCreate
+    , ProjectsLocationsEnvironmentsCreate
+
+    -- * Request Lenses
+    , plecParent
+    , plecXgafv
+    , plecUploadProtocol
+    , plecAccessToken
+    , plecUploadType
+    , plecPayload
+    , plecCallback
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @composer.projects.locations.environments.create@ method which the
+-- 'ProjectsLocationsEnvironmentsCreate' request conforms to.
+type ProjectsLocationsEnvironmentsCreateResource =
+     "v1" :>
+       Capture "parent" Text :>
+         "environments" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :>
+                       ReqBody '[JSON] Environment :> Post '[JSON] Operation
+
+-- | Create a new environment.
+--
+-- /See:/ 'projectsLocationsEnvironmentsCreate' smart constructor.
+data ProjectsLocationsEnvironmentsCreate = ProjectsLocationsEnvironmentsCreate'
+    { _plecParent         :: !Text
+    , _plecXgafv          :: !(Maybe Xgafv)
+    , _plecUploadProtocol :: !(Maybe Text)
+    , _plecAccessToken    :: !(Maybe Text)
+    , _plecUploadType     :: !(Maybe Text)
+    , _plecPayload        :: !Environment
+    , _plecCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsEnvironmentsCreate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plecParent'
+--
+-- * 'plecXgafv'
+--
+-- * 'plecUploadProtocol'
+--
+-- * 'plecAccessToken'
+--
+-- * 'plecUploadType'
+--
+-- * 'plecPayload'
+--
+-- * 'plecCallback'
+projectsLocationsEnvironmentsCreate
+    :: Text -- ^ 'plecParent'
+    -> Environment -- ^ 'plecPayload'
+    -> ProjectsLocationsEnvironmentsCreate
+projectsLocationsEnvironmentsCreate pPlecParent_ pPlecPayload_ =
+    ProjectsLocationsEnvironmentsCreate'
+    { _plecParent = pPlecParent_
+    , _plecXgafv = Nothing
+    , _plecUploadProtocol = Nothing
+    , _plecAccessToken = Nothing
+    , _plecUploadType = Nothing
+    , _plecPayload = pPlecPayload_
+    , _plecCallback = Nothing
+    }
+
+-- | The parent must be of the form
+-- \"projects\/{projectId}\/locations\/{locationId}\".
+plecParent :: Lens' ProjectsLocationsEnvironmentsCreate Text
+plecParent
+  = lens _plecParent (\ s a -> s{_plecParent = a})
+
+-- | V1 error format.
+plecXgafv :: Lens' ProjectsLocationsEnvironmentsCreate (Maybe Xgafv)
+plecXgafv
+  = lens _plecXgafv (\ s a -> s{_plecXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plecUploadProtocol :: Lens' ProjectsLocationsEnvironmentsCreate (Maybe Text)
+plecUploadProtocol
+  = lens _plecUploadProtocol
+      (\ s a -> s{_plecUploadProtocol = a})
+
+-- | OAuth access token.
+plecAccessToken :: Lens' ProjectsLocationsEnvironmentsCreate (Maybe Text)
+plecAccessToken
+  = lens _plecAccessToken
+      (\ s a -> s{_plecAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plecUploadType :: Lens' ProjectsLocationsEnvironmentsCreate (Maybe Text)
+plecUploadType
+  = lens _plecUploadType
+      (\ s a -> s{_plecUploadType = a})
+
+-- | Multipart request metadata.
+plecPayload :: Lens' ProjectsLocationsEnvironmentsCreate Environment
+plecPayload
+  = lens _plecPayload (\ s a -> s{_plecPayload = a})
+
+-- | JSONP
+plecCallback :: Lens' ProjectsLocationsEnvironmentsCreate (Maybe Text)
+plecCallback
+  = lens _plecCallback (\ s a -> s{_plecCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsEnvironmentsCreate where
+        type Rs ProjectsLocationsEnvironmentsCreate =
+             Operation
+        type Scopes ProjectsLocationsEnvironmentsCreate =
+             '["https://www.googleapis.com/auth/cloud-platform"]
+        requestClient
+          ProjectsLocationsEnvironmentsCreate'{..}
+          = go _plecParent _plecXgafv _plecUploadProtocol
+              _plecAccessToken
+              _plecUploadType
+              _plecCallback
+              (Just AltJSON)
+              _plecPayload
+              composerService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsEnvironmentsCreateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Delete.hs b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Delete.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Delete.hs
@@ -0,0 +1,150 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Composer.Projects.Locations.Environments.Delete
+-- 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)
+--
+-- Delete an environment.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference> for @composer.projects.locations.environments.delete@.
+module Network.Google.Resource.Composer.Projects.Locations.Environments.Delete
+    (
+    -- * REST Resource
+      ProjectsLocationsEnvironmentsDeleteResource
+
+    -- * Creating a Request
+    , projectsLocationsEnvironmentsDelete
+    , ProjectsLocationsEnvironmentsDelete
+
+    -- * Request Lenses
+    , pledXgafv
+    , pledUploadProtocol
+    , pledAccessToken
+    , pledUploadType
+    , pledName
+    , pledCallback
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @composer.projects.locations.environments.delete@ method which the
+-- 'ProjectsLocationsEnvironmentsDelete' request conforms to.
+type ProjectsLocationsEnvironmentsDeleteResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :> Delete '[JSON] Operation
+
+-- | Delete an environment.
+--
+-- /See:/ 'projectsLocationsEnvironmentsDelete' smart constructor.
+data ProjectsLocationsEnvironmentsDelete = ProjectsLocationsEnvironmentsDelete'
+    { _pledXgafv          :: !(Maybe Xgafv)
+    , _pledUploadProtocol :: !(Maybe Text)
+    , _pledAccessToken    :: !(Maybe Text)
+    , _pledUploadType     :: !(Maybe Text)
+    , _pledName           :: !Text
+    , _pledCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsEnvironmentsDelete' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pledXgafv'
+--
+-- * 'pledUploadProtocol'
+--
+-- * 'pledAccessToken'
+--
+-- * 'pledUploadType'
+--
+-- * 'pledName'
+--
+-- * 'pledCallback'
+projectsLocationsEnvironmentsDelete
+    :: Text -- ^ 'pledName'
+    -> ProjectsLocationsEnvironmentsDelete
+projectsLocationsEnvironmentsDelete pPledName_ =
+    ProjectsLocationsEnvironmentsDelete'
+    { _pledXgafv = Nothing
+    , _pledUploadProtocol = Nothing
+    , _pledAccessToken = Nothing
+    , _pledUploadType = Nothing
+    , _pledName = pPledName_
+    , _pledCallback = Nothing
+    }
+
+-- | V1 error format.
+pledXgafv :: Lens' ProjectsLocationsEnvironmentsDelete (Maybe Xgafv)
+pledXgafv
+  = lens _pledXgafv (\ s a -> s{_pledXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+pledUploadProtocol :: Lens' ProjectsLocationsEnvironmentsDelete (Maybe Text)
+pledUploadProtocol
+  = lens _pledUploadProtocol
+      (\ s a -> s{_pledUploadProtocol = a})
+
+-- | OAuth access token.
+pledAccessToken :: Lens' ProjectsLocationsEnvironmentsDelete (Maybe Text)
+pledAccessToken
+  = lens _pledAccessToken
+      (\ s a -> s{_pledAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+pledUploadType :: Lens' ProjectsLocationsEnvironmentsDelete (Maybe Text)
+pledUploadType
+  = lens _pledUploadType
+      (\ s a -> s{_pledUploadType = a})
+
+-- | The environment to delete, in the form:
+-- \"projects\/{projectId}\/locations\/{locationId}\/environments\/{environmentId}\"
+pledName :: Lens' ProjectsLocationsEnvironmentsDelete Text
+pledName = lens _pledName (\ s a -> s{_pledName = a})
+
+-- | JSONP
+pledCallback :: Lens' ProjectsLocationsEnvironmentsDelete (Maybe Text)
+pledCallback
+  = lens _pledCallback (\ s a -> s{_pledCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsEnvironmentsDelete where
+        type Rs ProjectsLocationsEnvironmentsDelete =
+             Operation
+        type Scopes ProjectsLocationsEnvironmentsDelete =
+             '["https://www.googleapis.com/auth/cloud-platform"]
+        requestClient
+          ProjectsLocationsEnvironmentsDelete'{..}
+          = go _pledName _pledXgafv _pledUploadProtocol
+              _pledAccessToken
+              _pledUploadType
+              _pledCallback
+              (Just AltJSON)
+              composerService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsEnvironmentsDeleteResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Get.hs b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Get.hs
@@ -0,0 +1,149 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Composer.Projects.Locations.Environments.Get
+-- 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)
+--
+-- Get an existing environment.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference> for @composer.projects.locations.environments.get@.
+module Network.Google.Resource.Composer.Projects.Locations.Environments.Get
+    (
+    -- * REST Resource
+      ProjectsLocationsEnvironmentsGetResource
+
+    -- * Creating a Request
+    , projectsLocationsEnvironmentsGet
+    , ProjectsLocationsEnvironmentsGet
+
+    -- * Request Lenses
+    , plegXgafv
+    , plegUploadProtocol
+    , plegAccessToken
+    , plegUploadType
+    , plegName
+    , plegCallback
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @composer.projects.locations.environments.get@ method which the
+-- 'ProjectsLocationsEnvironmentsGet' request conforms to.
+type ProjectsLocationsEnvironmentsGetResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :> Get '[JSON] Environment
+
+-- | Get an existing environment.
+--
+-- /See:/ 'projectsLocationsEnvironmentsGet' smart constructor.
+data ProjectsLocationsEnvironmentsGet = ProjectsLocationsEnvironmentsGet'
+    { _plegXgafv          :: !(Maybe Xgafv)
+    , _plegUploadProtocol :: !(Maybe Text)
+    , _plegAccessToken    :: !(Maybe Text)
+    , _plegUploadType     :: !(Maybe Text)
+    , _plegName           :: !Text
+    , _plegCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsEnvironmentsGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plegXgafv'
+--
+-- * 'plegUploadProtocol'
+--
+-- * 'plegAccessToken'
+--
+-- * 'plegUploadType'
+--
+-- * 'plegName'
+--
+-- * 'plegCallback'
+projectsLocationsEnvironmentsGet
+    :: Text -- ^ 'plegName'
+    -> ProjectsLocationsEnvironmentsGet
+projectsLocationsEnvironmentsGet pPlegName_ =
+    ProjectsLocationsEnvironmentsGet'
+    { _plegXgafv = Nothing
+    , _plegUploadProtocol = Nothing
+    , _plegAccessToken = Nothing
+    , _plegUploadType = Nothing
+    , _plegName = pPlegName_
+    , _plegCallback = Nothing
+    }
+
+-- | V1 error format.
+plegXgafv :: Lens' ProjectsLocationsEnvironmentsGet (Maybe Xgafv)
+plegXgafv
+  = lens _plegXgafv (\ s a -> s{_plegXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plegUploadProtocol :: Lens' ProjectsLocationsEnvironmentsGet (Maybe Text)
+plegUploadProtocol
+  = lens _plegUploadProtocol
+      (\ s a -> s{_plegUploadProtocol = a})
+
+-- | OAuth access token.
+plegAccessToken :: Lens' ProjectsLocationsEnvironmentsGet (Maybe Text)
+plegAccessToken
+  = lens _plegAccessToken
+      (\ s a -> s{_plegAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plegUploadType :: Lens' ProjectsLocationsEnvironmentsGet (Maybe Text)
+plegUploadType
+  = lens _plegUploadType
+      (\ s a -> s{_plegUploadType = a})
+
+-- | The resource name of the environment to get, in the form:
+-- \"projects\/{projectId}\/locations\/{locationId}\/environments\/{environmentId}\"
+plegName :: Lens' ProjectsLocationsEnvironmentsGet Text
+plegName = lens _plegName (\ s a -> s{_plegName = a})
+
+-- | JSONP
+plegCallback :: Lens' ProjectsLocationsEnvironmentsGet (Maybe Text)
+plegCallback
+  = lens _plegCallback (\ s a -> s{_plegCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsEnvironmentsGet where
+        type Rs ProjectsLocationsEnvironmentsGet =
+             Environment
+        type Scopes ProjectsLocationsEnvironmentsGet =
+             '["https://www.googleapis.com/auth/cloud-platform"]
+        requestClient ProjectsLocationsEnvironmentsGet'{..}
+          = go _plegName _plegXgafv _plegUploadProtocol
+              _plegAccessToken
+              _plegUploadType
+              _plegCallback
+              (Just AltJSON)
+              composerService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsEnvironmentsGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/List.hs b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/List.hs
@@ -0,0 +1,178 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Composer.Projects.Locations.Environments.List
+-- 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)
+--
+-- List environments.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference> for @composer.projects.locations.environments.list@.
+module Network.Google.Resource.Composer.Projects.Locations.Environments.List
+    (
+    -- * REST Resource
+      ProjectsLocationsEnvironmentsListResource
+
+    -- * Creating a Request
+    , projectsLocationsEnvironmentsList
+    , ProjectsLocationsEnvironmentsList
+
+    -- * Request Lenses
+    , plelParent
+    , plelXgafv
+    , plelUploadProtocol
+    , plelAccessToken
+    , plelUploadType
+    , plelPageToken
+    , plelPageSize
+    , plelCallback
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @composer.projects.locations.environments.list@ method which the
+-- 'ProjectsLocationsEnvironmentsList' request conforms to.
+type ProjectsLocationsEnvironmentsListResource =
+     "v1" :>
+       Capture "parent" Text :>
+         "environments" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "pageToken" Text :>
+                     QueryParam "pageSize" (Textual Int32) :>
+                       QueryParam "callback" Text :>
+                         QueryParam "alt" AltJSON :>
+                           Get '[JSON] ListEnvironmentsResponse
+
+-- | List environments.
+--
+-- /See:/ 'projectsLocationsEnvironmentsList' smart constructor.
+data ProjectsLocationsEnvironmentsList = ProjectsLocationsEnvironmentsList'
+    { _plelParent         :: !Text
+    , _plelXgafv          :: !(Maybe Xgafv)
+    , _plelUploadProtocol :: !(Maybe Text)
+    , _plelAccessToken    :: !(Maybe Text)
+    , _plelUploadType     :: !(Maybe Text)
+    , _plelPageToken      :: !(Maybe Text)
+    , _plelPageSize       :: !(Maybe (Textual Int32))
+    , _plelCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsEnvironmentsList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plelParent'
+--
+-- * 'plelXgafv'
+--
+-- * 'plelUploadProtocol'
+--
+-- * 'plelAccessToken'
+--
+-- * 'plelUploadType'
+--
+-- * 'plelPageToken'
+--
+-- * 'plelPageSize'
+--
+-- * 'plelCallback'
+projectsLocationsEnvironmentsList
+    :: Text -- ^ 'plelParent'
+    -> ProjectsLocationsEnvironmentsList
+projectsLocationsEnvironmentsList pPlelParent_ =
+    ProjectsLocationsEnvironmentsList'
+    { _plelParent = pPlelParent_
+    , _plelXgafv = Nothing
+    , _plelUploadProtocol = Nothing
+    , _plelAccessToken = Nothing
+    , _plelUploadType = Nothing
+    , _plelPageToken = Nothing
+    , _plelPageSize = Nothing
+    , _plelCallback = Nothing
+    }
+
+-- | List environments in the given project and location, in the form:
+-- \"projects\/{projectId}\/locations\/{locationId}\"
+plelParent :: Lens' ProjectsLocationsEnvironmentsList Text
+plelParent
+  = lens _plelParent (\ s a -> s{_plelParent = a})
+
+-- | V1 error format.
+plelXgafv :: Lens' ProjectsLocationsEnvironmentsList (Maybe Xgafv)
+plelXgafv
+  = lens _plelXgafv (\ s a -> s{_plelXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plelUploadProtocol :: Lens' ProjectsLocationsEnvironmentsList (Maybe Text)
+plelUploadProtocol
+  = lens _plelUploadProtocol
+      (\ s a -> s{_plelUploadProtocol = a})
+
+-- | OAuth access token.
+plelAccessToken :: Lens' ProjectsLocationsEnvironmentsList (Maybe Text)
+plelAccessToken
+  = lens _plelAccessToken
+      (\ s a -> s{_plelAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plelUploadType :: Lens' ProjectsLocationsEnvironmentsList (Maybe Text)
+plelUploadType
+  = lens _plelUploadType
+      (\ s a -> s{_plelUploadType = a})
+
+-- | The next_page_token value returned from a previous List request, if any.
+plelPageToken :: Lens' ProjectsLocationsEnvironmentsList (Maybe Text)
+plelPageToken
+  = lens _plelPageToken
+      (\ s a -> s{_plelPageToken = a})
+
+-- | The maximum number of environments to return.
+plelPageSize :: Lens' ProjectsLocationsEnvironmentsList (Maybe Int32)
+plelPageSize
+  = lens _plelPageSize (\ s a -> s{_plelPageSize = a})
+      . mapping _Coerce
+
+-- | JSONP
+plelCallback :: Lens' ProjectsLocationsEnvironmentsList (Maybe Text)
+plelCallback
+  = lens _plelCallback (\ s a -> s{_plelCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsEnvironmentsList where
+        type Rs ProjectsLocationsEnvironmentsList =
+             ListEnvironmentsResponse
+        type Scopes ProjectsLocationsEnvironmentsList =
+             '["https://www.googleapis.com/auth/cloud-platform"]
+        requestClient ProjectsLocationsEnvironmentsList'{..}
+          = go _plelParent _plelXgafv _plelUploadProtocol
+              _plelAccessToken
+              _plelUploadType
+              _plelPageToken
+              _plelPageSize
+              _plelCallback
+              (Just AltJSON)
+              composerService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsEnvironmentsListResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Patch.hs b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Patch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Composer/Projects/Locations/Environments/Patch.hs
@@ -0,0 +1,217 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Composer.Projects.Locations.Environments.Patch
+-- 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)
+--
+-- Update an environment.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference> for @composer.projects.locations.environments.patch@.
+module Network.Google.Resource.Composer.Projects.Locations.Environments.Patch
+    (
+    -- * REST Resource
+      ProjectsLocationsEnvironmentsPatchResource
+
+    -- * Creating a Request
+    , projectsLocationsEnvironmentsPatch
+    , ProjectsLocationsEnvironmentsPatch
+
+    -- * Request Lenses
+    , plepXgafv
+    , plepUploadProtocol
+    , plepUpdateMask
+    , plepAccessToken
+    , plepUploadType
+    , plepPayload
+    , plepName
+    , plepCallback
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @composer.projects.locations.environments.patch@ method which the
+-- 'ProjectsLocationsEnvironmentsPatch' request conforms to.
+type ProjectsLocationsEnvironmentsPatchResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "updateMask" GFieldMask :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "callback" Text :>
+                     QueryParam "alt" AltJSON :>
+                       ReqBody '[JSON] Environment :>
+                         Patch '[JSON] Operation
+
+-- | Update an environment.
+--
+-- /See:/ 'projectsLocationsEnvironmentsPatch' smart constructor.
+data ProjectsLocationsEnvironmentsPatch = ProjectsLocationsEnvironmentsPatch'
+    { _plepXgafv          :: !(Maybe Xgafv)
+    , _plepUploadProtocol :: !(Maybe Text)
+    , _plepUpdateMask     :: !(Maybe GFieldMask)
+    , _plepAccessToken    :: !(Maybe Text)
+    , _plepUploadType     :: !(Maybe Text)
+    , _plepPayload        :: !Environment
+    , _plepName           :: !Text
+    , _plepCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsEnvironmentsPatch' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plepXgafv'
+--
+-- * 'plepUploadProtocol'
+--
+-- * 'plepUpdateMask'
+--
+-- * 'plepAccessToken'
+--
+-- * 'plepUploadType'
+--
+-- * 'plepPayload'
+--
+-- * 'plepName'
+--
+-- * 'plepCallback'
+projectsLocationsEnvironmentsPatch
+    :: Environment -- ^ 'plepPayload'
+    -> Text -- ^ 'plepName'
+    -> ProjectsLocationsEnvironmentsPatch
+projectsLocationsEnvironmentsPatch pPlepPayload_ pPlepName_ =
+    ProjectsLocationsEnvironmentsPatch'
+    { _plepXgafv = Nothing
+    , _plepUploadProtocol = Nothing
+    , _plepUpdateMask = Nothing
+    , _plepAccessToken = Nothing
+    , _plepUploadType = Nothing
+    , _plepPayload = pPlepPayload_
+    , _plepName = pPlepName_
+    , _plepCallback = Nothing
+    }
+
+-- | V1 error format.
+plepXgafv :: Lens' ProjectsLocationsEnvironmentsPatch (Maybe Xgafv)
+plepXgafv
+  = lens _plepXgafv (\ s a -> s{_plepXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plepUploadProtocol :: Lens' ProjectsLocationsEnvironmentsPatch (Maybe Text)
+plepUploadProtocol
+  = lens _plepUploadProtocol
+      (\ s a -> s{_plepUploadProtocol = a})
+
+-- | Required. A comma-separated list of paths, relative to \`Environment\`,
+-- of fields to update. For example, to set the version of scikit-learn to
+-- install in the environment to 0.19.0 and to remove an existing
+-- installation of numpy, the \`updateMask\` parameter would include the
+-- following two \`paths\` values:
+-- \"config.softwareConfig.pypiPackages.scikit-learn\" and
+-- \"config.softwareConfig.pypiPackages.numpy\". The included patch
+-- environment would specify the scikit-learn version as follows: {
+-- \"config\":{ \"softwareConfig\":{ \"pypiPackages\":{
+-- \"scikit-learn\":\"==0.19.0\" } } } } Note that in the above example,
+-- any existing PyPI packages other than scikit-learn and numpy will be
+-- unaffected. Only one update type may be included in a single request\'s
+-- \`updateMask\`. For example, one cannot update both the PyPI packages
+-- and labels in the same request. However, it is possible to update
+-- multiple members of a map field simultaneously in the same request. For
+-- example, to set the labels \"label1\" and \"label2\" while clearing
+-- \"label3\" (assuming it already exists), one can provide the paths
+-- \"labels.label1\", \"labels.label2\", and \"labels.label3\" and populate
+-- the patch environment as follows: { \"labels\":{
+-- \"label1\":\"new-label1-value\" \"label2\":\"new-label2-value\" } } Note
+-- that in the above example, any existing labels that are not included in
+-- the \`updateMask\` will be unaffected. It is also possible to replace an
+-- entire map field by providing the map field\'s path in the
+-- \`updateMask\`. The new value of the field will be that which is
+-- provided in the patch environment. For example, to delete all
+-- pre-existing user-specified PyPI packages and install botocore at
+-- version 1.7.14, the \`updateMask\` would contain the path
+-- \"config.softwareConfig.pypiPackages\", and the patch environment would
+-- be the following: { \"config\":{ \"softwareConfig\":{ \"pypiPackages\":{
+-- \"botocore\":\"==1.7.14\" } } } } **Note:** Only the following fields
+-- can be updated:
+-- >   ----------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- >   __Mask__                                                    __Purpose__
+-- >   config.softwareConfig.pypiPackages                          Replace all custom custom PyPI packages. If a replacement package map is not included in \`environment\`, all custom PyPI packages are cleared. It is an error to provide both this mask and a mask specifying an individual package.
+-- >   config.softwareConfig.pypiPackages.packagename              Update the custom PyPI package packagename, preserving other packages. To delete the package, include it in \`updateMask\`, and omit the mapping for it in \`environment.config.softwareConfig.pypiPackages\`. It is an error to provide both a mask of this form and the \"config.softwareConfig.pypiPackages\" mask.
+-- >   labels                                                      Replace all environment labels. If a replacement labels map is not included in \`environment\`, all labels are cleared. It is an error to provide both this mask and a mask specifying one or more individual labels.
+-- >   labels.labelName                                            Set the label named labelName, while preserving other labels. To delete the label, include it in \`updateMask\` and omit its mapping in \`environment.labels\`. It is an error to provide both a mask of this form and the \"labels\" mask.
+-- >   config.nodeCount                                            Horizontally scale the number of nodes in the environment. An integer greater than or equal to 3 must be provided in the \`config.nodeCount\` field.
+-- >   config.softwareConfig.airflowConfigOverrides                Replace all Apache Airflow config overrides. If a replacement config overrides map is not included in \`environment\`, all config overrides are cleared. It is an error to provide both this mask and a mask specifying one or more individual config overrides.
+-- >   config.softwareConfig.airflowConfigOverrides.section-name   Override the Apache Airflow config property name in the section named section, preserving other properties. To delete the property override, include it in \`updateMask\` and omit its mapping in \`environment.config.softwareConfig.airflowConfigOverrides\`. It is an error to provide both a mask of this form and the \"config.softwareConfig.airflowConfigOverrides\" mask.
+-- >   config.softwareConfig.envVariables                          Replace all environment variables. If a replacement environment variable map is not included in \`environment\`, all custom environment variables are cleared. It is an error to provide both this mask and a mask specifying one or more individual environment variables.
+-- >   ----------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+plepUpdateMask :: Lens' ProjectsLocationsEnvironmentsPatch (Maybe GFieldMask)
+plepUpdateMask
+  = lens _plepUpdateMask
+      (\ s a -> s{_plepUpdateMask = a})
+
+-- | OAuth access token.
+plepAccessToken :: Lens' ProjectsLocationsEnvironmentsPatch (Maybe Text)
+plepAccessToken
+  = lens _plepAccessToken
+      (\ s a -> s{_plepAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plepUploadType :: Lens' ProjectsLocationsEnvironmentsPatch (Maybe Text)
+plepUploadType
+  = lens _plepUploadType
+      (\ s a -> s{_plepUploadType = a})
+
+-- | Multipart request metadata.
+plepPayload :: Lens' ProjectsLocationsEnvironmentsPatch Environment
+plepPayload
+  = lens _plepPayload (\ s a -> s{_plepPayload = a})
+
+-- | The relative resource name of the environment to update, in the form:
+-- \"projects\/{projectId}\/locations\/{locationId}\/environments\/{environmentId}\"
+plepName :: Lens' ProjectsLocationsEnvironmentsPatch Text
+plepName = lens _plepName (\ s a -> s{_plepName = a})
+
+-- | JSONP
+plepCallback :: Lens' ProjectsLocationsEnvironmentsPatch (Maybe Text)
+plepCallback
+  = lens _plepCallback (\ s a -> s{_plepCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsEnvironmentsPatch where
+        type Rs ProjectsLocationsEnvironmentsPatch =
+             Operation
+        type Scopes ProjectsLocationsEnvironmentsPatch =
+             '["https://www.googleapis.com/auth/cloud-platform"]
+        requestClient ProjectsLocationsEnvironmentsPatch'{..}
+          = go _plepName _plepXgafv _plepUploadProtocol
+              _plepUpdateMask
+              _plepAccessToken
+              _plepUploadType
+              _plepCallback
+              (Just AltJSON)
+              _plepPayload
+              composerService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsEnvironmentsPatchResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/Delete.hs b/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/Delete.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/Delete.hs
@@ -0,0 +1,153 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Composer.Projects.Locations.Operations.Delete
+-- 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)
+--
+-- Deletes a long-running operation. This method indicates that the client
+-- is no longer interested in the operation result. It does not cancel the
+-- operation. If the server doesn\'t support this method, it returns
+-- \`google.rpc.Code.UNIMPLEMENTED\`.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference> for @composer.projects.locations.operations.delete@.
+module Network.Google.Resource.Composer.Projects.Locations.Operations.Delete
+    (
+    -- * REST Resource
+      ProjectsLocationsOperationsDeleteResource
+
+    -- * Creating a Request
+    , projectsLocationsOperationsDelete
+    , ProjectsLocationsOperationsDelete
+
+    -- * Request Lenses
+    , plodXgafv
+    , plodUploadProtocol
+    , plodAccessToken
+    , plodUploadType
+    , plodName
+    , plodCallback
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @composer.projects.locations.operations.delete@ method which the
+-- 'ProjectsLocationsOperationsDelete' request conforms to.
+type ProjectsLocationsOperationsDeleteResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :> Delete '[JSON] Empty
+
+-- | Deletes a long-running operation. This method indicates that the client
+-- is no longer interested in the operation result. It does not cancel the
+-- operation. If the server doesn\'t support this method, it returns
+-- \`google.rpc.Code.UNIMPLEMENTED\`.
+--
+-- /See:/ 'projectsLocationsOperationsDelete' smart constructor.
+data ProjectsLocationsOperationsDelete = ProjectsLocationsOperationsDelete'
+    { _plodXgafv          :: !(Maybe Xgafv)
+    , _plodUploadProtocol :: !(Maybe Text)
+    , _plodAccessToken    :: !(Maybe Text)
+    , _plodUploadType     :: !(Maybe Text)
+    , _plodName           :: !Text
+    , _plodCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsOperationsDelete' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plodXgafv'
+--
+-- * 'plodUploadProtocol'
+--
+-- * 'plodAccessToken'
+--
+-- * 'plodUploadType'
+--
+-- * 'plodName'
+--
+-- * 'plodCallback'
+projectsLocationsOperationsDelete
+    :: Text -- ^ 'plodName'
+    -> ProjectsLocationsOperationsDelete
+projectsLocationsOperationsDelete pPlodName_ =
+    ProjectsLocationsOperationsDelete'
+    { _plodXgafv = Nothing
+    , _plodUploadProtocol = Nothing
+    , _plodAccessToken = Nothing
+    , _plodUploadType = Nothing
+    , _plodName = pPlodName_
+    , _plodCallback = Nothing
+    }
+
+-- | V1 error format.
+plodXgafv :: Lens' ProjectsLocationsOperationsDelete (Maybe Xgafv)
+plodXgafv
+  = lens _plodXgafv (\ s a -> s{_plodXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plodUploadProtocol :: Lens' ProjectsLocationsOperationsDelete (Maybe Text)
+plodUploadProtocol
+  = lens _plodUploadProtocol
+      (\ s a -> s{_plodUploadProtocol = a})
+
+-- | OAuth access token.
+plodAccessToken :: Lens' ProjectsLocationsOperationsDelete (Maybe Text)
+plodAccessToken
+  = lens _plodAccessToken
+      (\ s a -> s{_plodAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plodUploadType :: Lens' ProjectsLocationsOperationsDelete (Maybe Text)
+plodUploadType
+  = lens _plodUploadType
+      (\ s a -> s{_plodUploadType = a})
+
+-- | The name of the operation resource to be deleted.
+plodName :: Lens' ProjectsLocationsOperationsDelete Text
+plodName = lens _plodName (\ s a -> s{_plodName = a})
+
+-- | JSONP
+plodCallback :: Lens' ProjectsLocationsOperationsDelete (Maybe Text)
+plodCallback
+  = lens _plodCallback (\ s a -> s{_plodCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsOperationsDelete where
+        type Rs ProjectsLocationsOperationsDelete = Empty
+        type Scopes ProjectsLocationsOperationsDelete =
+             '["https://www.googleapis.com/auth/cloud-platform"]
+        requestClient ProjectsLocationsOperationsDelete'{..}
+          = go _plodName _plodXgafv _plodUploadProtocol
+              _plodAccessToken
+              _plodUploadType
+              _plodCallback
+              (Just AltJSON)
+              composerService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsOperationsDeleteResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/Get.hs b/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/Get.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Composer.Projects.Locations.Operations.Get
+-- 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)
+--
+-- Gets the latest state of a long-running operation. Clients can use this
+-- method to poll the operation result at intervals as recommended by the
+-- API service.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference> for @composer.projects.locations.operations.get@.
+module Network.Google.Resource.Composer.Projects.Locations.Operations.Get
+    (
+    -- * REST Resource
+      ProjectsLocationsOperationsGetResource
+
+    -- * Creating a Request
+    , projectsLocationsOperationsGet
+    , ProjectsLocationsOperationsGet
+
+    -- * Request Lenses
+    , plogXgafv
+    , plogUploadProtocol
+    , plogAccessToken
+    , plogUploadType
+    , plogName
+    , plogCallback
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @composer.projects.locations.operations.get@ method which the
+-- 'ProjectsLocationsOperationsGet' request conforms to.
+type ProjectsLocationsOperationsGetResource =
+     "v1" :>
+       Capture "name" Text :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "access_token" Text :>
+               QueryParam "uploadType" Text :>
+                 QueryParam "callback" Text :>
+                   QueryParam "alt" AltJSON :> Get '[JSON] Operation
+
+-- | Gets the latest state of a long-running operation. Clients can use this
+-- method to poll the operation result at intervals as recommended by the
+-- API service.
+--
+-- /See:/ 'projectsLocationsOperationsGet' smart constructor.
+data ProjectsLocationsOperationsGet = ProjectsLocationsOperationsGet'
+    { _plogXgafv          :: !(Maybe Xgafv)
+    , _plogUploadProtocol :: !(Maybe Text)
+    , _plogAccessToken    :: !(Maybe Text)
+    , _plogUploadType     :: !(Maybe Text)
+    , _plogName           :: !Text
+    , _plogCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsOperationsGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plogXgafv'
+--
+-- * 'plogUploadProtocol'
+--
+-- * 'plogAccessToken'
+--
+-- * 'plogUploadType'
+--
+-- * 'plogName'
+--
+-- * 'plogCallback'
+projectsLocationsOperationsGet
+    :: Text -- ^ 'plogName'
+    -> ProjectsLocationsOperationsGet
+projectsLocationsOperationsGet pPlogName_ =
+    ProjectsLocationsOperationsGet'
+    { _plogXgafv = Nothing
+    , _plogUploadProtocol = Nothing
+    , _plogAccessToken = Nothing
+    , _plogUploadType = Nothing
+    , _plogName = pPlogName_
+    , _plogCallback = Nothing
+    }
+
+-- | V1 error format.
+plogXgafv :: Lens' ProjectsLocationsOperationsGet (Maybe Xgafv)
+plogXgafv
+  = lens _plogXgafv (\ s a -> s{_plogXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plogUploadProtocol :: Lens' ProjectsLocationsOperationsGet (Maybe Text)
+plogUploadProtocol
+  = lens _plogUploadProtocol
+      (\ s a -> s{_plogUploadProtocol = a})
+
+-- | OAuth access token.
+plogAccessToken :: Lens' ProjectsLocationsOperationsGet (Maybe Text)
+plogAccessToken
+  = lens _plogAccessToken
+      (\ s a -> s{_plogAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plogUploadType :: Lens' ProjectsLocationsOperationsGet (Maybe Text)
+plogUploadType
+  = lens _plogUploadType
+      (\ s a -> s{_plogUploadType = a})
+
+-- | The name of the operation resource.
+plogName :: Lens' ProjectsLocationsOperationsGet Text
+plogName = lens _plogName (\ s a -> s{_plogName = a})
+
+-- | JSONP
+plogCallback :: Lens' ProjectsLocationsOperationsGet (Maybe Text)
+plogCallback
+  = lens _plogCallback (\ s a -> s{_plogCallback = a})
+
+instance GoogleRequest ProjectsLocationsOperationsGet
+         where
+        type Rs ProjectsLocationsOperationsGet = Operation
+        type Scopes ProjectsLocationsOperationsGet =
+             '["https://www.googleapis.com/auth/cloud-platform"]
+        requestClient ProjectsLocationsOperationsGet'{..}
+          = go _plogName _plogXgafv _plogUploadProtocol
+              _plogAccessToken
+              _plogUploadType
+              _plogCallback
+              (Just AltJSON)
+              composerService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsOperationsGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/List.hs b/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/List.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Composer/Projects/Locations/Operations/List.hs
@@ -0,0 +1,206 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Composer.Projects.Locations.Operations.List
+-- 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)
+--
+-- Lists operations that match the specified filter in the request. If the
+-- server doesn\'t support this method, it returns \`UNIMPLEMENTED\`. NOTE:
+-- the \`name\` binding allows API services to override the binding to use
+-- different resource name schemes, such as \`users\/*\/operations\`. To
+-- override the binding, API services can add a binding such as
+-- \`\"\/v1\/{name=users\/*}\/operations\"\` to their service
+-- configuration. For backwards compatibility, the default name includes
+-- the operations collection id, however overriding users must ensure the
+-- name binding is the parent resource, without the operations collection
+-- id.
+--
+-- /See:/ <https://cloud.google.com/composer/ Cloud Composer API Reference> for @composer.projects.locations.operations.list@.
+module Network.Google.Resource.Composer.Projects.Locations.Operations.List
+    (
+    -- * REST Resource
+      ProjectsLocationsOperationsListResource
+
+    -- * Creating a Request
+    , projectsLocationsOperationsList
+    , ProjectsLocationsOperationsList
+
+    -- * Request Lenses
+    , plolXgafv
+    , plolUploadProtocol
+    , plolAccessToken
+    , plolUploadType
+    , plolName
+    , plolFilter
+    , plolPageToken
+    , plolPageSize
+    , plolCallback
+    ) where
+
+import           Network.Google.Composer.Types
+import           Network.Google.Prelude
+
+-- | A resource alias for @composer.projects.locations.operations.list@ method which the
+-- 'ProjectsLocationsOperationsList' request conforms to.
+type ProjectsLocationsOperationsListResource =
+     "v1" :>
+       Capture "name" Text :>
+         "operations" :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "filter" Text :>
+                     QueryParam "pageToken" Text :>
+                       QueryParam "pageSize" (Textual Int32) :>
+                         QueryParam "callback" Text :>
+                           QueryParam "alt" AltJSON :>
+                             Get '[JSON] ListOperationsResponse
+
+-- | Lists operations that match the specified filter in the request. If the
+-- server doesn\'t support this method, it returns \`UNIMPLEMENTED\`. NOTE:
+-- the \`name\` binding allows API services to override the binding to use
+-- different resource name schemes, such as \`users\/*\/operations\`. To
+-- override the binding, API services can add a binding such as
+-- \`\"\/v1\/{name=users\/*}\/operations\"\` to their service
+-- configuration. For backwards compatibility, the default name includes
+-- the operations collection id, however overriding users must ensure the
+-- name binding is the parent resource, without the operations collection
+-- id.
+--
+-- /See:/ 'projectsLocationsOperationsList' smart constructor.
+data ProjectsLocationsOperationsList = ProjectsLocationsOperationsList'
+    { _plolXgafv          :: !(Maybe Xgafv)
+    , _plolUploadProtocol :: !(Maybe Text)
+    , _plolAccessToken    :: !(Maybe Text)
+    , _plolUploadType     :: !(Maybe Text)
+    , _plolName           :: !Text
+    , _plolFilter         :: !(Maybe Text)
+    , _plolPageToken      :: !(Maybe Text)
+    , _plolPageSize       :: !(Maybe (Textual Int32))
+    , _plolCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProjectsLocationsOperationsList' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'plolXgafv'
+--
+-- * 'plolUploadProtocol'
+--
+-- * 'plolAccessToken'
+--
+-- * 'plolUploadType'
+--
+-- * 'plolName'
+--
+-- * 'plolFilter'
+--
+-- * 'plolPageToken'
+--
+-- * 'plolPageSize'
+--
+-- * 'plolCallback'
+projectsLocationsOperationsList
+    :: Text -- ^ 'plolName'
+    -> ProjectsLocationsOperationsList
+projectsLocationsOperationsList pPlolName_ =
+    ProjectsLocationsOperationsList'
+    { _plolXgafv = Nothing
+    , _plolUploadProtocol = Nothing
+    , _plolAccessToken = Nothing
+    , _plolUploadType = Nothing
+    , _plolName = pPlolName_
+    , _plolFilter = Nothing
+    , _plolPageToken = Nothing
+    , _plolPageSize = Nothing
+    , _plolCallback = Nothing
+    }
+
+-- | V1 error format.
+plolXgafv :: Lens' ProjectsLocationsOperationsList (Maybe Xgafv)
+plolXgafv
+  = lens _plolXgafv (\ s a -> s{_plolXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+plolUploadProtocol :: Lens' ProjectsLocationsOperationsList (Maybe Text)
+plolUploadProtocol
+  = lens _plolUploadProtocol
+      (\ s a -> s{_plolUploadProtocol = a})
+
+-- | OAuth access token.
+plolAccessToken :: Lens' ProjectsLocationsOperationsList (Maybe Text)
+plolAccessToken
+  = lens _plolAccessToken
+      (\ s a -> s{_plolAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+plolUploadType :: Lens' ProjectsLocationsOperationsList (Maybe Text)
+plolUploadType
+  = lens _plolUploadType
+      (\ s a -> s{_plolUploadType = a})
+
+-- | The name of the operation\'s parent resource.
+plolName :: Lens' ProjectsLocationsOperationsList Text
+plolName = lens _plolName (\ s a -> s{_plolName = a})
+
+-- | The standard list filter.
+plolFilter :: Lens' ProjectsLocationsOperationsList (Maybe Text)
+plolFilter
+  = lens _plolFilter (\ s a -> s{_plolFilter = a})
+
+-- | The standard list page token.
+plolPageToken :: Lens' ProjectsLocationsOperationsList (Maybe Text)
+plolPageToken
+  = lens _plolPageToken
+      (\ s a -> s{_plolPageToken = a})
+
+-- | The standard list page size.
+plolPageSize :: Lens' ProjectsLocationsOperationsList (Maybe Int32)
+plolPageSize
+  = lens _plolPageSize (\ s a -> s{_plolPageSize = a})
+      . mapping _Coerce
+
+-- | JSONP
+plolCallback :: Lens' ProjectsLocationsOperationsList (Maybe Text)
+plolCallback
+  = lens _plolCallback (\ s a -> s{_plolCallback = a})
+
+instance GoogleRequest
+         ProjectsLocationsOperationsList where
+        type Rs ProjectsLocationsOperationsList =
+             ListOperationsResponse
+        type Scopes ProjectsLocationsOperationsList =
+             '["https://www.googleapis.com/auth/cloud-platform"]
+        requestClient ProjectsLocationsOperationsList'{..}
+          = go _plolName _plolXgafv _plolUploadProtocol
+              _plolAccessToken
+              _plolUploadType
+              _plolFilter
+              _plolPageToken
+              _plolPageSize
+              _plolCallback
+              (Just AltJSON)
+              composerService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy ProjectsLocationsOperationsListResource)
+                      mempty
diff --git a/gogol-composer.cabal b/gogol-composer.cabal
new file mode 100644
--- /dev/null
+++ b/gogol-composer.cabal
@@ -0,0 +1,53 @@
+name:                  gogol-composer
+version:               0.4.0
+synopsis:              Google Cloud Composer SDK.
+homepage:              https://github.com/brendanhay/gogol
+bug-reports:           https://github.com/brendanhay/gogol/issues
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2015-2016 Brendan Hay
+category:              Network, Google, Cloud
+build-type:            Simple
+cabal-version:         >= 1.10
+extra-source-files:    README.md src/.gitkeep
+
+description:
+    Manages Apache Airflow environments on Google Cloud Platform.
+    .
+    /Warning:/ This is an experimental prototype/preview release which is still
+    under exploratory development and not intended for public use, caveat emptor!
+    .
+    This library is compatible with version @v1@
+    of the API.
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/gogol.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.Google.Composer
+        , Network.Google.Composer.Types
+        , Network.Google.Resource.Composer.Projects.Locations.Environments.Create
+        , Network.Google.Resource.Composer.Projects.Locations.Environments.Delete
+        , Network.Google.Resource.Composer.Projects.Locations.Environments.Get
+        , Network.Google.Resource.Composer.Projects.Locations.Environments.List
+        , Network.Google.Resource.Composer.Projects.Locations.Environments.Patch
+        , Network.Google.Resource.Composer.Projects.Locations.Operations.Delete
+        , Network.Google.Resource.Composer.Projects.Locations.Operations.Get
+        , Network.Google.Resource.Composer.Projects.Locations.Operations.List
+
+    other-modules:
+          Network.Google.Composer.Types.Product
+        , Network.Google.Composer.Types.Sum
+
+    build-depends:
+          gogol-core == 0.4.0.*
+        , base       >= 4.7 && < 5
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
