<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="spanner_v1.html">Cloud Spanner API</a> . <a href="spanner_v1.projects.html">projects</a> . <a href="spanner_v1.projects.instances.html">instances</a> . <a href="spanner_v1.projects.instances.backupOperations.html">backupOperations</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#list">list(parent, pageSize=None, pageToken=None, filter=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists the backup long-running operations in</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="list">list(parent, pageSize=None, pageToken=None, filter=None, x__xgafv=None)</code>
  <pre>Lists the backup long-running operations in
the given instance. A backup operation has a name of the form
`projects/&lt;project&gt;/instances/&lt;instance&gt;/backups/&lt;backup&gt;/operations/&lt;operation&gt;`.
The long-running operation
metadata field type
`metadata.type_url` describes the type of the metadata. Operations returned
include those that have completed/failed/canceled within the last 7 days,
and pending operations. Operations returned are ordered by
`operation.metadata.value.progress.start_time` in descending order starting
from the most recently started operation.

Args:
  parent: string, Required. The instance of the backup operations. Values are of
the form `projects/&lt;project&gt;/instances/&lt;instance&gt;`. (required)
  pageSize: integer, Number of operations to be returned in the response. If 0 or
less, defaults to the server&#x27;s maximum allowed page size.
  pageToken: string, If non-empty, `page_token` should contain a
next_page_token
from a previous ListBackupOperationsResponse to the
same `parent` and with the same `filter`.
  filter: string, An expression that filters the list of returned backup operations.

A filter expression consists of a field name, a
comparison operator, and a value for filtering.
The value must be a string, a number, or a boolean. The comparison operator
must be one of: `&lt;`, `&gt;`, `&lt;=`, `&gt;=`, `!=`, `=`, or `:`.
Colon `:` is the contains operator. Filter rules are not case sensitive.

The following fields in the operation
are eligible for filtering:

  * `name` - The name of the long-running operation
  * `done` - False if the operation is in progress, else true.
  * `metadata.@type` - the type of metadata. For example, the type string
     for CreateBackupMetadata is
     `type.googleapis.com/google.spanner.admin.database.v1.CreateBackupMetadata`.
  * `metadata.&lt;field_name&gt;` - any field in metadata.value.
  * `error` - Error associated with the long-running operation.
  * `response.@type` - the type of response.
  * `response.&lt;field_name&gt;` - any field in response.value.

You can combine multiple expressions by enclosing each expression in
parentheses. By default, expressions are combined with AND logic, but
you can specify AND, OR, and NOT logic explicitly.

Here are a few examples:

  * `done:true` - The operation is complete.
  * `metadata.database:prod` - The database the backup was taken from has
     a name containing the string &quot;prod&quot;.
  * `(metadata.@type=type.googleapis.com/google.spanner.admin.database.v1.CreateBackupMetadata) AND` &lt;br/&gt;
    `(metadata.name:howl) AND` &lt;br/&gt;
    `(metadata.progress.start_time &lt; \&quot;2018-03-28T14:50:00Z\&quot;) AND` &lt;br/&gt;
    `(error:*)` - Returns operations where:
    * The operation&#x27;s metadata type is CreateBackupMetadata.
    * The backup name contains the string &quot;howl&quot;.
    * The operation started before 2018-03-28T14:50:00Z.
    * The operation resulted in an error.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response for
      # ListBackupOperations.
    &quot;operations&quot;: [ # The list of matching backup long-running
        # operations. Each operation&#x27;s name will be
        # prefixed by the backup&#x27;s name and the operation&#x27;s
        # metadata will be of type
        # CreateBackupMetadata. Operations returned include those that are
        # pending or have completed/failed/canceled within the last 7 days.
        # Operations returned are ordered by
        # `operation.metadata.value.progress.start_time` in descending order starting
        # from the most recently started operation.
      { # This resource represents a long-running operation that is the result of a
          # network API call.
        &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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        },
        &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.
        },
        &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;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
            # If `true`, the operation is completed, and either `error` or `response` is
            # available.
        &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
            # method returns no data on success, such as `Delete`, the response is
            # `google.protobuf.Empty`.  If the original method is standard
            # `Get`/`Create`/`Update`, the response should be the resource.  For other
            # methods, the response should have the type `XxxResponse`, where `Xxx`
            # is the original method name.  For example, if the original method name
            # is `TakeSnapshot()`, the inferred response type is
            # `TakeSnapshotResponse`.
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # `next_page_token` can be sent in a subsequent
        # ListBackupOperations
        # call to fetch more of the matching metadata.
  }</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>