<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="serviceconsumermanagement_v1beta1.html">Service Consumer Management API</a> . <a href="serviceconsumermanagement_v1beta1.services.html">services</a> . <a href="serviceconsumermanagement_v1beta1.services.consumerQuotaMetrics.html">consumerQuotaMetrics</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="serviceconsumermanagement_v1beta1.services.consumerQuotaMetrics.limits.html">limits()</a></code>
</p>
<p class="firstline">Returns the limits Resource.</p>

<p class="toc_element">
  <code><a href="#get">get(name, view=None, x__xgafv=None)</a></code></p>
<p class="firstline">Retrieves a summary of quota information for a specific quota metric.</p>
<p class="toc_element">
  <code><a href="#importProducerOverrides">importProducerOverrides(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Create or update multiple producer overrides atomically, all on the</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageToken=None, pageSize=None, view=None, x__xgafv=None)</a></code></p>
<p class="firstline">Retrieves a summary of all quota information about this consumer that is</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>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="get">get(name, view=None, x__xgafv=None)</code>
  <pre>Retrieves a summary of quota information for a specific quota metric.

Args:
  name: string, The resource name of the quota metric, returned by a
ListConsumerQuotaMetrics call.

An example name would be:
`services/compute.googleapis.com/projects/123/consumerQuotaMetrics/compute.googleapis.com%2Fcpus` (required)
  view: string, Specifies the level of detail for quota information in the response.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Consumer quota settings for a quota metric.
    &quot;name&quot;: &quot;A String&quot;, # The resource name of the quota settings on this metric for this consumer.
        #
        # An example name would be:
        # `services/serviceconsumermanagement.googleapis.com/projects/123/quota/metrics/compute.googleapis.com%2Fcpus
        #
        # The resource name is intended to be opaque and should not be parsed for
        # its component strings, since its representation could change in the future.
    &quot;unit&quot;: &quot;A String&quot;, # The units in which the metric value is reported.
    &quot;displayName&quot;: &quot;A String&quot;, # The display name of the metric.
        #
        # An example name would be:
        # &quot;CPUs&quot;
    &quot;consumerQuotaLimits&quot;: [ # The consumer quota for each quota limit defined on the metric.
      { # Consumer quota settings for a quota limit.
        &quot;unit&quot;: &quot;A String&quot;, # The limit unit.
            #
            # An example unit would be:
            # `1/{project}/{region}`
            # Note that `{project}` and `{region}` are not placeholders in this example;
            # the literal characters `{` and `}` occur in the string.
        &quot;metric&quot;: &quot;A String&quot;, # The name of the parent metric of this limit.
            #
            # An example name would be:
            # `compute.googleapis.com/cpus`
        &quot;isPrecise&quot;: True or False, # Whether this limit is precise or imprecise.
        &quot;name&quot;: &quot;A String&quot;, # The resource name of the quota limit.
            #
            # An example name would be:
            # `services/compute.googleapis.com/projects/123/quotas/metrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion`
            #
            # The resource name is intended to be opaque and should not be parsed for
            # its component strings, since its representation could change in the future.
        &quot;quotaBuckets&quot;: [ # Summary of the enforced quota buckets, organized by quota dimension,
            # ordered from least specific to most specific (for example, the global
            # default bucket, with no quota dimensions, will always appear first).
          { # A quota bucket is a quota provisioning unit for a specific set of dimensions.
            &quot;effectiveLimit&quot;: &quot;A String&quot;, # The effective limit of this quota bucket. Equal to default_limit if there
                # are no overrides.
            &quot;dimensions&quot;: { # The dimensions of this quota bucket.
                #
                # If this map is empty, this is the global bucket, which is the default quota
                # value applied to all requests that do not have a more specific override.
                #
                # If this map is nonempty, the default limit, effective limit, and quota
                # overrides apply only to requests that have the dimensions given in the map.
                #
                # For example, if the map has key &quot;region&quot; and value &quot;us-east-1&quot;, then the
                # specified effective limit is only effective in that region, and the
                # specified overrides apply only in that region.
              &quot;a_key&quot;: &quot;A String&quot;,
            },
            &quot;defaultLimit&quot;: &quot;A String&quot;, # The default limit of this quota bucket, as specified by the service
                # configuration.
            &quot;producerOverride&quot;: { # A quota override # Producer override on this quota bucket.
              &quot;adminOverrideAncestor&quot;: &quot;A String&quot;, # The resource name of the ancestor that requested the override. For example:
                  # &quot;organizations/12345&quot; or &quot;folders/67890&quot;.
                  # Used by admin overrides only.
              &quot;dimensions&quot;: { #
                  # If this map is nonempty, then this override applies only to specific values
                  # for dimensions defined in the limit unit.
                  #
                  # For example, an override on a limit with the unit 1/{project}/{region}
                  # could contain an entry with the key &quot;region&quot; and the value &quot;us-east-1&quot;;
                  # the override is only applied to quota consumed in that region.
                  #
                  # This map has the following restrictions:
                  #
                  # *   Keys that are not defined in the limit&#x27;s unit are not valid keys.
                  #     Any string appearing in {brackets} in the unit (besides {project} or
                  #     {user}) is a defined key.
                  # *   &quot;project&quot; is not a valid key; the project is already specified in
                  #     the parent resource name.
                  # *   &quot;user&quot; is not a valid key; the API does not support quota overrides
                  #     that apply only to a specific user.
                  # *   If &quot;region&quot; appears as a key, its value must be a valid Cloud region.
                  # *   If &quot;zone&quot; appears as a key, its value must be a valid Cloud zone.
                  # *   If any valid key other than &quot;region&quot; or &quot;zone&quot; appears in the map, then
                  #     all valid keys other than &quot;region&quot; or &quot;zone&quot; must also appear in the
                  #     map.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;overrideValue&quot;: &quot;A String&quot;, # The overriding quota limit value.
                  # Can be any nonnegative integer, or -1 (unlimited quota).
              &quot;metric&quot;: &quot;A String&quot;, # The name of the metric to which this override applies.
                  #
                  # An example name would be:
                  # `compute.googleapis.com/cpus`
              &quot;unit&quot;: &quot;A String&quot;, # The limit unit of the limit to which this override applies.
                  #
                  # An example unit would be:
                  # `1/{project}/{region}`
                  # Note that `{project}` and `{region}` are not placeholders in this example;
                  # the literal characters `{` and `}` occur in the string.
              &quot;name&quot;: &quot;A String&quot;, # The resource name of the producer override.
                  # An example name would be:
                  # `services/compute.googleapis.com/projects/123/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion/producerOverrides/4a3f2c1d`
            },
            &quot;consumerOverride&quot;: { # A quota override # Consumer override on this quota bucket.
              &quot;adminOverrideAncestor&quot;: &quot;A String&quot;, # The resource name of the ancestor that requested the override. For example:
                  # &quot;organizations/12345&quot; or &quot;folders/67890&quot;.
                  # Used by admin overrides only.
              &quot;dimensions&quot;: { #
                  # If this map is nonempty, then this override applies only to specific values
                  # for dimensions defined in the limit unit.
                  #
                  # For example, an override on a limit with the unit 1/{project}/{region}
                  # could contain an entry with the key &quot;region&quot; and the value &quot;us-east-1&quot;;
                  # the override is only applied to quota consumed in that region.
                  #
                  # This map has the following restrictions:
                  #
                  # *   Keys that are not defined in the limit&#x27;s unit are not valid keys.
                  #     Any string appearing in {brackets} in the unit (besides {project} or
                  #     {user}) is a defined key.
                  # *   &quot;project&quot; is not a valid key; the project is already specified in
                  #     the parent resource name.
                  # *   &quot;user&quot; is not a valid key; the API does not support quota overrides
                  #     that apply only to a specific user.
                  # *   If &quot;region&quot; appears as a key, its value must be a valid Cloud region.
                  # *   If &quot;zone&quot; appears as a key, its value must be a valid Cloud zone.
                  # *   If any valid key other than &quot;region&quot; or &quot;zone&quot; appears in the map, then
                  #     all valid keys other than &quot;region&quot; or &quot;zone&quot; must also appear in the
                  #     map.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;overrideValue&quot;: &quot;A String&quot;, # The overriding quota limit value.
                  # Can be any nonnegative integer, or -1 (unlimited quota).
              &quot;metric&quot;: &quot;A String&quot;, # The name of the metric to which this override applies.
                  #
                  # An example name would be:
                  # `compute.googleapis.com/cpus`
              &quot;unit&quot;: &quot;A String&quot;, # The limit unit of the limit to which this override applies.
                  #
                  # An example unit would be:
                  # `1/{project}/{region}`
                  # Note that `{project}` and `{region}` are not placeholders in this example;
                  # the literal characters `{` and `}` occur in the string.
              &quot;name&quot;: &quot;A String&quot;, # The resource name of the producer override.
                  # An example name would be:
                  # `services/compute.googleapis.com/projects/123/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion/producerOverrides/4a3f2c1d`
            },
            &quot;adminOverride&quot;: { # A quota override # Admin override on this quota bucket.
              &quot;adminOverrideAncestor&quot;: &quot;A String&quot;, # The resource name of the ancestor that requested the override. For example:
                  # &quot;organizations/12345&quot; or &quot;folders/67890&quot;.
                  # Used by admin overrides only.
              &quot;dimensions&quot;: { #
                  # If this map is nonempty, then this override applies only to specific values
                  # for dimensions defined in the limit unit.
                  #
                  # For example, an override on a limit with the unit 1/{project}/{region}
                  # could contain an entry with the key &quot;region&quot; and the value &quot;us-east-1&quot;;
                  # the override is only applied to quota consumed in that region.
                  #
                  # This map has the following restrictions:
                  #
                  # *   Keys that are not defined in the limit&#x27;s unit are not valid keys.
                  #     Any string appearing in {brackets} in the unit (besides {project} or
                  #     {user}) is a defined key.
                  # *   &quot;project&quot; is not a valid key; the project is already specified in
                  #     the parent resource name.
                  # *   &quot;user&quot; is not a valid key; the API does not support quota overrides
                  #     that apply only to a specific user.
                  # *   If &quot;region&quot; appears as a key, its value must be a valid Cloud region.
                  # *   If &quot;zone&quot; appears as a key, its value must be a valid Cloud zone.
                  # *   If any valid key other than &quot;region&quot; or &quot;zone&quot; appears in the map, then
                  #     all valid keys other than &quot;region&quot; or &quot;zone&quot; must also appear in the
                  #     map.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;overrideValue&quot;: &quot;A String&quot;, # The overriding quota limit value.
                  # Can be any nonnegative integer, or -1 (unlimited quota).
              &quot;metric&quot;: &quot;A String&quot;, # The name of the metric to which this override applies.
                  #
                  # An example name would be:
                  # `compute.googleapis.com/cpus`
              &quot;unit&quot;: &quot;A String&quot;, # The limit unit of the limit to which this override applies.
                  #
                  # An example unit would be:
                  # `1/{project}/{region}`
                  # Note that `{project}` and `{region}` are not placeholders in this example;
                  # the literal characters `{` and `}` occur in the string.
              &quot;name&quot;: &quot;A String&quot;, # The resource name of the producer override.
                  # An example name would be:
                  # `services/compute.googleapis.com/projects/123/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion/producerOverrides/4a3f2c1d`
            },
          },
        ],
      },
    ],
    &quot;metric&quot;: &quot;A String&quot;, # The name of the metric.
        #
        # An example name would be:
        # `compute.googleapis.com/cpus`
  }</pre>
</div>

<div class="method">
    <code class="details" id="importProducerOverrides">importProducerOverrides(parent, body=None, x__xgafv=None)</code>
  <pre>Create or update multiple producer overrides atomically, all on the
same consumer, but on many different metrics or limits.
The name field in the quota override message should not be set.

Args:
  parent: string, The resource name of the consumer.

An example name would be:
`services/compute.googleapis.com/projects/123` (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for ImportProducerOverrides
    &quot;inlineSource&quot;: { # Import data embedded in the request message # The import data is specified in the request message itself
      &quot;overrides&quot;: [ # The overrides to create.
          # Each override must have a value for &#x27;metric&#x27; and &#x27;unit&#x27;, to specify
          # which metric and which limit the override should be applied to.
        { # A quota override
          &quot;adminOverrideAncestor&quot;: &quot;A String&quot;, # The resource name of the ancestor that requested the override. For example:
              # &quot;organizations/12345&quot; or &quot;folders/67890&quot;.
              # Used by admin overrides only.
          &quot;dimensions&quot;: { #
              # If this map is nonempty, then this override applies only to specific values
              # for dimensions defined in the limit unit.
              #
              # For example, an override on a limit with the unit 1/{project}/{region}
              # could contain an entry with the key &quot;region&quot; and the value &quot;us-east-1&quot;;
              # the override is only applied to quota consumed in that region.
              #
              # This map has the following restrictions:
              #
              # *   Keys that are not defined in the limit&#x27;s unit are not valid keys.
              #     Any string appearing in {brackets} in the unit (besides {project} or
              #     {user}) is a defined key.
              # *   &quot;project&quot; is not a valid key; the project is already specified in
              #     the parent resource name.
              # *   &quot;user&quot; is not a valid key; the API does not support quota overrides
              #     that apply only to a specific user.
              # *   If &quot;region&quot; appears as a key, its value must be a valid Cloud region.
              # *   If &quot;zone&quot; appears as a key, its value must be a valid Cloud zone.
              # *   If any valid key other than &quot;region&quot; or &quot;zone&quot; appears in the map, then
              #     all valid keys other than &quot;region&quot; or &quot;zone&quot; must also appear in the
              #     map.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;overrideValue&quot;: &quot;A String&quot;, # The overriding quota limit value.
              # Can be any nonnegative integer, or -1 (unlimited quota).
          &quot;metric&quot;: &quot;A String&quot;, # The name of the metric to which this override applies.
              #
              # An example name would be:
              # `compute.googleapis.com/cpus`
          &quot;unit&quot;: &quot;A String&quot;, # The limit unit of the limit to which this override applies.
              #
              # An example unit would be:
              # `1/{project}/{region}`
              # Note that `{project}` and `{region}` are not placeholders in this example;
              # the literal characters `{` and `}` occur in the string.
          &quot;name&quot;: &quot;A String&quot;, # The resource name of the producer override.
              # An example name would be:
              # `services/compute.googleapis.com/projects/123/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion/producerOverrides/4a3f2c1d`
        },
      ],
    },
    &quot;force&quot;: True or False, # Whether to force the creation of the quota overrides.
        # If creating an override would cause the effective quota for the consumer to
        # decrease by more than 10 percent, the call is rejected, as a safety measure
        # to avoid accidentally decreasing quota too quickly. Setting the force
        # parameter to true ignores this restriction.
  }

  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;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;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;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;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &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="list">list(parent, pageToken=None, pageSize=None, view=None, x__xgafv=None)</code>
  <pre>Retrieves a summary of all quota information about this consumer that is
visible to the service producer, for each quota metric defined by the
service. Each metric includes information about all of its defined limits.
Each limit includes the limit configuration (quota unit, preciseness,
default value), the current effective limit value, and all of the overrides
applied to the limit.

Args:
  parent: string, Parent of the quotas resource.

An example parent would be:
`services/serviceconsumermanagement.googleapis.com/projects/123` (required)
  pageToken: string, Token identifying which result to start with; returned by a previous list
call.
  pageSize: integer, Requested size of the next page of data.
  view: string, Specifies the level of detail for quota information in the response.
  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 ListConsumerQuotaMetrics.
    &quot;metrics&quot;: [ # Quota settings for the consumer, organized by quota metric.
      { # Consumer quota settings for a quota metric.
        &quot;name&quot;: &quot;A String&quot;, # The resource name of the quota settings on this metric for this consumer.
            #
            # An example name would be:
            # `services/serviceconsumermanagement.googleapis.com/projects/123/quota/metrics/compute.googleapis.com%2Fcpus
            #
            # The resource name is intended to be opaque and should not be parsed for
            # its component strings, since its representation could change in the future.
        &quot;unit&quot;: &quot;A String&quot;, # The units in which the metric value is reported.
        &quot;displayName&quot;: &quot;A String&quot;, # The display name of the metric.
            #
            # An example name would be:
            # &quot;CPUs&quot;
        &quot;consumerQuotaLimits&quot;: [ # The consumer quota for each quota limit defined on the metric.
          { # Consumer quota settings for a quota limit.
            &quot;unit&quot;: &quot;A String&quot;, # The limit unit.
                #
                # An example unit would be:
                # `1/{project}/{region}`
                # Note that `{project}` and `{region}` are not placeholders in this example;
                # the literal characters `{` and `}` occur in the string.
            &quot;metric&quot;: &quot;A String&quot;, # The name of the parent metric of this limit.
                #
                # An example name would be:
                # `compute.googleapis.com/cpus`
            &quot;isPrecise&quot;: True or False, # Whether this limit is precise or imprecise.
            &quot;name&quot;: &quot;A String&quot;, # The resource name of the quota limit.
                #
                # An example name would be:
                # `services/compute.googleapis.com/projects/123/quotas/metrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion`
                #
                # The resource name is intended to be opaque and should not be parsed for
                # its component strings, since its representation could change in the future.
            &quot;quotaBuckets&quot;: [ # Summary of the enforced quota buckets, organized by quota dimension,
                # ordered from least specific to most specific (for example, the global
                # default bucket, with no quota dimensions, will always appear first).
              { # A quota bucket is a quota provisioning unit for a specific set of dimensions.
                &quot;effectiveLimit&quot;: &quot;A String&quot;, # The effective limit of this quota bucket. Equal to default_limit if there
                    # are no overrides.
                &quot;dimensions&quot;: { # The dimensions of this quota bucket.
                    #
                    # If this map is empty, this is the global bucket, which is the default quota
                    # value applied to all requests that do not have a more specific override.
                    #
                    # If this map is nonempty, the default limit, effective limit, and quota
                    # overrides apply only to requests that have the dimensions given in the map.
                    #
                    # For example, if the map has key &quot;region&quot; and value &quot;us-east-1&quot;, then the
                    # specified effective limit is only effective in that region, and the
                    # specified overrides apply only in that region.
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
                &quot;defaultLimit&quot;: &quot;A String&quot;, # The default limit of this quota bucket, as specified by the service
                    # configuration.
                &quot;producerOverride&quot;: { # A quota override # Producer override on this quota bucket.
                  &quot;adminOverrideAncestor&quot;: &quot;A String&quot;, # The resource name of the ancestor that requested the override. For example:
                      # &quot;organizations/12345&quot; or &quot;folders/67890&quot;.
                      # Used by admin overrides only.
                  &quot;dimensions&quot;: { #
                      # If this map is nonempty, then this override applies only to specific values
                      # for dimensions defined in the limit unit.
                      #
                      # For example, an override on a limit with the unit 1/{project}/{region}
                      # could contain an entry with the key &quot;region&quot; and the value &quot;us-east-1&quot;;
                      # the override is only applied to quota consumed in that region.
                      #
                      # This map has the following restrictions:
                      #
                      # *   Keys that are not defined in the limit&#x27;s unit are not valid keys.
                      #     Any string appearing in {brackets} in the unit (besides {project} or
                      #     {user}) is a defined key.
                      # *   &quot;project&quot; is not a valid key; the project is already specified in
                      #     the parent resource name.
                      # *   &quot;user&quot; is not a valid key; the API does not support quota overrides
                      #     that apply only to a specific user.
                      # *   If &quot;region&quot; appears as a key, its value must be a valid Cloud region.
                      # *   If &quot;zone&quot; appears as a key, its value must be a valid Cloud zone.
                      # *   If any valid key other than &quot;region&quot; or &quot;zone&quot; appears in the map, then
                      #     all valid keys other than &quot;region&quot; or &quot;zone&quot; must also appear in the
                      #     map.
                    &quot;a_key&quot;: &quot;A String&quot;,
                  },
                  &quot;overrideValue&quot;: &quot;A String&quot;, # The overriding quota limit value.
                      # Can be any nonnegative integer, or -1 (unlimited quota).
                  &quot;metric&quot;: &quot;A String&quot;, # The name of the metric to which this override applies.
                      #
                      # An example name would be:
                      # `compute.googleapis.com/cpus`
                  &quot;unit&quot;: &quot;A String&quot;, # The limit unit of the limit to which this override applies.
                      #
                      # An example unit would be:
                      # `1/{project}/{region}`
                      # Note that `{project}` and `{region}` are not placeholders in this example;
                      # the literal characters `{` and `}` occur in the string.
                  &quot;name&quot;: &quot;A String&quot;, # The resource name of the producer override.
                      # An example name would be:
                      # `services/compute.googleapis.com/projects/123/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion/producerOverrides/4a3f2c1d`
                },
                &quot;consumerOverride&quot;: { # A quota override # Consumer override on this quota bucket.
                  &quot;adminOverrideAncestor&quot;: &quot;A String&quot;, # The resource name of the ancestor that requested the override. For example:
                      # &quot;organizations/12345&quot; or &quot;folders/67890&quot;.
                      # Used by admin overrides only.
                  &quot;dimensions&quot;: { #
                      # If this map is nonempty, then this override applies only to specific values
                      # for dimensions defined in the limit unit.
                      #
                      # For example, an override on a limit with the unit 1/{project}/{region}
                      # could contain an entry with the key &quot;region&quot; and the value &quot;us-east-1&quot;;
                      # the override is only applied to quota consumed in that region.
                      #
                      # This map has the following restrictions:
                      #
                      # *   Keys that are not defined in the limit&#x27;s unit are not valid keys.
                      #     Any string appearing in {brackets} in the unit (besides {project} or
                      #     {user}) is a defined key.
                      # *   &quot;project&quot; is not a valid key; the project is already specified in
                      #     the parent resource name.
                      # *   &quot;user&quot; is not a valid key; the API does not support quota overrides
                      #     that apply only to a specific user.
                      # *   If &quot;region&quot; appears as a key, its value must be a valid Cloud region.
                      # *   If &quot;zone&quot; appears as a key, its value must be a valid Cloud zone.
                      # *   If any valid key other than &quot;region&quot; or &quot;zone&quot; appears in the map, then
                      #     all valid keys other than &quot;region&quot; or &quot;zone&quot; must also appear in the
                      #     map.
                    &quot;a_key&quot;: &quot;A String&quot;,
                  },
                  &quot;overrideValue&quot;: &quot;A String&quot;, # The overriding quota limit value.
                      # Can be any nonnegative integer, or -1 (unlimited quota).
                  &quot;metric&quot;: &quot;A String&quot;, # The name of the metric to which this override applies.
                      #
                      # An example name would be:
                      # `compute.googleapis.com/cpus`
                  &quot;unit&quot;: &quot;A String&quot;, # The limit unit of the limit to which this override applies.
                      #
                      # An example unit would be:
                      # `1/{project}/{region}`
                      # Note that `{project}` and `{region}` are not placeholders in this example;
                      # the literal characters `{` and `}` occur in the string.
                  &quot;name&quot;: &quot;A String&quot;, # The resource name of the producer override.
                      # An example name would be:
                      # `services/compute.googleapis.com/projects/123/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion/producerOverrides/4a3f2c1d`
                },
                &quot;adminOverride&quot;: { # A quota override # Admin override on this quota bucket.
                  &quot;adminOverrideAncestor&quot;: &quot;A String&quot;, # The resource name of the ancestor that requested the override. For example:
                      # &quot;organizations/12345&quot; or &quot;folders/67890&quot;.
                      # Used by admin overrides only.
                  &quot;dimensions&quot;: { #
                      # If this map is nonempty, then this override applies only to specific values
                      # for dimensions defined in the limit unit.
                      #
                      # For example, an override on a limit with the unit 1/{project}/{region}
                      # could contain an entry with the key &quot;region&quot; and the value &quot;us-east-1&quot;;
                      # the override is only applied to quota consumed in that region.
                      #
                      # This map has the following restrictions:
                      #
                      # *   Keys that are not defined in the limit&#x27;s unit are not valid keys.
                      #     Any string appearing in {brackets} in the unit (besides {project} or
                      #     {user}) is a defined key.
                      # *   &quot;project&quot; is not a valid key; the project is already specified in
                      #     the parent resource name.
                      # *   &quot;user&quot; is not a valid key; the API does not support quota overrides
                      #     that apply only to a specific user.
                      # *   If &quot;region&quot; appears as a key, its value must be a valid Cloud region.
                      # *   If &quot;zone&quot; appears as a key, its value must be a valid Cloud zone.
                      # *   If any valid key other than &quot;region&quot; or &quot;zone&quot; appears in the map, then
                      #     all valid keys other than &quot;region&quot; or &quot;zone&quot; must also appear in the
                      #     map.
                    &quot;a_key&quot;: &quot;A String&quot;,
                  },
                  &quot;overrideValue&quot;: &quot;A String&quot;, # The overriding quota limit value.
                      # Can be any nonnegative integer, or -1 (unlimited quota).
                  &quot;metric&quot;: &quot;A String&quot;, # The name of the metric to which this override applies.
                      #
                      # An example name would be:
                      # `compute.googleapis.com/cpus`
                  &quot;unit&quot;: &quot;A String&quot;, # The limit unit of the limit to which this override applies.
                      #
                      # An example unit would be:
                      # `1/{project}/{region}`
                      # Note that `{project}` and `{region}` are not placeholders in this example;
                      # the literal characters `{` and `}` occur in the string.
                  &quot;name&quot;: &quot;A String&quot;, # The resource name of the producer override.
                      # An example name would be:
                      # `services/compute.googleapis.com/projects/123/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion/producerOverrides/4a3f2c1d`
                },
              },
            ],
          },
        ],
        &quot;metric&quot;: &quot;A String&quot;, # The name of the metric.
            #
            # An example name would be:
            # `compute.googleapis.com/cpus`
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token identifying which result to start with; returned by a previous list
        # call.
  }</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>

</body></html>