<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="spanner_v1.html">Cloud Spanner API</a> . <a href="spanner_v1.projects.html">projects</a> . <a href="spanner_v1.projects.instances.html">instances</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="spanner_v1.projects.instances.databases.html">databases()</a></code>
</p>
<p class="firstline">Returns the databases Resource.</p>

<p class="toc_element">
  <code><a href="spanner_v1.projects.instances.operations.html">operations()</a></code>
</p>
<p class="firstline">Returns the operations Resource.</p>

<p class="toc_element">
  <code><a href="#create">create(parent, body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates an instance and begins preparing it to begin serving. The</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes an instance.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets information about a particular instance.</p>
<p class="toc_element">
  <code><a href="#getIamPolicy">getIamPolicy(resource, body, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the access control policy for an instance resource. Returns an empty</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageSize=None, filter=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists all instances in the given project.</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, x__xgafv=None)</a></code></p>
<p class="firstline">Updates an instance, and begins allocating or releasing resources</p>
<p class="toc_element">
  <code><a href="#setIamPolicy">setIamPolicy(resource, body, x__xgafv=None)</a></code></p>
<p class="firstline">Sets the access control policy on an instance resource. Replaces any</p>
<p class="toc_element">
  <code><a href="#testIamPermissions">testIamPermissions(resource, body, x__xgafv=None)</a></code></p>
<p class="firstline">Returns permissions that the caller has on the specified instance resource.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body, x__xgafv=None)</code>
  <pre>Creates an instance and begins preparing it to begin serving. The
returned long-running operation
can be used to track the progress of preparing the new
instance. The instance name is assigned by the caller. If the
named instance already exists, `CreateInstance` returns
`ALREADY_EXISTS`.

Immediately upon completion of this request:

  * The instance is readable via the API, with all requested attributes
    but no allocated resources. Its state is `CREATING`.

Until completion of the returned operation:

  * Cancelling the operation renders the instance immediately unreadable
    via the API.
  * The instance can be deleted.
  * All other attempts to modify the instance are rejected.

Upon completion of the returned operation:

  * Billing for all successfully-allocated resources begins (some types
    may have lower than the requested levels).
  * Databases can be created in the instance.
  * The instance's allocated resource levels are readable via the API.
  * The instance's state becomes `READY`.

The returned long-running operation will
have a name of the format `<instance_name>/operations/<operation_id>` and
can be used to track creation of the instance.  The
metadata field type is
CreateInstanceMetadata.
The response field type is
Instance, if successful.

Args:
  parent: string, Required. The name of the project in which to create the instance. Values
are of the form `projects/<project>`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for CreateInstance.
    "instanceId": "A String", # Required. The ID of the instance to create.  Valid identifiers are of the
        # form `a-z*[a-z0-9]` and must be between 6 and 30 characters in
        # length.
    "instance": { # An isolated set of Cloud Spanner resources on which databases can be hosted. # Required. The instance to create.  The name may be omitted, but if
        # specified must be `<parent>/instances/<instance_id>`.
      "displayName": "A String", # Required. The descriptive name for this instance as it appears in UIs.
          # Must be unique per project and between 4 and 30 characters in length.
      "name": "A String", # Required. A unique identifier for the instance, which cannot be changed
          # after the instance is created. Values are of the form
          # `projects/<project>/instances/a-z*[a-z0-9]`. The final
          # segment of the name must be between 6 and 30 characters in length.
      "labels": { # Cloud Labels are a flexible and lightweight mechanism for organizing cloud
          # resources into groups that reflect a customer's organizational needs and
          # deployment strategies. Cloud Labels can be used to filter collections of
          # resources. They can be used to control how resource metrics are aggregated.
          # And they can be used as arguments to policy management rules (e.g. route,
          # firewall, load balancing, etc.).
          #
          #  * Label keys must be between 1 and 63 characters long and must conform to
          #    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
          #  * Label values must be between 0 and 63 characters long and must conform
          #    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
          #  * No more than 64 labels can be associated with a given resource.
          #
          # See https://goo.gl/xmQnxf for more information on and examples of labels.
          #
          # If you plan to use labels in your own code, please note that additional
          # characters may be allowed in the future. And so you are advised to use an
          # internal label representation, such as JSON, which doesn't rely upon
          # specific characters being disallowed.  For example, representing labels
          # as the string:  name + "_" + value  would prove problematic if we were to
          # allow "_" in a future release.
        "a_key": "A String",
      },
      "state": "A String", # Output only. The current instance state. For
          # CreateInstance, the state must be
          # either omitted or set to `CREATING`. For
          # UpdateInstance, the state must be
          # either omitted or set to `READY`.
      "nodeCount": 42, # Required. The number of nodes allocated to this instance.
      "config": "A String", # Required. The name of the instance's configuration. Values are of the form
          # `projects/<project>/instanceConfigs/<configuration>`. See
          # also InstanceConfig and
          # ListInstanceConfigs.
    },
  }

  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.
    },
    "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 have the format of `operations/some/unique/name`.
    "error": { # The `Status` type defines a logical error model that is suitable for different # The error result of the operation in case of failure or cancellation.
        # 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` which 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 purpose.
        #
        # - 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 will be a
          # common set of message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
  }</pre>
