<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="cloudiot_v1.html">Cloud IoT API</a> . <a href="cloudiot_v1.projects.html">projects</a> . <a href="cloudiot_v1.projects.locations.html">locations</a> . <a href="cloudiot_v1.projects.locations.registries.html">registries</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="cloudiot_v1.projects.locations.registries.devices.html">devices()</a></code>
</p>
<p class="firstline">Returns the devices Resource.</p>

<p class="toc_element">
  <code><a href="cloudiot_v1.projects.locations.registries.groups.html">groups()</a></code>
</p>
<p class="firstline">Returns the groups Resource.</p>

<p class="toc_element">
  <code><a href="#bindDeviceToGateway">bindDeviceToGateway(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Associates the device with the gateway.</p>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a device registry that contains devices.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a device registry configuration.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets a device registry configuration.</p>
<p class="toc_element">
  <code><a href="#getIamPolicy">getIamPolicy(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the access control policy for a resource.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists device registries.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates a device registry configuration.</p>
<p class="toc_element">
  <code><a href="#setIamPolicy">setIamPolicy(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Sets the access control policy on the specified resource. Replaces any</p>
<p class="toc_element">
  <code><a href="#testIamPermissions">testIamPermissions(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns permissions that a caller has on the specified resource.</p>
<p class="toc_element">
  <code><a href="#unbindDeviceFromGateway">unbindDeviceFromGateway(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes the association between the device and the gateway.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="bindDeviceToGateway">bindDeviceToGateway(parent, body=None, x__xgafv=None)</code>
  <pre>Associates the device with the gateway.

Args:
  parent: string, Required. The name of the registry. For example,
`projects/example-project/locations/us-central1/registries/my-registry`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request for `BindDeviceToGateway`.
    &quot;deviceId&quot;: &quot;A String&quot;, # Required. The device to associate with the specified gateway. The value of
        # `device_id` can be either the device numeric ID or the user-defined device
        # identifier.
    &quot;gatewayId&quot;: &quot;A String&quot;, # Required. The value of `gateway_id` can be either the device numeric ID or the
        # user-defined device identifier.
  }

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

Returns:
  An object of the form:

    { # Response for `BindDeviceToGateway`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Creates a device registry that contains devices.

Args:
  parent: string, Required. The project and cloud region where this device registry must be created.
For example, `projects/example-project/locations/us-central1`. (required)
  body: object, The request body.
    The object takes the form of:

{ # A container for a group of devices.
  &quot;credentials&quot;: [ # The credentials used to verify the device credentials. No more than 10
      # credentials can be bound to a single registry at a time. The verification
      # process occurs at the time of device creation or update. If this field is
      # empty, no verification is performed. Otherwise, the credentials of a newly
      # created device or added credentials of an updated device should be signed
      # with one of these registry credentials.
      # 
      # Note, however, that existing devices will never be affected by
      # modifications to this list of credentials: after a device has been
      # successfully created in a registry, it should be able to connect even if
      # its registry credentials are revoked, deleted, or modified.
    { # A server-stored registry credential used to validate device credentials.
      &quot;publicKeyCertificate&quot;: { # A public key certificate format and data. # A public key certificate used to verify the device credentials.
        &quot;x509Details&quot;: { # Details of an X.509 certificate. For informational purposes only. # [Output only] The certificate details. Used only for X.509 certificates.
          &quot;signatureAlgorithm&quot;: &quot;A String&quot;, # The algorithm used to sign the certificate.
          &quot;startTime&quot;: &quot;A String&quot;, # The time the certificate becomes valid.
          &quot;expiryTime&quot;: &quot;A String&quot;, # The time the certificate becomes invalid.
          &quot;subject&quot;: &quot;A String&quot;, # The entity the certificate and public key belong to.
          &quot;issuer&quot;: &quot;A String&quot;, # The entity that signed the certificate.
          &quot;publicKeyType&quot;: &quot;A String&quot;, # The type of public key in the certificate.
        },
        &quot;format&quot;: &quot;A String&quot;, # The certificate format.
        &quot;certificate&quot;: &quot;A String&quot;, # The certificate data.
      },
    },
  ],
  &quot;name&quot;: &quot;A String&quot;, # The resource path name. For example,
      # `projects/example-project/locations/us-central1/registries/my-registry`.
  &quot;eventNotificationConfigs&quot;: [ # The configuration for notification of telemetry events received from the
      # device. All telemetry events that were successfully published by the
      # device and acknowledged by Cloud IoT Core are guaranteed to be
      # delivered to Cloud Pub/Sub. If multiple configurations match a message,
      # only the first matching configuration is used. If you try to publish a
      # device telemetry event using MQTT without specifying a Cloud Pub/Sub topic
      # for the device&#x27;s registry, the connection closes automatically. If you try
      # to do so using an HTTP connection, an error is returned. Up to 10
      # configurations may be provided.
    { # The configuration for forwarding telemetry events.
      &quot;subfolderMatches&quot;: &quot;A String&quot;, # If the subfolder name matches this string exactly, this configuration will
          # be used. The string must not include the leading &#x27;/&#x27; character. If empty,
          # all strings are matched. This field is used only for telemetry events;
          # subfolders are not supported for state changes.
      &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
          # `projects/myProject/topics/deviceEvents`.
    },
  ],
  &quot;logLevel&quot;: &quot;A String&quot;, # **Beta Feature**
      # 
      # The default logging verbosity for activity from devices in this registry.
      # The verbosity level can be overridden by Device.log_level.
  &quot;httpConfig&quot;: { # The configuration of the HTTP bridge for a device registry. # The DeviceService (HTTP) configuration for this device registry.
    &quot;httpEnabledState&quot;: &quot;A String&quot;, # If enabled, allows devices to use DeviceService via the HTTP protocol.
        # Otherwise, any requests to DeviceService will fail for this registry.
  },
  &quot;id&quot;: &quot;A String&quot;, # The identifier of this device registry. For example, `myRegistry`.
  &quot;mqttConfig&quot;: { # The configuration of MQTT for a device registry. # The MQTT configuration for this device registry.
    &quot;mqttEnabledState&quot;: &quot;A String&quot;, # If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
        # connections to this registry will fail.
  },
  &quot;stateNotificationConfig&quot;: { # The configuration for notification of new states received from the device. # The configuration for notification of new states received from the device.
      # State updates are guaranteed to be stored in the state history, but
      # notifications to Cloud Pub/Sub are not guaranteed. For example, if
      # permissions are misconfigured or the specified topic doesn&#x27;t exist, no
      # notification will be published but the state will still be stored in Cloud
      # IoT Core.
    &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
        # `projects/myProject/topics/deviceEvents`.
  },
}

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

Returns:
  An object of the form:

    { # A container for a group of devices.
    &quot;credentials&quot;: [ # The credentials used to verify the device credentials. No more than 10
        # credentials can be bound to a single registry at a time. The verification
        # process occurs at the time of device creation or update. If this field is
        # empty, no verification is performed. Otherwise, the credentials of a newly
        # created device or added credentials of an updated device should be signed
        # with one of these registry credentials.
        #
        # Note, however, that existing devices will never be affected by
        # modifications to this list of credentials: after a device has been
        # successfully created in a registry, it should be able to connect even if
        # its registry credentials are revoked, deleted, or modified.
      { # A server-stored registry credential used to validate device credentials.
        &quot;publicKeyCertificate&quot;: { # A public key certificate format and data. # A public key certificate used to verify the device credentials.
          &quot;x509Details&quot;: { # Details of an X.509 certificate. For informational purposes only. # [Output only] The certificate details. Used only for X.509 certificates.
            &quot;signatureAlgorithm&quot;: &quot;A String&quot;, # The algorithm used to sign the certificate.
            &quot;startTime&quot;: &quot;A String&quot;, # The time the certificate becomes valid.
            &quot;expiryTime&quot;: &quot;A String&quot;, # The time the certificate becomes invalid.
            &quot;subject&quot;: &quot;A String&quot;, # The entity the certificate and public key belong to.
            &quot;issuer&quot;: &quot;A String&quot;, # The entity that signed the certificate.
            &quot;publicKeyType&quot;: &quot;A String&quot;, # The type of public key in the certificate.
          },
          &quot;format&quot;: &quot;A String&quot;, # The certificate format.
          &quot;certificate&quot;: &quot;A String&quot;, # The certificate data.
        },
      },
    ],
    &quot;name&quot;: &quot;A String&quot;, # The resource path name. For example,
        # `projects/example-project/locations/us-central1/registries/my-registry`.
    &quot;eventNotificationConfigs&quot;: [ # The configuration for notification of telemetry events received from the
        # device. All telemetry events that were successfully published by the
        # device and acknowledged by Cloud IoT Core are guaranteed to be
        # delivered to Cloud Pub/Sub. If multiple configurations match a message,
        # only the first matching configuration is used. If you try to publish a
        # device telemetry event using MQTT without specifying a Cloud Pub/Sub topic
        # for the device&#x27;s registry, the connection closes automatically. If you try
        # to do so using an HTTP connection, an error is returned. Up to 10
        # configurations may be provided.
      { # The configuration for forwarding telemetry events.
        &quot;subfolderMatches&quot;: &quot;A String&quot;, # If the subfolder name matches this string exactly, this configuration will
            # be used. The string must not include the leading &#x27;/&#x27; character. If empty,
            # all strings are matched. This field is used only for telemetry events;
            # subfolders are not supported for state changes.
        &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
            # `projects/myProject/topics/deviceEvents`.
      },
    ],
    &quot;logLevel&quot;: &quot;A String&quot;, # **Beta Feature**
        #
        # The default logging verbosity for activity from devices in this registry.
        # The verbosity level can be overridden by Device.log_level.
    &quot;httpConfig&quot;: { # The configuration of the HTTP bridge for a device registry. # The DeviceService (HTTP) configuration for this device registry.
      &quot;httpEnabledState&quot;: &quot;A String&quot;, # If enabled, allows devices to use DeviceService via the HTTP protocol.
          # Otherwise, any requests to DeviceService will fail for this registry.
    },
    &quot;id&quot;: &quot;A String&quot;, # The identifier of this device registry. For example, `myRegistry`.
    &quot;mqttConfig&quot;: { # The configuration of MQTT for a device registry. # The MQTT configuration for this device registry.
      &quot;mqttEnabledState&quot;: &quot;A String&quot;, # If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
          # connections to this registry will fail.
    },
    &quot;stateNotificationConfig&quot;: { # The configuration for notification of new states received from the device. # The configuration for notification of new states received from the device.
        # State updates are guaranteed to be stored in the state history, but
        # notifications to Cloud Pub/Sub are not guaranteed. For example, if
        # permissions are misconfigured or the specified topic doesn&#x27;t exist, no
        # notification will be published but the state will still be stored in Cloud
        # IoT Core.
      &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
          # `projects/myProject/topics/deviceEvents`.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Deletes a device registry configuration.

Args:
  name: string, Required. The name of the device registry. For example,
`projects/example-project/locations/us-central1/registries/my-registry`. (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 a device registry configuration.

Args:
  name: string, Required. The name of the device registry. For example,
`projects/example-project/locations/us-central1/registries/my-registry`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A container for a group of devices.
    &quot;credentials&quot;: [ # The credentials used to verify the device credentials. No more than 10
        # credentials can be bound to a single registry at a time. The verification
        # process occurs at the time of device creation or update. If this field is
        # empty, no verification is performed. Otherwise, the credentials of a newly
        # created device or added credentials of an updated device should be signed
        # with one of these registry credentials.
        #
        # Note, however, that existing devices will never be affected by
        # modifications to this list of credentials: after a device has been
        # successfully created in a registry, it should be able to connect even if
        # its registry credentials are revoked, deleted, or modified.
      { # A server-stored registry credential used to validate device credentials.
        &quot;publicKeyCertificate&quot;: { # A public key certificate format and data. # A public key certificate used to verify the device credentials.
          &quot;x509Details&quot;: { # Details of an X.509 certificate. For informational purposes only. # [Output only] The certificate details. Used only for X.509 certificates.
            &quot;signatureAlgorithm&quot;: &quot;A String&quot;, # The algorithm used to sign the certificate.
            &quot;startTime&quot;: &quot;A String&quot;, # The time the certificate becomes valid.
            &quot;expiryTime&quot;: &quot;A String&quot;, # The time the certificate becomes invalid.
            &quot;subject&quot;: &quot;A String&quot;, # The entity the certificate and public key belong to.
            &quot;issuer&quot;: &quot;A String&quot;, # The entity that signed the certificate.
            &quot;publicKeyType&quot;: &quot;A String&quot;, # The type of public key in the certificate.
          },
          &quot;format&quot;: &quot;A String&quot;, # The certificate format.
          &quot;certificate&quot;: &quot;A String&quot;, # The certificate data.
        },
      },
    ],
    &quot;name&quot;: &quot;A String&quot;, # The resource path name. For example,
        # `projects/example-project/locations/us-central1/registries/my-registry`.
    &quot;eventNotificationConfigs&quot;: [ # The configuration for notification of telemetry events received from the
        # device. All telemetry events that were successfully published by the
        # device and acknowledged by Cloud IoT Core are guaranteed to be
        # delivered to Cloud Pub/Sub. If multiple configurations match a message,
        # only the first matching configuration is used. If you try to publish a
        # device telemetry event using MQTT without specifying a Cloud Pub/Sub topic
        # for the device&#x27;s registry, the connection closes automatically. If you try
        # to do so using an HTTP connection, an error is returned. Up to 10
        # configurations may be provided.
      { # The configuration for forwarding telemetry events.
        &quot;subfolderMatches&quot;: &quot;A String&quot;, # If the subfolder name matches this string exactly, this configuration will
            # be used. The string must not include the leading &#x27;/&#x27; character. If empty,
            # all strings are matched. This field is used only for telemetry events;
            # subfolders are not supported for state changes.
        &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
            # `projects/myProject/topics/deviceEvents`.
      },
    ],
    &quot;logLevel&quot;: &quot;A String&quot;, # **Beta Feature**
        #
        # The default logging verbosity for activity from devices in this registry.
        # The verbosity level can be overridden by Device.log_level.
    &quot;httpConfig&quot;: { # The configuration of the HTTP bridge for a device registry. # The DeviceService (HTTP) configuration for this device registry.
      &quot;httpEnabledState&quot;: &quot;A String&quot;, # If enabled, allows devices to use DeviceService via the HTTP protocol.
          # Otherwise, any requests to DeviceService will fail for this registry.
    },
    &quot;id&quot;: &quot;A String&quot;, # The identifier of this device registry. For example, `myRegistry`.
    &quot;mqttConfig&quot;: { # The configuration of MQTT for a device registry. # The MQTT configuration for this device registry.
      &quot;mqttEnabledState&quot;: &quot;A String&quot;, # If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
          # connections to this registry will fail.
    },
    &quot;stateNotificationConfig&quot;: { # The configuration for notification of new states received from the device. # The configuration for notification of new states received from the device.
        # State updates are guaranteed to be stored in the state history, but
        # notifications to Cloud Pub/Sub are not guaranteed. For example, if
        # permissions are misconfigured or the specified topic doesn&#x27;t exist, no
        # notification will be published but the state will still be stored in Cloud
        # IoT Core.
      &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
          # `projects/myProject/topics/deviceEvents`.
    },
  }</pre>
</div>

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

Args:
  resource: string, REQUIRED: The resource for which the policy is being requested.
See the operation documentation for the appropriate value for this field. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for `GetIamPolicy` method.
    &quot;options&quot;: { # Encapsulates settings provided to GetIamPolicy. # OPTIONAL: A `GetPolicyOptions` object for specifying options to
        # `GetIamPolicy`.
      &quot;requestedPolicyVersion&quot;: 42, # Optional. The policy format version to be returned.
          #
          # Valid values are 0, 1, and 3. Requests specifying an invalid value will be
          # rejected.
          #
          # Requests for policies with any conditional bindings must specify version 3.
          # Policies without any conditional bindings may specify any valid value or
          # leave the field unset.
          #
          # To learn which resources support conditions in their IAM policies, see the
          # [IAM
          # documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
    },
  }

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

Returns:
  An object of the form:

    { # An Identity and Access Management (IAM) policy, which specifies access
      # controls for Google Cloud resources.
      #
      #
      # A `Policy` is a collection of `bindings`. A `binding` binds one or more
      # `members` to a single `role`. Members can be user accounts, service accounts,
      # Google groups, and domains (such as G Suite). A `role` is a named list of
      # permissions; each `role` can be an IAM predefined role or a user-created
      # custom role.
      #
      # For some types of Google Cloud resources, a `binding` can also specify a
      # `condition`, which is a logical expression that allows access to a resource
      # only if the expression evaluates to `true`. A condition can add constraints
      # based on attributes of the request, the resource, or both. To learn which
      # resources support conditions in their IAM policies, see the
      # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
      #
      # **JSON example:**
      #
      #     {
      #       &quot;bindings&quot;: [
      #         {
      #           &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;,
      #           &quot;members&quot;: [
      #             &quot;user:mike@example.com&quot;,
      #             &quot;group:admins@example.com&quot;,
      #             &quot;domain:google.com&quot;,
      #             &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot;
      #           ]
      #         },
      #         {
      #           &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;,
      #           &quot;members&quot;: [
      #             &quot;user:eve@example.com&quot;
      #           ],
      #           &quot;condition&quot;: {
      #             &quot;title&quot;: &quot;expirable access&quot;,
      #             &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;,
      #             &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;,
      #           }
      #         }
      #       ],
      #       &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;,
      #       &quot;version&quot;: 3
      #     }
      #
      # **YAML example:**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-project-id@appspot.gserviceaccount.com
      #       role: roles/resourcemanager.organizationAdmin
      #     - members:
      #       - user:eve@example.com
      #       role: roles/resourcemanager.organizationViewer
      #       condition:
      #         title: expirable access
      #         description: Does not grant access after Sep 2020
      #         expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)
      #     - etag: BwWWja0YfJA=
      #     - version: 3
      #
      # For a description of IAM and its features, see the
      # [IAM documentation](https://cloud.google.com/iam/docs/).
    &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a
        # `condition` that determines how and when the `bindings` are applied. Each
        # of the `bindings` must contain at least one member.
      { # Associates `members` with a `role`.
        &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) # The condition that is associated with this binding.
            #
            # If the condition evaluates to `true`, then this binding applies to the
            # current request.
            #
            # If the condition evaluates to `false`, then this binding does not apply to
            # the current request. However, a different role binding might grant the same
            # role to one or more of the members in this binding.
            #
            # To learn which resources support conditions in their IAM policies, see the
            # [IAM
            # documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
            # syntax. CEL is a C-like expression language. The syntax and semantics of CEL
            # are documented at https://github.com/google/cel-spec.
            #
            # Example (Comparison):
            #
            #     title: &quot;Summary size limit&quot;
            #     description: &quot;Determines if a summary is less than 100 chars&quot;
            #     expression: &quot;document.summary.size() &lt; 100&quot;
            #
            # Example (Equality):
            #
            #     title: &quot;Requestor is owner&quot;
            #     description: &quot;Determines if requestor is the document owner&quot;
            #     expression: &quot;document.owner == request.auth.claims.email&quot;
            #
            # Example (Logic):
            #
            #     title: &quot;Public documents&quot;
            #     description: &quot;Determine whether the document should be publicly visible&quot;
            #     expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot;
            #
            # Example (Data Manipulation):
            #
            #     title: &quot;Notification string&quot;
            #     description: &quot;Create a notification string with a timestamp.&quot;
            #     expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot;
            #
            # The exact variables and functions that may be referenced within an expression
            # are determined by the service that evaluates it. See the service
            # documentation for additional information.
          &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language
              # syntax.
          &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing
              # its purpose. This can be used e.g. in UIs which allow to enter the
              # expression.
          &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
        },
        &quot;members&quot;: [ # 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@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`.
            #
            # * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique
            #    identifier) representing a user that has been recently deleted. For
            #    example, `alice@example.com?uid=123456789012345678901`. If the user is
            #    recovered, this value reverts to `user:{emailid}` and the recovered user
            #    retains the role in the binding.
            #
            # * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus
            #    unique identifier) representing a service account that has been recently
            #    deleted. For example,
            #    `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`.
            #    If the service account is undeleted, this value reverts to
            #    `serviceAccount:{emailid}` and the undeleted service account retains the
            #    role in the binding.
            #
            # * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique
            #    identifier) representing a Google group that has been recently
            #    deleted. For example, `admins@example.com?uid=123456789012345678901`. If
            #    the group is recovered, this value reverts to `group:{emailid}` and the
            #    recovered group retains the role in the binding.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          &quot;A String&quot;,
        ],
        &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
      },
    ],
    &quot;etag&quot;: &quot;A String&quot;, # `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.
        #
        # **Important:** If you use IAM Conditions, you must include the `etag` field
        # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
        # you to overwrite a version `3` policy with a version `1` policy, and all of
        # the conditions in the version `3` policy are lost.
    &quot;version&quot;: 42, # Specifies the format of the policy.
        #
        # Valid values are `0`, `1`, and `3`. Requests that specify an invalid value
        # are rejected.
        #
        # Any operation that affects conditional role bindings must specify version
        # `3`. This requirement applies to the following operations:
        #
        # * Getting a policy that includes a conditional role binding
        # * Adding a conditional role binding to a policy
        # * Changing a conditional role binding in a policy
        # * Removing any role binding, with or without a condition, from a policy
        #   that includes conditions
        #
        # **Important:** If you use IAM Conditions, you must include the `etag` field
        # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
        # you to overwrite a version `3` policy with a version `1` policy, and all of
        # the conditions in the version `3` policy are lost.
        #
        # If a policy does not include any conditions, operations on that policy may
        # specify any valid version or leave the field unset.
        #
        # To learn which resources support conditions in their IAM policies, see the
        # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
  }</pre>
</div>

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

Args:
  parent: string, Required. The project and cloud region path. For example,
`projects/example-project/locations/us-central1`. (required)
  pageToken: string, The value returned by the last `ListDeviceRegistriesResponse`; indicates
that this is a continuation of a prior `ListDeviceRegistries` call and
the system should return the next page of data.
  pageSize: integer, The maximum number of registries to return in the response. If this value
is zero, the service will select a default size. A call may return fewer
objects than requested. A non-empty `next_page_token` in the response
indicates that more data is available.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response for `ListDeviceRegistries`.
    &quot;deviceRegistries&quot;: [ # The registries that matched the query.
      { # A container for a group of devices.
        &quot;credentials&quot;: [ # The credentials used to verify the device credentials. No more than 10
            # credentials can be bound to a single registry at a time. The verification
            # process occurs at the time of device creation or update. If this field is
            # empty, no verification is performed. Otherwise, the credentials of a newly
            # created device or added credentials of an updated device should be signed
            # with one of these registry credentials.
            #
            # Note, however, that existing devices will never be affected by
            # modifications to this list of credentials: after a device has been
            # successfully created in a registry, it should be able to connect even if
            # its registry credentials are revoked, deleted, or modified.
          { # A server-stored registry credential used to validate device credentials.
            &quot;publicKeyCertificate&quot;: { # A public key certificate format and data. # A public key certificate used to verify the device credentials.
              &quot;x509Details&quot;: { # Details of an X.509 certificate. For informational purposes only. # [Output only] The certificate details. Used only for X.509 certificates.
                &quot;signatureAlgorithm&quot;: &quot;A String&quot;, # The algorithm used to sign the certificate.
                &quot;startTime&quot;: &quot;A String&quot;, # The time the certificate becomes valid.
                &quot;expiryTime&quot;: &quot;A String&quot;, # The time the certificate becomes invalid.
                &quot;subject&quot;: &quot;A String&quot;, # The entity the certificate and public key belong to.
                &quot;issuer&quot;: &quot;A String&quot;, # The entity that signed the certificate.
                &quot;publicKeyType&quot;: &quot;A String&quot;, # The type of public key in the certificate.
              },
              &quot;format&quot;: &quot;A String&quot;, # The certificate format.
              &quot;certificate&quot;: &quot;A String&quot;, # The certificate data.
            },
          },
        ],
        &quot;name&quot;: &quot;A String&quot;, # The resource path name. For example,
            # `projects/example-project/locations/us-central1/registries/my-registry`.
        &quot;eventNotificationConfigs&quot;: [ # The configuration for notification of telemetry events received from the
            # device. All telemetry events that were successfully published by the
            # device and acknowledged by Cloud IoT Core are guaranteed to be
            # delivered to Cloud Pub/Sub. If multiple configurations match a message,
            # only the first matching configuration is used. If you try to publish a
            # device telemetry event using MQTT without specifying a Cloud Pub/Sub topic
            # for the device&#x27;s registry, the connection closes automatically. If you try
            # to do so using an HTTP connection, an error is returned. Up to 10
            # configurations may be provided.
          { # The configuration for forwarding telemetry events.
            &quot;subfolderMatches&quot;: &quot;A String&quot;, # If the subfolder name matches this string exactly, this configuration will
                # be used. The string must not include the leading &#x27;/&#x27; character. If empty,
                # all strings are matched. This field is used only for telemetry events;
                # subfolders are not supported for state changes.
            &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
                # `projects/myProject/topics/deviceEvents`.
          },
        ],
        &quot;logLevel&quot;: &quot;A String&quot;, # **Beta Feature**
            #
            # The default logging verbosity for activity from devices in this registry.
            # The verbosity level can be overridden by Device.log_level.
        &quot;httpConfig&quot;: { # The configuration of the HTTP bridge for a device registry. # The DeviceService (HTTP) configuration for this device registry.
          &quot;httpEnabledState&quot;: &quot;A String&quot;, # If enabled, allows devices to use DeviceService via the HTTP protocol.
              # Otherwise, any requests to DeviceService will fail for this registry.
        },
        &quot;id&quot;: &quot;A String&quot;, # The identifier of this device registry. For example, `myRegistry`.
        &quot;mqttConfig&quot;: { # The configuration of MQTT for a device registry. # The MQTT configuration for this device registry.
          &quot;mqttEnabledState&quot;: &quot;A String&quot;, # If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
              # connections to this registry will fail.
        },
        &quot;stateNotificationConfig&quot;: { # The configuration for notification of new states received from the device. # The configuration for notification of new states received from the device.
            # State updates are guaranteed to be stored in the state history, but
            # notifications to Cloud Pub/Sub are not guaranteed. For example, if
            # permissions are misconfigured or the specified topic doesn&#x27;t exist, no
            # notification will be published but the state will still be stored in Cloud
            # IoT Core.
          &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
              # `projects/myProject/topics/deviceEvents`.
        },
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # If not empty, indicates that there may be more registries that match the
        # request; this value should be passed in a new
        # `ListDeviceRegistriesRequest`.
  }</pre>
</div>

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

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

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

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates a device registry configuration.

Args:
  name: string, The resource path name. For example,
`projects/example-project/locations/us-central1/registries/my-registry`. (required)
  body: object, The request body.
    The object takes the form of:

{ # A container for a group of devices.
  &quot;credentials&quot;: [ # The credentials used to verify the device credentials. No more than 10
      # credentials can be bound to a single registry at a time. The verification
      # process occurs at the time of device creation or update. If this field is
      # empty, no verification is performed. Otherwise, the credentials of a newly
      # created device or added credentials of an updated device should be signed
      # with one of these registry credentials.
      # 
      # Note, however, that existing devices will never be affected by
      # modifications to this list of credentials: after a device has been
      # successfully created in a registry, it should be able to connect even if
      # its registry credentials are revoked, deleted, or modified.
    { # A server-stored registry credential used to validate device credentials.
      &quot;publicKeyCertificate&quot;: { # A public key certificate format and data. # A public key certificate used to verify the device credentials.
        &quot;x509Details&quot;: { # Details of an X.509 certificate. For informational purposes only. # [Output only] The certificate details. Used only for X.509 certificates.
          &quot;signatureAlgorithm&quot;: &quot;A String&quot;, # The algorithm used to sign the certificate.
          &quot;startTime&quot;: &quot;A String&quot;, # The time the certificate becomes valid.
          &quot;expiryTime&quot;: &quot;A String&quot;, # The time the certificate becomes invalid.
          &quot;subject&quot;: &quot;A String&quot;, # The entity the certificate and public key belong to.
          &quot;issuer&quot;: &quot;A String&quot;, # The entity that signed the certificate.
          &quot;publicKeyType&quot;: &quot;A String&quot;, # The type of public key in the certificate.
        },
        &quot;format&quot;: &quot;A String&quot;, # The certificate format.
        &quot;certificate&quot;: &quot;A String&quot;, # The certificate data.
      },
    },
  ],
  &quot;name&quot;: &quot;A String&quot;, # The resource path name. For example,
      # `projects/example-project/locations/us-central1/registries/my-registry`.
  &quot;eventNotificationConfigs&quot;: [ # The configuration for notification of telemetry events received from the
      # device. All telemetry events that were successfully published by the
      # device and acknowledged by Cloud IoT Core are guaranteed to be
      # delivered to Cloud Pub/Sub. If multiple configurations match a message,
      # only the first matching configuration is used. If you try to publish a
      # device telemetry event using MQTT without specifying a Cloud Pub/Sub topic
      # for the device&#x27;s registry, the connection closes automatically. If you try
      # to do so using an HTTP connection, an error is returned. Up to 10
      # configurations may be provided.
    { # The configuration for forwarding telemetry events.
      &quot;subfolderMatches&quot;: &quot;A String&quot;, # If the subfolder name matches this string exactly, this configuration will
          # be used. The string must not include the leading &#x27;/&#x27; character. If empty,
          # all strings are matched. This field is used only for telemetry events;
          # subfolders are not supported for state changes.
      &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
          # `projects/myProject/topics/deviceEvents`.
    },
  ],
  &quot;logLevel&quot;: &quot;A String&quot;, # **Beta Feature**
      # 
      # The default logging verbosity for activity from devices in this registry.
      # The verbosity level can be overridden by Device.log_level.
  &quot;httpConfig&quot;: { # The configuration of the HTTP bridge for a device registry. # The DeviceService (HTTP) configuration for this device registry.
    &quot;httpEnabledState&quot;: &quot;A String&quot;, # If enabled, allows devices to use DeviceService via the HTTP protocol.
        # Otherwise, any requests to DeviceService will fail for this registry.
  },
  &quot;id&quot;: &quot;A String&quot;, # The identifier of this device registry. For example, `myRegistry`.
  &quot;mqttConfig&quot;: { # The configuration of MQTT for a device registry. # The MQTT configuration for this device registry.
    &quot;mqttEnabledState&quot;: &quot;A String&quot;, # If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
        # connections to this registry will fail.
  },
  &quot;stateNotificationConfig&quot;: { # The configuration for notification of new states received from the device. # The configuration for notification of new states received from the device.
      # State updates are guaranteed to be stored in the state history, but
      # notifications to Cloud Pub/Sub are not guaranteed. For example, if
      # permissions are misconfigured or the specified topic doesn&#x27;t exist, no
      # notification will be published but the state will still be stored in Cloud
      # IoT Core.
    &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
        # `projects/myProject/topics/deviceEvents`.
  },
}

  updateMask: string, Required. Only updates the `device_registry` fields indicated by this mask.
The field mask must not be empty, and it must not contain fields that
are immutable or only set by the server.
Mutable top-level fields: `event_notification_config`, `http_config`,
`mqtt_config`, and `state_notification_config`.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A container for a group of devices.
    &quot;credentials&quot;: [ # The credentials used to verify the device credentials. No more than 10
        # credentials can be bound to a single registry at a time. The verification
        # process occurs at the time of device creation or update. If this field is
        # empty, no verification is performed. Otherwise, the credentials of a newly
        # created device or added credentials of an updated device should be signed
        # with one of these registry credentials.
        #
        # Note, however, that existing devices will never be affected by
        # modifications to this list of credentials: after a device has been
        # successfully created in a registry, it should be able to connect even if
        # its registry credentials are revoked, deleted, or modified.
      { # A server-stored registry credential used to validate device credentials.
        &quot;publicKeyCertificate&quot;: { # A public key certificate format and data. # A public key certificate used to verify the device credentials.
          &quot;x509Details&quot;: { # Details of an X.509 certificate. For informational purposes only. # [Output only] The certificate details. Used only for X.509 certificates.
            &quot;signatureAlgorithm&quot;: &quot;A String&quot;, # The algorithm used to sign the certificate.
            &quot;startTime&quot;: &quot;A String&quot;, # The time the certificate becomes valid.
            &quot;expiryTime&quot;: &quot;A String&quot;, # The time the certificate becomes invalid.
            &quot;subject&quot;: &quot;A String&quot;, # The entity the certificate and public key belong to.
            &quot;issuer&quot;: &quot;A String&quot;, # The entity that signed the certificate.
            &quot;publicKeyType&quot;: &quot;A String&quot;, # The type of public key in the certificate.
          },
          &quot;format&quot;: &quot;A String&quot;, # The certificate format.
          &quot;certificate&quot;: &quot;A String&quot;, # The certificate data.
        },
      },
    ],
    &quot;name&quot;: &quot;A String&quot;, # The resource path name. For example,
        # `projects/example-project/locations/us-central1/registries/my-registry`.
    &quot;eventNotificationConfigs&quot;: [ # The configuration for notification of telemetry events received from the
        # device. All telemetry events that were successfully published by the
        # device and acknowledged by Cloud IoT Core are guaranteed to be
        # delivered to Cloud Pub/Sub. If multiple configurations match a message,
        # only the first matching configuration is used. If you try to publish a
        # device telemetry event using MQTT without specifying a Cloud Pub/Sub topic
        # for the device&#x27;s registry, the connection closes automatically. If you try
        # to do so using an HTTP connection, an error is returned. Up to 10
        # configurations may be provided.
      { # The configuration for forwarding telemetry events.
        &quot;subfolderMatches&quot;: &quot;A String&quot;, # If the subfolder name matches this string exactly, this configuration will
            # be used. The string must not include the leading &#x27;/&#x27; character. If empty,
            # all strings are matched. This field is used only for telemetry events;
            # subfolders are not supported for state changes.
        &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
            # `projects/myProject/topics/deviceEvents`.
      },
    ],
    &quot;logLevel&quot;: &quot;A String&quot;, # **Beta Feature**
        #
        # The default logging verbosity for activity from devices in this registry.
        # The verbosity level can be overridden by Device.log_level.
    &quot;httpConfig&quot;: { # The configuration of the HTTP bridge for a device registry. # The DeviceService (HTTP) configuration for this device registry.
      &quot;httpEnabledState&quot;: &quot;A String&quot;, # If enabled, allows devices to use DeviceService via the HTTP protocol.
          # Otherwise, any requests to DeviceService will fail for this registry.
    },
    &quot;id&quot;: &quot;A String&quot;, # The identifier of this device registry. For example, `myRegistry`.
    &quot;mqttConfig&quot;: { # The configuration of MQTT for a device registry. # The MQTT configuration for this device registry.
      &quot;mqttEnabledState&quot;: &quot;A String&quot;, # If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
          # connections to this registry will fail.
    },
    &quot;stateNotificationConfig&quot;: { # The configuration for notification of new states received from the device. # The configuration for notification of new states received from the device.
        # State updates are guaranteed to be stored in the state history, but
        # notifications to Cloud Pub/Sub are not guaranteed. For example, if
        # permissions are misconfigured or the specified topic doesn&#x27;t exist, no
        # notification will be published but the state will still be stored in Cloud
        # IoT Core.
      &quot;pubsubTopicName&quot;: &quot;A String&quot;, # A Cloud Pub/Sub topic name. For example,
          # `projects/myProject/topics/deviceEvents`.
    },
  }</pre>
</div>

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

Args:
  resource: string, REQUIRED: The resource for which the policy is being specified.
See the operation documentation for the appropriate value for this field. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for `SetIamPolicy` method.
    &quot;policy&quot;: { # An Identity and Access Management (IAM) policy, which specifies access # 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.
        # controls for Google Cloud resources.
        #
        #
        # A `Policy` is a collection of `bindings`. A `binding` binds one or more
        # `members` to a single `role`. Members can be user accounts, service accounts,
        # Google groups, and domains (such as G Suite). A `role` is a named list of
        # permissions; each `role` can be an IAM predefined role or a user-created
        # custom role.
        #
        # For some types of Google Cloud resources, a `binding` can also specify a
        # `condition`, which is a logical expression that allows access to a resource
        # only if the expression evaluates to `true`. A condition can add constraints
        # based on attributes of the request, the resource, or both. To learn which
        # resources support conditions in their IAM policies, see the
        # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
        #
        # **JSON example:**
        #
        #     {
        #       &quot;bindings&quot;: [
        #         {
        #           &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;,
        #           &quot;members&quot;: [
        #             &quot;user:mike@example.com&quot;,
        #             &quot;group:admins@example.com&quot;,
        #             &quot;domain:google.com&quot;,
        #             &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot;
        #           ]
        #         },
        #         {
        #           &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;,
        #           &quot;members&quot;: [
        #             &quot;user:eve@example.com&quot;
        #           ],
        #           &quot;condition&quot;: {
        #             &quot;title&quot;: &quot;expirable access&quot;,
        #             &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;,
        #             &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;,
        #           }
        #         }
        #       ],
        #       &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;,
        #       &quot;version&quot;: 3
        #     }
        #
        # **YAML example:**
        #
        #     bindings:
        #     - members:
        #       - user:mike@example.com
        #       - group:admins@example.com
        #       - domain:google.com
        #       - serviceAccount:my-project-id@appspot.gserviceaccount.com
        #       role: roles/resourcemanager.organizationAdmin
        #     - members:
        #       - user:eve@example.com
        #       role: roles/resourcemanager.organizationViewer
        #       condition:
        #         title: expirable access
        #         description: Does not grant access after Sep 2020
        #         expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)
        #     - etag: BwWWja0YfJA=
        #     - version: 3
        #
        # For a description of IAM and its features, see the
        # [IAM documentation](https://cloud.google.com/iam/docs/).
      &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a
          # `condition` that determines how and when the `bindings` are applied. Each
          # of the `bindings` must contain at least one member.
        { # Associates `members` with a `role`.
          &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) # The condition that is associated with this binding.
              #
              # If the condition evaluates to `true`, then this binding applies to the
              # current request.
              #
              # If the condition evaluates to `false`, then this binding does not apply to
              # the current request. However, a different role binding might grant the same
              # role to one or more of the members in this binding.
              #
              # To learn which resources support conditions in their IAM policies, see the
              # [IAM
              # documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
              # syntax. CEL is a C-like expression language. The syntax and semantics of CEL
              # are documented at https://github.com/google/cel-spec.
              #
              # Example (Comparison):
              #
              #     title: &quot;Summary size limit&quot;
              #     description: &quot;Determines if a summary is less than 100 chars&quot;
              #     expression: &quot;document.summary.size() &lt; 100&quot;
              #
              # Example (Equality):
              #
              #     title: &quot;Requestor is owner&quot;
              #     description: &quot;Determines if requestor is the document owner&quot;
              #     expression: &quot;document.owner == request.auth.claims.email&quot;
              #
              # Example (Logic):
              #
              #     title: &quot;Public documents&quot;
              #     description: &quot;Determine whether the document should be publicly visible&quot;
              #     expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot;
              #
              # Example (Data Manipulation):
              #
              #     title: &quot;Notification string&quot;
              #     description: &quot;Create a notification string with a timestamp.&quot;
              #     expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot;
              #
              # The exact variables and functions that may be referenced within an expression
              # are determined by the service that evaluates it. See the service
              # documentation for additional information.
            &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which
                # describes the expression, e.g. when hovered over it in a UI.
            &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language
                # syntax.
            &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing
                # its purpose. This can be used e.g. in UIs which allow to enter the
                # expression.
            &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error
                # reporting, e.g. a file name and a position in the file.
          },
          &quot;members&quot;: [ # 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@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`.
              #
              # * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique
              #    identifier) representing a user that has been recently deleted. For
              #    example, `alice@example.com?uid=123456789012345678901`. If the user is
              #    recovered, this value reverts to `user:{emailid}` and the recovered user
              #    retains the role in the binding.
              #
              # * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus
              #    unique identifier) representing a service account that has been recently
              #    deleted. For example,
              #    `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`.
              #    If the service account is undeleted, this value reverts to
              #    `serviceAccount:{emailid}` and the undeleted service account retains the
              #    role in the binding.
              #
              # * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique
              #    identifier) representing a Google group that has been recently
              #    deleted. For example, `admins@example.com?uid=123456789012345678901`. If
              #    the group is recovered, this value reverts to `group:{emailid}` and the
              #    recovered group retains the role in the binding.
              #
              #
              # * `domain:{domain}`: The G Suite domain (primary) that represents all the
              #    users of that domain. For example, `google.com` or `example.com`.
              #
            &quot;A String&quot;,
          ],
          &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
              # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        },
      ],
      &quot;etag&quot;: &quot;A String&quot;, # `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.
          #
          # **Important:** If you use IAM Conditions, you must include the `etag` field
          # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
          # you to overwrite a version `3` policy with a version `1` policy, and all of
          # the conditions in the version `3` policy are lost.
      &quot;version&quot;: 42, # Specifies the format of the policy.
          #
          # Valid values are `0`, `1`, and `3`. Requests that specify an invalid value
          # are rejected.
          #
          # Any operation that affects conditional role bindings must specify version
          # `3`. This requirement applies to the following operations:
          #
          # * Getting a policy that includes a conditional role binding
          # * Adding a conditional role binding to a policy
          # * Changing a conditional role binding in a policy
          # * Removing any role binding, with or without a condition, from a policy
          #   that includes conditions
          #
          # **Important:** If you use IAM Conditions, you must include the `etag` field
          # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
          # you to overwrite a version `3` policy with a version `1` policy, and all of
          # the conditions in the version `3` policy are lost.
          #
          # If a policy does not include any conditions, operations on that policy may
          # specify any valid version or leave the field unset.
          #
          # To learn which resources support conditions in their IAM policies, see the
          # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
    },
  }

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

