<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_v1.html">Cloud Composer API</a> . <a href="composer_v1.projects.html">projects</a> . <a href="composer_v1.projects.locations.html">locations</a> . <a href="composer_v1.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, pageToken=None, pageSize=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;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;createTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was 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;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;enablePrivateEnvironment&quot;: True or False, # Optional. If `true`, a Private IP Cloud Composer environment is created.
          # If this field is set to true, `IPAllocationPolicy.use_ip_aliases` must be
          # set to true.
      &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;enablePrivateEndpoint&quot;: True or False, # Optional. If `true`, access to the public endpoint of the GKE cluster is
            # denied.
        &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 GKE 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;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;webServerIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range reserved for the tenant project&#x27;s App Engine VMs.
      &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;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;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;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;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;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;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;nodeCount&quot;: 42, # The number of nodes in the Kubernetes Engine cluster that will be
        # used to run this environment.
    &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;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;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;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 configuration for controlling how IPs are allocated in the GKE cluster.
          # GKE cluster running the Apache Airflow software.
        &quot;clusterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range used to allocate IP addresses to pods in
            # the GKE 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.
        &quot;servicesIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range of the services IP addresses in this
            # GKE 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.
        &quot;clusterSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the GKE cluster&#x27;s secondary range used to allocate
            # IP addresses to pods.
            #
            # 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 GKE cluster.
            #
            # This field is applicable only when `use_ip_aliases` is true.
        &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;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;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;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;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;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;.
          #
          # [Shared VPC](/vpc/docs/shared-vpc) is not currently supported. The
          # network must belong to the environment&#x27;s project. If unspecified, the
          # &quot;default&quot; network ID 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.
    },
    &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;updateTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was last modified.
  &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;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;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.
    },
    &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;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;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;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.
    },
  }</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;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;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.
    },
    &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;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;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;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.
    },
  }</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;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;createTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was 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;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;enablePrivateEnvironment&quot;: True or False, # Optional. If `true`, a Private IP Cloud Composer environment is created.
            # If this field is set to true, `IPAllocationPolicy.use_ip_aliases` must be
            # set to true.
        &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;enablePrivateEndpoint&quot;: True or False, # Optional. If `true`, access to the public endpoint of the GKE cluster is
              # denied.
          &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 GKE 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;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;webServerIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range reserved for the tenant project&#x27;s App Engine VMs.
        &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;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;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;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;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;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;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;nodeCount&quot;: 42, # The number of nodes in the Kubernetes Engine cluster that will be
          # used to run this environment.
      &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;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;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;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 configuration for controlling how IPs are allocated in the GKE cluster.
            # GKE cluster running the Apache Airflow software.
          &quot;clusterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range used to allocate IP addresses to pods in
              # the GKE 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.
          &quot;servicesIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range of the services IP addresses in this
              # GKE 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.
          &quot;clusterSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the GKE cluster&#x27;s secondary range used to allocate
              # IP addresses to pods.
              #
              # 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 GKE cluster.
              #
              # This field is applicable only when `use_ip_aliases` is true.
          &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;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;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;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;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;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;.
            #
            # [Shared VPC](/vpc/docs/shared-vpc) is not currently supported. The
            # network must belong to the environment&#x27;s project. If unspecified, the
            # &quot;default&quot; network ID 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.
      },
      &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;updateTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was last modified.
    &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, pageToken=None, pageSize=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)
  pageToken: string, The next_page_token value returned from a previous List request, if any.
  pageSize: integer, The maximum number of environments to return.
  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;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;createTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was 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;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;enablePrivateEnvironment&quot;: True or False, # Optional. If `true`, a Private IP Cloud Composer environment is created.
                # If this field is set to true, `IPAllocationPolicy.use_ip_aliases` must be
                # set to true.
            &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;enablePrivateEndpoint&quot;: True or False, # Optional. If `true`, access to the public endpoint of the GKE cluster is
                  # denied.
              &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 GKE 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;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;webServerIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range reserved for the tenant project&#x27;s App Engine VMs.
            &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;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;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;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;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;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;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;nodeCount&quot;: 42, # The number of nodes in the Kubernetes Engine cluster that will be
              # used to run this environment.
          &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;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;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;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 configuration for controlling how IPs are allocated in the GKE cluster.
                # GKE cluster running the Apache Airflow software.
              &quot;clusterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range used to allocate IP addresses to pods in
                  # the GKE 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.
              &quot;servicesIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range of the services IP addresses in this
                  # GKE 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.
              &quot;clusterSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the GKE cluster&#x27;s secondary range used to allocate
                  # IP addresses to pods.
                  #
                  # 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 GKE cluster.
                  #
                  # This field is applicable only when `use_ip_aliases` is true.
              &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;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;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;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;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;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;.
                #
                # [Shared VPC](/vpc/docs/shared-vpc) is not currently supported. The
                # network must belong to the environment&#x27;s project. If unspecified, the
                # &quot;default&quot; network ID 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.
          },
          &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;updateTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was last modified.
        &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;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;createTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was 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;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;enablePrivateEnvironment&quot;: True or False, # Optional. If `true`, a Private IP Cloud Composer environment is created.
          # If this field is set to true, `IPAllocationPolicy.use_ip_aliases` must be
          # set to true.
      &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;enablePrivateEndpoint&quot;: True or False, # Optional. If `true`, access to the public endpoint of the GKE cluster is
            # denied.
        &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 GKE 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;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;webServerIpv4ReservedRange&quot;: &quot;A String&quot;, # Output only. The IP range reserved for the tenant project&#x27;s App Engine VMs.
      &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;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;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;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;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;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;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;nodeCount&quot;: 42, # The number of nodes in the Kubernetes Engine cluster that will be
        # used to run this environment.
    &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;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;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;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 configuration for controlling how IPs are allocated in the GKE cluster.
          # GKE cluster running the Apache Airflow software.
        &quot;clusterIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range used to allocate IP addresses to pods in
            # the GKE 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.
        &quot;servicesIpv4CidrBlock&quot;: &quot;A String&quot;, # Optional. The IP address range of the services IP addresses in this
            # GKE 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.
        &quot;clusterSecondaryRangeName&quot;: &quot;A String&quot;, # Optional. The name of the GKE cluster&#x27;s secondary range used to allocate
            # IP addresses to pods.
            #
            # 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 GKE cluster.
            #
            # This field is applicable only when `use_ip_aliases` is true.
        &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;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;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;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;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;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;.
          #
          # [Shared VPC](/vpc/docs/shared-vpc) is not currently supported. The
          # network must belong to the environment&#x27;s project. If unspecified, the
          # &quot;default&quot; network ID 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.
    },
    &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;updateTime&quot;: &quot;A String&quot;, # Output only. The time at which this environment was last modified.
  &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
numpy, the `updateMask` parameter would include the following two
`paths` values: &quot;config.softwareConfig.pypiPackages.scikit-learn&quot; and
&quot;config.softwareConfig.pypiPackages.numpy&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 numpy 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;
          }
        }
      }
    }

**Note:** 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.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;/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;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;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.
    },
    &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;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;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;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.
    },
  }</pre>
</div>

</body></html>