</div>

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

Immediately upon completion of the request:

  * Billing ceases for all of the instance's reserved resources.

Soon afterward:

  * The instance and *all of its databases* immediately and
    irrevocably disappear from the API. All data in the databases
    is permanently deleted.

Args:
  name: string, Required. The name of the instance to be deleted. Values are of the form
`projects/<project>/instances/<instance>` (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Gets information about a particular instance.

Args:
  name: string, Required. The name of the requested instance. Values are of the form
`projects/<project>/instances/<instance>`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # An isolated set of Cloud Spanner resources on which databases can be hosted.
    "displayName": "A String", # Required. The descriptive name for this instance as it appears in UIs.
        # Must be unique per project and between 4 and 30 characters in length.
    "name": "A String", # Required. A unique identifier for the instance, which cannot be changed
        # after the instance is created. Values are of the form
        # `projects/<project>/instances/a-z*[a-z0-9]`. The final
        # segment of the name must be between 6 and 30 characters in length.
    "labels": { # Cloud Labels are a flexible and lightweight mechanism for organizing cloud
        # resources into groups that reflect a customer's organizational needs and
        # deployment strategies. Cloud Labels can be used to filter collections of
        # resources. They can be used to control how resource metrics are aggregated.
        # And they can be used as arguments to policy management rules (e.g. route,
        # firewall, load balancing, etc.).
        #
        #  * Label keys must be between 1 and 63 characters long and must conform to
        #    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
        #  * Label values must be between 0 and 63 characters long and must conform
        #    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
        #  * No more than 64 labels can be associated with a given resource.
        #
        # See https://goo.gl/xmQnxf for more information on and examples of labels.
        #
        # If you plan to use labels in your own code, please note that additional
        # characters may be allowed in the future. And so you are advised to use an
        # internal label representation, such as JSON, which doesn't rely upon
        # specific characters being disallowed.  For example, representing labels
        # as the string:  name + "_" + value  would prove problematic if we were to
        # allow "_" in a future release.
      "a_key": "A String",
    },
    "state": "A String", # Output only. The current instance state. For
        # CreateInstance, the state must be
        # either omitted or set to `CREATING`. For
        # UpdateInstance, the state must be
        # either omitted or set to `READY`.
    "nodeCount": 42, # Required. The number of nodes allocated to this instance.
    "config": "A String", # Required. The name of the instance's configuration. Values are of the form
        # `projects/<project>/instanceConfigs/<configuration>`. See
        # also InstanceConfig and
        # ListInstanceConfigs.
  }</pre>
</div>

<div class="method">
    <code class="details" id="getIamPolicy">getIamPolicy(resource, body, x__xgafv=None)</code>
  <pre>Gets the access control policy for an instance resource. Returns an empty
policy if an instance exists but does not have a policy set.

Authorization requires `spanner.instances.getIamPolicy` on
resource.

Args:
  resource: string, REQUIRED: The Cloud Spanner resource for which the policy is being retrieved. The format is `projects/<project ID>/instances/<instance ID>` for instance resources and `projects/<project ID>/instances/<instance ID>/databases/<database ID>` for database resources. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request message for `GetIamPolicy` method.
  }

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

