<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="compute_beta.html">Compute Engine API</a> . <a href="compute_beta.regionMultiMigs.html">regionMultiMigs</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#close">close()</a></code></p>
<p class="firstline">Close httplib2 connections.</p>
<p class="toc_element">
  <code><a href="#delete">delete(project, region, multiMig, requestId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a multi-MIG in the specified project.</p>
<p class="toc_element">
  <code><a href="#get">get(project, region, multiMig, x__xgafv=None)</a></code></p>
<p class="firstline">Returns all the details of a specific multi-MIG.</p>
<p class="toc_element">
  <code><a href="#insert">insert(project, region, body=None, requestId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a multi-MIG in the specified project.</p>
<p class="toc_element">
  <code><a href="#list">list(project, region, filter=None, maxResults=None, orderBy=None, pageToken=None, returnPartialSuccess=None, x__xgafv=None)</a></code></p>
<p class="firstline">Retrieves a list of multi-MIGs in a project and region.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next()</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="close">close()</code>
  <pre>Close httplib2 connections.</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(project, region, multiMig, requestId=None, x__xgafv=None)</code>
  <pre>Deletes a multi-MIG in the specified project.

Args:
  project: string, Project ID for this request. (required)
  region: string, Name of the region for this request. (required)
  multiMig: string, Name of the multi-MIG to delete. (required)
  requestId: string, An optional request ID to identify requests. Specify a unique request ID so
that if you must retry your request, the server will know to ignore the
request if it has already been completed.

For example, consider a situation where you make an initial request and
the request times out. If you make the request again with the same
request ID, the server can check if original operation with the same
request ID was received, and if so, will ignore the second request. This
prevents clients from accidentally creating duplicate commitments.

The request ID must be
a valid UUID with the exception that zero UUID is not supported
(00000000-0000-0000-0000-000000000000).
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Represents an Operation resource.
    #
    # Google Compute Engine has three Operation resources:
    #
    # * [Global](/compute/docs/reference/rest/beta/globalOperations)
    # * [Regional](/compute/docs/reference/rest/beta/regionOperations)
    # * [Zonal](/compute/docs/reference/rest/beta/zoneOperations)
    #
    # You can use an operation resource to manage asynchronous API requests.
    # For more information, readHandling
    # API responses.
    #
    # Operations can be global, regional or zonal.
    #
    #    - For global operations, use the `globalOperations`
    #    resource.
    #    - For regional operations, use the
    #    `regionOperations` resource.
    #    - For zonal operations, use
    #    the `zoneOperations` resource.
    #
    #
    #
    # For more information, read
    # Global, Regional, and Zonal Resources.
    #
    # Note that completed Operation resources have a limited
    # retention period.
  &quot;clientOperationId&quot;: &quot;A String&quot;, # [Output Only] The value of `requestId` if you provided it in the request.
      # Not present otherwise.
  &quot;creationTimestamp&quot;: &quot;A String&quot;, # [Deprecated] This field is deprecated.
  &quot;description&quot;: &quot;A String&quot;, # [Output Only] A textual description of the operation, which is
      # set when the operation is created.
  &quot;endTime&quot;: &quot;A String&quot;, # [Output Only] The time that this operation was completed. This value is inRFC3339
      # text format.
  &quot;error&quot;: { # [Output Only] If errors are generated during processing of the operation,
      # this field will be populated.
    &quot;errors&quot;: [ # [Output Only] The array of errors encountered while processing this
        # operation.
      {
        &quot;code&quot;: &quot;A String&quot;, # [Output Only] The error type identifier for this error.
        &quot;errorDetails&quot;: [ # [Output Only] An optional list of messages that contain the error
            # details. There is a set of defined message types to use for providing
            # details.The syntax depends on the error code. For example,
            # QuotaExceededInfo will have details when the error code is
            # QUOTA_EXCEEDED.
          {
            &quot;errorInfo&quot;: { # Describes the cause of the error with structured details.
                #
                # Example of an error when contacting the &quot;pubsub.googleapis.com&quot; API when it
                # is not enabled:
                #
                #     { &quot;reason&quot;: &quot;API_DISABLED&quot;
                #       &quot;domain&quot;: &quot;googleapis.com&quot;
                #       &quot;metadata&quot;: {
                #         &quot;resource&quot;: &quot;projects/123&quot;,
                #         &quot;service&quot;: &quot;pubsub.googleapis.com&quot;
                #       }
                #     }
                #
                # This response indicates that the pubsub.googleapis.com API is not enabled.
                #
                # Example of an error that is returned when attempting to create a Spanner
                # instance in a region that is out of stock:
                #
                #     { &quot;reason&quot;: &quot;STOCKOUT&quot;
                #       &quot;domain&quot;: &quot;spanner.googleapis.com&quot;,
                #       &quot;metadata&quot;: {
                #         &quot;availableRegions&quot;: &quot;us-central1,us-east2&quot;
                #       }
                #     }
              &quot;domain&quot;: &quot;A String&quot;, # The logical grouping to which the &quot;reason&quot; belongs. The error domain
                  # is typically the registered service name of the tool or product that
                  # generates the error. Example: &quot;pubsub.googleapis.com&quot;. If the error is
                  # generated by some common infrastructure, the error domain must be a
                  # globally unique value that identifies the infrastructure. For Google API
                  # infrastructure, the error domain is &quot;googleapis.com&quot;.
              &quot;metadatas&quot;: { # Additional structured details about this error.
                  #
                  # Keys must match a regular expression of `a-z+` but should
                  # ideally be lowerCamelCase. Also, they must be limited to 64 characters in
                  # length. When identifying the current value of an exceeded limit, the units
                  # should be contained in the key, not the value.  For example, rather than
                  # `{&quot;instanceLimit&quot;: &quot;100/request&quot;}`, should be returned as,
                  # `{&quot;instanceLimitPerRequest&quot;: &quot;100&quot;}`, if the client exceeds the number of
                  # instances that can be created in a single (batch) request.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;reason&quot;: &quot;A String&quot;, # The reason of the error. This is a constant value that identifies the
                  # proximate cause of the error. Error reasons are unique within a particular
                  # domain of errors. This should be at most 63 characters and match a
                  # regular expression of `A-Z+[A-Z0-9]`, which represents
                  # UPPER_SNAKE_CASE.
            },
            &quot;help&quot;: { # Provides links to documentation or for performing an out of band action.
                #
                # For example, if a quota check failed with an error indicating the calling
                # project hasn&#x27;t enabled the accessed service, this can contain a URL pointing
                # directly to the right place in the developer console to flip the bit.
              &quot;links&quot;: [ # URL(s) pointing to additional information on handling the current error.
                { # Describes a URL link.
                  &quot;description&quot;: &quot;A String&quot;, # Describes what the link offers.
                  &quot;url&quot;: &quot;A String&quot;, # The URL of the link.
                },
              ],
            },
            &quot;localizedMessage&quot;: { # Provides a localized error message that is safe to return to the user
                # which can be attached to an RPC error.
              &quot;locale&quot;: &quot;A String&quot;, # The locale used following the specification defined at
                  # https://www.rfc-editor.org/rfc/bcp/bcp47.txt.
                  # Examples are: &quot;en-US&quot;, &quot;fr-CH&quot;, &quot;es-MX&quot;
              &quot;message&quot;: &quot;A String&quot;, # The localized error message in the above locale.
            },
            &quot;quotaInfo&quot;: { # Additional details for quota exceeded error for resource quota.
              &quot;dimensions&quot;: { # The map holding related quota dimensions.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;futureLimit&quot;: 3.14, # Future quota limit being rolled out. The limit&#x27;s unit depends on the quota
                  #  type or metric.
              &quot;limit&quot;: 3.14, # Current effective quota limit. The limit&#x27;s unit depends on the quota type
                  # or metric.
              &quot;limitName&quot;: &quot;A String&quot;, # The name of the quota limit.
              &quot;metricName&quot;: &quot;A String&quot;, # The Compute Engine quota metric name.
              &quot;rolloutStatus&quot;: &quot;A String&quot;, # Rollout status of the future quota limit.
            },
          },
        ],
        &quot;location&quot;: &quot;A String&quot;, # [Output Only] Indicates the field in the request that caused the error.
            # This property is optional.
        &quot;message&quot;: &quot;A String&quot;, # [Output Only] An optional, human-readable error message.
      },
    ],
  },
  &quot;httpErrorMessage&quot;: &quot;A String&quot;, # [Output Only] If the operation fails, this field contains the HTTP error
      # message that was returned, such as `NOT FOUND`.
  &quot;httpErrorStatusCode&quot;: 42, # [Output Only] If the operation fails, this field contains the HTTP error
      # status code that was returned. For example, a `404` means the
      # resource was not found.
  &quot;id&quot;: &quot;A String&quot;, # [Output Only] The unique identifier for the operation. This identifier is
      # defined by the server.
  &quot;insertTime&quot;: &quot;A String&quot;, # [Output Only] The time that this operation was requested.
      # This value is inRFC3339
      # text format.
  &quot;instancesBulkInsertOperationMetadata&quot;: {
    &quot;perLocationStatus&quot;: { # Status information per location (location name is key).
        # Example key: zones/us-central1-a
      &quot;a_key&quot;: {
        &quot;createdVmCount&quot;: 42, # [Output Only] Count of VMs successfully created so far.
        &quot;deletedVmCount&quot;: 42, # [Output Only] Count of VMs that got deleted during rollback.
        &quot;failedToCreateVmCount&quot;: 42, # [Output Only] Count of VMs that started creating but encountered an
            # error.
        &quot;status&quot;: &quot;A String&quot;, # [Output Only] Creation status of BulkInsert operation - information
            # if the flow is rolling forward or rolling back.
        &quot;targetVmCount&quot;: 42, # [Output Only] Count of VMs originally planned to be created.
      },
    },
  },
  &quot;kind&quot;: &quot;compute#operation&quot;, # [Output Only] Type of the resource. Always `compute#operation` for
      # Operation resources.
  &quot;name&quot;: &quot;A String&quot;, # [Output Only] Name of the operation.
  &quot;operationGroupId&quot;: &quot;A String&quot;, # [Output Only] An ID that represents a group of operations, such as when a
      # group of operations results from a `bulkInsert` API request.
  &quot;operationType&quot;: &quot;A String&quot;, # [Output Only] The type of operation, such as `insert`,
      # `update`, or `delete`, and so on.
  &quot;progress&quot;: 42, # [Output Only] An optional progress indicator that ranges from 0 to 100.
      # There is no requirement that this be linear or support any granularity of
      # operations. This should not be used to guess when the operation will be
      # complete. This number should monotonically increase as the operation
      # progresses.
  &quot;region&quot;: &quot;A String&quot;, # [Output Only] The URL of the region where the operation resides. Only
      # applicable when performing regional operations.
  &quot;selfLink&quot;: &quot;A String&quot;, # [Output Only] Server-defined URL for the resource.
  &quot;setCommonInstanceMetadataOperationMetadata&quot;: { # [Output Only] If the operation is for projects.setCommonInstanceMetadata,
      # this field will contain information on all underlying zonal actions and
      # their state.
    &quot;clientOperationId&quot;: &quot;A String&quot;, # [Output Only] The client operation id.
    &quot;perLocationOperations&quot;: { # [Output Only] Status information per location (location name is key).
        # Example key: zones/us-central1-a
      &quot;a_key&quot;: {
        &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # [Output Only] If state is `ABANDONED` or `FAILED`, this field is
            # populated.
            # 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;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;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;state&quot;: &quot;A String&quot;, # [Output Only] Status of the action, which can be one of the following:
            # `PROPAGATING`, `PROPAGATED`, `ABANDONED`, `FAILED`, or `DONE`.
      },
    },
  },
  &quot;startTime&quot;: &quot;A String&quot;, # [Output Only] The time that this operation was started by the server.
      # This value is inRFC3339
      # text format.
  &quot;status&quot;: &quot;A String&quot;, # [Output Only] The status of the operation, which can be one of the
      # following:
      # `PENDING`, `RUNNING`, or `DONE`.
  &quot;statusMessage&quot;: &quot;A String&quot;, # [Output Only] An optional textual description of the current status of the
      # operation.
  &quot;targetId&quot;: &quot;A String&quot;, # [Output Only] The unique target ID, which identifies a specific incarnation
      # of the target resource.
  &quot;targetLink&quot;: &quot;A String&quot;, # [Output Only] The URL of the resource that the operation modifies. For
      # operations related to creating a snapshot, this points to the disk
      # that the snapshot was created from.
  &quot;user&quot;: &quot;A String&quot;, # [Output Only] User who requested the operation, for example:
      # `user@example.com` or
      # `alice_smith_identifier (global/workforcePools/example-com-us-employees)`.
  &quot;warnings&quot;: [ # [Output Only] If warning messages are generated during processing of the
      # operation, this field will be populated.
    {
      &quot;code&quot;: &quot;A String&quot;, # [Output Only] A warning code, if applicable. For example, Compute
          # Engine returns NO_RESULTS_ON_PAGE if there
          # are no results in the response.
      &quot;data&quot;: [ # [Output Only] Metadata about this warning in key:
          # value format. For example:
          #
          # &quot;data&quot;: [
          #   {
          #    &quot;key&quot;: &quot;scope&quot;,
          #    &quot;value&quot;: &quot;zones/us-east1-d&quot;
          #   }
        {
          &quot;key&quot;: &quot;A String&quot;, # [Output Only] A key that provides more detail on the warning being
              # returned. For example, for warnings where there are no results in a list
              # request for a particular zone, this key might be scope and
              # the key value might be the zone name. Other examples might be a key
              # indicating a deprecated resource and a suggested replacement, or a
              # warning about invalid network settings (for example, if an instance
              # attempts to perform IP forwarding but is not enabled for IP forwarding).
          &quot;value&quot;: &quot;A String&quot;, # [Output Only] A warning data value corresponding to the key.
        },
      ],
      &quot;message&quot;: &quot;A String&quot;, # [Output Only] A human-readable description of the warning code.
    },
  ],
  &quot;zone&quot;: &quot;A String&quot;, # [Output Only] The URL of the zone where the operation resides. Only
      # applicable when performing per-zone operations.
}</pre>
</div>

<div class="method">
    <code class="details" id="get">get(project, region, multiMig, x__xgafv=None)</code>
  <pre>Returns all the details of a specific multi-MIG.

Args:
  project: string, Project ID for this request. (required)
  region: string, Name of the region for this request. (required)
  multiMig: string, Name of the multi-MIG resource to return. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Multi-MIG represents a group of managed instance groups.
  &quot;creationTimestamp&quot;: &quot;A String&quot;, # [Output only] The creation timestamp of this multi-MIG in RFC3339
      # text format.
  &quot;description&quot;: &quot;A String&quot;, # An optional description of this resource.
  &quot;id&quot;: &quot;A String&quot;, # [Output only] The unique identifier for this resource type. The server
      # generates this identifier.
  &quot;kind&quot;: &quot;compute#multiMig&quot;, # [Output only] Type of the resource. Alwayscompute#multiMig for multi-MIGs.
  &quot;name&quot;: &quot;A String&quot;, # The name of the multi-MIG.
      # The name must be 1-63 characters long, and comply withRFC1035.
      # Specifically, the name must be 1-63 characters long and match the regular
      # expression `[a-z]([-a-z0-9]*[a-z0-9])?` which means the first character
      # must be a lowercase letter, and all following characters must be a dash,
      # lowercase letter, or digit, except the last character, which cannot be a
      # dash.
  &quot;region&quot;: &quot;A String&quot;, # [Output only] The URL of the region where the resource resides. You must
      # specify this field as part of the HTTP request URL. You cannot set the
      # region as a field in the request body.
  &quot;resourcePolicies&quot;: { # Resource policies message for a multi-MIG. Specifies the workload policy # Resource policies for this multi-MIG.
      # configuration of the multi-MIG.
    &quot;workloadPolicy&quot;: &quot;A String&quot;, # The URL of the workload policy for this multi-MIG.
        # It can be a full or partial URL. For example, the following are
        # all valid URLs to a workload policy:
        #
        #
        #       - https://www.googleapis.com/compute/v1/projects/project/regions/region/resourcePolicies/resourcePolicy
        #       - projects/project/regions/region/resourcePolicies/resourcePolicy
        #       - regions/region/resourcePolicies/resourcePolicy
  },
  &quot;selfLink&quot;: &quot;A String&quot;, # [Output only] Server-defined URL for the resource.
  &quot;status&quot;: {
    &quot;appliedAcceleratorTopologies&quot;: [ # [Output Only] The accelerator topology applied to this multi-MIG.
        # Currently only one accelerator topology is supported.
      {
        &quot;acceleratorTopology&quot;: &quot;A String&quot;, # [Output Only] Topology in the format of: &quot;16x16&quot;, &quot;4x4x4&quot;, etc.
            # The value is the same as configured in the WorkloadPolicy.
        &quot;acceleratorTopologyState&quot;: &quot;A String&quot;, # [Output Only] The state of the accelerator topology.
        &quot;acceleratorTopologyStateLastCheck&quot;: { # [Output Only] The result of the latest accelerator topology state
            # check.
          &quot;error&quot;: { # [Output Only] Encountered errors on the last state check.
            &quot;errors&quot;: [ # [Output Only] The array of errors encountered while processing this
                # operation.
              {
                &quot;code&quot;: &quot;A String&quot;, # [Output Only] The error type identifier for this error.
                &quot;errorDetails&quot;: [ # [Output Only] An optional list of messages that contain the error
                    # details. There is a set of defined message types to use for providing
                    # details.The syntax depends on the error code. For example,
                    # QuotaExceededInfo will have details when the error code is
                    # QUOTA_EXCEEDED.
                  {
                    &quot;errorInfo&quot;: { # Describes the cause of the error with structured details.
                        #
                        # Example of an error when contacting the &quot;pubsub.googleapis.com&quot; API when it
                        # is not enabled:
                        #
                        #     { &quot;reason&quot;: &quot;API_DISABLED&quot;
                        #       &quot;domain&quot;: &quot;googleapis.com&quot;
                        #       &quot;metadata&quot;: {
                        #         &quot;resource&quot;: &quot;projects/123&quot;,
                        #         &quot;service&quot;: &quot;pubsub.googleapis.com&quot;
                        #       }
                        #     }
                        #
                        # This response indicates that the pubsub.googleapis.com API is not enabled.
                        #
                        # Example of an error that is returned when attempting to create a Spanner
                        # instance in a region that is out of stock:
                        #
                        #     { &quot;reason&quot;: &quot;STOCKOUT&quot;
                        #       &quot;domain&quot;: &quot;spanner.googleapis.com&quot;,
                        #       &quot;metadata&quot;: {
                        #         &quot;availableRegions&quot;: &quot;us-central1,us-east2&quot;
                        #       }
                        #     }
                      &quot;domain&quot;: &quot;A String&quot;, # The logical grouping to which the &quot;reason&quot; belongs. The error domain
                          # is typically the registered service name of the tool or product that
                          # generates the error. Example: &quot;pubsub.googleapis.com&quot;. If the error is
                          # generated by some common infrastructure, the error domain must be a
                          # globally unique value that identifies the infrastructure. For Google API
                          # infrastructure, the error domain is &quot;googleapis.com&quot;.
                      &quot;metadatas&quot;: { # Additional structured details about this error.
                          #
                          # Keys must match a regular expression of `a-z+` but should
                          # ideally be lowerCamelCase. Also, they must be limited to 64 characters in
                          # length. When identifying the current value of an exceeded limit, the units
                          # should be contained in the key, not the value.  For example, rather than
                          # `{&quot;instanceLimit&quot;: &quot;100/request&quot;}`, should be returned as,
                          # `{&quot;instanceLimitPerRequest&quot;: &quot;100&quot;}`, if the client exceeds the number of
                          # instances that can be created in a single (batch) request.
                        &quot;a_key&quot;: &quot;A String&quot;,
                      },
                      &quot;reason&quot;: &quot;A String&quot;, # The reason of the error. This is a constant value that identifies the
                          # proximate cause of the error. Error reasons are unique within a particular
                          # domain of errors. This should be at most 63 characters and match a
                          # regular expression of `A-Z+[A-Z0-9]`, which represents
                          # UPPER_SNAKE_CASE.
                    },
                    &quot;help&quot;: { # Provides links to documentation or for performing an out of band action.
                        #
                        # For example, if a quota check failed with an error indicating the calling
                        # project hasn&#x27;t enabled the accessed service, this can contain a URL pointing
                        # directly to the right place in the developer console to flip the bit.
                      &quot;links&quot;: [ # URL(s) pointing to additional information on handling the current error.
                        { # Describes a URL link.
                          &quot;description&quot;: &quot;A String&quot;, # Describes what the link offers.
                          &quot;url&quot;: &quot;A String&quot;, # The URL of the link.
                        },
                      ],
                    },
                    &quot;localizedMessage&quot;: { # Provides a localized error message that is safe to return to the user
                        # which can be attached to an RPC error.
                      &quot;locale&quot;: &quot;A String&quot;, # The locale used following the specification defined at
                          # https://www.rfc-editor.org/rfc/bcp/bcp47.txt.
                          # Examples are: &quot;en-US&quot;, &quot;fr-CH&quot;, &quot;es-MX&quot;
                      &quot;message&quot;: &quot;A String&quot;, # The localized error message in the above locale.
                    },
                    &quot;quotaInfo&quot;: { # Additional details for quota exceeded error for resource quota.
                      &quot;dimensions&quot;: { # The map holding related quota dimensions.
                        &quot;a_key&quot;: &quot;A String&quot;,
                      },
                      &quot;futureLimit&quot;: 3.14, # Future quota limit being rolled out. The limit&#x27;s unit depends on the quota
                          #  type or metric.
                      &quot;limit&quot;: 3.14, # Current effective quota limit. The limit&#x27;s unit depends on the quota type
                          # or metric.
                      &quot;limitName&quot;: &quot;A String&quot;, # The name of the quota limit.
                      &quot;metricName&quot;: &quot;A String&quot;, # The Compute Engine quota metric name.
                      &quot;rolloutStatus&quot;: &quot;A String&quot;, # Rollout status of the future quota limit.
                    },
                  },
                ],
                &quot;location&quot;: &quot;A String&quot;, # [Output Only] Indicates the field in the request that caused the error.
                    # This property is optional.
                &quot;message&quot;: &quot;A String&quot;, # [Output Only] An optional, human-readable error message.
              },
            ],
          },
          &quot;timestamp&quot;: &quot;A String&quot;, # [Output Only] Timestamp is shown only if there is an error. The field
              # has // RFC3339 //
              # text format.
        },
      },
    ],
  },
}</pre>
</div>

<div class="method">
    <code class="details" id="insert">insert(project, region, body=None, requestId=None, x__xgafv=None)</code>
  <pre>Creates a multi-MIG in the specified project.

Args:
  project: string, Project ID for this request. (required)
  region: string, Name of the region for this request. (required)
  body: object, The request body.
    The object takes the form of:

{ # Multi-MIG represents a group of managed instance groups.
  &quot;creationTimestamp&quot;: &quot;A String&quot;, # [Output only] The creation timestamp of this multi-MIG in RFC3339
      # text format.
  &quot;description&quot;: &quot;A String&quot;, # An optional description of this resource.
  &quot;id&quot;: &quot;A String&quot;, # [Output only] The unique identifier for this resource type. The server
      # generates this identifier.
  &quot;kind&quot;: &quot;compute#multiMig&quot;, # [Output only] Type of the resource. Alwayscompute#multiMig for multi-MIGs.
  &quot;name&quot;: &quot;A String&quot;, # The name of the multi-MIG.
      # The name must be 1-63 characters long, and comply withRFC1035.
      # Specifically, the name must be 1-63 characters long and match the regular
      # expression `[a-z]([-a-z0-9]*[a-z0-9])?` which means the first character
      # must be a lowercase letter, and all following characters must be a dash,
      # lowercase letter, or digit, except the last character, which cannot be a
      # dash.
  &quot;region&quot;: &quot;A String&quot;, # [Output only] The URL of the region where the resource resides. You must
      # specify this field as part of the HTTP request URL. You cannot set the
      # region as a field in the request body.
  &quot;resourcePolicies&quot;: { # Resource policies message for a multi-MIG. Specifies the workload policy # Resource policies for this multi-MIG.
      # configuration of the multi-MIG.
    &quot;workloadPolicy&quot;: &quot;A String&quot;, # The URL of the workload policy for this multi-MIG.
        # It can be a full or partial URL. For example, the following are
        # all valid URLs to a workload policy:
        #
        #
        #       - https://www.googleapis.com/compute/v1/projects/project/regions/region/resourcePolicies/resourcePolicy
        #       - projects/project/regions/region/resourcePolicies/resourcePolicy
        #       - regions/region/resourcePolicies/resourcePolicy
  },
  &quot;selfLink&quot;: &quot;A String&quot;, # [Output only] Server-defined URL for the resource.
  &quot;status&quot;: {
    &quot;appliedAcceleratorTopologies&quot;: [ # [Output Only] The accelerator topology applied to this multi-MIG.
        # Currently only one accelerator topology is supported.
      {
        &quot;acceleratorTopology&quot;: &quot;A String&quot;, # [Output Only] Topology in the format of: &quot;16x16&quot;, &quot;4x4x4&quot;, etc.
            # The value is the same as configured in the WorkloadPolicy.
        &quot;acceleratorTopologyState&quot;: &quot;A String&quot;, # [Output Only] The state of the accelerator topology.
        &quot;acceleratorTopologyStateLastCheck&quot;: { # [Output Only] The result of the latest accelerator topology state
            # check.
          &quot;error&quot;: { # [Output Only] Encountered errors on the last state check.
            &quot;errors&quot;: [ # [Output Only] The array of errors encountered while processing this
                # operation.
              {
                &quot;code&quot;: &quot;A String&quot;, # [Output Only] The error type identifier for this error.
                &quot;errorDetails&quot;: [ # [Output Only] An optional list of messages that contain the error
                    # details. There is a set of defined message types to use for providing
                    # details.The syntax depends on the error code. For example,
                    # QuotaExceededInfo will have details when the error code is
                    # QUOTA_EXCEEDED.
                  {
                    &quot;errorInfo&quot;: { # Describes the cause of the error with structured details.
                        #
                        # Example of an error when contacting the &quot;pubsub.googleapis.com&quot; API when it
                        # is not enabled:
                        #
                        #     { &quot;reason&quot;: &quot;API_DISABLED&quot;
                        #       &quot;domain&quot;: &quot;googleapis.com&quot;
                        #       &quot;metadata&quot;: {
                        #         &quot;resource&quot;: &quot;projects/123&quot;,
                        #         &quot;service&quot;: &quot;pubsub.googleapis.com&quot;
                        #       }
                        #     }
                        #
                        # This response indicates that the pubsub.googleapis.com API is not enabled.
                        #
                        # Example of an error that is returned when attempting to create a Spanner
                        # instance in a region that is out of stock:
                        #
                        #     { &quot;reason&quot;: &quot;STOCKOUT&quot;
                        #       &quot;domain&quot;: &quot;spanner.googleapis.com&quot;,
                        #       &quot;metadata&quot;: {
                        #         &quot;availableRegions&quot;: &quot;us-central1,us-east2&quot;
                        #       }
                        #     }
                      &quot;domain&quot;: &quot;A String&quot;, # The logical grouping to which the &quot;reason&quot; belongs. The error domain
                          # is typically the registered service name of the tool or product that
                          # generates the error. Example: &quot;pubsub.googleapis.com&quot;. If the error is
                          # generated by some common infrastructure, the error domain must be a
                          # globally unique value that identifies the infrastructure. For Google API
                          # infrastructure, the error domain is &quot;googleapis.com&quot;.
                      &quot;metadatas&quot;: { # Additional structured details about this error.
                          #
                          # Keys must match a regular expression of `a-z+` but should
                          # ideally be lowerCamelCase. Also, they must be limited to 64 characters in
                          # length. When identifying the current value of an exceeded limit, the units
                          # should be contained in the key, not the value.  For example, rather than
                          # `{&quot;instanceLimit&quot;: &quot;100/request&quot;}`, should be returned as,
                          # `{&quot;instanceLimitPerRequest&quot;: &quot;100&quot;}`, if the client exceeds the number of
                          # instances that can be created in a single (batch) request.
                        &quot;a_key&quot;: &quot;A String&quot;,
                      },
                      &quot;reason&quot;: &quot;A String&quot;, # The reason of the error. This is a constant value that identifies the
                          # proximate cause of the error. Error reasons are unique within a particular
                          # domain of errors. This should be at most 63 characters and match a
                          # regular expression of `A-Z+[A-Z0-9]`, which represents
                          # UPPER_SNAKE_CASE.
                    },
                    &quot;help&quot;: { # Provides links to documentation or for performing an out of band action.
                        #
                        # For example, if a quota check failed with an error indicating the calling
                        # project hasn&#x27;t enabled the accessed service, this can contain a URL pointing
                        # directly to the right place in the developer console to flip the bit.
                      &quot;links&quot;: [ # URL(s) pointing to additional information on handling the current error.
                        { # Describes a URL link.
                          &quot;description&quot;: &quot;A String&quot;, # Describes what the link offers.
                          &quot;url&quot;: &quot;A String&quot;, # The URL of the link.
                        },
                      ],
                    },
                    &quot;localizedMessage&quot;: { # Provides a localized error message that is safe to return to the user
                        # which can be attached to an RPC error.
                      &quot;locale&quot;: &quot;A String&quot;, # The locale used following the specification defined at
                          # https://www.rfc-editor.org/rfc/bcp/bcp47.txt.
                          # Examples are: &quot;en-US&quot;, &quot;fr-CH&quot;, &quot;es-MX&quot;
                      &quot;message&quot;: &quot;A String&quot;, # The localized error message in the above locale.
                    },
                    &quot;quotaInfo&quot;: { # Additional details for quota exceeded error for resource quota.
                      &quot;dimensions&quot;: { # The map holding related quota dimensions.
                        &quot;a_key&quot;: &quot;A String&quot;,
                      },
                      &quot;futureLimit&quot;: 3.14, # Future quota limit being rolled out. The limit&#x27;s unit depends on the quota
                          #  type or metric.
                      &quot;limit&quot;: 3.14, # Current effective quota limit. The limit&#x27;s unit depends on the quota type
                          # or metric.
                      &quot;limitName&quot;: &quot;A String&quot;, # The name of the quota limit.
                      &quot;metricName&quot;: &quot;A String&quot;, # The Compute Engine quota metric name.
                      &quot;rolloutStatus&quot;: &quot;A String&quot;, # Rollout status of the future quota limit.
                    },
                  },
                ],
                &quot;location&quot;: &quot;A String&quot;, # [Output Only] Indicates the field in the request that caused the error.
                    # This property is optional.
                &quot;message&quot;: &quot;A String&quot;, # [Output Only] An optional, human-readable error message.
              },
            ],
          },
          &quot;timestamp&quot;: &quot;A String&quot;, # [Output Only] Timestamp is shown only if there is an error. The field
              # has // RFC3339 //
              # text format.
        },
      },
    ],
  },
}

  requestId: string, An optional request ID to identify requests. Specify a unique request ID so
that if you must retry your request, the server will know to ignore the
request if it has already been completed.

For example, consider a situation where you make an initial request and
the request times out. If you make the request again with the same
request ID, the server can check if original operation with the same
request ID was received, and if so, will ignore the second request. This
prevents you from accidentally creating duplicate commitments.

The request ID must be
a valid UUID with the exception that zero UUID is not supported
(00000000-0000-0000-0000-000000000000).
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Represents an Operation resource.
    #
    # Google Compute Engine has three Operation resources:
    #
    # * [Global](/compute/docs/reference/rest/beta/globalOperations)
    # * [Regional](/compute/docs/reference/rest/beta/regionOperations)
    # * [Zonal](/compute/docs/reference/rest/beta/zoneOperations)
    #
    # You can use an operation resource to manage asynchronous API requests.
    # For more information, readHandling
    # API responses.
    #
    # Operations can be global, regional or zonal.
    #
    #    - For global operations, use the `globalOperations`
    #    resource.
    #    - For regional operations, use the
    #    `regionOperations` resource.
    #    - For zonal operations, use
    #    the `zoneOperations` resource.
    #
    #
    #
    # For more information, read
    # Global, Regional, and Zonal Resources.
    #
    # Note that completed Operation resources have a limited
    # retention period.
  &quot;clientOperationId&quot;: &quot;A String&quot;, # [Output Only] The value of `requestId` if you provided it in the request.
      # Not present otherwise.
  &quot;creationTimestamp&quot;: &quot;A String&quot;, # [Deprecated] This field is deprecated.
  &quot;description&quot;: &quot;A String&quot;, # [Output Only] A textual description of the operation, which is
      # set when the operation is created.
  &quot;endTime&quot;: &quot;A String&quot;, # [Output Only] The time that this operation was completed. This value is inRFC3339
      # text format.
  &quot;error&quot;: { # [Output Only] If errors are generated during processing of the operation,
      # this field will be populated.
    &quot;errors&quot;: [ # [Output Only] The array of errors encountered while processing this
        # operation.
      {
        &quot;code&quot;: &quot;A String&quot;, # [Output Only] The error type identifier for this error.
        &quot;errorDetails&quot;: [ # [Output Only] An optional list of messages that contain the error
            # details. There is a set of defined message types to use for providing
            # details.The syntax depends on the error code. For example,
            # QuotaExceededInfo will have details when the error code is
            # QUOTA_EXCEEDED.
          {
            &quot;errorInfo&quot;: { # Describes the cause of the error with structured details.
                #
                # Example of an error when contacting the &quot;pubsub.googleapis.com&quot; API when it
                # is not enabled:
                #
                #     { &quot;reason&quot;: &quot;API_DISABLED&quot;
                #       &quot;domain&quot;: &quot;googleapis.com&quot;
                #       &quot;metadata&quot;: {
                #         &quot;resource&quot;: &quot;projects/123&quot;,
                #         &quot;service&quot;: &quot;pubsub.googleapis.com&quot;
                #       }
                #     }
                #
                # This response indicates that the pubsub.googleapis.com API is not enabled.
                #
                # Example of an error that is returned when attempting to create a Spanner
                # instance in a region that is out of stock:
                #
                #     { &quot;reason&quot;: &quot;STOCKOUT&quot;
                #       &quot;domain&quot;: &quot;spanner.googleapis.com&quot;,
                #       &quot;metadata&quot;: {
                #         &quot;availableRegions&quot;: &quot;us-central1,us-east2&quot;
                #       }
                #     }
              &quot;domain&quot;: &quot;A String&quot;, # The logical grouping to which the &quot;reason&quot; belongs. The error domain
                  # is typically the registered service name of the tool or product that
                  # generates the error. Example: &quot;pubsub.googleapis.com&quot;. If the error is
                  # generated by some common infrastructure, the error domain must be a
                  # globally unique value that identifies the infrastructure. For Google API
                  # infrastructure, the error domain is &quot;googleapis.com&quot;.
              &quot;metadatas&quot;: { # Additional structured details about this error.
                  #
                  # Keys must match a regular expression of `a-z+` but should
                  # ideally be lowerCamelCase. Also, they must be limited to 64 characters in
                  # length. When identifying the current value of an exceeded limit, the units
                  # should be contained in the key, not the value.  For example, rather than
                  # `{&quot;instanceLimit&quot;: &quot;100/request&quot;}`, should be returned as,
                  # `{&quot;instanceLimitPerRequest&quot;: &quot;100&quot;}`, if the client exceeds the number of
                  # instances that can be created in a single (batch) request.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;reason&quot;: &quot;A String&quot;, # The reason of the error. This is a constant value that identifies the
                  # proximate cause of the error. Error reasons are unique within a particular
                  # domain of errors. This should be at most 63 characters and match a
                  # regular expression of `A-Z+[A-Z0-9]`, which represents
                  # UPPER_SNAKE_CASE.
            },
            &quot;help&quot;: { # Provides links to documentation or for performing an out of band action.
                #
                # For example, if a quota check failed with an error indicating the calling
                # project hasn&#x27;t enabled the accessed service, this can contain a URL pointing
                # directly to the right place in the developer console to flip the bit.
              &quot;links&quot;: [ # URL(s) pointing to additional information on handling the current error.
                { # Describes a URL link.
                  &quot;description&quot;: &quot;A String&quot;, # Describes what the link offers.
                  &quot;url&quot;: &quot;A String&quot;, # The URL of the link.
                },
              ],
            },
            &quot;localizedMessage&quot;: { # Provides a localized error message that is safe to return to the user
                # which can be attached to an RPC error.
              &quot;locale&quot;: &quot;A String&quot;, # The locale used following the specification defined at
                  # https://www.rfc-editor.org/rfc/bcp/bcp47.txt.
                  # Examples are: &quot;en-US&quot;, &quot;fr-CH&quot;, &quot;es-MX&quot;
              &quot;message&quot;: &quot;A String&quot;, # The localized error message in the above locale.
            },
            &quot;quotaInfo&quot;: { # Additional details for quota exceeded error for resource quota.
              &quot;dimensions&quot;: { # The map holding related quota dimensions.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;futureLimit&quot;: 3.14, # Future quota limit being rolled out. The limit&#x27;s unit depends on the quota
                  #  type or metric.
              &quot;limit&quot;: 3.14, # Current effective quota limit. The limit&#x27;s unit depends on the quota type
                  # or metric.
              &quot;limitName&quot;: &quot;A String&quot;, # The name of the quota limit.
              &quot;metricName&quot;: &quot;A String&quot;, # The Compute Engine quota metric name.
              &quot;rolloutStatus&quot;: &quot;A String&quot;, # Rollout status of the future quota limit.
            },
          },
        ],
        &quot;location&quot;: &quot;A String&quot;, # [Output Only] Indicates the field in the request that caused the error.
            # This property is optional.
        &quot;message&quot;: &quot;A String&quot;, # [Output Only] An optional, human-readable error message.
      },
    ],
  },
  &quot;httpErrorMessage&quot;: &quot;A String&quot;, # [Output Only] If the operation fails, this field contains the HTTP error
      # message that was returned, such as `NOT FOUND`.
  &quot;httpErrorStatusCode&quot;: 42, # [Output Only] If the operation fails, this field contains the HTTP error
      # status code that was returned. For example, a `404` means the
      # resource was not found.
  &quot;id&quot;: &quot;A String&quot;, # [Output Only] The unique identifier for the operation. This identifier is
      # defined by the server.
  &quot;insertTime&quot;: &quot;A String&quot;, # [Output Only] The time that this operation was requested.
      # This value is inRFC3339
      # text format.
  &quot;instancesBulkInsertOperationMetadata&quot;: {
    &quot;perLocationStatus&quot;: { # Status information per location (location name is key).
        # Example key: zones/us-central1-a
      &quot;a_key&quot;: {
        &quot;createdVmCount&quot;: 42, # [Output Only] Count of VMs successfully created so far.
        &quot;deletedVmCount&quot;: 42, # [Output Only] Count of VMs that got deleted during rollback.
        &quot;failedToCreateVmCount&quot;: 42, # [Output Only] Count of VMs that started creating but encountered an
            # error.
        &quot;status&quot;: &quot;A String&quot;, # [Output Only] Creation status of BulkInsert operation - information
            # if the flow is rolling forward or rolling back.
        &quot;targetVmCount&quot;: 42, # [Output Only] Count of VMs originally planned to be created.
      },
    },
  },
  &quot;kind&quot;: &quot;compute#operation&quot;, # [Output Only] Type of the resource. Always `compute#operation` for
      # Operation resources.
  &quot;name&quot;: &quot;A String&quot;, # [Output Only] Name of the operation.
  &quot;operationGroupId&quot;: &quot;A String&quot;, # [Output Only] An ID that represents a group of operations, such as when a
      # group of operations results from a `bulkInsert` API request.
  &quot;operationType&quot;: &quot;A String&quot;, # [Output Only] The type of operation, such as `insert`,
      # `update`, or `delete`, and so on.
  &quot;progress&quot;: 42, # [Output Only] An optional progress indicator that ranges from 0 to 100.
      # There is no requirement that this be linear or support any granularity of
      # operations. This should not be used to guess when the operation will be
      # complete. This number should monotonically increase as the operation
      # progresses.
  &quot;region&quot;: &quot;A String&quot;, # [Output Only] The URL of the region where the operation resides. Only
      # applicable when performing regional operations.
  &quot;selfLink&quot;: &quot;A String&quot;, # [Output Only] Server-defined URL for the resource.
  &quot;setCommonInstanceMetadataOperationMetadata&quot;: { # [Output Only] If the operation is for projects.setCommonInstanceMetadata,
      # this field will contain information on all underlying zonal actions and
      # their state.
    &quot;clientOperationId&quot;: &quot;A String&quot;, # [Output Only] The client operation id.
    &quot;perLocationOperations&quot;: { # [Output Only] Status information per location (location name is key).
        # Example key: zones/us-central1-a
      &quot;a_key&quot;: {
        &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # [Output Only] If state is `ABANDONED` or `FAILED`, this field is
            # populated.
            # 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;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;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;state&quot;: &quot;A String&quot;, # [Output Only] Status of the action, which can be one of the following:
            # `PROPAGATING`, `PROPAGATED`, `ABANDONED`, `FAILED`, or `DONE`.
      },
    },
  },
  &quot;startTime&quot;: &quot;A String&quot;, # [Output Only] The time that this operation was started by the server.
      # This value is inRFC3339
      # text format.
  &quot;status&quot;: &quot;A String&quot;, # [Output Only] The status of the operation, which can be one of the
      # following:
      # `PENDING`, `RUNNING`, or `DONE`.
  &quot;statusMessage&quot;: &quot;A String&quot;, # [Output Only] An optional textual description of the current status of the
      # operation.
  &quot;targetId&quot;: &quot;A String&quot;, # [Output Only] The unique target ID, which identifies a specific incarnation
      # of the target resource.
  &quot;targetLink&quot;: &quot;A String&quot;, # [Output Only] The URL of the resource that the operation modifies. For
      # operations related to creating a snapshot, this points to the disk
      # that the snapshot was created from.
  &quot;user&quot;: &quot;A String&quot;, # [Output Only] User who requested the operation, for example:
      # `user@example.com` or
      # `alice_smith_identifier (global/workforcePools/example-com-us-employees)`.
  &quot;warnings&quot;: [ # [Output Only] If warning messages are generated during processing of the
      # operation, this field will be populated.
    {
      &quot;code&quot;: &quot;A String&quot;, # [Output Only] A warning code, if applicable. For example, Compute
          # Engine returns NO_RESULTS_ON_PAGE if there
          # are no results in the response.
      &quot;data&quot;: [ # [Output Only] Metadata about this warning in key:
          # value format. For example:
          #
          # &quot;data&quot;: [
          #   {
          #    &quot;key&quot;: &quot;scope&quot;,
          #    &quot;value&quot;: &quot;zones/us-east1-d&quot;
          #   }
        {
          &quot;key&quot;: &quot;A String&quot;, # [Output Only] A key that provides more detail on the warning being
              # returned. For example, for warnings where there are no results in a list
              # request for a particular zone, this key might be scope and
              # the key value might be the zone name. Other examples might be a key
              # indicating a deprecated resource and a suggested replacement, or a
              # warning about invalid network settings (for example, if an instance
              # attempts to perform IP forwarding but is not enabled for IP forwarding).
          &quot;value&quot;: &quot;A String&quot;, # [Output Only] A warning data value corresponding to the key.
        },
      ],
      &quot;message&quot;: &quot;A String&quot;, # [Output Only] A human-readable description of the warning code.
    },
  ],
  &quot;zone&quot;: &quot;A String&quot;, # [Output Only] The URL of the zone where the operation resides. Only
      # applicable when performing per-zone operations.
}</pre>
</div>

<div class="method">
    <code class="details" id="list">list(project, region, filter=None, maxResults=None, orderBy=None, pageToken=None, returnPartialSuccess=None, x__xgafv=None)</code>
  <pre>Retrieves a list of multi-MIGs in a project and region.

Args:
  project: string, Project ID for this request. (required)
  region: string, Name of the region for this request. (required)
  filter: string, A filter expression that filters resources listed in the response. Most
Compute resources support two types of filter expressions:
expressions that support regular expressions and expressions that follow
API improvement proposal AIP-160.
These two types of filter expressions cannot be mixed in one request.

If you want to use AIP-160, your expression must specify the field name, an
operator, and the value that you want to use for filtering. The value
must be a string, a number, or a boolean. The operator
must be either `=`, `!=`, `&gt;`, `&lt;`, `&lt;=`, `&gt;=` or `:`.

For example, if you are filtering Compute Engine instances, you can
exclude instances named `example-instance` by specifying
`name != example-instance`.

The `:*` comparison can be used to test whether a key has been defined.
For example, to find all objects with `owner` label use:
```
labels.owner:*
```

You can also filter nested fields. For example, you could specify
`scheduling.automaticRestart = false` to include instances only
if they are not scheduled for automatic restarts. You can use filtering
on nested fields to filter based onresource labels.

To filter on multiple expressions, provide each separate expression within
parentheses. For example:
```
(scheduling.automaticRestart = true)
(cpuPlatform = &quot;Intel Skylake&quot;)
```
By default, each expression is an `AND` expression. However, you
can include `AND` and `OR` expressions explicitly.
For example:
```
(cpuPlatform = &quot;Intel Skylake&quot;) OR
(cpuPlatform = &quot;Intel Broadwell&quot;) AND
(scheduling.automaticRestart = true)
```

If you want to use a regular expression, use the `eq` (equal) or `ne`
(not equal) operator against a single un-parenthesized expression with or
without quotes or against multiple parenthesized expressions. Examples:

`fieldname eq unquoted literal`
`fieldname eq &#x27;single quoted literal&#x27;`
`fieldname eq &quot;double quoted literal&quot;`
`(fieldname1 eq literal) (fieldname2 ne &quot;literal&quot;)`

The literal value is interpreted as a regular expression using GoogleRE2 library syntax.
The literal value must match the entire field.

For example, to filter for instances that do not end with name &quot;instance&quot;,
you would use `name ne .*instance`.

You cannot combine constraints on multiple fields using regular
expressions.
  maxResults: integer, The maximum number of results per page that should be returned.
If the number of available results is larger than `maxResults`,
Compute Engine returns a `nextPageToken` that can be used to get
the next page of results in subsequent list requests. Acceptable values are
`0` to `500`, inclusive. (Default: `500`)
  orderBy: string, Sorts list results by a certain order. By default, results
are returned in alphanumerical order based on the resource name.

You can also sort results in descending order based on the creation
timestamp using `orderBy=&quot;creationTimestamp desc&quot;`. This sorts
results based on the `creationTimestamp` field in
reverse chronological order (newest result first). Use this to sort
resources like operations so that the newest operation is returned first.

Currently, only sorting by `name` or
`creationTimestamp desc` is supported.
  pageToken: string, Specifies a page token to use. Set `pageToken` to the
`nextPageToken` returned by a previous list request to get
the next page of results.
  returnPartialSuccess: boolean, Opt-in for partial success behavior which provides partial results in case
of failure. The default value is false.

For example, when partial success behavior is enabled, aggregatedList for a
single zone scope either returns all resources in the zone or no resources,
with an error code.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    {
  &quot;id&quot;: &quot;A String&quot;, # Unique identifier for the resource; defined by the server.
  &quot;items&quot;: [ # A list of multi-MIGs in the specified project and region.
    { # Multi-MIG represents a group of managed instance groups.
      &quot;creationTimestamp&quot;: &quot;A String&quot;, # [Output only] The creation timestamp of this multi-MIG in RFC3339
          # text format.
      &quot;description&quot;: &quot;A String&quot;, # An optional description of this resource.
      &quot;id&quot;: &quot;A String&quot;, # [Output only] The unique identifier for this resource type. The server
          # generates this identifier.
      &quot;kind&quot;: &quot;compute#multiMig&quot;, # [Output only] Type of the resource. Alwayscompute#multiMig for multi-MIGs.
      &quot;name&quot;: &quot;A String&quot;, # The name of the multi-MIG.
          # The name must be 1-63 characters long, and comply withRFC1035.
          # Specifically, the name must be 1-63 characters long and match the regular
          # expression `[a-z]([-a-z0-9]*[a-z0-9])?` which means the first character
          # must be a lowercase letter, and all following characters must be a dash,
          # lowercase letter, or digit, except the last character, which cannot be a
          # dash.
      &quot;region&quot;: &quot;A String&quot;, # [Output only] The URL of the region where the resource resides. You must
          # specify this field as part of the HTTP request URL. You cannot set the
          # region as a field in the request body.
      &quot;resourcePolicies&quot;: { # Resource policies message for a multi-MIG. Specifies the workload policy # Resource policies for this multi-MIG.
          # configuration of the multi-MIG.
        &quot;workloadPolicy&quot;: &quot;A String&quot;, # The URL of the workload policy for this multi-MIG.
            # It can be a full or partial URL. For example, the following are
            # all valid URLs to a workload policy:
            #
            #
            #       - https://www.googleapis.com/compute/v1/projects/project/regions/region/resourcePolicies/resourcePolicy
            #       - projects/project/regions/region/resourcePolicies/resourcePolicy
            #       - regions/region/resourcePolicies/resourcePolicy
      },
      &quot;selfLink&quot;: &quot;A String&quot;, # [Output only] Server-defined URL for the resource.
      &quot;status&quot;: {
        &quot;appliedAcceleratorTopologies&quot;: [ # [Output Only] The accelerator topology applied to this multi-MIG.
            # Currently only one accelerator topology is supported.
          {
            &quot;acceleratorTopology&quot;: &quot;A String&quot;, # [Output Only] Topology in the format of: &quot;16x16&quot;, &quot;4x4x4&quot;, etc.
                # The value is the same as configured in the WorkloadPolicy.
            &quot;acceleratorTopologyState&quot;: &quot;A String&quot;, # [Output Only] The state of the accelerator topology.
            &quot;acceleratorTopologyStateLastCheck&quot;: { # [Output Only] The result of the latest accelerator topology state
                # check.
              &quot;error&quot;: { # [Output Only] Encountered errors on the last state check.
                &quot;errors&quot;: [ # [Output Only] The array of errors encountered while processing this
                    # operation.
                  {
                    &quot;code&quot;: &quot;A String&quot;, # [Output Only] The error type identifier for this error.
                    &quot;errorDetails&quot;: [ # [Output Only] An optional list of messages that contain the error
                        # details. There is a set of defined message types to use for providing
                        # details.The syntax depends on the error code. For example,
                        # QuotaExceededInfo will have details when the error code is
                        # QUOTA_EXCEEDED.
                      {
                        &quot;errorInfo&quot;: { # Describes the cause of the error with structured details.
                            #
                            # Example of an error when contacting the &quot;pubsub.googleapis.com&quot; API when it
                            # is not enabled:
                            #
                            #     { &quot;reason&quot;: &quot;API_DISABLED&quot;
                            #       &quot;domain&quot;: &quot;googleapis.com&quot;
                            #       &quot;metadata&quot;: {
                            #         &quot;resource&quot;: &quot;projects/123&quot;,
                            #         &quot;service&quot;: &quot;pubsub.googleapis.com&quot;
                            #       }
                            #     }
                            #
                            # This response indicates that the pubsub.googleapis.com API is not enabled.
                            #
                            # Example of an error that is returned when attempting to create a Spanner
                            # instance in a region that is out of stock:
                            #
                            #     { &quot;reason&quot;: &quot;STOCKOUT&quot;
                            #       &quot;domain&quot;: &quot;spanner.googleapis.com&quot;,
                            #       &quot;metadata&quot;: {
                            #         &quot;availableRegions&quot;: &quot;us-central1,us-east2&quot;
                            #       }
                            #     }
                          &quot;domain&quot;: &quot;A String&quot;, # The logical grouping to which the &quot;reason&quot; belongs. The error domain
                              # is typically the registered service name of the tool or product that
                              # generates the error. Example: &quot;pubsub.googleapis.com&quot;. If the error is
                              # generated by some common infrastructure, the error domain must be a
                              # globally unique value that identifies the infrastructure. For Google API
                              # infrastructure, the error domain is &quot;googleapis.com&quot;.
                          &quot;metadatas&quot;: { # Additional structured details about this error.
                              #
                              # Keys must match a regular expression of `a-z+` but should
                              # ideally be lowerCamelCase. Also, they must be limited to 64 characters in
                              # length. When identifying the current value of an exceeded limit, the units
                              # should be contained in the key, not the value.  For example, rather than
                              # `{&quot;instanceLimit&quot;: &quot;100/request&quot;}`, should be returned as,
                              # `{&quot;instanceLimitPerRequest&quot;: &quot;100&quot;}`, if the client exceeds the number of
                              # instances that can be created in a single (batch) request.
                            &quot;a_key&quot;: &quot;A String&quot;,
                          },
                          &quot;reason&quot;: &quot;A String&quot;, # The reason of the error. This is a constant value that identifies the
                              # proximate cause of the error. Error reasons are unique within a particular
                              # domain of errors. This should be at most 63 characters and match a
                              # regular expression of `A-Z+[A-Z0-9]`, which represents
                              # UPPER_SNAKE_CASE.
                        },
                        &quot;help&quot;: { # Provides links to documentation or for performing an out of band action.
                            #
                            # For example, if a quota check failed with an error indicating the calling
                            # project hasn&#x27;t enabled the accessed service, this can contain a URL pointing
                            # directly to the right place in the developer console to flip the bit.
                          &quot;links&quot;: [ # URL(s) pointing to additional information on handling the current error.
                            { # Describes a URL link.
                              &quot;description&quot;: &quot;A String&quot;, # Describes what the link offers.
                              &quot;url&quot;: &quot;A String&quot;, # The URL of the link.
                            },
                          ],
                        },
                        &quot;localizedMessage&quot;: { # Provides a localized error message that is safe to return to the user
                            # which can be attached to an RPC error.
                          &quot;locale&quot;: &quot;A String&quot;, # The locale used following the specification defined at
                              # https://www.rfc-editor.org/rfc/bcp/bcp47.txt.
                              # Examples are: &quot;en-US&quot;, &quot;fr-CH&quot;, &quot;es-MX&quot;
                          &quot;message&quot;: &quot;A String&quot;, # The localized error message in the above locale.
                        },
                        &quot;quotaInfo&quot;: { # Additional details for quota exceeded error for resource quota.
                          &quot;dimensions&quot;: { # The map holding related quota dimensions.
                            &quot;a_key&quot;: &quot;A String&quot;,
                          },
                          &quot;futureLimit&quot;: 3.14, # Future quota limit being rolled out. The limit&#x27;s unit depends on the quota
                              #  type or metric.
                          &quot;limit&quot;: 3.14, # Current effective quota limit. The limit&#x27;s unit depends on the quota type
                              # or metric.
                          &quot;limitName&quot;: &quot;A String&quot;, # The name of the quota limit.
                          &quot;metricName&quot;: &quot;A String&quot;, # The Compute Engine quota metric name.
                          &quot;rolloutStatus&quot;: &quot;A String&quot;, # Rollout status of the future quota limit.
                        },
                      },
                    ],
                    &quot;location&quot;: &quot;A String&quot;, # [Output Only] Indicates the field in the request that caused the error.
                        # This property is optional.
                    &quot;message&quot;: &quot;A String&quot;, # [Output Only] An optional, human-readable error message.
                  },
                ],
              },
              &quot;timestamp&quot;: &quot;A String&quot;, # [Output Only] Timestamp is shown only if there is an error. The field
                  # has // RFC3339 //
                  # text format.
            },
          },
        ],
      },
    },
  ],
  &quot;kind&quot;: &quot;compute#multiMigList&quot;, # Type of resource.
  &quot;nextPageToken&quot;: &quot;A String&quot;, # This token allows you to get the next page of results formaxResults, use the nextPageToken as a value for
      # the query parameter pageToken in the next list request.
      # Subsequent list requests will have their own nextPageToken to
      # continue paging through the results.
  &quot;selfLink&quot;: &quot;A String&quot;, # [Output only] Server-defined URL for this resource.
  &quot;warning&quot;: { # Informational warning message.
    &quot;code&quot;: &quot;A String&quot;, # [Output Only] A warning code, if applicable. For example, Compute
        # Engine returns NO_RESULTS_ON_PAGE if there
        # are no results in the response.
    &quot;data&quot;: [ # [Output Only] Metadata about this warning in key:
        # value format. For example:
        #
        # &quot;data&quot;: [
        #   {
        #    &quot;key&quot;: &quot;scope&quot;,
        #    &quot;value&quot;: &quot;zones/us-east1-d&quot;
        #   }
      {
        &quot;key&quot;: &quot;A String&quot;, # [Output Only] A key that provides more detail on the warning being
            # returned. For example, for warnings where there are no results in a list
            # request for a particular zone, this key might be scope and
            # the key value might be the zone name. Other examples might be a key
            # indicating a deprecated resource and a suggested replacement, or a
            # warning about invalid network settings (for example, if an instance
            # attempts to perform IP forwarding but is not enabled for IP forwarding).
        &quot;value&quot;: &quot;A String&quot;, # [Output Only] A warning data value corresponding to the key.
      },
    ],
    &quot;message&quot;: &quot;A String&quot;, # [Output Only] A human-readable description of the warning code.
  },
}</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next()</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>