Returns:
  An object of the form:

    { # An Identity and Access Management (IAM) policy, which specifies access
      # controls for Google Cloud resources.
      #
      #
      # A `Policy` is a collection of `bindings`. A `binding` binds one or more
      # `members` to a single `role`. Members can be user accounts, service accounts,
      # Google groups, and domains (such as G Suite). A `role` is a named list of
      # permissions; each `role` can be an IAM predefined role or a user-created
      # custom role.
      #
      # For some types of Google Cloud resources, a `binding` can also specify a
      # `condition`, which is a logical expression that allows access to a resource
      # only if the expression evaluates to `true`. A condition can add constraints
      # based on attributes of the request, the resource, or both. To learn which
      # resources support conditions in their IAM policies, see the
      # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
      #
      # **JSON example:**
      #
      #     {
      #       &quot;bindings&quot;: [
      #         {
      #           &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;,
      #           &quot;members&quot;: [
      #             &quot;user:mike@example.com&quot;,
      #             &quot;group:admins@example.com&quot;,
      #             &quot;domain:google.com&quot;,
      #             &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot;
      #           ]
      #         },
      #         {
      #           &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;,
      #           &quot;members&quot;: [
      #             &quot;user:eve@example.com&quot;
      #           ],
      #           &quot;condition&quot;: {
      #             &quot;title&quot;: &quot;expirable access&quot;,
      #             &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;,
      #             &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;,
      #           }
      #         }
      #       ],
      #       &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;,
      #       &quot;version&quot;: 3
      #     }
      #
      # **YAML example:**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-project-id@appspot.gserviceaccount.com
      #       role: roles/resourcemanager.organizationAdmin
      #     - members:
      #       - user:eve@example.com
      #       role: roles/resourcemanager.organizationViewer
      #       condition:
      #         title: expirable access
      #         description: Does not grant access after Sep 2020
      #         expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)
      #     - etag: BwWWja0YfJA=
      #     - version: 3
      #
      # For a description of IAM and its features, see the
      # [IAM documentation](https://cloud.google.com/iam/docs/).
    &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a
        # `condition` that determines how and when the `bindings` are applied. Each
        # of the `bindings` must contain at least one member.
      { # Associates `members` with a `role`.
        &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) # The condition that is associated with this binding.
            #
            # If the condition evaluates to `true`, then this binding applies to the
            # current request.
            #
            # If the condition evaluates to `false`, then this binding does not apply to
            # the current request. However, a different role binding might grant the same
            # role to one or more of the members in this binding.
            #
            # To learn which resources support conditions in their IAM policies, see the
            # [IAM
            # documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
            # syntax. CEL is a C-like expression language. The syntax and semantics of CEL
            # are documented at https://github.com/google/cel-spec.
            #
            # Example (Comparison):
            #
            #     title: &quot;Summary size limit&quot;
            #     description: &quot;Determines if a summary is less than 100 chars&quot;
            #     expression: &quot;document.summary.size() &lt; 100&quot;
            #
            # Example (Equality):
            #
            #     title: &quot;Requestor is owner&quot;
            #     description: &quot;Determines if requestor is the document owner&quot;
            #     expression: &quot;document.owner == request.auth.claims.email&quot;
            #
            # Example (Logic):
            #
            #     title: &quot;Public documents&quot;
            #     description: &quot;Determine whether the document should be publicly visible&quot;
            #     expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot;
            #
            # Example (Data Manipulation):
            #
            #     title: &quot;Notification string&quot;
            #     description: &quot;Create a notification string with a timestamp.&quot;
            #     expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot;
            #
            # The exact variables and functions that may be referenced within an expression
            # are determined by the service that evaluates it. See the service
            # documentation for additional information.
          &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language
              # syntax.
          &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing
              # its purpose. This can be used e.g. in UIs which allow to enter the
              # expression.
          &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
        },
        &quot;members&quot;: [ # 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@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`.
            #
            # * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique
            #    identifier) representing a user that has been recently deleted. For
            #    example, `alice@example.com?uid=123456789012345678901`. If the user is
            #    recovered, this value reverts to `user:{emailid}` and the recovered user
            #    retains the role in the binding.
            #
            # * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus
            #    unique identifier) representing a service account that has been recently
            #    deleted. For example,
            #    `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`.
            #    If the service account is undeleted, this value reverts to
            #    `serviceAccount:{emailid}` and the undeleted service account retains the
            #    role in the binding.
            #
            # * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique
            #    identifier) representing a Google group that has been recently
            #    deleted. For example, `admins@example.com?uid=123456789012345678901`. If
            #    the group is recovered, this value reverts to `group:{emailid}` and the
            #    recovered group retains the role in the binding.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          &quot;A String&quot;,
        ],
        &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
      },
    ],
    &quot;etag&quot;: &quot;A String&quot;, # `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.
        #
        # **Important:** If you use IAM Conditions, you must include the `etag` field
        # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
        # you to overwrite a version `3` policy with a version `1` policy, and all of
        # the conditions in the version `3` policy are lost.
    &quot;version&quot;: 42, # Specifies the format of the policy.
        #
        # Valid values are `0`, `1`, and `3`. Requests that specify an invalid value
        # are rejected.
        #
        # Any operation that affects conditional role bindings must specify version
        # `3`. This requirement applies to the following operations:
        #
        # * Getting a policy that includes a conditional role binding
        # * Adding a conditional role binding to a policy
        # * Changing a conditional role binding in a policy
        # * Removing any role binding, with or without a condition, from a policy
        #   that includes conditions
        #
        # **Important:** If you use IAM Conditions, you must include the `etag` field
        # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
        # you to overwrite a version `3` policy with a version `1` policy, and all of
        # the conditions in the version `3` policy are lost.
        #
        # If a policy does not include any conditions, operations on that policy may
        # specify any valid version or leave the field unset.
        #
        # To learn which resources support conditions in their IAM policies, see the
        # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
  }</pre>