Returns:
  An object of the form:

    { # Defines an Identity and Access Management (IAM) policy. It is used to
      # specify access control policies for Cloud Platform resources.
      #
      #
      # A `Policy` consists of a list of `bindings`. A `Binding` binds a list of
      # `members` to a `role`, where the members can be user accounts, Google groups,
      # Google domains, and service accounts. A `role` is a named list of permissions
      # defined by IAM.
      #
      # **Example**
      #
      #     {
      #       "bindings": [
      #         {
      #           "role": "roles/owner",
      #           "members": [
      #             "user:mike@example.com",
      #             "group:admins@example.com",
      #             "domain:google.com",
      #             "serviceAccount:my-other-app@appspot.gserviceaccount.com",
      #           ]
      #         },
      #         {
      #           "role": "roles/viewer",
      #           "members": ["user:sean@example.com"]
      #         }
      #       ]
      #     }
      #
      # For a description of IAM and its features, see the
      # [IAM developer's guide](https://cloud.google.com/iam).
    "auditConfigs": [ # Specifies cloud audit logging configuration for this policy.
      { # Specifies the audit configuration for a service.
          # The configuration determines which permission types are logged, and what
          # identities, if any, are exempted from logging.
          # An AuditConifg must have one or more AuditLogConfigs.
          #
          # If there are AuditConfigs for both `allServices` and a specific service,
          # the union of the two AuditConfigs is used for that service: the log_types
          # specified in each AuditConfig are enabled, and the exempted_members in each
          # AuditConfig are exempted.
          #
          # Example Policy with multiple AuditConfigs:
          #
          #     {
          #       "audit_configs": [
          #         {
          #           "service": "allServices"
          #           "audit_log_configs": [
          #             {
          #               "log_type": "DATA_READ",
          #               "exempted_members": [
          #                 "user:foo@gmail.com"
          #               ]
          #             },
          #             {
          #               "log_type": "DATA_WRITE",
          #             },
          #             {
          #               "log_type": "ADMIN_READ",
          #             }
          #           ]
          #         },
          #         {
          #           "service": "fooservice.googleapis.com"
          #           "audit_log_configs": [
          #             {
          #               "log_type": "DATA_READ",
          #             },
          #             {
          #               "log_type": "DATA_WRITE",
          #               "exempted_members": [
          #                 "user:bar@gmail.com"
          #               ]
          #             }
          #           ]
          #         }
          #       ]
          #     }
          #
          # For fooservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
          # logging. It also exempts foo@gmail.com from DATA_READ logging, and
          # bar@gmail.com from DATA_WRITE logging.
        "exemptedMembers": [
          "A String",
        ],
        "auditLogConfigs": [ # The configuration for logging of each type of permission.
            # Next ID: 4
          { # Provides the configuration for logging a type of permissions.
              # Example:
              #
              #     {
              #       "audit_log_configs": [
              #         {
              #           "log_type": "DATA_READ",
              #           "exempted_members": [
              #             "user:foo@gmail.com"
              #           ]
              #         },
              #         {
              #           "log_type": "DATA_WRITE",
              #         }
              #       ]
              #     }
              #
              # This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting
              # foo@gmail.com from DATA_READ logging.
            "exemptedMembers": [ # Specifies the identities that do not cause logging for this type of
                # permission.
                # Follows the same format of Binding.members.
              "A String",
            ],
            "logType": "A String", # The log type that this config enables.
          },
        ],
        "service": "A String", # Specifies a service that will be enabled for audit logging.
            # For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
            # `allServices` is a special value that covers all services.
      },
    ],
    "rules": [ # If more than one rule is specified, the rules are applied in the following
        # manner:
        # - All matching LOG rules are always applied.
        # - If any DENY/DENY_WITH_LOG rule matches, permission is denied.
        #   Logging will be applied if one or more matching rule requires logging.
        # - Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is
        #   granted.
        #   Logging will be applied if one or more matching rule requires logging.
        # - Otherwise, if no rule applies, permission is denied.
      { # A rule to be applied in a Policy.
        "notIn": [ # If one or more 'not_in' clauses are specified, the rule matches
            # if the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.
            # The format for in and not_in entries is the same as for members in a
            # Binding (see google/iam/v1/policy.proto).
          "A String",
        ],
        "description": "A String", # Human-readable description of the rule.
        "in": [ # If one or more 'in' clauses are specified, the rule matches if
            # the PRINCIPAL/AUTHORITY_SELECTOR is in at least one of these entries.
          "A String",
        ],
        "action": "A String", # Required
        "conditions": [ # Additional restrictions that must be met
          { # A condition to be met.
            "iam": "A String", # Trusted attributes supplied by the IAM system.
            "svc": "A String", # Trusted attributes discharged by the service.
            "value": "A String", # DEPRECATED. Use 'values' instead.
            "sys": "A String", # Trusted attributes supplied by any service that owns resources and uses
                # the IAM system for access control.
            "values": [ # The objects of the condition. This is mutually exclusive with 'value'.
              "A String",
            ],
            "op": "A String", # An operator to apply the subject with.
          },
        ],
        "logConfig": [ # The config returned to callers of tech.iam.IAM.CheckPolicy for any entries
            # that match the LOG action.
          { # Specifies what kind of log the caller must write
            "counter": { # Options for counters # Counter options.
              "field": "A String", # The field value to attribute.
              "metric": "A String", # The metric to update.
            },
            "dataAccess": { # Write a Data Access (Gin) log # Data access options.
            },
            "cloudAudit": { # Write a Cloud Audit log # Cloud audit options.
            },
          },
        ],
        "permissions": [ # A permission is a string of form '<service>.<resource type>.<verb>'
            # (e.g., 'storage.buckets.list'). A value of '*' matches all permissions,
            # and a verb part of '*' (e.g., 'storage.buckets.*') matches all verbs.
          "A String",
        ],
      },
    ],
    "version": 42, # Version of the `Policy`. The default version is 0.
    "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
        # prevent simultaneous updates of a policy from overwriting each other.
        # It is strongly suggested that systems make use of the `etag` in the
        # read-modify-write cycle to perform policy updates in order to avoid race
        # conditions: An `etag` is returned in the response to `getIamPolicy`, and
        # systems are expected to put that etag in the request to `setIamPolicy` to
        # ensure that their change will be applied to the same version of the policy.
        #
        # If no `etag` is provided in the call to `setIamPolicy`, then the existing
        # policy is overwritten blindly.
    "bindings": [ # Associates a list of `members` to a `role`.
        # Multiple `bindings` must not be specified for the same `role`.
        # `bindings` with no members will result in an error.
      { # Associates `members` with a `role`.
        "role": "A String", # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
            # Required
        "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
            # `members` can have the following values:
            #
            # * `allUsers`: A special identifier that represents anyone who is
            #    on the internet; with or without a Google account.
            #
            # * `allAuthenticatedUsers`: A special identifier that represents anyone
            #    who is authenticated with a Google account or a service account.
            #
            # * `user:{emailid}`: An email address that represents a specific Google
            #    account. For example, `alice@gmail.com` or `joe@example.com`.
            #
            #
            # * `serviceAccount:{emailid}`: An email address that represents a service
            #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
            #
            # * `group:{emailid}`: An email address that represents a Google group.
            #    For example, `admins@example.com`.
            #
            # * `domain:{domain}`: A Google Apps domain name that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          "A String",
        ],
      },
    ],
    "iamOwned": True or False,
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, pageSize=None, filter=None, pageToken=None, x__xgafv=None)</code>
  <pre>Lists all instances in the given project.

