<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="cloudresourcemanager_v2.html">Cloud Resource Manager API</a> . <a href="cloudresourcemanager_v2.folders.html">folders</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(body=None, parent=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a Folder in the resource hierarchy.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Requests deletion of a Folder. The Folder is moved into the</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Retrieves a Folder identified by the supplied resource name.</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 Folder. The returned policy may be</p>
<p class="toc_element">
  <code><a href="#list">list(pageToken=None, pageSize=None, parent=None, showDeleted=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists the Folders that are direct descendants of supplied parent resource.</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="#move">move(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Moves a Folder under a new resource parent.</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 Folder, changing its display_name.</p>
<p class="toc_element">
  <code><a href="#search">search(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Search for folders that match specific filter criteria.</p>
<p class="toc_element">
  <code><a href="#search_next">search_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="#setIamPolicy">setIamPolicy(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Sets the access control policy on a Folder, replacing any existing policy.</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 Folder.</p>
<p class="toc_element">
  <code><a href="#undelete">undelete(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Cancels the deletion request for a Folder. This method may only be</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(body=None, parent=None, x__xgafv=None)</code>
  <pre>Creates a Folder in the resource hierarchy.
Returns an Operation which can be used to track the progress of the
folder creation workflow.
Upon success the Operation.response field will be populated with the
created Folder.

In order to succeed, the addition of this new Folder must not violate
the Folder naming, height or fanout constraints.

+ The Folder&#x27;s display_name must be distinct from all other Folder&#x27;s that
share its parent.
+ The addition of the Folder must not cause the active Folder hierarchy
to exceed a height of 4. Note, the full active + deleted Folder hierarchy
is allowed to reach a height of 8; this provides additional headroom when
moving folders that contain deleted folders.
+ The addition of the Folder must not cause the total number of Folders
under its parent to exceed 100.

If the operation fails due to a folder constraint violation, some errors
may be returned by the CreateFolder request, with status code
FAILED_PRECONDITION and an error description. Other folder constraint
violations will be communicated in the Operation, with the specific
PreconditionFailure returned via the details list in the Operation.error
field.

The caller must have `resourcemanager.folders.create` permission on the
identified parent.

Args:
  body: object, The request body.
    The object takes the form of:

{ # A Folder in an Organization&#x27;s resource hierarchy, used to
    # organize that Organization&#x27;s resources.
  &quot;parent&quot;: &quot;A String&quot;, # Required. The Folder’s parent&#x27;s resource name.
      # Updates to the folder&#x27;s parent must be performed via
      # MoveFolder.
  &quot;createTime&quot;: &quot;A String&quot;, # Output only. Timestamp when the Folder was created. Assigned by the server.
  &quot;lifecycleState&quot;: &quot;A String&quot;, # Output only. The lifecycle state of the folder.
      # Updates to the lifecycle_state must be performed via
      # DeleteFolder and
      # UndeleteFolder.
  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the Folder.
      # Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;.
  &quot;displayName&quot;: &quot;A String&quot;, # The folder’s display name.
      # A folder’s display name must be unique amongst its siblings, e.g.
      # no two folders with the same parent can share the same display name.
      # The display name must start and end with a letter or digit, may contain
      # letters, digits, spaces, hyphens and underscores and can be no longer
      # than 30 characters. This is captured by the regular expression:
      # [\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
}

  parent: string, Required. The resource name of the new Folder&#x27;s parent.
Must be of the form `folders/{folder_id}` or `organizations/{org_id}`.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Requests deletion of a Folder. The Folder is moved into the
DELETE_REQUESTED state
immediately, and is deleted approximately 30 days later. This method may
only be called on an empty Folder in the
ACTIVE state, where a Folder is empty if
it doesn&#x27;t contain any Folders or Projects in the
ACTIVE state.
The caller must have `resourcemanager.folders.delete` permission on the
identified folder.

Args:
  name: string, Required. the resource name of the Folder to be deleted.
Must be of the form `folders/{folder_id}`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A Folder in an Organization&#x27;s resource hierarchy, used to
      # organize that Organization&#x27;s resources.
    &quot;parent&quot;: &quot;A String&quot;, # Required. The Folder’s parent&#x27;s resource name.
        # Updates to the folder&#x27;s parent must be performed via
        # MoveFolder.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. Timestamp when the Folder was created. Assigned by the server.
    &quot;lifecycleState&quot;: &quot;A String&quot;, # Output only. The lifecycle state of the folder.
        # Updates to the lifecycle_state must be performed via
        # DeleteFolder and
        # UndeleteFolder.
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the Folder.
        # Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;.
    &quot;displayName&quot;: &quot;A String&quot;, # The folder’s display name.
        # A folder’s display name must be unique amongst its siblings, e.g.
        # no two folders with the same parent can share the same display name.
        # The display name must start and end with a letter or digit, may contain
        # letters, digits, spaces, hyphens and underscores and can be no longer
        # than 30 characters. This is captured by the regular expression:
        # [\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Retrieves a Folder identified by the supplied resource name.
Valid Folder resource names have the format `folders/{folder_id}`
(for example, `folders/1234`).
The caller must have `resourcemanager.folders.get` permission on the
identified folder.

Args:
  name: string, Required. The resource name of the Folder to retrieve.
Must be of the form `folders/{folder_id}`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A Folder in an Organization&#x27;s resource hierarchy, used to
      # organize that Organization&#x27;s resources.
    &quot;parent&quot;: &quot;A String&quot;, # Required. The Folder’s parent&#x27;s resource name.
        # Updates to the folder&#x27;s parent must be performed via
        # MoveFolder.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. Timestamp when the Folder was created. Assigned by the server.
    &quot;lifecycleState&quot;: &quot;A String&quot;, # Output only. The lifecycle state of the folder.
        # Updates to the lifecycle_state must be performed via
        # DeleteFolder and
        # UndeleteFolder.
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the Folder.
        # Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;.
    &quot;displayName&quot;: &quot;A String&quot;, # The folder’s display name.
        # A folder’s display name must be unique amongst its siblings, e.g.
        # no two folders with the same parent can share the same display name.
        # The display name must start and end with a letter or digit, may contain
        # letters, digits, spaces, hyphens and underscores and can be no longer
        # than 30 characters. This is captured by the regular expression:
        # [\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
  }</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 Folder. The returned policy may be
empty if no such policy or resource exists. The `resource` field should
be the Folder&#x27;s resource name, e.g. &quot;folders/1234&quot;.
The caller must have `resourcemanager.folders.getIamPolicy` permission
on the identified folder.

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;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;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;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).
    &quot;auditConfigs&quot;: [ # 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 AuditConfig 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
          # AuditLogConfig are exempted.
          #
          # Example Policy with multiple AuditConfigs:
          #
          #     {
          #       &quot;audit_configs&quot;: [
          #         {
          #           &quot;service&quot;: &quot;allServices&quot;
          #           &quot;audit_log_configs&quot;: [
          #             {
          #               &quot;log_type&quot;: &quot;DATA_READ&quot;,
          #               &quot;exempted_members&quot;: [
          #                 &quot;user:jose@example.com&quot;
          #               ]
          #             },
          #             {
          #               &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
          #             },
          #             {
          #               &quot;log_type&quot;: &quot;ADMIN_READ&quot;,
          #             }
          #           ]
          #         },
          #         {
          #           &quot;service&quot;: &quot;sampleservice.googleapis.com&quot;
          #           &quot;audit_log_configs&quot;: [
          #             {
          #               &quot;log_type&quot;: &quot;DATA_READ&quot;,
          #             },
          #             {
          #               &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
          #               &quot;exempted_members&quot;: [
          #                 &quot;user:aliya@example.com&quot;
          #               ]
          #             }
          #           ]
          #         }
          #       ]
          #     }
          #
          # For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
          # logging. It also exempts jose@example.com from DATA_READ logging, and
          # aliya@example.com from DATA_WRITE logging.
        &quot;service&quot;: &quot;A String&quot;, # 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.
        &quot;auditLogConfigs&quot;: [ # The configuration for logging of each type of permission.
          { # Provides the configuration for logging a type of permissions.
              # Example:
              #
              #     {
              #       &quot;audit_log_configs&quot;: [
              #         {
              #           &quot;log_type&quot;: &quot;DATA_READ&quot;,
              #           &quot;exempted_members&quot;: [
              #             &quot;user:jose@example.com&quot;
              #           ]
              #         },
              #         {
              #           &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
              #         }
              #       ]
              #     }
              #
              # This enables &#x27;DATA_READ&#x27; and &#x27;DATA_WRITE&#x27; logging, while exempting
              # jose@example.com from DATA_READ logging.
            &quot;exemptedMembers&quot;: [ # Specifies the identities that do not cause logging for this type of
                # permission.
                # Follows the same format of Binding.members.
              &quot;A String&quot;,
            ],
            &quot;logType&quot;: &quot;A String&quot;, # The log type that this config enables.
          },
        ],
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(pageToken=None, pageSize=None, parent=None, showDeleted=None, x__xgafv=None)</code>
  <pre>Lists the Folders that are direct descendants of supplied parent resource.
List provides a strongly consistent view of the Folders underneath
the specified parent resource.
List returns Folders sorted based upon the (ascending) lexical ordering
of their display_name.
The caller must have `resourcemanager.folders.list` permission on the
identified parent.

Args:
  pageToken: string, Optional. A pagination token returned from a previous call to `ListFolders`
that indicates where this listing should continue from.
  pageSize: integer, Optional. The maximum number of Folders to return in the response.
  parent: string, Required. The resource name of the Organization or Folder whose Folders are
being listed.
Must be of the form `folders/{folder_id}` or `organizations/{org_id}`.
Access to this method is controlled by checking the
`resourcemanager.folders.list` permission on the `parent`.
  showDeleted: boolean, Optional. Controls whether Folders in the
DELETE_REQUESTED
state should be returned. Defaults to false.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The ListFolders response message.
    &quot;folders&quot;: [ # A possibly paginated list of Folders that are direct descendants of
        # the specified parent resource.
      { # A Folder in an Organization&#x27;s resource hierarchy, used to
          # organize that Organization&#x27;s resources.
        &quot;parent&quot;: &quot;A String&quot;, # Required. The Folder’s parent&#x27;s resource name.
            # Updates to the folder&#x27;s parent must be performed via
            # MoveFolder.
        &quot;createTime&quot;: &quot;A String&quot;, # Output only. Timestamp when the Folder was created. Assigned by the server.
        &quot;lifecycleState&quot;: &quot;A String&quot;, # Output only. The lifecycle state of the folder.
            # Updates to the lifecycle_state must be performed via
            # DeleteFolder and
            # UndeleteFolder.
        &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the Folder.
            # Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;.
        &quot;displayName&quot;: &quot;A String&quot;, # The folder’s display name.
            # A folder’s display name must be unique amongst its siblings, e.g.
            # no two folders with the same parent can share the same display name.
            # The display name must start and end with a letter or digit, may contain
            # letters, digits, spaces, hyphens and underscores and can be no longer
            # than 30 characters. This is captured by the regular expression:
            # [\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # A pagination token returned from a previous call to `ListFolders`
        # that indicates from where listing should continue.
  }</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="move">move(name, body=None, x__xgafv=None)</code>
  <pre>Moves a Folder under a new resource parent.
Returns an Operation which can be used to track the progress of the
folder move workflow.
Upon success the Operation.response field will be populated with the
moved Folder.
Upon failure, a FolderOperationError categorizing the failure cause will
be returned - if the failure occurs synchronously then the
FolderOperationError will be returned via the Status.details field
and if it occurs asynchronously then the FolderOperation will be returned
via the Operation.error field.
In addition, the Operation.metadata field will be populated with a
FolderOperation message as an aid to stateless clients.
Folder moves will be rejected if they violate either the naming, height
or fanout constraints described in the
CreateFolder documentation.
The caller must have `resourcemanager.folders.move` permission on the
folder&#x27;s current and proposed new parent.

Args:
  name: string, Required. The resource name of the Folder to move.
Must be of the form folders/{folder_id} (required)
  body: object, The request body.
    The object takes the form of:

{ # The MoveFolder request message.
    &quot;destinationParent&quot;: &quot;A String&quot;, # Required. The resource name of the Folder or Organization to reparent
        # the folder under.
        # Must be of the form `folders/{folder_id}` or `organizations/{org_id}`.
  }

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

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates a Folder, changing its display_name.
Changes to the folder display_name will be rejected if they violate either
the display_name formatting rules or naming constraints described in
the CreateFolder documentation.

The Folder&#x27;s display name must start and end with a letter or digit,
may contain letters, digits, spaces, hyphens and underscores and can be
no longer than 30 characters. This is captured by the regular expression:
[\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
The caller must have `resourcemanager.folders.update` permission on the
identified folder.

If the update fails due to the unique name constraint then a
PreconditionFailure explaining this violation will be returned
in the Status.details field.

Args:
  name: string, Output only. The resource name of the Folder.
Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;. (required)
  body: object, The request body.
    The object takes the form of:

{ # A Folder in an Organization&#x27;s resource hierarchy, used to
    # organize that Organization&#x27;s resources.
  &quot;parent&quot;: &quot;A String&quot;, # Required. The Folder’s parent&#x27;s resource name.
      # Updates to the folder&#x27;s parent must be performed via
      # MoveFolder.
  &quot;createTime&quot;: &quot;A String&quot;, # Output only. Timestamp when the Folder was created. Assigned by the server.
  &quot;lifecycleState&quot;: &quot;A String&quot;, # Output only. The lifecycle state of the folder.
      # Updates to the lifecycle_state must be performed via
      # DeleteFolder and
      # UndeleteFolder.
  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the Folder.
      # Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;.
  &quot;displayName&quot;: &quot;A String&quot;, # The folder’s display name.
      # A folder’s display name must be unique amongst its siblings, e.g.
      # no two folders with the same parent can share the same display name.
      # The display name must start and end with a letter or digit, may contain
      # letters, digits, spaces, hyphens and underscores and can be no longer
      # than 30 characters. This is captured by the regular expression:
      # [\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
}

  updateMask: string, Required. Fields to be updated.
Only the `display_name` can be updated.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A Folder in an Organization&#x27;s resource hierarchy, used to
      # organize that Organization&#x27;s resources.
    &quot;parent&quot;: &quot;A String&quot;, # Required. The Folder’s parent&#x27;s resource name.
        # Updates to the folder&#x27;s parent must be performed via
        # MoveFolder.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. Timestamp when the Folder was created. Assigned by the server.
    &quot;lifecycleState&quot;: &quot;A String&quot;, # Output only. The lifecycle state of the folder.
        # Updates to the lifecycle_state must be performed via
        # DeleteFolder and
        # UndeleteFolder.
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the Folder.
        # Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;.
    &quot;displayName&quot;: &quot;A String&quot;, # The folder’s display name.
        # A folder’s display name must be unique amongst its siblings, e.g.
        # no two folders with the same parent can share the same display name.
        # The display name must start and end with a letter or digit, may contain
        # letters, digits, spaces, hyphens and underscores and can be no longer
        # than 30 characters. This is captured by the regular expression:
        # [\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
  }</pre>
</div>

<div class="method">
    <code class="details" id="search">search(body=None, x__xgafv=None)</code>
  <pre>Search for folders that match specific filter criteria.
Search provides an eventually consistent view of the folders a user has
access to which meet the specified filter criteria.

This will only return folders on which the caller has the
permission `resourcemanager.folders.get`.

Args:
  body: object, The request body.
    The object takes the form of:

{ # The request message for searching folders.
    &quot;pageToken&quot;: &quot;A String&quot;, # Optional. A pagination token returned from a previous call to `SearchFolders`
        # that indicates from where search should continue.
    &quot;pageSize&quot;: 42, # Optional. The maximum number of folders to return in the response.
    &quot;query&quot;: &quot;A String&quot;, # Search criteria used to select the Folders to return.
        # If no search criteria is specified then all accessible folders will be
        # returned.
        # 
        # Query expressions can be used to restrict results based upon displayName,
        # lifecycleState and parent, where the operators `=`, `NOT`, `AND` and `OR`
        # can be used along with the suffix wildcard symbol `*`.
        # 
        # The displayName field in a query expression should use escaped quotes
        # for values that include whitespace to prevent unexpected behavior.
        # 
        # Some example queries are:
        # 
        # * Query `displayName=Test*` returns Folder resources whose display name
        # starts with &quot;Test&quot;.
        # * Query `lifecycleState=ACTIVE` returns Folder resources with
        # `lifecycleState` set to `ACTIVE`.
        # * Query `parent=folders/123` returns Folder resources that have
        # `folders/123` as a parent resource.
        # * Query `parent=folders/123 AND lifecycleState=ACTIVE` returns active
        # Folder resources that have `folders/123` as a parent resource.
        # * Query `displayName=\\&quot;Test String\\&quot;` returns Folder resources with
        # display names that include both &quot;Test&quot; and &quot;String&quot;.
  }

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

Returns:
  An object of the form:

    { # The response message for searching folders.
    &quot;folders&quot;: [ # A possibly paginated folder search results.
        # the specified parent resource.
      { # A Folder in an Organization&#x27;s resource hierarchy, used to
          # organize that Organization&#x27;s resources.
        &quot;parent&quot;: &quot;A String&quot;, # Required. The Folder’s parent&#x27;s resource name.
            # Updates to the folder&#x27;s parent must be performed via
            # MoveFolder.
        &quot;createTime&quot;: &quot;A String&quot;, # Output only. Timestamp when the Folder was created. Assigned by the server.
        &quot;lifecycleState&quot;: &quot;A String&quot;, # Output only. The lifecycle state of the folder.
            # Updates to the lifecycle_state must be performed via
            # DeleteFolder and
            # UndeleteFolder.
        &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the Folder.
            # Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;.
        &quot;displayName&quot;: &quot;A String&quot;, # The folder’s display name.
            # A folder’s display name must be unique amongst its siblings, e.g.
            # no two folders with the same parent can share the same display name.
            # The display name must start and end with a letter or digit, may contain
            # letters, digits, spaces, hyphens and underscores and can be no longer
            # than 30 characters. This is captured by the regular expression:
            # [\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # A pagination token returned from a previous call to `SearchFolders`
        # that indicates from where searching should continue.
  }</pre>
</div>

<div class="method">
    <code class="details" id="search_next">search_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="setIamPolicy">setIamPolicy(resource, body=None, x__xgafv=None)</code>
  <pre>Sets the access control policy on a Folder, replacing any existing policy.
The `resource` field should be the Folder&#x27;s resource name, e.g.
&quot;folders/1234&quot;.
The caller must have `resourcemanager.folders.setIamPolicy` permission
on the identified folder.

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;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;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;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).
      &quot;auditConfigs&quot;: [ # 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 AuditConfig 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
            # AuditLogConfig are exempted.
            #
            # Example Policy with multiple AuditConfigs:
            #
            #     {
            #       &quot;audit_configs&quot;: [
            #         {
            #           &quot;service&quot;: &quot;allServices&quot;
            #           &quot;audit_log_configs&quot;: [
            #             {
            #               &quot;log_type&quot;: &quot;DATA_READ&quot;,
            #               &quot;exempted_members&quot;: [
            #                 &quot;user:jose@example.com&quot;
            #               ]
            #             },
            #             {
            #               &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
            #             },
            #             {
            #               &quot;log_type&quot;: &quot;ADMIN_READ&quot;,
            #             }
            #           ]
            #         },
            #         {
            #           &quot;service&quot;: &quot;sampleservice.googleapis.com&quot;
            #           &quot;audit_log_configs&quot;: [
            #             {
            #               &quot;log_type&quot;: &quot;DATA_READ&quot;,
            #             },
            #             {
            #               &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
            #               &quot;exempted_members&quot;: [
            #                 &quot;user:aliya@example.com&quot;
            #               ]
            #             }
            #           ]
            #         }
            #       ]
            #     }
            #
            # For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
            # logging. It also exempts jose@example.com from DATA_READ logging, and
            # aliya@example.com from DATA_WRITE logging.
          &quot;service&quot;: &quot;A String&quot;, # 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.
          &quot;auditLogConfigs&quot;: [ # The configuration for logging of each type of permission.
            { # Provides the configuration for logging a type of permissions.
                # Example:
                #
                #     {
                #       &quot;audit_log_configs&quot;: [
                #         {
                #           &quot;log_type&quot;: &quot;DATA_READ&quot;,
                #           &quot;exempted_members&quot;: [
                #             &quot;user:jose@example.com&quot;
                #           ]
                #         },
                #         {
                #           &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
                #         }
                #       ]
                #     }
                #
                # This enables &#x27;DATA_READ&#x27; and &#x27;DATA_WRITE&#x27; logging, while exempting
                # jose@example.com from DATA_READ logging.
              &quot;exemptedMembers&quot;: [ # Specifies the identities that do not cause logging for this type of
                  # permission.
                  # Follows the same format of Binding.members.
                &quot;A String&quot;,
              ],
              &quot;logType&quot;: &quot;A String&quot;, # The log type that this config enables.
            },
          ],
        },
      ],
    },
    &quot;updateMask&quot;: &quot;A String&quot;, # 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: &quot;bindings, etag&quot;`
  }

  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;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;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;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).
    &quot;auditConfigs&quot;: [ # 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 AuditConfig 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
          # AuditLogConfig are exempted.
          #
          # Example Policy with multiple AuditConfigs:
          #
          #     {
          #       &quot;audit_configs&quot;: [
          #         {
          #           &quot;service&quot;: &quot;allServices&quot;
          #           &quot;audit_log_configs&quot;: [
          #             {
          #               &quot;log_type&quot;: &quot;DATA_READ&quot;,
          #               &quot;exempted_members&quot;: [
          #                 &quot;user:jose@example.com&quot;
          #               ]
          #             },
          #             {
          #               &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
          #             },
          #             {
          #               &quot;log_type&quot;: &quot;ADMIN_READ&quot;,
          #             }
          #           ]
          #         },
          #         {
          #           &quot;service&quot;: &quot;sampleservice.googleapis.com&quot;
          #           &quot;audit_log_configs&quot;: [
          #             {
          #               &quot;log_type&quot;: &quot;DATA_READ&quot;,
          #             },
          #             {
          #               &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
          #               &quot;exempted_members&quot;: [
          #                 &quot;user:aliya@example.com&quot;
          #               ]
          #             }
          #           ]
          #         }
          #       ]
          #     }
          #
          # For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
          # logging. It also exempts jose@example.com from DATA_READ logging, and
          # aliya@example.com from DATA_WRITE logging.
        &quot;service&quot;: &quot;A String&quot;, # 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.
        &quot;auditLogConfigs&quot;: [ # The configuration for logging of each type of permission.
          { # Provides the configuration for logging a type of permissions.
              # Example:
              #
              #     {
              #       &quot;audit_log_configs&quot;: [
              #         {
              #           &quot;log_type&quot;: &quot;DATA_READ&quot;,
              #           &quot;exempted_members&quot;: [
              #             &quot;user:jose@example.com&quot;
              #           ]
              #         },
              #         {
              #           &quot;log_type&quot;: &quot;DATA_WRITE&quot;,
              #         }
              #       ]
              #     }
              #
              # This enables &#x27;DATA_READ&#x27; and &#x27;DATA_WRITE&#x27; logging, while exempting
              # jose@example.com from DATA_READ logging.
            &quot;exemptedMembers&quot;: [ # Specifies the identities that do not cause logging for this type of
                # permission.
                # Follows the same format of Binding.members.
              &quot;A String&quot;,
            ],
            &quot;logType&quot;: &quot;A String&quot;, # The log type that this config enables.
          },
        ],
      },
    ],
  }</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 Folder.
The `resource` field should be the Folder&#x27;s resource name,
e.g. &quot;folders/1234&quot;.

There are no permissions required for making this API call.

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="undelete">undelete(name, body=None, x__xgafv=None)</code>
  <pre>Cancels the deletion request for a Folder. This method may only be
called on a Folder in the
DELETE_REQUESTED state.
In order to succeed, the Folder&#x27;s parent must be in the
ACTIVE state.
In addition, reintroducing the folder into the tree must not violate
folder naming, height and fanout constraints described in the
CreateFolder documentation.
The caller must have `resourcemanager.folders.undelete` permission on the
identified folder.

Args:
  name: string, Required. The resource name of the Folder to undelete.
Must be of the form `folders/{folder_id}`. (required)
  body: object, The request body.
    The object takes the form of:

{ # The UndeleteFolder request message.
  }

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

Returns:
  An object of the form:

    { # A Folder in an Organization&#x27;s resource hierarchy, used to
      # organize that Organization&#x27;s resources.
    &quot;parent&quot;: &quot;A String&quot;, # Required. The Folder’s parent&#x27;s resource name.
        # Updates to the folder&#x27;s parent must be performed via
        # MoveFolder.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. Timestamp when the Folder was created. Assigned by the server.
    &quot;lifecycleState&quot;: &quot;A String&quot;, # Output only. The lifecycle state of the folder.
        # Updates to the lifecycle_state must be performed via
        # DeleteFolder and
        # UndeleteFolder.
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the Folder.
        # Its format is `folders/{folder_id}`, for example: &quot;folders/1234&quot;.
    &quot;displayName&quot;: &quot;A String&quot;, # The folder’s display name.
        # A folder’s display name must be unique amongst its siblings, e.g.
        # no two folders with the same parent can share the same display name.
        # The display name must start and end with a letter or digit, may contain
        # letters, digits, spaces, hyphens and underscores and can be no longer
        # than 30 characters. This is captured by the regular expression:
        # [\p{L}\p{N}]([\p{L}\p{N}_- ]{0,28}[\p{L}\p{N}])?.
  }</pre>
</div>

</body></html>