</div>

<div class="method">
    <code class="details" id="testIamPermissions">testIamPermissions(resource, body=None, x__xgafv=None)</code>
  <pre>Returns permissions that a caller has on the specified resource.
If the resource does not exist, this will return an empty set of
permissions, not a NOT_FOUND error.

Args:
  resource: string, REQUIRED: The resource for which the policy detail is being requested.
See the operation documentation for the appropriate value for this field. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for `TestIamPermissions` method.
    &quot;permissions&quot;: [ # The set of permissions to check for the `resource`. Permissions with
        # wildcards (such as &#x27;*&#x27; or &#x27;storage.*&#x27;) are not allowed. For more
        # information see
        # [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).
      &quot;A String&quot;,
    ],
  }

  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.
    &quot;permissions&quot;: [ # A subset of `TestPermissionsRequest.permissions` that the caller is
        # allowed.
      &quot;A String&quot;,
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="unbindDeviceFromGateway">unbindDeviceFromGateway(parent, body=None, x__xgafv=None)</code>
  <pre>Deletes the association between the device and the gateway.

Args:
  parent: string, Required. The name of the registry. For example,
`projects/example-project/locations/us-central1/registries/my-registry`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request for `UnbindDeviceFromGateway`.
    &quot;gatewayId&quot;: &quot;A String&quot;, # Required. The value of `gateway_id` can be either the device numeric ID or the
        # user-defined device identifier.
    &quot;deviceId&quot;: &quot;A String&quot;, # Required. The device to disassociate from the specified gateway. The value of
        # `device_id` can be either the device numeric ID or the user-defined device
        # identifier.
  }

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

Returns:
  An object of the form:

    { # Response for `UnbindDeviceFromGateway`.
  }</pre>
</div>

</body></html>