Args:
  parent: string, Required. The name of the project for which a list of instances is
requested. Values are of the form `projects/<project>`. (required)
  pageSize: integer, Number of instances to be returned in the response. If 0 or less, defaults
to the server's maximum allowed page size.
  filter: string, An expression for filtering the results of the request. Filter rules are
case insensitive. The fields eligible for filtering are:

  * name
  * display_name
  * labels.key where key is the name of a label

Some examples of using filters are:

  * name:* --> The instance has a name.
  * name:Howl --> The instance's name contains the string "howl".
  * name:HOWL --> Equivalent to above.
  * NAME:howl --> Equivalent to above.
  * labels.env:* --> The instance has the label "env".
  * labels.env:dev --> The instance has the label "env" and the value of
                       the label contains the string "dev".
  * name:howl labels.env:dev --> The instance's name contains "howl" and
                                 it has the label "env" with its value
                                 containing "dev".
  pageToken: string, If non-empty, `page_token` should contain a
next_page_token from a
previous ListInstancesResponse.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response for ListInstances.
    "nextPageToken": "A String", # `next_page_token` can be sent in a subsequent
        # ListInstances call to fetch more
        # of the matching instances.
    "instances": [ # The list of requested instances.
      { # An isolated set of Cloud Spanner resources on which databases can be hosted.
        "displayName": "A String", # Required. The descriptive name for this instance as it appears in UIs.
            # Must be unique per project and between 4 and 30 characters in length.
        "name": "A String", # Required. A unique identifier for the instance, which cannot be changed
            # after the instance is created. Values are of the form
            # `projects/<project>/instances/a-z*[a-z0-9]`. The final
            # segment of the name must be between 6 and 30 characters in length.
        "labels": { # Cloud Labels are a flexible and lightweight mechanism for organizing cloud
            # resources into groups that reflect a customer's organizational needs and
            # deployment strategies. Cloud Labels can be used to filter collections of
            # resources. They can be used to control how resource metrics are aggregated.
            # And they can be used as arguments to policy management rules (e.g. route,
            # firewall, load balancing, etc.).
            #
            #  * Label keys must be between 1 and 63 characters long and must conform to
            #    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
            #  * Label values must be between 0 and 63 characters long and must conform
            #    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
            #  * No more than 64 labels can be associated with a given resource.
            #
            # See https://goo.gl/xmQnxf for more information on and examples of labels.
            #
            # If you plan to use labels in your own code, please note that additional
            # characters may be allowed in the future. And so you are advised to use an
            # internal label representation, such as JSON, which doesn't rely upon
            # specific characters being disallowed.  For example, representing labels
            # as the string:  name + "_" + value  would prove problematic if we were to
            # allow "_" in a future release.
          "a_key": "A String",
        },
        "state": "A String", # Output only. The current instance state. For
            # CreateInstance, the state must be
            # either omitted or set to `CREATING`. For
            # UpdateInstance, the state must be
            # either omitted or set to `READY`.
        "nodeCount": 42, # Required. The number of nodes allocated to this instance.
        "config": "A String", # Required. The name of the instance's configuration. Values are of the form
            # `projects/<project>/instanceConfigs/<configuration>`. See
            # also InstanceConfig and
            # ListInstanceConfigs.
      },
    ],
  }</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, x__xgafv=None)</code>
  <pre>Updates an instance, and begins allocating or releasing resources
as requested. The returned long-running
operation can be used to track the
progress of updating the instance. If the named instance does not
exist, returns `NOT_FOUND`.

Immediately upon completion of this request:

  * For resource types for which a decrease in the instance's allocation
    has been requested, billing is based on the newly-requested level.

Until completion of the returned operation:

  * Cancelling the operation sets its metadata's
    cancel_time, and begins
    restoring resources to their pre-request values. The operation
    is guaranteed to succeed at undoing all resource changes,
    after which point it terminates with a `CANCELLED` status.
  * All other attempts to modify the instance are rejected.
  * Reading the instance via the API continues to give the pre-request
    resource levels.

Upon completion of the returned operation:

  * Billing begins for all successfully-allocated resources (some types
    may have lower than the requested levels).
  * All newly-reserved resources are available for serving the instance's
    tables.
  * The instance's new resource levels are readable via the API.

The returned long-running operation will
have a name of the format `<instance_name>/operations/<operation_id>` and
can be used to track the instance modification.  The
metadata field type is
UpdateInstanceMetadata.
The response field type is
Instance, if successful.

