<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="composer_v1beta1.html">Cloud Composer API</a> . <a href="composer_v1beta1.projects.html">projects</a> . <a href="composer_v1beta1.projects.locations.html">locations</a> . <a href="composer_v1beta1.projects.locations.environments.html">environments</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Create a new environment.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Delete an environment.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Get an existing environment.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">List environments.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Update an environment.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Create a new environment.

Args:
  parent: string, The parent must be of the form
&quot;projects/{projectId}/locations/{locationId}&quot;. (required)
  body: object, The request body.
    The object takes the form of:

{ # An environment for running orchestration tasks.
    &quot;uuid&quot;: &quot;A String&quot;, # Output only. The UUID (Universally Unique IDentifier) associated with this environment.
        # This value is generated when the environment is created.
    &quot;config&quot;: { # Configuration information for an environment. # Configuration parameters for this environment.
      &quot;gkeCluster&quot;: &quot;A String&quot;, # Output only. The Kubernetes Engine cluster used to run this environment.
      &quot;nodeCount&quot;: 42, # The number of nodes in the Kubernetes Engine cluster that will be
          # used to run this environment.
      &quot;databaseConfig&quot;: { # The configuration of Cloud SQL instance that is used by the Apache Airflow # Optional. The configuration settings for Cloud SQL instance used internally by Apache
          # Airflow software.
          # software.
        &quot;machineType&quot;: &quot;A String&quot;, # Optional. Cloud SQL machine type used by Airflow database.
            # It has to be one of: db-n1-standard-2, db-n1-standard-4, db-n1-standard-8
            # or db-n1-standard-16. If not specified, db-n1-standard-2 will be used.
      },
      &quot;softwareConfig&quot;: { # Specifies the selection and configuration of software inside the environment. # The configuration settings for software inside the environment.
        &quot;airflowConfigOverrides&quot;: { # Optional. Apache Airflow configuration properties to override.
            #
            # Property keys contain the section and property names, separated by a
            # hyphen, for example &quot;core-dags_are_paused_at_creation&quot;. Section names must
            # not contain hyphens (&quot;-&quot;), opening square brackets (&quot;[&quot;),  or closing
            # square brackets (&quot;]&quot;). The property name must not be empty and must not
            # contain an equals sign (&quot;=&quot;) or semicolon (&quot;;&quot;). Section and property names
            # must not contain a period (&quot;.&quot;). 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.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;imageVersion&quot;: &quot;A String&quot;, # 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]+|latest)-airflow-[0-9]+\.[0-9]+(\.[0-9]+.*)?`.
            # When used as input, the server also checks if the provided version is
            # supported and denies the request for an unsupported version.
            #
            # The Cloud Composer portion of the version is a
            # [semantic version](https://semver.org) or `latest`. When the patch version
            # is omitted, the current Cloud Composer patch version is selected.
            # When `latest` is provided instead of an explicit version number,
            # the server replaces `latest` with the current Cloud Composer version
            # and stores that version number in the same field.
            #
            # The portion of the image version that follows &lt;em&gt;airflow-&lt;/em&gt; is an
            # official Apache Airflow repository
            # [release name](https://github.com/apache/incubator-airflow/releases).
            #
            # See also [Version
            # List](/composer/docs/concepts/versioning/composer-versions).
        &quot;envVariables&quot;: { # 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`
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;pypiPackages&quot;: { # Optional. Custom Python Package Index (PyPI) packages to be installed in
            # the environment.
            #
            # Keys refer to the lowercase package name such as &quot;numpy&quot;
            # and values are the lowercase extras and version specifier such as
            # &quot;==1.12.0&quot;, &quot;[devel,gcp_api]&quot;, or &quot;[devel]&gt;=1.8.2, &lt;1.9.2&quot;. To specify a
            # package without pinning it to a version specifier, use the empty string as
            # the value.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;pythonVersion&quot;: &quot;A String&quot;, # Optional. The major version of Python used to run the Apache Airflow
            # scheduler, worker, and webserver processes.
            #
            # Can be set to &#x27;2&#x27; or &#x27;3&#x27;. If not specified, the default is &#x27;2&#x27;. Cannot be
            # updated.
      },
      &quot;dagGcsPrefix&quot;: &quot;A String&quot;, # 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 &quot;/&quot;-delimited object name prefixes. DAG objects for
          # this environment reside in a simulated directory with the given prefix.
      &quot;webServerNetworkAccessControl&quot;: { # Network-level access control policy for the Airflow web server. # Optional. The network-level access control policy for the Airflow web server. If
          # unspecified, no network-level access restrictions will be applied.
        &quot;allowedIpRanges&quot;: [ # A collection of allowed IP ranges with descriptions.
          { # Allowed IP range with user-provided description.
            &quot;description&quot;: &quot;A String&quot;, # Optional. User-provided description. It must contain at most 300 characters.
            &quot;value&quot;: &quot;A String&quot;, # IP address or range, defined using CIDR notation, of requests that this
                # rule applies to.
                # Examples: `192.168.1.1` or `192.168.0.0/16` or `2001:db8::/32`
                #           or `2001:0db8:0000:0042:0000:8a2e:0370:7334`.
                #
                #
                # &lt;p&gt;IP range prefixes should be properly truncated. For example,
                # `1.2.3.4/24` should be truncated to `1.2.3.0/24`. Similarly, for IPv6,
                # `2001:db8::1/32` should be truncated to `2001:db8::/32`.
          },
        ],
      },
      &quot;webServerConfig&quot;: { # The configuration settings for the Airflow web server App Engine instance. # Optional. The configuration settings for the Airflow web server App Engine instance.
        &quot;machineType&quot;: &quot;A String&quot;, # Optional. Machine type on which Airflow web server is running.
            # It has to be one of: composer-n1-webserver-2, composer-n1-webserver-4 or
            # composer-n1-webserver-8.
            # If not specified, composer-n1-webserver-2 will be used.
            # Value custom is returned only in response, if Airflow web server parameters
            # were manually changed to a non-standard values.
      },
      &quot;nodeConfig&quot;: { # The configuration information for the Kubernetes Engine nodes running # The configuration used for the Kubernetes Engine cluster.
          # the Apache Airflow software.
        &quot;tags&quot;: [ # 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.
          &quot;A String&quot;,
        ],
        &quot;diskSizeGb&quot;: 42, # Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
            # If unspecified, defaults to 100GB. Cannot be updated.
        &quot;subnetwork&quot;: &quot;A String&quot;, # 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:
            # &quot;projects/{projectId}/regions/{regionId}/subnetworks/{subnetworkId}&quot;
            #
            # If a subnetwork is provided, `nodeConfig.network` must also be provided,
            # and the subnetwork must belong to the enclosing environment&#x27;s project and
            # location.
        &quot;network&quot;: &quot;A String&quot;, # 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:
            # &quot;projects/{projectId}/global/networks/{networkId}&quot;.
            #
            # If unspecified, the default network in the environment&#x27;s project is used.
            # If a [Custom Subnet Network](/vpc/docs/vpc#vpc_networks_and_subnets)
            # is provided, `nodeConfig.subnetwork` must also be provided. For
            # [Shared VPC](/vpc/docs/shared-vpc) subnetwork requirements, see
            # `nodeConfig.subnetwork`.
        &quot;serviceAccount&quot;: &quot;A String&quot;, # Optional. The Google Cloud Platform Service Account to be used by the node
            # VMs. If a service account is not specified, the &quot;default&quot; Compute Engine
            # service account is used. Cannot be updated.
        &quot;location&quot;: &quot;A String&quot;, # 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:
            # &quot;projects/{projectId}/zones/{zoneId}&quot;.
            #
            # This `location` must belong to the enclosing environment&#x27;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.
        &quot;machineType&quot;: &quot;A String&quot;, # 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:
            # &quot;projects/{projectId}/zones/{zoneId}/machineTypes/{machineTypeId}&quot;.
            #
            # The `machineType` must belong to the enclosing environment&#x27;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.
            #
            # The `machineTypeId` must not be a [shared-core machine
            # type](/compute/docs/machine-types#sharedcore).
            #
            # If this field is unspecified, the `machineTypeId` defaults
            # to &quot;n1-standard-1&quot;.
        &quot;ipAllocationPolicy&quot;: { # Configuration for controlling how IPs are allocated in the # Optional. The IPAllocationPolicy fields for the GKE cluster.
            # GKE cluster.
          &quot;useIpAliases&quot;: True or False, # Optional. Whether or not to enable Alias IPs in the GKE cluster.
              # If `true`, a VPC-native cluster is created.
          &quot;clusterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range used to allocate IP addresses to pods in
              # the cluster.
              #
              # This field is applicable only when `use_ip_aliases` is true.
              #
              # Set to blank to have GKE choose a range with the default size.
              #
              # Set to /netmask (e.g. `/14`) to have GKE choose a range with a specific
              # netmask.
              #
              # Set to a
              # [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
              # notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.
              # `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range
              # to use.
              # Specify `cluster_secondary_range_name` or `cluster_ipv4_cidr_block`
              # but not both.
          &quot;servicesIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range of the services IP addresses in this
              # cluster.
              #
              # This field is applicable only when `use_ip_aliases` is true.
              #
              # Set to blank to have GKE choose a range with the default size.
              #
              # Set to /netmask (e.g. `/14`) to have GKE choose a range with a specific
              # netmask.
              #
              # Set to a
              # [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
              # notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.
              # `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range
              # to use.
              # Specify `services_secondary_range_name` or `services_ipv4_cidr_block`
              # but not both.
          &quot;clusterSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the cluster&#x27;s secondary range used to allocate
              # IP addresses to pods. Specify either `cluster_secondary_range_name`
              # or `cluster_ipv4_cidr_block` but not both.
              #
              # This field is applicable only when `use_ip_aliases` is true.
          &quot;servicesSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the services&#x27; secondary range used to allocate
              # IP addresses to the cluster. Specify either `services_secondary_range_name`
              # or `services_ipv4_cidr_block` but not both.
              #
              # This field is applicable only when `use_ip_aliases` is true.
        },
        &quot;oauthScopes&quot;: [ # Optional. The set of Google API scopes to be made available on all
            # node VMs. If `oauth_scopes` is empty, defaults to
            # [&quot;https://www.googleapis.com/auth/cloud-platform&quot;]. Cannot be updated.
          &quot;A String&quot;,
        ],
      },
      &quot;airflowUri&quot;: &quot;A String&quot;, # 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)).
      &quot;privateEnvironmentConfig&quot;: { # The configuration information for configuring a Private IP Cloud Composer # The configuration used for the Private IP Cloud Composer environment.
          # environment.
        &quot;privateClusterConfig&quot;: { # Configuration options for the private GKE cluster in a Cloud Composer # Optional. Configuration for the private GKE cluster for a Private IP
            # Cloud Composer environment.
            # environment.
          &quot;masterIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range in CIDR notation to use for the hosted master network. This
              # range is used for assigning internal IP addresses to the cluster
              # master or set of masters and to the internal load balancer virtual IP.
              # This range must not overlap with any other ranges in use
              # within the cluster&#x27;s network.
          &quot;enablePrivateEndpoint&quot;: True or False, # Optional. If `true`, access to the public endpoint of the GKE cluster is
              # denied.
          &quot;masterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IPv4 range for GKE master will be reserved. If
              # left blank, the default value of &#x27;172.16.0.0/23&#x27; is used.
        },
        &quot;cloudSqlIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IP range in tenant project will be reserved for
            # Cloud SQL. Needs to be disjoint from web_server_ipv4_cidr_block
        &quot;webServerIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IP range for web server will be reserved. Needs
            # to be disjoint from private_cluster_config.master_ipv4_cidr_block and
            # cloud_sql_ipv4_cidr_block.
        &quot;enablePrivateEnvironment&quot;: True or False, # Optional. If `true`, a Private IP Cloud Composer environment is created.
            # If this field is true, `use_ip_aliases` must be true.
        &quot;webServerIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range reserved for the tenant project&#x27;s App Engine VMs.
      },
    },
    &quot;labels&quot;: { # 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 &lt;= 128 bytes in
        # size.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was last modified.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was created.
    &quot;state&quot;: &quot;A String&quot;, # The current state of the environment.
    &quot;name&quot;: &quot;A String&quot;, # The resource name of the environment, in the form:
        # &quot;projects/{projectId}/locations/{locationId}/environments/{environmentId}&quot;
        # 
        # EnvironmentId must start with a lowercase letter followed by up to 63
        # lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;name&quot;: &quot;A String&quot;, # 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 be a resource name ending with `operations/{unique_id}`.
    &quot;done&quot;: True or False, # 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.
    &quot;response&quot;: { # 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`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;message&quot;: &quot;A String&quot;, # 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.
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # 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.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Delete an environment.

Args:
  name: string, The environment to delete, in the form:
&quot;projects/{projectId}/locations/{locationId}/environments/{environmentId}&quot; (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;name&quot;: &quot;A String&quot;, # 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 be a resource name ending with `operations/{unique_id}`.
    &quot;done&quot;: True or False, # 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.
    &quot;response&quot;: { # 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`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;message&quot;: &quot;A String&quot;, # 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.
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # 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.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Get an existing environment.

Args:
  name: string, The resource name of the environment to get, in the form:
&quot;projects/{projectId}/locations/{locationId}/environments/{environmentId}&quot; (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # An environment for running orchestration tasks.
      &quot;uuid&quot;: &quot;A String&quot;, # Output only. The UUID (Universally Unique IDentifier) associated with this environment.
          # This value is generated when the environment is created.
      &quot;config&quot;: { # Configuration information for an environment. # Configuration parameters for this environment.
        &quot;gkeCluster&quot;: &quot;A String&quot;, # Output only. The Kubernetes Engine cluster used to run this environment.
        &quot;nodeCount&quot;: 42, # The number of nodes in the Kubernetes Engine cluster that will be
            # used to run this environment.
        &quot;databaseConfig&quot;: { # The configuration of Cloud SQL instance that is used by the Apache Airflow # Optional. The configuration settings for Cloud SQL instance used internally by Apache
            # Airflow software.
            # software.
          &quot;machineType&quot;: &quot;A String&quot;, # Optional. Cloud SQL machine type used by Airflow database.
              # It has to be one of: db-n1-standard-2, db-n1-standard-4, db-n1-standard-8
              # or db-n1-standard-16. If not specified, db-n1-standard-2 will be used.
        },
        &quot;softwareConfig&quot;: { # Specifies the selection and configuration of software inside the environment. # The configuration settings for software inside the environment.
          &quot;airflowConfigOverrides&quot;: { # Optional. Apache Airflow configuration properties to override.
              #
              # Property keys contain the section and property names, separated by a
              # hyphen, for example &quot;core-dags_are_paused_at_creation&quot;. Section names must
              # not contain hyphens (&quot;-&quot;), opening square brackets (&quot;[&quot;),  or closing
              # square brackets (&quot;]&quot;). The property name must not be empty and must not
              # contain an equals sign (&quot;=&quot;) or semicolon (&quot;;&quot;). Section and property names
              # must not contain a period (&quot;.&quot;). 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.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;imageVersion&quot;: &quot;A String&quot;, # 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]+|latest)-airflow-[0-9]+\.[0-9]+(\.[0-9]+.*)?`.
              # When used as input, the server also checks if the provided version is
              # supported and denies the request for an unsupported version.
              #
              # The Cloud Composer portion of the version is a
              # [semantic version](https://semver.org) or `latest`. When the patch version
              # is omitted, the current Cloud Composer patch version is selected.
              # When `latest` is provided instead of an explicit version number,
              # the server replaces `latest` with the current Cloud Composer version
              # and stores that version number in the same field.
              #
              # The portion of the image version that follows &lt;em&gt;airflow-&lt;/em&gt; is an
              # official Apache Airflow repository
              # [release name](https://github.com/apache/incubator-airflow/releases).
              #
              # See also [Version
              # List](/composer/docs/concepts/versioning/composer-versions).
          &quot;envVariables&quot;: { # 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`
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;pypiPackages&quot;: { # Optional. Custom Python Package Index (PyPI) packages to be installed in
              # the environment.
              #
              # Keys refer to the lowercase package name such as &quot;numpy&quot;
              # and values are the lowercase extras and version specifier such as
              # &quot;==1.12.0&quot;, &quot;[devel,gcp_api]&quot;, or &quot;[devel]&gt;=1.8.2, &lt;1.9.2&quot;. To specify a
              # package without pinning it to a version specifier, use the empty string as
              # the value.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;pythonVersion&quot;: &quot;A String&quot;, # Optional. The major version of Python used to run the Apache Airflow
              # scheduler, worker, and webserver processes.
              #
              # Can be set to &#x27;2&#x27; or &#x27;3&#x27;. If not specified, the default is &#x27;2&#x27;. Cannot be
              # updated.
        },
        &quot;dagGcsPrefix&quot;: &quot;A String&quot;, # 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 &quot;/&quot;-delimited object name prefixes. DAG objects for
            # this environment reside in a simulated directory with the given prefix.
        &quot;webServerNetworkAccessControl&quot;: { # Network-level access control policy for the Airflow web server. # Optional. The network-level access control policy for the Airflow web server. If
            # unspecified, no network-level access restrictions will be applied.
          &quot;allowedIpRanges&quot;: [ # A collection of allowed IP ranges with descriptions.
            { # Allowed IP range with user-provided description.
              &quot;description&quot;: &quot;A String&quot;, # Optional. User-provided description. It must contain at most 300 characters.
              &quot;value&quot;: &quot;A String&quot;, # IP address or range, defined using CIDR notation, of requests that this
                  # rule applies to.
                  # Examples: `192.168.1.1` or `192.168.0.0/16` or `2001:db8::/32`
                  #           or `2001:0db8:0000:0042:0000:8a2e:0370:7334`.
                  #
                  #
                  # &lt;p&gt;IP range prefixes should be properly truncated. For example,
                  # `1.2.3.4/24` should be truncated to `1.2.3.0/24`. Similarly, for IPv6,
                  # `2001:db8::1/32` should be truncated to `2001:db8::/32`.
            },
          ],
        },
        &quot;webServerConfig&quot;: { # The configuration settings for the Airflow web server App Engine instance. # Optional. The configuration settings for the Airflow web server App Engine instance.
          &quot;machineType&quot;: &quot;A String&quot;, # Optional. Machine type on which Airflow web server is running.
              # It has to be one of: composer-n1-webserver-2, composer-n1-webserver-4 or
              # composer-n1-webserver-8.
              # If not specified, composer-n1-webserver-2 will be used.
              # Value custom is returned only in response, if Airflow web server parameters
              # were manually changed to a non-standard values.
        },
        &quot;nodeConfig&quot;: { # The configuration information for the Kubernetes Engine nodes running # The configuration used for the Kubernetes Engine cluster.
            # the Apache Airflow software.
          &quot;tags&quot;: [ # 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.
            &quot;A String&quot;,
          ],
          &quot;diskSizeGb&quot;: 42, # Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
              # If unspecified, defaults to 100GB. Cannot be updated.
          &quot;subnetwork&quot;: &quot;A String&quot;, # 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:
              # &quot;projects/{projectId}/regions/{regionId}/subnetworks/{subnetworkId}&quot;
              #
              # If a subnetwork is provided, `nodeConfig.network` must also be provided,
              # and the subnetwork must belong to the enclosing environment&#x27;s project and
              # location.
          &quot;network&quot;: &quot;A String&quot;, # 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:
              # &quot;projects/{projectId}/global/networks/{networkId}&quot;.
              #
              # If unspecified, the default network in the environment&#x27;s project is used.
              # If a [Custom Subnet Network](/vpc/docs/vpc#vpc_networks_and_subnets)
              # is provided, `nodeConfig.subnetwork` must also be provided. For
              # [Shared VPC](/vpc/docs/shared-vpc) subnetwork requirements, see
              # `nodeConfig.subnetwork`.
          &quot;serviceAccount&quot;: &quot;A String&quot;, # Optional. The Google Cloud Platform Service Account to be used by the node
              # VMs. If a service account is not specified, the &quot;default&quot; Compute Engine
              # service account is used. Cannot be updated.
          &quot;location&quot;: &quot;A String&quot;, # 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:
              # &quot;projects/{projectId}/zones/{zoneId}&quot;.
              #
              # This `location` must belong to the enclosing environment&#x27;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.
          &quot;machineType&quot;: &quot;A String&quot;, # 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:
              # &quot;projects/{projectId}/zones/{zoneId}/machineTypes/{machineTypeId}&quot;.
              #
              # The `machineType` must belong to the enclosing environment&#x27;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.
              #
              # The `machineTypeId` must not be a [shared-core machine
              # type](/compute/docs/machine-types#sharedcore).
              #
              # If this field is unspecified, the `machineTypeId` defaults
              # to &quot;n1-standard-1&quot;.
          &quot;ipAllocationPolicy&quot;: { # Configuration for controlling how IPs are allocated in the # Optional. The IPAllocationPolicy fields for the GKE cluster.
              # GKE cluster.
            &quot;useIpAliases&quot;: True or False, # Optional. Whether or not to enable Alias IPs in the GKE cluster.
                # If `true`, a VPC-native cluster is created.
            &quot;clusterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range used to allocate IP addresses to pods in
                # the cluster.
                #
                # This field is applicable only when `use_ip_aliases` is true.
                #
                # Set to blank to have GKE choose a range with the default size.
                #
                # Set to /netmask (e.g. `/14`) to have GKE choose a range with a specific
                # netmask.
                #
                # Set to a
                # [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
                # notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.
                # `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range
                # to use.
                # Specify `cluster_secondary_range_name` or `cluster_ipv4_cidr_block`
                # but not both.
            &quot;servicesIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range of the services IP addresses in this
                # cluster.
                #
                # This field is applicable only when `use_ip_aliases` is true.
                #
                # Set to blank to have GKE choose a range with the default size.
                #
                # Set to /netmask (e.g. `/14`) to have GKE choose a range with a specific
                # netmask.
                #
                # Set to a
                # [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
                # notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.
                # `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range
                # to use.
                # Specify `services_secondary_range_name` or `services_ipv4_cidr_block`
                # but not both.
            &quot;clusterSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the cluster&#x27;s secondary range used to allocate
                # IP addresses to pods. Specify either `cluster_secondary_range_name`
                # or `cluster_ipv4_cidr_block` but not both.
                #
                # This field is applicable only when `use_ip_aliases` is true.
            &quot;servicesSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the services&#x27; secondary range used to allocate
                # IP addresses to the cluster. Specify either `services_secondary_range_name`
                # or `services_ipv4_cidr_block` but not both.
                #
                # This field is applicable only when `use_ip_aliases` is true.
          },
          &quot;oauthScopes&quot;: [ # Optional. The set of Google API scopes to be made available on all
              # node VMs. If `oauth_scopes` is empty, defaults to
              # [&quot;https://www.googleapis.com/auth/cloud-platform&quot;]. Cannot be updated.
            &quot;A String&quot;,
          ],
        },
        &quot;airflowUri&quot;: &quot;A String&quot;, # 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)).
        &quot;privateEnvironmentConfig&quot;: { # The configuration information for configuring a Private IP Cloud Composer # The configuration used for the Private IP Cloud Composer environment.
            # environment.
          &quot;privateClusterConfig&quot;: { # Configuration options for the private GKE cluster in a Cloud Composer # Optional. Configuration for the private GKE cluster for a Private IP
              # Cloud Composer environment.
              # environment.
            &quot;masterIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range in CIDR notation to use for the hosted master network. This
                # range is used for assigning internal IP addresses to the cluster
                # master or set of masters and to the internal load balancer virtual IP.
                # This range must not overlap with any other ranges in use
                # within the cluster&#x27;s network.
            &quot;enablePrivateEndpoint&quot;: True or False, # Optional. If `true`, access to the public endpoint of the GKE cluster is
                # denied.
            &quot;masterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IPv4 range for GKE master will be reserved. If
                # left blank, the default value of &#x27;172.16.0.0/23&#x27; is used.
          },
          &quot;cloudSqlIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IP range in tenant project will be reserved for
              # Cloud SQL. Needs to be disjoint from web_server_ipv4_cidr_block
          &quot;webServerIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IP range for web server will be reserved. Needs
              # to be disjoint from private_cluster_config.master_ipv4_cidr_block and
              # cloud_sql_ipv4_cidr_block.
          &quot;enablePrivateEnvironment&quot;: True or False, # Optional. If `true`, a Private IP Cloud Composer environment is created.
              # If this field is true, `use_ip_aliases` must be true.
          &quot;webServerIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range reserved for the tenant project&#x27;s App Engine VMs.
        },
      },
      &quot;labels&quot;: { # 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 &lt;= 128 bytes in
          # size.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was last modified.
      &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was created.
      &quot;state&quot;: &quot;A String&quot;, # The current state of the environment.
      &quot;name&quot;: &quot;A String&quot;, # The resource name of the environment, in the form:
          # &quot;projects/{projectId}/locations/{locationId}/environments/{environmentId}&quot;
          #
          # EnvironmentId must start with a lowercase letter followed by up to 63
          # lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
    }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</code>
  <pre>List environments.

Args:
  parent: string, List environments in the given project and location, in the form:
&quot;projects/{projectId}/locations/{locationId}&quot; (required)
  pageSize: integer, The maximum number of environments to return.
  pageToken: string, The next_page_token value returned from a previous List request, if any.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The environments in a project and location.
    &quot;nextPageToken&quot;: &quot;A String&quot;, # The page token used to query for the next page if one exists.
    &quot;environments&quot;: [ # The list of environments returned by a ListEnvironmentsRequest.
      { # An environment for running orchestration tasks.
          &quot;uuid&quot;: &quot;A String&quot;, # Output only. The UUID (Universally Unique IDentifier) associated with this environment.
              # This value is generated when the environment is created.
          &quot;config&quot;: { # Configuration information for an environment. # Configuration parameters for this environment.
            &quot;gkeCluster&quot;: &quot;A String&quot;, # Output only. The Kubernetes Engine cluster used to run this environment.
            &quot;nodeCount&quot;: 42, # The number of nodes in the Kubernetes Engine cluster that will be
                # used to run this environment.
            &quot;databaseConfig&quot;: { # The configuration of Cloud SQL instance that is used by the Apache Airflow # Optional. The configuration settings for Cloud SQL instance used internally by Apache
                # Airflow software.
                # software.
              &quot;machineType&quot;: &quot;A String&quot;, # Optional. Cloud SQL machine type used by Airflow database.
                  # It has to be one of: db-n1-standard-2, db-n1-standard-4, db-n1-standard-8
                  # or db-n1-standard-16. If not specified, db-n1-standard-2 will be used.
            },
            &quot;softwareConfig&quot;: { # Specifies the selection and configuration of software inside the environment. # The configuration settings for software inside the environment.
              &quot;airflowConfigOverrides&quot;: { # Optional. Apache Airflow configuration properties to override.
                  #
                  # Property keys contain the section and property names, separated by a
                  # hyphen, for example &quot;core-dags_are_paused_at_creation&quot;. Section names must
                  # not contain hyphens (&quot;-&quot;), opening square brackets (&quot;[&quot;),  or closing
                  # square brackets (&quot;]&quot;). The property name must not be empty and must not
                  # contain an equals sign (&quot;=&quot;) or semicolon (&quot;;&quot;). Section and property names
                  # must not contain a period (&quot;.&quot;). 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.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;imageVersion&quot;: &quot;A String&quot;, # 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]+|latest)-airflow-[0-9]+\.[0-9]+(\.[0-9]+.*)?`.
                  # When used as input, the server also checks if the provided version is
                  # supported and denies the request for an unsupported version.
                  #
                  # The Cloud Composer portion of the version is a
                  # [semantic version](https://semver.org) or `latest`. When the patch version
                  # is omitted, the current Cloud Composer patch version is selected.
                  # When `latest` is provided instead of an explicit version number,
                  # the server replaces `latest` with the current Cloud Composer version
                  # and stores that version number in the same field.
                  #
                  # The portion of the image version that follows &lt;em&gt;airflow-&lt;/em&gt; is an
                  # official Apache Airflow repository
                  # [release name](https://github.com/apache/incubator-airflow/releases).
                  #
                  # See also [Version
                  # List](/composer/docs/concepts/versioning/composer-versions).
              &quot;envVariables&quot;: { # 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`
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;pypiPackages&quot;: { # Optional. Custom Python Package Index (PyPI) packages to be installed in
                  # the environment.
                  #
                  # Keys refer to the lowercase package name such as &quot;numpy&quot;
                  # and values are the lowercase extras and version specifier such as
                  # &quot;==1.12.0&quot;, &quot;[devel,gcp_api]&quot;, or &quot;[devel]&gt;=1.8.2, &lt;1.9.2&quot;. To specify a
                  # package without pinning it to a version specifier, use the empty string as
                  # the value.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;pythonVersion&quot;: &quot;A String&quot;, # Optional. The major version of Python used to run the Apache Airflow
                  # scheduler, worker, and webserver processes.
                  #
                  # Can be set to &#x27;2&#x27; or &#x27;3&#x27;. If not specified, the default is &#x27;2&#x27;. Cannot be
                  # updated.
            },
            &quot;dagGcsPrefix&quot;: &quot;A String&quot;, # 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 &quot;/&quot;-delimited object name prefixes. DAG objects for
                # this environment reside in a simulated directory with the given prefix.
            &quot;webServerNetworkAccessControl&quot;: { # Network-level access control policy for the Airflow web server. # Optional. The network-level access control policy for the Airflow web server. If
                # unspecified, no network-level access restrictions will be applied.
              &quot;allowedIpRanges&quot;: [ # A collection of allowed IP ranges with descriptions.
                { # Allowed IP range with user-provided description.
                  &quot;description&quot;: &quot;A String&quot;, # Optional. User-provided description. It must contain at most 300 characters.
                  &quot;value&quot;: &quot;A String&quot;, # IP address or range, defined using CIDR notation, of requests that this
                      # rule applies to.
                      # Examples: `192.168.1.1` or `192.168.0.0/16` or `2001:db8::/32`
                      #           or `2001:0db8:0000:0042:0000:8a2e:0370:7334`.
                      #
                      #
                      # &lt;p&gt;IP range prefixes should be properly truncated. For example,
                      # `1.2.3.4/24` should be truncated to `1.2.3.0/24`. Similarly, for IPv6,
                      # `2001:db8::1/32` should be truncated to `2001:db8::/32`.
                },
              ],
            },
            &quot;webServerConfig&quot;: { # The configuration settings for the Airflow web server App Engine instance. # Optional. The configuration settings for the Airflow web server App Engine instance.
              &quot;machineType&quot;: &quot;A String&quot;, # Optional. Machine type on which Airflow web server is running.
                  # It has to be one of: composer-n1-webserver-2, composer-n1-webserver-4 or
                  # composer-n1-webserver-8.
                  # If not specified, composer-n1-webserver-2 will be used.
                  # Value custom is returned only in response, if Airflow web server parameters
                  # were manually changed to a non-standard values.
            },
            &quot;nodeConfig&quot;: { # The configuration information for the Kubernetes Engine nodes running # The configuration used for the Kubernetes Engine cluster.
                # the Apache Airflow software.
              &quot;tags&quot;: [ # 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.
                &quot;A String&quot;,
              ],
              &quot;diskSizeGb&quot;: 42, # Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
                  # If unspecified, defaults to 100GB. Cannot be updated.
              &quot;subnetwork&quot;: &quot;A String&quot;, # 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:
                  # &quot;projects/{projectId}/regions/{regionId}/subnetworks/{subnetworkId}&quot;
                  #
                  # If a subnetwork is provided, `nodeConfig.network` must also be provided,
                  # and the subnetwork must belong to the enclosing environment&#x27;s project and
                  # location.
              &quot;network&quot;: &quot;A String&quot;, # 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:
                  # &quot;projects/{projectId}/global/networks/{networkId}&quot;.
                  #
                  # If unspecified, the default network in the environment&#x27;s project is used.
                  # If a [Custom Subnet Network](/vpc/docs/vpc#vpc_networks_and_subnets)
                  # is provided, `nodeConfig.subnetwork` must also be provided. For
                  # [Shared VPC](/vpc/docs/shared-vpc) subnetwork requirements, see
                  # `nodeConfig.subnetwork`.
              &quot;serviceAccount&quot;: &quot;A String&quot;, # Optional. The Google Cloud Platform Service Account to be used by the node
                  # VMs. If a service account is not specified, the &quot;default&quot; Compute Engine
                  # service account is used. Cannot be updated.
              &quot;location&quot;: &quot;A String&quot;, # 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:
                  # &quot;projects/{projectId}/zones/{zoneId}&quot;.
                  #
                  # This `location` must belong to the enclosing environment&#x27;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.
              &quot;machineType&quot;: &quot;A String&quot;, # 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:
                  # &quot;projects/{projectId}/zones/{zoneId}/machineTypes/{machineTypeId}&quot;.
                  #
                  # The `machineType` must belong to the enclosing environment&#x27;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.
                  #
                  # The `machineTypeId` must not be a [shared-core machine
                  # type](/compute/docs/machine-types#sharedcore).
                  #
                  # If this field is unspecified, the `machineTypeId` defaults
                  # to &quot;n1-standard-1&quot;.
              &quot;ipAllocationPolicy&quot;: { # Configuration for controlling how IPs are allocated in the # Optional. The IPAllocationPolicy fields for the GKE cluster.
                  # GKE cluster.
                &quot;useIpAliases&quot;: True or False, # Optional. Whether or not to enable Alias IPs in the GKE cluster.
                    # If `true`, a VPC-native cluster is created.
                &quot;clusterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range used to allocate IP addresses to pods in
                    # the cluster.
                    #
                    # This field is applicable only when `use_ip_aliases` is true.
                    #
                    # Set to blank to have GKE choose a range with the default size.
                    #
                    # Set to /netmask (e.g. `/14`) to have GKE choose a range with a specific
                    # netmask.
                    #
                    # Set to a
                    # [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
                    # notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.
                    # `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range
                    # to use.
                    # Specify `cluster_secondary_range_name` or `cluster_ipv4_cidr_block`
                    # but not both.
                &quot;servicesIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range of the services IP addresses in this
                    # cluster.
                    #
                    # This field is applicable only when `use_ip_aliases` is true.
                    #
                    # Set to blank to have GKE choose a range with the default size.
                    #
                    # Set to /netmask (e.g. `/14`) to have GKE choose a range with a specific
                    # netmask.
                    #
                    # Set to a
                    # [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
                    # notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.
                    # `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range
                    # to use.
                    # Specify `services_secondary_range_name` or `services_ipv4_cidr_block`
                    # but not both.
                &quot;clusterSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the cluster&#x27;s secondary range used to allocate
                    # IP addresses to pods. Specify either `cluster_secondary_range_name`
                    # or `cluster_ipv4_cidr_block` but not both.
                    #
                    # This field is applicable only when `use_ip_aliases` is true.
                &quot;servicesSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the services&#x27; secondary range used to allocate
                    # IP addresses to the cluster. Specify either `services_secondary_range_name`
                    # or `services_ipv4_cidr_block` but not both.
                    #
                    # This field is applicable only when `use_ip_aliases` is true.
              },
              &quot;oauthScopes&quot;: [ # Optional. The set of Google API scopes to be made available on all
                  # node VMs. If `oauth_scopes` is empty, defaults to
                  # [&quot;https://www.googleapis.com/auth/cloud-platform&quot;]. Cannot be updated.
                &quot;A String&quot;,
              ],
            },
            &quot;airflowUri&quot;: &quot;A String&quot;, # 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)).
            &quot;privateEnvironmentConfig&quot;: { # The configuration information for configuring a Private IP Cloud Composer # The configuration used for the Private IP Cloud Composer environment.
                # environment.
              &quot;privateClusterConfig&quot;: { # Configuration options for the private GKE cluster in a Cloud Composer # Optional. Configuration for the private GKE cluster for a Private IP
                  # Cloud Composer environment.
                  # environment.
                &quot;masterIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range in CIDR notation to use for the hosted master network. This
                    # range is used for assigning internal IP addresses to the cluster
                    # master or set of masters and to the internal load balancer virtual IP.
                    # This range must not overlap with any other ranges in use
                    # within the cluster&#x27;s network.
                &quot;enablePrivateEndpoint&quot;: True or False, # Optional. If `true`, access to the public endpoint of the GKE cluster is
                    # denied.
                &quot;masterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IPv4 range for GKE master will be reserved. If
                    # left blank, the default value of &#x27;172.16.0.0/23&#x27; is used.
              },
              &quot;cloudSqlIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IP range in tenant project will be reserved for
                  # Cloud SQL. Needs to be disjoint from web_server_ipv4_cidr_block
              &quot;webServerIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IP range for web server will be reserved. Needs
                  # to be disjoint from private_cluster_config.master_ipv4_cidr_block and
                  # cloud_sql_ipv4_cidr_block.
              &quot;enablePrivateEnvironment&quot;: True or False, # Optional. If `true`, a Private IP Cloud Composer environment is created.
                  # If this field is true, `use_ip_aliases` must be true.
              &quot;webServerIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range reserved for the tenant project&#x27;s App Engine VMs.
            },
          },
          &quot;labels&quot;: { # 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 &lt;= 128 bytes in
              # size.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was last modified.
          &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was created.
          &quot;state&quot;: &quot;A String&quot;, # The current state of the environment.
          &quot;name&quot;: &quot;A String&quot;, # The resource name of the environment, in the form:
              # &quot;projects/{projectId}/locations/{locationId}/environments/{environmentId}&quot;
              #
              # EnvironmentId must start with a lowercase letter followed by up to 63
              # lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
        },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call &#x27;execute()&#x27; on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Update an environment.

Args:
  name: string, The relative resource name of the environment to update, in the form:
&quot;projects/{projectId}/locations/{locationId}/environments/{environmentId}&quot; (required)
  body: object, The request body.
    The object takes the form of:

{ # An environment for running orchestration tasks.
    &quot;uuid&quot;: &quot;A String&quot;, # Output only. The UUID (Universally Unique IDentifier) associated with this environment.
        # This value is generated when the environment is created.
    &quot;config&quot;: { # Configuration information for an environment. # Configuration parameters for this environment.
      &quot;gkeCluster&quot;: &quot;A String&quot;, # Output only. The Kubernetes Engine cluster used to run this environment.
      &quot;nodeCount&quot;: 42, # The number of nodes in the Kubernetes Engine cluster that will be
          # used to run this environment.
      &quot;databaseConfig&quot;: { # The configuration of Cloud SQL instance that is used by the Apache Airflow # Optional. The configuration settings for Cloud SQL instance used internally by Apache
          # Airflow software.
          # software.
        &quot;machineType&quot;: &quot;A String&quot;, # Optional. Cloud SQL machine type used by Airflow database.
            # It has to be one of: db-n1-standard-2, db-n1-standard-4, db-n1-standard-8
            # or db-n1-standard-16. If not specified, db-n1-standard-2 will be used.
      },
      &quot;softwareConfig&quot;: { # Specifies the selection and configuration of software inside the environment. # The configuration settings for software inside the environment.
        &quot;airflowConfigOverrides&quot;: { # Optional. Apache Airflow configuration properties to override.
            #
            # Property keys contain the section and property names, separated by a
            # hyphen, for example &quot;core-dags_are_paused_at_creation&quot;. Section names must
            # not contain hyphens (&quot;-&quot;), opening square brackets (&quot;[&quot;),  or closing
            # square brackets (&quot;]&quot;). The property name must not be empty and must not
            # contain an equals sign (&quot;=&quot;) or semicolon (&quot;;&quot;). Section and property names
            # must not contain a period (&quot;.&quot;). 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.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;imageVersion&quot;: &quot;A String&quot;, # 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]+|latest)-airflow-[0-9]+\.[0-9]+(\.[0-9]+.*)?`.
            # When used as input, the server also checks if the provided version is
            # supported and denies the request for an unsupported version.
            #
            # The Cloud Composer portion of the version is a
            # [semantic version](https://semver.org) or `latest`. When the patch version
            # is omitted, the current Cloud Composer patch version is selected.
            # When `latest` is provided instead of an explicit version number,
            # the server replaces `latest` with the current Cloud Composer version
            # and stores that version number in the same field.
            #
            # The portion of the image version that follows &lt;em&gt;airflow-&lt;/em&gt; is an
            # official Apache Airflow repository
            # [release name](https://github.com/apache/incubator-airflow/releases).
            #
            # See also [Version
            # List](/composer/docs/concepts/versioning/composer-versions).
        &quot;envVariables&quot;: { # 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`
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;pypiPackages&quot;: { # Optional. Custom Python Package Index (PyPI) packages to be installed in
            # the environment.
            #
            # Keys refer to the lowercase package name such as &quot;numpy&quot;
            # and values are the lowercase extras and version specifier such as
            # &quot;==1.12.0&quot;, &quot;[devel,gcp_api]&quot;, or &quot;[devel]&gt;=1.8.2, &lt;1.9.2&quot;. To specify a
            # package without pinning it to a version specifier, use the empty string as
            # the value.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;pythonVersion&quot;: &quot;A String&quot;, # Optional. The major version of Python used to run the Apache Airflow
            # scheduler, worker, and webserver processes.
            #
            # Can be set to &#x27;2&#x27; or &#x27;3&#x27;. If not specified, the default is &#x27;2&#x27;. Cannot be
            # updated.
      },
      &quot;dagGcsPrefix&quot;: &quot;A String&quot;, # 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 &quot;/&quot;-delimited object name prefixes. DAG objects for
          # this environment reside in a simulated directory with the given prefix.
      &quot;webServerNetworkAccessControl&quot;: { # Network-level access control policy for the Airflow web server. # Optional. The network-level access control policy for the Airflow web server. If
          # unspecified, no network-level access restrictions will be applied.
        &quot;allowedIpRanges&quot;: [ # A collection of allowed IP ranges with descriptions.
          { # Allowed IP range with user-provided description.
            &quot;description&quot;: &quot;A String&quot;, # Optional. User-provided description. It must contain at most 300 characters.
            &quot;value&quot;: &quot;A String&quot;, # IP address or range, defined using CIDR notation, of requests that this
                # rule applies to.
                # Examples: `192.168.1.1` or `192.168.0.0/16` or `2001:db8::/32`
                #           or `2001:0db8:0000:0042:0000:8a2e:0370:7334`.
                #
                #
                # &lt;p&gt;IP range prefixes should be properly truncated. For example,
                # `1.2.3.4/24` should be truncated to `1.2.3.0/24`. Similarly, for IPv6,
                # `2001:db8::1/32` should be truncated to `2001:db8::/32`.
          },
        ],
      },
      &quot;webServerConfig&quot;: { # The configuration settings for the Airflow web server App Engine instance. # Optional. The configuration settings for the Airflow web server App Engine instance.
        &quot;machineType&quot;: &quot;A String&quot;, # Optional. Machine type on which Airflow web server is running.
            # It has to be one of: composer-n1-webserver-2, composer-n1-webserver-4 or
            # composer-n1-webserver-8.
            # If not specified, composer-n1-webserver-2 will be used.
            # Value custom is returned only in response, if Airflow web server parameters
            # were manually changed to a non-standard values.
      },
      &quot;nodeConfig&quot;: { # The configuration information for the Kubernetes Engine nodes running # The configuration used for the Kubernetes Engine cluster.
          # the Apache Airflow software.
        &quot;tags&quot;: [ # 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.
          &quot;A String&quot;,
        ],
        &quot;diskSizeGb&quot;: 42, # Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
            # If unspecified, defaults to 100GB. Cannot be updated.
        &quot;subnetwork&quot;: &quot;A String&quot;, # 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:
            # &quot;projects/{projectId}/regions/{regionId}/subnetworks/{subnetworkId}&quot;
            #
            # If a subnetwork is provided, `nodeConfig.network` must also be provided,
            # and the subnetwork must belong to the enclosing environment&#x27;s project and
            # location.
        &quot;network&quot;: &quot;A String&quot;, # 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:
            # &quot;projects/{projectId}/global/networks/{networkId}&quot;.
            #
            # If unspecified, the default network in the environment&#x27;s project is used.
            # If a [Custom Subnet Network](/vpc/docs/vpc#vpc_networks_and_subnets)
            # is provided, `nodeConfig.subnetwork` must also be provided. For
            # [Shared VPC](/vpc/docs/shared-vpc) subnetwork requirements, see
            # `nodeConfig.subnetwork`.
        &quot;serviceAccount&quot;: &quot;A String&quot;, # Optional. The Google Cloud Platform Service Account to be used by the node
            # VMs. If a service account is not specified, the &quot;default&quot; Compute Engine
            # service account is used. Cannot be updated.
        &quot;location&quot;: &quot;A String&quot;, # 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:
            # &quot;projects/{projectId}/zones/{zoneId}&quot;.
            #
            # This `location` must belong to the enclosing environment&#x27;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.
        &quot;machineType&quot;: &quot;A String&quot;, # 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:
            # &quot;projects/{projectId}/zones/{zoneId}/machineTypes/{machineTypeId}&quot;.
            #
            # The `machineType` must belong to the enclosing environment&#x27;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.
            #
            # The `machineTypeId` must not be a [shared-core machine
            # type](/compute/docs/machine-types#sharedcore).
            #
            # If this field is unspecified, the `machineTypeId` defaults
            # to &quot;n1-standard-1&quot;.
        &quot;ipAllocationPolicy&quot;: { # Configuration for controlling how IPs are allocated in the # Optional. The IPAllocationPolicy fields for the GKE cluster.
            # GKE cluster.
          &quot;useIpAliases&quot;: True or False, # Optional. Whether or not to enable Alias IPs in the GKE cluster.
              # If `true`, a VPC-native cluster is created.
          &quot;clusterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range used to allocate IP addresses to pods in
              # the cluster.
              #
              # This field is applicable only when `use_ip_aliases` is true.
              #
              # Set to blank to have GKE choose a range with the default size.
              #
              # Set to /netmask (e.g. `/14`) to have GKE choose a range with a specific
              # netmask.
              #
              # Set to a
              # [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
              # notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.
              # `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range
              # to use.
              # Specify `cluster_secondary_range_name` or `cluster_ipv4_cidr_block`
              # but not both.
          &quot;servicesIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range of the services IP addresses in this
              # cluster.
              #
              # This field is applicable only when `use_ip_aliases` is true.
              #
              # Set to blank to have GKE choose a range with the default size.
              #
              # Set to /netmask (e.g. `/14`) to have GKE choose a range with a specific
              # netmask.
              #
              # Set to a
              # [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
              # notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.
              # `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range
              # to use.
              # Specify `services_secondary_range_name` or `services_ipv4_cidr_block`
              # but not both.
          &quot;clusterSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the cluster&#x27;s secondary range used to allocate
              # IP addresses to pods. Specify either `cluster_secondary_range_name`
              # or `cluster_ipv4_cidr_block` but not both.
              #
              # This field is applicable only when `use_ip_aliases` is true.
          &quot;servicesSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the services&#x27; secondary range used to allocate
              # IP addresses to the cluster. Specify either `services_secondary_range_name`
              # or `services_ipv4_cidr_block` but not both.
              #
              # This field is applicable only when `use_ip_aliases` is true.
        },
        &quot;oauthScopes&quot;: [ # Optional. The set of Google API scopes to be made available on all
            # node VMs. If `oauth_scopes` is empty, defaults to
            # [&quot;https://www.googleapis.com/auth/cloud-platform&quot;]. Cannot be updated.
          &quot;A String&quot;,
        ],
      },
      &quot;airflowUri&quot;: &quot;A String&quot;, # 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)).
      &quot;privateEnvironmentConfig&quot;: { # The configuration information for configuring a Private IP Cloud Composer # The configuration used for the Private IP Cloud Composer environment.
          # environment.
        &quot;privateClusterConfig&quot;: { # Configuration options for the private GKE cluster in a Cloud Composer # Optional. Configuration for the private GKE cluster for a Private IP
            # Cloud Composer environment.
            # environment.
          &quot;masterIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range in CIDR notation to use for the hosted master network. This
              # range is used for assigning internal IP addresses to the cluster
              # master or set of masters and to the internal load balancer virtual IP.
              # This range must not overlap with any other ranges in use
              # within the cluster&#x27;s network.
          &quot;enablePrivateEndpoint&quot;: True or False, # Optional. If `true`, access to the public endpoint of the GKE cluster is
              # denied.
          &quot;masterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IPv4 range for GKE master will be reserved. If
              # left blank, the default value of &#x27;172.16.0.0/23&#x27; is used.
        },
        &quot;cloudSqlIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IP range in tenant project will be reserved for
            # Cloud SQL. Needs to be disjoint from web_server_ipv4_cidr_block
        &quot;webServerIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The CIDR block from which IP range for web server will be reserved. Needs
            # to be disjoint from private_cluster_config.master_ipv4_cidr_block and
            # cloud_sql_ipv4_cidr_block.
        &quot;enablePrivateEnvironment&quot;: True or False, # Optional. If `true`, a Private IP Cloud Composer environment is created.
            # If this field is true, `use_ip_aliases` must be true.
        &quot;webServerIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range reserved for the tenant project&#x27;s App Engine VMs.
      },
    },
    &quot;labels&quot;: { # 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 &lt;= 128 bytes in
        # size.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was last modified.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was created.
    &quot;state&quot;: &quot;A String&quot;, # The current state of the environment.
    &quot;name&quot;: &quot;A String&quot;, # The resource name of the environment, in the form:
        # &quot;projects/{projectId}/locations/{locationId}/environments/{environmentId}&quot;
        # 
        # EnvironmentId must start with a lowercase letter followed by up to 63
        # lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
  }

  updateMask: string, 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
argparse, the `updateMask` parameter would include the following two
`paths` values: &quot;config.softwareConfig.pypiPackages.scikit-learn&quot; and
&quot;config.softwareConfig.pypiPackages.argparse&quot;. The included patch
environment would specify the scikit-learn version as follows:

    {
      &quot;config&quot;:{
        &quot;softwareConfig&quot;:{
          &quot;pypiPackages&quot;:{
            &quot;scikit-learn&quot;:&quot;==0.19.0&quot;
          }
        }
      }
    }

Note that in the above example, any existing PyPI packages
other than scikit-learn and argparse will be unaffected.

Only one update type may be included in a single request&#x27;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 &quot;label1&quot; and &quot;label2&quot; while clearing &quot;label3&quot; (assuming
it already exists), one can
provide the paths &quot;labels.label1&quot;, &quot;labels.label2&quot;, and &quot;labels.label3&quot;
and populate the patch environment as follows:

    {
      &quot;labels&quot;:{
        &quot;label1&quot;:&quot;new-label1-value&quot;
        &quot;label2&quot;:&quot;new-label2-value&quot;
      }
    }

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&#x27;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 &quot;config.softwareConfig.pypiPackages&quot;, and
the patch environment would be the following:

    {
      &quot;config&quot;:{
        &quot;softwareConfig&quot;:{
          &quot;pypiPackages&quot;:{
            &quot;botocore&quot;:&quot;==1.7.14&quot;
          }
        }
      }
    }

&lt;strong&gt;Note:&lt;/strong&gt; Only the following fields can be updated:

 &lt;table&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Mask&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.softwareConfig.pypiPackages
 &lt;/td&gt;
 &lt;td&gt;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.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.softwareConfig.pypiPackages.&lt;var&gt;packagename&lt;/var&gt;&lt;/td&gt;
 &lt;td&gt;Update the custom PyPI package &lt;var&gt;packagename&lt;/var&gt;,
 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
 &quot;config.softwareConfig.pypiPackages&quot; mask.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;labels&lt;/td&gt;
 &lt;td&gt;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.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;labels.&lt;var&gt;labelName&lt;/var&gt;&lt;/td&gt;
 &lt;td&gt;Set the label named &lt;var&gt;labelName&lt;/var&gt;, 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 &quot;labels&quot; mask.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.nodeCount&lt;/td&gt;
 &lt;td&gt;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.
 &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.webServerNetworkAccessControl&lt;/td&gt;
 &lt;td&gt;Replace the environment&#x27;s current WebServerNetworkAccessControl.
 &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.softwareConfig.airflowConfigOverrides&lt;/td&gt;
 &lt;td&gt;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.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.softwareConfig.airflowConfigOverrides.&lt;var&gt;section&lt;/var&gt;-&lt;var&gt;name
 &lt;/var&gt;&lt;/td&gt;
 &lt;td&gt;Override the Apache Airflow config property &lt;var&gt;name&lt;/var&gt; in the
 section named &lt;var&gt;section&lt;/var&gt;, 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
 &quot;config.softwareConfig.airflowConfigOverrides&quot; mask.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.softwareConfig.envVariables&lt;/td&gt;
 &lt;td&gt;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.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.softwareConfig.imageVersion&lt;/td&gt;
 &lt;td&gt;Upgrade the version of the environment in-place. Refer to
 `SoftwareConfig.image_version` for information on how to format the new
 image version. Additionally, the new image version cannot effect a version
 downgrade and must match the current image version&#x27;s Composer major
 version and Airflow major and minor versions. Consult the
 &lt;a href=&quot;/composer/docs/concepts/versioning/composer-versions&quot;&gt;Cloud
 Composer Version List&lt;/a&gt; for valid values.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.databaseConfig.machineType&lt;/td&gt;
 &lt;td&gt;Cloud SQL machine type used by Airflow database.
 It has to be one of: db-n1-standard-2, db-n1-standard-4, db-n1-standard-8
 or db-n1-standard-16.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;config.webServerConfig.machineType&lt;/td&gt;
 &lt;td&gt;Machine type on which Airflow web server is running.
 It has to be one of: composer-n1-webserver-2, composer-n1-webserver-4 or
 composer-n1-webserver-8.
 &lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;name&quot;: &quot;A String&quot;, # 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 be a resource name ending with `operations/{unique_id}`.
    &quot;done&quot;: True or False, # 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.
    &quot;response&quot;: { # 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`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;message&quot;: &quot;A String&quot;, # 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.
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # 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.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
  }</pre>
</div>

</body></html>