<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, 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, 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, x__xgafv=None)</code>
  <pre>Create a new environment.

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

{ # An environment for running orchestration tasks.
    "updateTime": "A String", # Output only.
        # The time at which this environment was last modified.
    "uuid": "A String", # Output only.
        # The UUID (Universally Unique IDentifier) associated with this environment.
        # This value is generated when the environment is created.
    "labels": { # Optional. User-defined labels for this environment.
        # The labels map can contain no more than 64 entries. Entries of the labels
        # map are UTF8 strings that comply with the following restrictions:
        # 
        # * Keys must conform to regexp: \p{Ll}\p{Lo}{0,62}
        # * Values must conform to regexp:  [\p{Ll}\p{Lo}\p{N}_-]{0,63}
        # * Both keys and values are additionally constrained to be <= 128 bytes in
        # size.
      "a_key": "A String",
    },
    "state": "A String", # The current state of the environment.
    "config": { # Configuration information for an environment. # Configuration parameters for this environment.
      "dagGcsPrefix": "A String", # Output only.
          # The Cloud Storage prefix of the DAGs for this environment. Although Cloud
          # Storage objects reside in a flat namespace, a hierarchical file tree
          # can be simulated using "/"-delimited object name prefixes. DAG objects for
          # this environment reside in a simulated directory with the given prefix.
      "softwareConfig": { # Specifies the selection and configuration of software inside the environment. # The configuration settings for software inside the environment.
        "imageVersion": "A String", # 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 <em>airflow-</em> 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).
        "pypiPackages": { # Optional. Custom Python Package Index (PyPI) packages to be installed in
            # the environment.
            #
            # Keys refer to the lowercase package name such as "numpy"
            # and values are the lowercase extras and version specifier such as
            # "==1.12.0", "[devel,gcp_api]", or "[devel]>=1.8.2, <1.9.2". To specify a
            # package without pinning it to a version specifier, use the empty string as
            # the value.
          "a_key": "A String",
        },
        "pythonVersion": "A String", # Optional. The major version of Python used to run the Apache Airflow
            # scheduler, worker, and webserver processes.
            #
            # Can be set to '2' or '3'. If not specified, the default is '2'. Cannot be
            # updated.
        "envVariables": { # 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`
          "a_key": "A String",
        },
        "airflowConfigOverrides": { # Optional. Apache Airflow configuration properties to override.
            #
            # Property keys contain the section and property names, separated by a
            # hyphen, for example "core-dags_are_paused_at_creation". Section names must
            # not contain hyphens ("-"), opening square brackets ("["),  or closing
            # square brackets ("]"). The property name must not be empty and must not
            # contain an equals sign ("=") or semicolon (";"). Section and property names
            # must not contain a period ("."). Apache Airflow configuration property
            # names must be written in
            # [snake_case](https://en.wikipedia.org/wiki/Snake_case). Property values can
            # contain any character, and can be written in any lower/upper case format.
            #
            # Certain Apache Airflow configuration property values are
            # [blacklisted](/composer/docs/how-to/managing/setting-airflow-configurations#airflow_configuration_blacklists),
            # and cannot be overridden.
          "a_key": "A String",
        },
      },
      "airflowUri": "A String", # 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)).
      "gkeCluster": "A String", # Output only.
          # The Kubernetes Engine cluster used to run this environment.
      "nodeConfig": { # The configuration information for the Kubernetes Engine nodes running # The configuration used for the Kubernetes Engine cluster.
          # the Apache Airflow software.
        "machineType": "A String", # Optional. The Compute Engine
            # [machine type](/compute/docs/machine-types) used for cluster instances,
            # specified as a
            # [relative resource
            # name](/apis/design/resource_names#relative_resource_name). For example:
            # "projects/{projectId}/zones/{zoneId}/machineTypes/{machineTypeId}".
            #
            # The `machineType` must belong to the enclosing environment's project and
            # location. If both this field and `nodeConfig.location` are specified,
            # this `machineType` must belong to the `nodeConfig.location`; if both are
            # unspecified, the service will pick a zone in the Compute Engine region
            # corresponding to the Cloud Composer location, and propagate that choice to
            # both fields. If exactly one of this field and `nodeConfig.location` is
            # specified, the location information from the specified field will be
            # propagated to the unspecified field.
            #
            # If this field is unspecified, the `machineTypeId` defaults
            # to "n1-standard-1".
        "network": "A String", # Optional. The Compute Engine network to be used for machine
            # communications, specified as a
            # [relative resource
            # name](/apis/design/resource_names#relative_resource_name). For example:
            # "projects/{projectId}/global/networks/{networkId}".
            #
            # [Shared VPC](/vpc/docs/shared-vpc) is not currently supported. The
            # network must belong to the environment's project. If unspecified, the
            # "default" network ID in the environment's project is used.  If a
            # [Custom Subnet Network](/vpc/docs/vpc#vpc_networks_and_subnets)
            # is provided, `nodeConfig.subnetwork` must also be provided.
        "tags": [ # 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.
          "A String",
        ],
        "serviceAccount": "A String", # Optional. The Google Cloud Platform Service Account to be used by the node
            # VMs. If a service account is not specified, the "default" Compute Engine
            # service account is used. Cannot be updated.
        "oauthScopes": [ # Optional. The set of Google API scopes to be made available on all
            # node VMs. If `oauth_scopes` is empty, defaults to
            # ["https://www.googleapis.com/auth/cloud-platform"]. Cannot be updated.
          "A String",
        ],
        "diskSizeGb": 42, # Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
            # If unspecified, defaults to 100GB. Cannot be updated.
        "location": "A String", # Optional. The Compute Engine [zone](/compute/docs/regions-zones) in which
            # to deploy the VMs used to run the Apache Airflow software, specified as a
            # [relative resource
            # name](/apis/design/resource_names#relative_resource_name). For example:
            # "projects/{projectId}/zones/{zoneId}".
            #
            # This `location` must belong to the enclosing environment's project and
            # location. If both this field and `nodeConfig.machineType` are specified,
            # `nodeConfig.machineType` must belong to this `location`; if both are
            # unspecified, the service will pick a zone in the Compute Engine region
            # corresponding to the Cloud Composer location, and propagate that choice to
            # both fields. If only one field (`location` or `nodeConfig.machineType`) is
            # specified, the location information from the specified field will be
            # propagated to the unspecified field.
        "subnetwork": "A String", # Optional. The Compute Engine subnetwork to be used for machine
            # communications, specified as a
            # [relative resource
            # name](/apis/design/resource_names#relative_resource_name). For example:
            # "projects/{projectId}/regions/{regionId}/subnetworks/{subnetworkId}"
            #
            # If a subnetwork is provided, `nodeConfig.network` must also be provided,
            # and the subnetwork must belong to the enclosing environment's project and
            # location.
      },
      "nodeCount": 42, # The number of nodes in the Kubernetes Engine cluster that will be
          # used to run this environment.
    },
    "createTime": "A String", # Output only.
        # The time at which this environment was created.
    "name": "A String", # The resource name of the environment, in the form:
        # "projects/{projectId}/locations/{locationId}/environments/{environmentId}"
  }

  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.
    "metadata": { # 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.
      "a_key": "", # Properties of the object. Contains field @type with type URL.
    },
    "error": { # 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). The error model is designed to be:
        #
        # - Simple to use and understand for most users
        # - Flexible enough to meet unexpected needs
        #
        # # Overview
        #
        # The `Status` message contains three pieces of data: error code, error
        # message, and error details. The error code should be an enum value of
        # google.rpc.Code, but it may accept additional error codes if needed.  The
        # error message should be a developer-facing English message that helps
        # developers *understand* and *resolve* the error. If a localized user-facing
        # error message is needed, put the localized message in the error details or
        # localize it in the client. The optional error details may contain arbitrary
        # information about the error. There is a predefined set of error detail types
        # in the package `google.rpc` that can be used for common error conditions.
        #
        # # Language mapping
        #
        # The `Status` message is the logical representation of the error model, but it
        # is not necessarily the actual wire format. When the `Status` message is
        # exposed in different client libraries and different wire protocols, it can be
        # mapped differently. For example, it will likely be mapped to some exceptions
        # in Java, but more likely mapped to some error codes in C.
        #
        # # Other uses
        #
        # The error model and the `Status` message can be used in a variety of
        # environments, either with or without APIs, to provide a
        # consistent developer experience across different environments.
        #
        # Example uses of this error model include:
        #
        # - Partial errors. If a service needs to return partial errors to the client,
        #     it may embed the `Status` in the normal response to indicate the partial
        #     errors.
        #
        # - Workflow errors. A typical workflow has multiple steps. Each step may
        #     have a `Status` message for error reporting.
        #
        # - Batch operations. If a client uses batch request and batch response, the
        #     `Status` message should be used directly inside batch response, one for
        #     each error sub-response.
        #
        # - Asynchronous operations. If an API call embeds asynchronous operation
        #     results in its response, the status of those operations should be
        #     represented directly using the `Status` message.
        #
        # - Logging. If some API errors are stored in logs, the message `Status` could
        #     be used directly after any stripping needed for security/privacy reasons.
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "done": 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.
    "response": { # 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`.
      "a_key": "", # Properties of the object. Contains field @type with type URL.
    },
    "name": "A String", # 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}`.
  }</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:
"projects/{projectId}/locations/{locationId}/environments/{environmentId}" (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.
    "metadata": { # 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.
      "a_key": "", # Properties of the object. Contains field @type with type URL.
    },
    "error": { # 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). The error model is designed to be:
        #
        # - Simple to use and understand for most users
        # - Flexible enough to meet unexpected needs
        #
        # # Overview
        #
        # The `Status` message contains three pieces of data: error code, error
        # message, and error details. The error code should be an enum value of
        # google.rpc.Code, but it may accept additional error codes if needed.  The
        # error message should be a developer-facing English message that helps
        # developers *understand* and *resolve* the error. If a localized user-facing
        # error message is needed, put the localized message in the error details or
        # localize it in the client. The optional error details may contain arbitrary
        # information about the error. There is a predefined set of error detail types
        # in the package `google.rpc` that can be used for common error conditions.
        #
        # # Language mapping
        #
        # The `Status` message is the logical representation of the error model, but it
        # is not necessarily the actual wire format. When the `Status` message is
        # exposed in different client libraries and different wire protocols, it can be
        # mapped differently. For example, it will likely be mapped to some exceptions
        # in Java, but more likely mapped to some error codes in C.
        #
        # # Other uses
        #
        # The error model and the `Status` message can be used in a variety of
        # environments, either with or without APIs, to provide a
        # consistent developer experience across different environments.
        #
        # Example uses of this error model include:
        #
        # - Partial errors. If a service needs to return partial errors to the client,
        #     it may embed the `Status` in the normal response to indicate the partial
        #     errors.
        #
        # - Workflow errors. A typical workflow has multiple steps. Each step may
        #     have a `Status` message for error reporting.
        #
        # - Batch operations. If a client uses batch request and batch response, the
        #     `Status` message should be used directly inside batch response, one for
        #     each error sub-response.
        #
        # - Asynchronous operations. If an API call embeds asynchronous operation
        #     results in its response, the status of those operations should be
        #     represented directly using the `Status` message.
        #
        # - Logging. If some API errors are stored in logs, the message `Status` could
        #     be used directly after any stripping needed for security/privacy reasons.
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "done": 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.
    "response": { # 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`.
      "a_key": "", # Properties of the object. Contains field @type with type URL.
    },
    "name": "A String", # 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}`.
  }</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:
"projects/{projectId}/locations/{locationId}/environments/{environmentId}" (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.
      "updateTime": "A String", # Output only.
          # The time at which this environment was last modified.
      "uuid": "A String", # Output only.
          # The UUID (Universally Unique IDentifier) associated with this environment.
          # This value is generated when the environment is created.
      "labels": { # Optional. User-defined labels for this environment.
          # The labels map can contain no more than 64 entries. Entries of the labels
          # map are UTF8 strings that comply with the following restrictions:
          #
          # * Keys must conform to regexp: \p{Ll}\p{Lo}{0,62}
          # * Values must conform to regexp:  [\p{Ll}\p{Lo}\p{N}_-]{0,63}
          # * Both keys and values are additionally constrained to be <= 128 bytes in
          # size.
        "a_key": "A String",
      },
      "state": "A String", # The current state of the environment.
      "config": { # Configuration information for an environment. # Configuration parameters for this environment.
        "dagGcsPrefix": "A String", # Output only.
            # The Cloud Storage prefix of the DAGs for this environment. Although Cloud
            # Storage objects reside in a flat namespace, a hierarchical file tree
            # can be simulated using "/"-delimited object name prefixes. DAG objects for
            # this environment reside in a simulated directory with the given prefix.
        "softwareConfig": { # Specifies the selection and configuration of software inside the environment. # The configuration settings for software inside the environment.
          "imageVersion": "A String", # 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 <em>airflow-</em> 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).
          "pypiPackages": { # Optional. Custom Python Package Index (PyPI) packages to be installed in
              # the environment.
              #
              # Keys refer to the lowercase package name such as "numpy"
              # and values are the lowercase extras and version specifier such as
              # "==1.12.0", "[devel,gcp_api]", or "[devel]>=1.8.2, <1.9.2". To specify a
              # package without pinning it to a version specifier, use the empty string as
              # the value.
            "a_key": "A String",
          },
          "pythonVersion": "A String", # Optional. The major version of Python used to run the Apache Airflow
              # scheduler, worker, and webserver processes.
              #
              # Can be set to '2' or '3'. If not specified, the default is '2'. Cannot be
              # updated.
          "envVariables": { # 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`
            "a_key": "A String",
          },
          "airflowConfigOverrides": { # Optional. Apache Airflow configuration properties to override.
              #
              # Property keys contain the section and property names, separated by a
              # hyphen, for example "core-dags_are_paused_at_creation". Section names must
              # not contain hyphens ("-"), opening square brackets ("["),  or closing
              # square brackets ("]"). The property name must not be empty and must not
              # contain an equals sign ("=") or semicolon (";"). Section and property names
              # must not contain a period ("."). Apache Airflow configuration property
              # names must be written in
              # [snake_case](https://en.wikipedia.org/wiki/Snake_case). Property values can
              # contain any character, and can be written in any lower/upper case format.
              #
              # Certain Apache Airflow configuration property values are
              # [blacklisted](/composer/docs/how-to/managing/setting-airflow-configurations#airflow_configuration_blacklists),
              # and cannot be overridden.
            "a_key": "A String",
          },
        },
        "airflowUri": "A String", # 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)).
        "gkeCluster": "A String", # Output only.
            # The Kubernetes Engine cluster used to run this environment.
        "nodeConfig": { # The configuration information for the Kubernetes Engine nodes running # The configuration used for the Kubernetes Engine cluster.
            # the Apache Airflow software.
          "machineType": "A String", # Optional. The Compute Engine
              # [machine type](/compute/docs/machine-types) used for cluster instances,
              # specified as a
              # [relative resource
              # name](/apis/design/resource_names#relative_resource_name). For example:
              # "projects/{projectId}/zones/{zoneId}/machineTypes/{machineTypeId}".
              #
              # The `machineType` must belong to the enclosing environment's project and
              # location. If both this field and `nodeConfig.location` are specified,
              # this `machineType` must belong to the `nodeConfig.location`; if both are
              # unspecified, the service will pick a zone in the Compute Engine region
              # corresponding to the Cloud Composer location, and propagate that choice to
              # both fields. If exactly one of this field and `nodeConfig.location` is
              # specified, the location information from the specified field will be
              # propagated to the unspecified field.
              #
              # If this field is unspecified, the `machineTypeId` defaults
              # to "n1-standard-1".
          "network": "A String", # Optional. The Compute Engine network to be used for machine
              # communications, specified as a
              # [relative resource
              # name](/apis/design/resource_names#relative_resource_name). For example:
              # "projects/{projectId}/global/networks/{networkId}".
              #
              # [Shared VPC](/vpc/docs/shared-vpc) is not currently supported. The
              # network must belong to the environment's project. If unspecified, the
              # "default" network ID in the environment's project is used.  If a
              # [Custom Subnet Network](/vpc/docs/vpc#vpc_networks_and_subnets)
              # is provided, `nodeConfig.subnetwork` must also be provided.
          "tags": [ # 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.
            "A String",
          ],
          "serviceAccount": "A String", # Optional. The Google Cloud Platform Service Account to be used by the node
              # VMs. If a service account is not specified, the "default" Compute Engine
              # service account is used. Cannot be updated.
          "oauthScopes": [ # Optional. The set of Google API scopes to be made available on all
              # node VMs. If `oauth_scopes` is empty, defaults to
              # ["https://www.googleapis.com/auth/cloud-platform"]. Cannot be updated.
            "A String",
          ],
          "diskSizeGb": 42, # Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
              # If unspecified, defaults to 100GB. Cannot be updated.
          "location": "A String", # Optional. The Compute Engine [zone](/compute/docs/regions-zones) in which
              # to deploy the VMs used to run the Apache Airflow software, specified as a
              # [relative resource
              # name](/apis/design/resource_names#relative_resource_name). For example:
              # "projects/{projectId}/zones/{zoneId}".
              #
              # This `location` must belong to the enclosing environment's project and
              # location. If both this field and `nodeConfig.machineType` are specified,
              # `nodeConfig.machineType` must belong to this `location`; if both are
              # unspecified, the service will pick a zone in the Compute Engine region
              # corresponding to the Cloud Composer location, and propagate that choice to
              # both fields. If only one field (`location` or `nodeConfig.machineType`) is
              # specified, the location information from the specified field will be
              # propagated to the unspecified field.
          "subnetwork": "A String", # Optional. The Compute Engine subnetwork to be used for machine
              # communications, specified as a
              # [relative resource
              # name](/apis/design/resource_names#relative_resource_name). For example:
              # "projects/{projectId}/regions/{regionId}/subnetworks/{subnetworkId}"
              #
              # If a subnetwork is provided, `nodeConfig.network` must also be provided,
              # and the subnetwork must belong to the enclosing environment's project and
              # location.
        },
        "nodeCount": 42, # The number of nodes in the Kubernetes Engine cluster that will be
            # used to run this environment.
      },
      "createTime": "A String", # Output only.
          # The time at which this environment was created.
      "name": "A String", # The resource name of the environment, in the form:
          # "projects/{projectId}/locations/{locationId}/environments/{environmentId}"
    }</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:
"projects/{projectId}/locations/{locationId}" (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.
    "nextPageToken": "A String", # The page token used to query for the next page if one exists.
    "environments": [ # The list of environments returned by a ListEnvironmentsRequest.
      { # An environment for running orchestration tasks.
          "updateTime": "A String", # Output only.
              # The time at which this environment was last modified.
          "uuid": "A String", # Output only.
              # The UUID (Universally Unique IDentifier) associated with this environment.
              # This value is generated when the environment is created.
          "labels": { # Optional. User-defined labels for this environment.
              # The labels map can contain no more than 64 entries. Entries of the labels
              # map are UTF8 strings that comply with the following restrictions:
              #
              # * Keys must conform to regexp: \p{Ll}\p{Lo}{0,62}
              # * Values must conform to regexp:  [\p{Ll}\p{Lo}\p{N}_-]{0,63}
              # * Both keys and values are additionally constrained to be <= 128 bytes in
              # size.
            "a_key": "A String",
          },
          "state": "A String", # The current state of the environment.
          "config": { # Configuration information for an environment. # Configuration parameters for this environment.
            "dagGcsPrefix": "A String", # Output only.
                # The Cloud Storage prefix of the DAGs for this environment. Although Cloud
                # Storage objects reside in a flat namespace, a hierarchical file tree
                # can be simulated using "/"-delimited object name prefixes. DAG objects for
                # this environment reside in a simulated directory with the given prefix.
            "softwareConfig": { # Specifies the selection and configuration of software inside the environment. # The configuration settings for software inside the environment.
              "imageVersion": "A String", # 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 <em>airflow-</em> 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).
              "pypiPackages": { # Optional. Custom Python Package Index (PyPI) packages to be installed in
                  # the environment.
                  #
                  # Keys refer to the lowercase package name such as "numpy"
                  # and values are the lowercase extras and version specifier such as
                  # "==1.12.0", "[devel,gcp_api]", or "[devel]>=1.8.2, <1.9.2". To specify a
                  # package without pinning it to a version specifier, use the empty string as
                  # the value.
                "a_key": "A String",
              },
              "pythonVersion": "A String", # Optional. The major version of Python used to run the Apache Airflow
                  # scheduler, worker, and webserver processes.
                  #
                  # Can be set to '2' or '3'. If not specified, the default is '2'. Cannot be
                  # updated.
              "envVariables": { # 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`
                "a_key": "A String",
              },
              "airflowConfigOverrides": { # Optional. Apache Airflow configuration properties to override.
                  #
                  # Property keys contain the section and property names, separated by a
                  # hyphen, for example "core-dags_are_paused_at_creation". Section names must
                  # not contain hyphens ("-"), opening square brackets ("["),  or closing
                  # square brackets ("]"). The property name must not be empty and must not
                  # contain an equals sign ("=") or semicolon (";"). Section and property names
                  # must not contain a period ("."). Apache Airflow configuration property
                  # names must be written in
                  # [snake_case](https://en.wikipedia.org/wiki/Snake_case). Property values can
                  # contain any character, and can be written in any lower/upper case format.
                  #
                  # Certain Apache Airflow configuration property values are
                  # [blacklisted](/composer/docs/how-to/managing/setting-airflow-configurations#airflow_configuration_blacklists),
                  # and cannot be overridden.
                "a_key": "A String",
              },
            },
            "airflowUri": "A String", # 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)).
            "gkeCluster": "A String", # Output only.
                # The Kubernetes Engine cluster used to run this environment.
            "nodeConfig": { # The configuration information for the Kubernetes Engine nodes running # The configuration used for the Kubernetes Engine cluster.
                # the Apache Airflow software.
              "machineType": "A String", # Optional. The Compute Engine
                  # [machine type](/compute/docs/machine-types) used for cluster instances,
                  # specified as a
                  # [relative resource
                  # name](/apis/design/resource_names#relative_resource_name). For example:
                  # "projects/{projectId}/zones/{zoneId}/machineTypes/{machineTypeId}".
                  #
                  # The `machineType` must belong to the enclosing environment's project and
                  # location. If both this field and `nodeConfig.location` are specified,
                  # this `machineType` must belong to the `nodeConfig.location`; if both are
                  # unspecified, the service will pick a zone in the Compute Engine region
                  # corresponding to the Cloud Composer location, and propagate that choice to
                  # both fields. If exactly one of this field and `nodeConfig.location` is
                  # specified, the location information from the specified field will be
                  # propagated to the unspecified field.
                  #
                  # If this field is unspecified, the `machineTypeId` defaults
                  # to "n1-standard-1".
              "network": "A String", # Optional. The Compute Engine network to be used for machine
                  # communications, specified as a
                  # [relative resource
                  # name](/apis/design/resource_names#relative_resource_name). For example:
                  # "projects/{projectId}/global/networks/{networkId}".
                  #
                  # [Shared VPC](/vpc/docs/shared-vpc) is not currently supported. The
                  # network must belong to the environment's project. If unspecified, the
                  # "default" network ID in the environment's project is used.  If a
                  # [Custom Subnet Network](/vpc/docs/vpc#vpc_networks_and_subnets)
                  # is provided, `nodeConfig.subnetwork` must also be provided.
              "tags": [ # 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.
                "A String",
              ],
              "serviceAccount": "A String", # Optional. The Google Cloud Platform Service Account to be used by the node
                  # VMs. If a service account is not specified, the "default" Compute Engine
                  # service account is used. Cannot be updated.
              "oauthScopes": [ # Optional. The set of Google API scopes to be made available on all
                  # node VMs. If `oauth_scopes` is empty, defaults to
                  # ["https://www.googleapis.com/auth/cloud-platform"]. Cannot be updated.
                "A String",
              ],
              "diskSizeGb": 42, # Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
                  # If unspecified, defaults to 100GB. Cannot be updated.
              "location": "A String", # Optional. The Compute Engine [zone](/compute/docs/regions-zones) in which
                  # to deploy the VMs used to run the Apache Airflow software, specified as a
                  # [relative resource
                  # name](/apis/design/resource_names#relative_resource_name). For example:
                  # "projects/{projectId}/zones/{zoneId}".
                  #
                  # This `location` must belong to the enclosing environment's project and
                  # location. If both this field and `nodeConfig.machineType` are specified,
                  # `nodeConfig.machineType` must belong to this `location`; if both are
                  # unspecified, the service will pick a zone in the Compute Engine region
                  # corresponding to the Cloud Composer location, and propagate that choice to
                  # both fields. If only one field (`location` or `nodeConfig.machineType`) is
                  # specified, the location information from the specified field will be
                  # propagated to the unspecified field.
              "subnetwork": "A String", # Optional. The Compute Engine subnetwork to be used for machine
                  # communications, specified as a
                  # [relative resource
                  # name](/apis/design/resource_names#relative_resource_name). For example:
                  # "projects/{projectId}/regions/{regionId}/subnetworks/{subnetworkId}"
                  #
                  # If a subnetwork is provided, `nodeConfig.network` must also be provided,
                  # and the subnetwork must belong to the enclosing environment's project and
                  # location.
            },
            "nodeCount": 42, # The number of nodes in the Kubernetes Engine cluster that will be
                # used to run this environment.
          },
          "createTime": "A String", # Output only.
              # The time at which this environment was created.
          "name": "A String", # The resource name of the environment, in the form:
              # "projects/{projectId}/locations/{locationId}/environments/{environmentId}"
        },
    ],
  }</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 'execute()' 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, 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:
"projects/{projectId}/locations/{locationId}/environments/{environmentId}" (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # An environment for running orchestration tasks.
    "updateTime": "A String", # Output only.
        # The time at which this environment was last modified.
    "uuid": "A String", # Output only.
        # The UUID (Universally Unique IDentifier) associated with this environment.
        # This value is generated when the environment is created.
    "labels": { # Optional. User-defined labels for this environment.
        # The labels map can contain no more than 64 entries. Entries of the labels
        # map are UTF8 strings that comply with the following restrictions:
        # 
        # * Keys must conform to regexp: \p{Ll}\p{Lo}{0,62}
        # * Values must conform to regexp:  [\p{Ll}\p{Lo}\p{N}_-]{0,63}
        # * Both keys and values are additionally constrained to be <= 128 bytes in
        # size.
      "a_key": "A String",
    },
    "state": "A String", # The current state of the environment.
    "config": { # Configuration information for an environment. # Configuration parameters for this environment.
      "dagGcsPrefix": "A String", # Output only.
          # The Cloud Storage prefix of the DAGs for this environment. Although Cloud
          # Storage objects reside in a flat namespace, a hierarchical file tree
          # can be simulated using "/"-delimited object name prefixes. DAG objects for
          # this environment reside in a simulated directory with the given prefix.
      "softwareConfig": { # Specifies the selection and configuration of software inside the environment. # The configuration settings for software inside the environment.
        "imageVersion": "A String", # 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 <em>airflow-</em> 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).
        "pypiPackages": { # Optional. Custom Python Package Index (PyPI) packages to be installed in
            # the environment.
            #
            # Keys refer to the lowercase package name such as "numpy"
            # and values are the lowercase extras and version specifier such as
            # "==1.12.0", "[devel,gcp_api]", or "[devel]>=1.8.2, <1.9.2". To specify a
            # package without pinning it to a version specifier, use the empty string as
            # the value.
          "a_key": "A String",
        },
        "pythonVersion": "A String", # Optional. The major version of Python used to run the Apache Airflow
            # scheduler, worker, and webserver processes.
            #
            # Can be set to '2' or '3'. If not specified, the default is '2'. Cannot be
            # updated.
        "envVariables": { # 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`
          "a_key": "A String",
        },
        "airflowConfigOverrides": { # Optional. Apache Airflow configuration properties to override.
            #
            # Property keys contain the section and property names, separated by a
            # hyphen, for example "core-dags_are_paused_at_creation". Section names must
            # not contain hyphens ("-"), opening square brackets ("["),  or closing
            # square brackets ("]"). The property name must not be empty and must not
            # contain an equals sign ("=") or semicolon (";"). Section and property names
            # must not contain a period ("."). Apache Airflow configuration property
            # names must be written in
            # [snake_case](https://en.wikipedia.org/wiki/Snake_case). Property values can
            # contain any character, and can be written in any lower/upper case format.
            #
            # Certain Apache Airflow configuration property values are
            # [blacklisted](/composer/docs/how-to/managing/setting-airflow-configurations#airflow_configuration_blacklists),
            # and cannot be overridden.
          "a_key": "A String",
        },
      },
      "airflowUri": "A String", # 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)).
      "gkeCluster": "A String", # Output only.
          # The Kubernetes Engine cluster used to run this environment.
      "nodeConfig": { # The configuration information for the Kubernetes Engine nodes running # The configuration used for the Kubernetes Engine cluster.
          # the Apache Airflow software.
        "machineType": "A String", # Optional. The Compute Engine
            # [machine type](/compute/docs/machine-types) used for cluster instances,
            # specified as a
            # [relative resource
            # name](/apis/design/resource_names#relative_resource_name). For example:
            # "projects/{projectId}/zones/{zoneId}/machineTypes/{machineTypeId}".
            #
            # The `machineType` must belong to the enclosing environment's project and
            # location. If both this field and `nodeConfig.location` are specified,
            # this `machineType` must belong to the `nodeConfig.location`; if both are
            # unspecified, the service will pick a zone in the Compute Engine region
            # corresponding to the Cloud Composer location, and propagate that choice to
            # both fields. If exactly one of this field and `nodeConfig.location` is
            # specified, the location information from the specified field will be
            # propagated to the unspecified field.
            #
            # If this field is unspecified, the `machineTypeId` defaults
            # to "n1-standard-1".
        "network": "A String", # Optional. The Compute Engine network to be used for machine
            # communications, specified as a
            # [relative resource
            # name](/apis/design/resource_names#relative_resource_name). For example:
            # "projects/{projectId}/global/networks/{networkId}".
            #
            # [Shared VPC](/vpc/docs/shared-vpc) is not currently supported. The
            # network must belong to the environment's project. If unspecified, the
            # "default" network ID in the environment's project is used.  If a
            # [Custom Subnet Network](/vpc/docs/vpc#vpc_networks_and_subnets)
            # is provided, `nodeConfig.subnetwork` must also be provided.
        "tags": [ # 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.
          "A String",
        ],
        "serviceAccount": "A String", # Optional. The Google Cloud Platform Service Account to be used by the node
            # VMs. If a service account is not specified, the "default" Compute Engine
            # service account is used. Cannot be updated.
        "oauthScopes": [ # Optional. The set of Google API scopes to be made available on all
            # node VMs. If `oauth_scopes` is empty, defaults to
            # ["https://www.googleapis.com/auth/cloud-platform"]. Cannot be updated.
          "A String",
        ],
        "diskSizeGb": 42, # Optional. The disk size in GB used for node VMs. Minimum size is 20GB.
            # If unspecified, defaults to 100GB. Cannot be updated.
        "location": "A String", # Optional. The Compute Engine [zone](/compute/docs/regions-zones) in which
            # to deploy the VMs used to run the Apache Airflow software, specified as a
            # [relative resource
            # name](/apis/design/resource_names#relative_resource_name). For example:
            # "projects/{projectId}/zones/{zoneId}".
            #
            # This `location` must belong to the enclosing environment's project and
            # location. If both this field and `nodeConfig.machineType` are specified,
            # `nodeConfig.machineType` must belong to this `location`; if both are
            # unspecified, the service will pick a zone in the Compute Engine region
            # corresponding to the Cloud Composer location, and propagate that choice to
            # both fields. If only one field (`location` or `nodeConfig.machineType`) is
            # specified, the location information from the specified field will be
            # propagated to the unspecified field.
        "subnetwork": "A String", # Optional. The Compute Engine subnetwork to be used for machine
            # communications, specified as a
            # [relative resource
            # name](/apis/design/resource_names#relative_resource_name). For example:
            # "projects/{projectId}/regions/{regionId}/subnetworks/{subnetworkId}"
            #
            # If a subnetwork is provided, `nodeConfig.network` must also be provided,
            # and the subnetwork must belong to the enclosing environment's project and
            # location.
      },
      "nodeCount": 42, # The number of nodes in the Kubernetes Engine cluster that will be
          # used to run this environment.
    },
    "createTime": "A String", # Output only.
        # The time at which this environment was created.
    "name": "A String", # The resource name of the environment, in the form:
        # "projects/{projectId}/locations/{locationId}/environments/{environmentId}"
  }

  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: "config.softwareConfig.pypiPackages.scikit-learn" and
"config.softwareConfig.pypiPackages.numpy". The included patch
environment would specify the scikit-learn version as follows:

    {
      "config":{
        "softwareConfig":{
          "pypiPackages":{
            "scikit-learn":"==0.19.0"
          }
        }
      }
    }

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

Only one update type may be included in a single request's `updateMask`.
For example, one cannot update both the PyPI packages and
labels in the same request. However, it is possible to update multiple
members of a map field simultaneously in the same request. For example,
to set the labels "label1" and "label2" while clearing "label3" (assuming
it already exists), one can
provide the paths "labels.label1", "labels.label2", and "labels.label3"
and populate the patch environment as follows:

    {
      "labels":{
        "label1":"new-label1-value"
        "label2":"new-label2-value"
      }
    }

Note that in the above example, any existing labels that are not
included in the `updateMask` will be unaffected.

It is also possible to replace an entire map field by providing the
map field's path in the `updateMask`. The new value of the field will
be that which is provided in the patch environment. For example, to
delete all pre-existing user-specified PyPI packages and
install botocore at version 1.7.14, the `updateMask` would contain
the path "config.softwareConfig.pypiPackages", and
the patch environment would be the following:

    {
      "config":{
        "softwareConfig":{
          "pypiPackages":{
            "botocore":"==1.7.14"
          }
        }
      }
    }

**Note:** Only the following fields can be updated:

 <table>
 <tbody>
 <tr>
 <td><strong>Mask</strong></td>
 <td><strong>Purpose</strong></td>
 </tr>
 <tr>
 <td>config.softwareConfig.pypiPackages
 </td>
 <td>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.</td>
 </tr>
 <tr>
 <td>config.softwareConfig.pypiPackages.<var>packagename</var></td>
 <td>Update the custom PyPI package <var>packagename</var>,
 preserving other packages. To delete the package, include it in
 `updateMask`, and omit the mapping for it in
 `environment.config.softwareConfig.pypiPackages`. It is an error
 to provide both a mask of this form and the
 "config.softwareConfig.pypiPackages" mask.</td>
 </tr>
 <tr>
 <td>labels</td>
 <td>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.</td>
 </tr>
 <tr>
 <td>labels.<var>labelName</var></td>
 <td>Set the label named <var>labelName</var>, while preserving other
 labels. To delete the label, include it in `updateMask` and omit its
 mapping in `environment.labels`. It is an error to provide both a
 mask of this form and the "labels" mask.</td>
 </tr>
 <tr>
 <td>config.nodeCount</td>
 <td>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.
 </td>
 </tr>
 <tr>
 <td>config.softwareConfig.airflowConfigOverrides</td>
 <td>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.</td>
 </tr>
 <tr>
 <td>config.softwareConfig.airflowConfigOverrides.<var>section</var>-<var>name
 </var></td>
 <td>Override the Apache Airflow config property <var>name</var> in the
 section named <var>section</var>, preserving other properties. To delete
 the property override, include it in `updateMask` and omit its mapping
 in `environment.config.softwareConfig.airflowConfigOverrides`.
 It is an error to provide both a mask of this form and the
 "config.softwareConfig.airflowConfigOverrides" mask.</td>
 </tr>
 <tr>
 <td>config.softwareConfig.envVariables</td>
 <td>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.</td>
 </tr>
 </tbody>
 </table>
  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.
    "metadata": { # 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.
      "a_key": "", # Properties of the object. Contains field @type with type URL.
    },
    "error": { # 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). The error model is designed to be:
        #
        # - Simple to use and understand for most users
        # - Flexible enough to meet unexpected needs
        #
        # # Overview
        #
        # The `Status` message contains three pieces of data: error code, error
        # message, and error details. The error code should be an enum value of
        # google.rpc.Code, but it may accept additional error codes if needed.  The
        # error message should be a developer-facing English message that helps
        # developers *understand* and *resolve* the error. If a localized user-facing
        # error message is needed, put the localized message in the error details or
        # localize it in the client. The optional error details may contain arbitrary
        # information about the error. There is a predefined set of error detail types
        # in the package `google.rpc` that can be used for common error conditions.
        #
        # # Language mapping
        #
        # The `Status` message is the logical representation of the error model, but it
        # is not necessarily the actual wire format. When the `Status` message is
        # exposed in different client libraries and different wire protocols, it can be
        # mapped differently. For example, it will likely be mapped to some exceptions
        # in Java, but more likely mapped to some error codes in C.
        #
        # # Other uses
        #
        # The error model and the `Status` message can be used in a variety of
        # environments, either with or without APIs, to provide a
        # consistent developer experience across different environments.
        #
        # Example uses of this error model include:
        #
        # - Partial errors. If a service needs to return partial errors to the client,
        #     it may embed the `Status` in the normal response to indicate the partial
        #     errors.
        #
        # - Workflow errors. A typical workflow has multiple steps. Each step may
        #     have a `Status` message for error reporting.
        #
        # - Batch operations. If a client uses batch request and batch response, the
        #     `Status` message should be used directly inside batch response, one for
        #     each error sub-response.
        #
        # - Asynchronous operations. If an API call embeds asynchronous operation
        #     results in its response, the status of those operations should be
        #     represented directly using the `Status` message.
        #
        # - Logging. If some API errors are stored in logs, the message `Status` could
        #     be used directly after any stripping needed for security/privacy reasons.
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "done": 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.
    "response": { # 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`.
      "a_key": "", # Properties of the object. Contains field @type with type URL.
    },
    "name": "A String", # 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}`.
  }</pre>
</div>

</body></html>