Authorization requires `spanner.instances.update` permission on
resource name.

Args:
  name: string, Required. A unique identifier for the instance, which cannot be changed
after the instance is created. Values are of the form
`projects/<project>/instances/a-z*[a-z0-9]`. The final
segment of the name must be between 6 and 30 characters in length. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for UpdateInstance.
    "instance": { # An isolated set of Cloud Spanner resources on which databases can be hosted. # Required. The instance to update, which must always include the instance
        # name.  Otherwise, only fields mentioned in [][google.spanner.admin.instance.v1.UpdateInstanceRequest.field_mask] need be included.
      "displayName": "A String", # Required. The descriptive name for this instance as it appears in UIs.
          # Must be unique per project and between 4 and 30 characters in length.
      "name": "A String", # Required. A unique identifier for the instance, which cannot be changed
          # after the instance is created. Values are of the form
          # `projects/<project>/instances/a-z*[a-z0-9]`. The final
          # segment of the name must be between 6 and 30 characters in length.
      "labels": { # Cloud Labels are a flexible and lightweight mechanism for organizing cloud
          # resources into groups that reflect a customer's organizational needs and
          # deployment strategies. Cloud Labels can be used to filter collections of
          # resources. They can be used to control how resource metrics are aggregated.
          # And they can be used as arguments to policy management rules (e.g. route,
          # firewall, load balancing, etc.).
          #
          #  * Label keys must be between 1 and 63 characters long and must conform to
          #    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
          #  * Label values must be between 0 and 63 characters long and must conform
          #    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
          #  * No more than 64 labels can be associated with a given resource.
          #
          # See https://goo.gl/xmQnxf for more information on and examples of labels.
          #
          # If you plan to use labels in your own code, please note that additional
          # characters may be allowed in the future. And so you are advised to use an
          # internal label representation, such as JSON, which doesn't rely upon
          # specific characters being disallowed.  For example, representing labels
          # as the string:  name + "_" + value  would prove problematic if we were to
          # allow "_" in a future release.
        "a_key": "A String",
      },
      "state": "A String", # Output only. The current instance state. For
          # CreateInstance, the state must be
          # either omitted or set to `CREATING`. For
          # UpdateInstance, the state must be
          # either omitted or set to `READY`.
      "nodeCount": 42, # Required. The number of nodes allocated to this instance.
      "config": "A String", # Required. The name of the instance's configuration. Values are of the form
          # `projects/<project>/instanceConfigs/<configuration>`. See
          # also InstanceConfig and
          # ListInstanceConfigs.
    },
    "fieldMask": "A String", # Required. A mask specifying which fields in [][google.spanner.admin.instance.v1.UpdateInstanceRequest.instance] should be updated.
        # The field mask must always be specified; this prevents any future fields in
        # [][google.spanner.admin.instance.v1.Instance] from being erased accidentally by clients that do not know
        # about them.
  }

  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.
    },
    "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 have the format of `operations/some/unique/name`.
    "error": { # The `Status` type defines a logical error model that is suitable for different # The error result of the operation in case of failure or cancellation.
        # 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` which 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 purpose.
        #
        # - 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 will be a
          # common set of message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="setIamPolicy">setIamPolicy(resource, body, x__xgafv=None)</code>
  <pre>Sets the access control policy on an instance resource. Replaces any
existing policy.

Authorization requires `spanner.instances.setIamPolicy` on
resource.

Args:
  resource: string, REQUIRED: The Cloud Spanner resource for which the policy is being set. The format is `projects/<project ID>/instances/<instance ID>` for instance resources and `projects/<project ID>/instances/<instance ID>/databases/<database ID>` for databases resources. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request message for `SetIamPolicy` method.
    "policy": { # Defines an Identity and Access Management (IAM) policy. It is used to # REQUIRED: The complete policy to be applied to the `resource`. The size of
        # the policy is limited to a few 10s of KB. An empty policy is a
        # valid policy but certain Cloud Platform services (such as Projects)
        # might reject them.
        # specify access control policies for Cloud Platform resources.
        #
        #
        # A `Policy` consists of a list of `bindings`. A `Binding` binds a list of
        # `members` to a `role`, where the members can be user accounts, Google groups,
        # Google domains, and service accounts. A `role` is a named list of permissions
        # defined by IAM.
        #
        # **Example**
        #
        #     {
        #       "bindings": [
        #         {
        #           "role": "roles/owner",
        #           "members": [
        #             "user:mike@example.com",
        #             "group:admins@example.com",
        #             "domain:google.com",
        #             "serviceAccount:my-other-app@appspot.gserviceaccount.com",
        #           ]
        #         },
        #         {
        #           "role": "roles/viewer",
        #           "members": ["user:sean@example.com"]
        #         }
        #       ]
        #     }
        #
        # For a description of IAM and its features, see the
        # [IAM developer's guide](https://cloud.google.com/iam).
      "auditConfigs": [ # Specifies cloud audit logging configuration for this policy.
        { # Specifies the audit configuration for a service.
            # The configuration determines which permission types are logged, and what
            # identities, if any, are exempted from logging.
            # An AuditConifg must have one or more AuditLogConfigs.
            #
            # If there are AuditConfigs for both `allServices` and a specific service,
            # the union of the two AuditConfigs is used for that service: the log_types
            # specified in each AuditConfig are enabled, and the exempted_members in each
            # AuditConfig are exempted.
            #
            # Example Policy with multiple AuditConfigs:
            #
            #     {
            #       "audit_configs": [
            #         {
            #           "service": "allServices"
            #           "audit_log_configs": [
            #             {
            #               "log_type": "DATA_READ",
            #               "exempted_members": [
            #                 "user:foo@gmail.com"
            #               ]
            #             },
            #             {
            #               "log_type": "DATA_WRITE",
            #             },
            #             {
            #               "log_type": "ADMIN_READ",
            #             }
            #           ]
            #         },
            #         {
            #           "service": "fooservice.googleapis.com"
            #           "audit_log_configs": [
            #             {
            #               "log_type": "DATA_READ",
            #             },
            #             {
            #               "log_type": "DATA_WRITE",
            #               "exempted_members": [
            #                 "user:bar@gmail.com"
            #               ]
            #             }
            #           ]
            #         }
            #       ]
            #     }
            #
            # For fooservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
            # logging. It also exempts foo@gmail.com from DATA_READ logging, and
            # bar@gmail.com from DATA_WRITE logging.
          "exemptedMembers": [
            "A String",
          ],
          "auditLogConfigs": [ # The configuration for logging of each type of permission.
              # Next ID: 4
            { # Provides the configuration for logging a type of permissions.
                # Example:
                #
                #     {
                #       "audit_log_configs": [
                #         {
                #           "log_type": "DATA_READ",
                #           "exempted_members": [
                #             "user:foo@gmail.com"
                #           ]
                #         },
                #         {
                #           "log_type": "DATA_WRITE",
                #         }
                #       ]
                #     }
                #
                # This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting
                # foo@gmail.com from DATA_READ logging.
              "exemptedMembers": [ # Specifies the identities that do not cause logging for this type of
                  # permission.
                  # Follows the same format of Binding.members.
                "A String",
              ],
              "logType": "A String", # The log type that this config enables.
            },
          ],
          "service": "A String", # Specifies a service that will be enabled for audit logging.
              # For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
              # `allServices` is a special value that covers all services.
        },
      ],
      "rules": [ # If more than one rule is specified, the rules are applied in the following
          # manner:
          # - All matching LOG rules are always applied.
          # - If any DENY/DENY_WITH_LOG rule matches, permission is denied.
          #   Logging will be applied if one or more matching rule requires logging.
          # - Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is
          #   granted.
          #   Logging will be applied if one or more matching rule requires logging.
          # - Otherwise, if no rule applies, permission is denied.
        { # A rule to be applied in a Policy.
          "notIn": [ # If one or more 'not_in' clauses are specified, the rule matches
              # if the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.
              # The format for in and not_in entries is the same as for members in a
              # Binding (see google/iam/v1/policy.proto).
            "A String",
          ],
          "description": "A String", # Human-readable description of the rule.
          "in": [ # If one or more 'in' clauses are specified, the rule matches if
              # the PRINCIPAL/AUTHORITY_SELECTOR is in at least one of these entries.
            "A String",
          ],
          "action": "A String", # Required
          "conditions": [ # Additional restrictions that must be met
            { # A condition to be met.
              "iam": "A String", # Trusted attributes supplied by the IAM system.
              "svc": "A String", # Trusted attributes discharged by the service.
              "value": "A String", # DEPRECATED. Use 'values' instead.
              "sys": "A String", # Trusted attributes supplied by any service that owns resources and uses
                  # the IAM system for access control.
              "values": [ # The objects of the condition. This is mutually exclusive with 'value'.
                "A String",
              ],
              "op": "A String", # An operator to apply the subject with.
            },
          ],
          "logConfig": [ # The config returned to callers of tech.iam.IAM.CheckPolicy for any entries
              # that match the LOG action.
            { # Specifies what kind of log the caller must write
              "counter": { # Options for counters # Counter options.
                "field": "A String", # The field value to attribute.
                "metric": "A String", # The metric to update.
              },
              "dataAccess": { # Write a Data Access (Gin) log # Data access options.
              },
              "cloudAudit": { # Write a Cloud Audit log # Cloud audit options.
              },
            },
          ],
          "permissions": [ # A permission is a string of form '<service>.<resource type>.<verb>'
              # (e.g., 'storage.buckets.list'). A value of '*' matches all permissions,
              # and a verb part of '*' (e.g., 'storage.buckets.*') matches all verbs.
            "A String",
          ],
        },
      ],
      "version": 42, # Version of the `Policy`. The default version is 0.
      "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
          # prevent simultaneous updates of a policy from overwriting each other.
          # It is strongly suggested that systems make use of the `etag` in the
          # read-modify-write cycle to perform policy updates in order to avoid race
          # conditions: An `etag` is returned in the response to `getIamPolicy`, and
          # systems are expected to put that etag in the request to `setIamPolicy` to
          # ensure that their change will be applied to the same version of the policy.
          #
          # If no `etag` is provided in the call to `setIamPolicy`, then the existing
          # policy is overwritten blindly.
      "bindings": [ # Associates a list of `members` to a `role`.
          # Multiple `bindings` must not be specified for the same `role`.
          # `bindings` with no members will result in an error.
        { # Associates `members` with a `role`.
          "role": "A String", # Role that is assigned to `members`.
              # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
              # Required
          "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
              # `members` can have the following values:
              #
              # * `allUsers`: A special identifier that represents anyone who is
              #    on the internet; with or without a Google account.
              #
              # * `allAuthenticatedUsers`: A special identifier that represents anyone
              #    who is authenticated with a Google account or a service account.
              #
              # * `user:{emailid}`: An email address that represents a specific Google
              #    account. For example, `alice@gmail.com` or `joe@example.com`.
              #
              #
              # * `serviceAccount:{emailid}`: An email address that represents a service
              #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
              #
              # * `group:{emailid}`: An email address that represents a Google group.
              #    For example, `admins@example.com`.
              #
              # * `domain:{domain}`: A Google Apps domain name that represents all the
              #    users of that domain. For example, `google.com` or `example.com`.
              #
            "A String",
          ],
        },
      ],
      "iamOwned": True or False,
    },
    "updateMask": "A String", # OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only
        # the fields in the mask will be modified. If no mask is provided, the
        # following default mask is used:
        # paths: "bindings, etag"
        # This field is only used by Cloud IAM.
  }

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

Returns:
  An object of the form:

    { # Defines an Identity and Access Management (IAM) policy. It is used to
      # specify access control policies for Cloud Platform resources.
      #
      #
      # A `Policy` consists of a list of `bindings`. A `Binding` binds a list of
      # `members` to a `role`, where the members can be user accounts, Google groups,
      # Google domains, and service accounts. A `role` is a named list of permissions
      # defined by IAM.
      #
      # **Example**
      #
      #     {
      #       "bindings": [
      #         {
      #           "role": "roles/owner",
      #           "members": [
      #             "user:mike@example.com",
      #             "group:admins@example.com",
      #             "domain:google.com",
      #             "serviceAccount:my-other-app@appspot.gserviceaccount.com",
      #           ]
      #         },
      #         {
      #           "role": "roles/viewer",
      #           "members": ["user:sean@example.com"]
      #         }
      #       ]
      #     }
      #
      # For a description of IAM and its features, see the
      # [IAM developer's guide](https://cloud.google.com/iam).
    "auditConfigs": [ # Specifies cloud audit logging configuration for this policy.
      { # Specifies the audit configuration for a service.
          # The configuration determines which permission types are logged, and what
          # identities, if any, are exempted from logging.
          # An AuditConifg must have one or more AuditLogConfigs.
          #
          # If there are AuditConfigs for both `allServices` and a specific service,
          # the union of the two AuditConfigs is used for that service: the log_types
          # specified in each AuditConfig are enabled, and the exempted_members in each
          # AuditConfig are exempted.
          #
          # Example Policy with multiple AuditConfigs:
          #
          #     {
          #       "audit_configs": [
          #         {
          #           "service": "allServices"
          #           "audit_log_configs": [
          #             {
          #               "log_type": "DATA_READ",
          #               "exempted_members": [
          #                 "user:foo@gmail.com"
          #               ]
          #             },
          #             {
          #               "log_type": "DATA_WRITE",
          #             },
          #             {
          #               "log_type": "ADMIN_READ",
          #             }
          #           ]
          #         },
          #         {
          #           "service": "fooservice.googleapis.com"
          #           "audit_log_configs": [
          #             {
          #               "log_type": "DATA_READ",
          #             },
          #             {
          #               "log_type": "DATA_WRITE",
          #               "exempted_members": [
          #                 "user:bar@gmail.com"
          #               ]
          #             }
          #           ]
          #         }
          #       ]
          #     }
          #
          # For fooservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
          # logging. It also exempts foo@gmail.com from DATA_READ logging, and
          # bar@gmail.com from DATA_WRITE logging.
        "exemptedMembers": [
          "A String",
        ],
        "auditLogConfigs": [ # The configuration for logging of each type of permission.
            # Next ID: 4
          { # Provides the configuration for logging a type of permissions.
              # Example:
              #
              #     {
              #       "audit_log_configs": [
              #         {
              #           "log_type": "DATA_READ",
              #           "exempted_members": [
              #             "user:foo@gmail.com"
              #           ]
              #         },
              #         {
              #           "log_type": "DATA_WRITE",
              #         }
              #       ]
              #     }
              #
              # This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting
              # foo@gmail.com from DATA_READ logging.
            "exemptedMembers": [ # Specifies the identities that do not cause logging for this type of
                # permission.
                # Follows the same format of Binding.members.
              "A String",
            ],
            "logType": "A String", # The log type that this config enables.
          },
        ],
        "service": "A String", # Specifies a service that will be enabled for audit logging.
            # For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
            # `allServices` is a special value that covers all services.
      },
    ],
    "rules": [ # If more than one rule is specified, the rules are applied in the following
        # manner:
        # - All matching LOG rules are always applied.
        # - If any DENY/DENY_WITH_LOG rule matches, permission is denied.
        #   Logging will be applied if one or more matching rule requires logging.
        # - Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is
        #   granted.
        #   Logging will be applied if one or more matching rule requires logging.
        # - Otherwise, if no rule applies, permission is denied.
      { # A rule to be applied in a Policy.
        "notIn": [ # If one or more 'not_in' clauses are specified, the rule matches
            # if the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.
            # The format for in and not_in entries is the same as for members in a
            # Binding (see google/iam/v1/policy.proto).
          "A String",
        ],
        "description": "A String", # Human-readable description of the rule.
        "in": [ # If one or more 'in' clauses are specified, the rule matches if
            # the PRINCIPAL/AUTHORITY_SELECTOR is in at least one of these entries.
          "A String",
        ],
        "action": "A String", # Required
        "conditions": [ # Additional restrictions that must be met
          { # A condition to be met.
            "iam": "A String", # Trusted attributes supplied by the IAM system.
            "svc": "A String", # Trusted attributes discharged by the service.
            "value": "A String", # DEPRECATED. Use 'values' instead.
            "sys": "A String", # Trusted attributes supplied by any service that owns resources and uses
                # the IAM system for access control.
            "values": [ # The objects of the condition. This is mutually exclusive with 'value'.
              "A String",
            ],
            "op": "A String", # An operator to apply the subject with.
          },
        ],
        "logConfig": [ # The config returned to callers of tech.iam.IAM.CheckPolicy for any entries
            # that match the LOG action.
          { # Specifies what kind of log the caller must write
            "counter": { # Options for counters # Counter options.
              "field": "A String", # The field value to attribute.
              "metric": "A String", # The metric to update.
            },
            "dataAccess": { # Write a Data Access (Gin) log # Data access options.
            },
            "cloudAudit": { # Write a Cloud Audit log # Cloud audit options.
            },
          },
        ],
        "permissions": [ # A permission is a string of form '<service>.<resource type>.<verb>'
            # (e.g., 'storage.buckets.list'). A value of '*' matches all permissions,
            # and a verb part of '*' (e.g., 'storage.buckets.*') matches all verbs.
          "A String",
        ],
      },
    ],
    "version": 42, # Version of the `Policy`. The default version is 0.
    "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
        # prevent simultaneous updates of a policy from overwriting each other.
        # It is strongly suggested that systems make use of the `etag` in the
        # read-modify-write cycle to perform policy updates in order to avoid race
        # conditions: An `etag` is returned in the response to `getIamPolicy`, and
        # systems are expected to put that etag in the request to `setIamPolicy` to
        # ensure that their change will be applied to the same version of the policy.
        #
        # If no `etag` is provided in the call to `setIamPolicy`, then the existing
        # policy is overwritten blindly.
    "bindings": [ # Associates a list of `members` to a `role`.
        # Multiple `bindings` must not be specified for the same `role`.
        # `bindings` with no members will result in an error.
      { # Associates `members` with a `role`.
        "role": "A String", # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
            # Required
        "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
            # `members` can have the following values:
            #
            # * `allUsers`: A special identifier that represents anyone who is
            #    on the internet; with or without a Google account.
            #
            # * `allAuthenticatedUsers`: A special identifier that represents anyone
            #    who is authenticated with a Google account or a service account.
            #
            # * `user:{emailid}`: An email address that represents a specific Google
            #    account. For example, `alice@gmail.com` or `joe@example.com`.
            #
            #
            # * `serviceAccount:{emailid}`: An email address that represents a service
            #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
            #
            # * `group:{emailid}`: An email address that represents a Google group.
            #    For example, `admins@example.com`.
            #
            # * `domain:{domain}`: A Google Apps domain name that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          "A String",
        ],
      },
    ],
    "iamOwned": True or False,
  }</pre>
</div>

<div class="method">
    <code class="details" id="testIamPermissions">testIamPermissions(resource, body, x__xgafv=None)</code>
  <pre>Returns permissions that the caller has on the specified instance resource.

Attempting this RPC on a non-existent Cloud Spanner instance resource will
result in a NOT_FOUND error if the user has `spanner.instances.list`
permission on the containing Google Cloud Project. Otherwise returns an
empty set of permissions.

Args:
  resource: string, REQUIRED: The Cloud Spanner resource for which permissions are being tested. The format is `projects/<project ID>/instances/<instance ID>` for instance resources and `projects/<project ID>/instances/<instance ID>/databases/<database ID>` for database resources. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request message for `TestIamPermissions` method.
    "permissions": [ # REQUIRED: The set of permissions to check for 'resource'.
        # Permissions with wildcards (such as '*', 'spanner.*', 'spanner.instances.*') are not allowed.
      "A String",
    ],
  }

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

Returns:
  An object of the form:

    { # Response message for `TestIamPermissions` method.
    "permissions": [ # A subset of `TestPermissionsRequest.permissions` that the caller is
        # allowed.
      "A String",
    ],
  }</pre>
</div>

</body></html>