<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="bigqueryreservation_v1alpha2.html">BigQuery Reservation API</a> . <a href="bigqueryreservation_v1alpha2.projects.html">projects</a> . <a href="bigqueryreservation_v1alpha2.projects.locations.html">locations</a> . <a href="bigqueryreservation_v1alpha2.projects.locations.reservations.html">reservations</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="bigqueryreservation_v1alpha2.projects.locations.reservations.slotPools.html">slotPools()</a></code>
</p>
<p class="firstline">Returns the slotPools Resource.</p>

<p class="toc_element">
  <code><a href="#create">create(parent, body=None, reservationId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a new reservation resource. Multiple reservations are created if</p>
<p class="toc_element">
  <code><a href="#createReservation">createReservation(parent, body=None, reservationId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a new reservation resource. Multiple reservations are created if</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, force=None, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a reservation.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Returns information about the reservation.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, filter=None, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists all the reservations for the project in the specified location.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates an existing reservation resource. Applicable only for child</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, reservationId=None, x__xgafv=None)</code>
  <pre>Creates a new reservation resource. Multiple reservations are created if
the ancestor reservations do not exist.

Args:
  parent: string, Project, location, and (optionally) reservation name. E.g.,
   projects/myproject/locations/us-central1/reservations/parent (required)
  body: object, The request body.
    The object takes the form of:

{ # A reservation is a mechanism used to guarantee slots to users.
    &quot;name&quot;: &quot;A String&quot;, # The resource name of the reservation, e.g.,
        # &quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
        # (e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
        # `google.rpc.Code.INVALID_ARGUMENT`.
    &quot;slotCapacity&quot;: &quot;A String&quot;, # Maximum slots available to this reservation and its children. A slot is a
        # unit of computational power in BigQuery, and serves as the unit of
        # parallelism. In a scan of a multi-partitioned table, a single slot operates
        # on a single partition of the table.
        # 
        # If the new reservation&#x27;s slot capacity exceed the parent&#x27;s slot capacity or
        # if total slot capacity of the new reservation and its siblings exceeds the
        # parent&#x27;s slot capacity, the request will fail with
        # `google.rpc.Code.RESOURCE_EXHAUSTED`.
    &quot;useParentReservation&quot;: True or False, # If true, any query using this reservation will also be submitted to the
        # parent reservation. This allows the query to share the additional slot
        # capacity of the parent with other queries in the parent reservation. If the
        # parent also has this field set to true, then this process will continue
        # until it encounters a reservation for which this is false.
        # If false, a query using this reservation will
        # execute with the maximum slot capacity as specified above.
        # If not specified, default value is true.
        # Ignored for top-level reservation.
  }

  reservationId: string, The reservation ID relative to the parent, e.g., &quot;dev&quot;. This field must
only contain alphanumeric characters.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A reservation is a mechanism used to guarantee slots to users.
      &quot;name&quot;: &quot;A String&quot;, # The resource name of the reservation, e.g.,
          # &quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
          # (e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
          # `google.rpc.Code.INVALID_ARGUMENT`.
      &quot;slotCapacity&quot;: &quot;A String&quot;, # Maximum slots available to this reservation and its children. A slot is a
          # unit of computational power in BigQuery, and serves as the unit of
          # parallelism. In a scan of a multi-partitioned table, a single slot operates
          # on a single partition of the table.
          #
          # If the new reservation&#x27;s slot capacity exceed the parent&#x27;s slot capacity or
          # if total slot capacity of the new reservation and its siblings exceeds the
          # parent&#x27;s slot capacity, the request will fail with
          # `google.rpc.Code.RESOURCE_EXHAUSTED`.
      &quot;useParentReservation&quot;: True or False, # If true, any query using this reservation will also be submitted to the
          # parent reservation. This allows the query to share the additional slot
          # capacity of the parent with other queries in the parent reservation. If the
          # parent also has this field set to true, then this process will continue
          # until it encounters a reservation for which this is false.
          # If false, a query using this reservation will
          # execute with the maximum slot capacity as specified above.
          # If not specified, default value is true.
          # Ignored for top-level reservation.
    }</pre>
</div>

<div class="method">
    <code class="details" id="createReservation">createReservation(parent, body=None, reservationId=None, x__xgafv=None)</code>
  <pre>Creates a new reservation resource. Multiple reservations are created if
the ancestor reservations do not exist.

Args:
  parent: string, Project, location, and (optionally) reservation name. E.g.,
   projects/myproject/locations/us-central1/reservations/parent (required)
  body: object, The request body.
    The object takes the form of:

{ # A reservation is a mechanism used to guarantee slots to users.
    &quot;name&quot;: &quot;A String&quot;, # The resource name of the reservation, e.g.,
        # &quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
        # (e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
        # `google.rpc.Code.INVALID_ARGUMENT`.
    &quot;slotCapacity&quot;: &quot;A String&quot;, # Maximum slots available to this reservation and its children. A slot is a
        # unit of computational power in BigQuery, and serves as the unit of
        # parallelism. In a scan of a multi-partitioned table, a single slot operates
        # on a single partition of the table.
        # 
        # If the new reservation&#x27;s slot capacity exceed the parent&#x27;s slot capacity or
        # if total slot capacity of the new reservation and its siblings exceeds the
        # parent&#x27;s slot capacity, the request will fail with
        # `google.rpc.Code.RESOURCE_EXHAUSTED`.
    &quot;useParentReservation&quot;: True or False, # If true, any query using this reservation will also be submitted to the
        # parent reservation. This allows the query to share the additional slot
        # capacity of the parent with other queries in the parent reservation. If the
        # parent also has this field set to true, then this process will continue
        # until it encounters a reservation for which this is false.
        # If false, a query using this reservation will
        # execute with the maximum slot capacity as specified above.
        # If not specified, default value is true.
        # Ignored for top-level reservation.
  }

  reservationId: string, The reservation ID relative to the parent, e.g., &quot;dev&quot;. This field must
only contain alphanumeric characters.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A reservation is a mechanism used to guarantee slots to users.
      &quot;name&quot;: &quot;A String&quot;, # The resource name of the reservation, e.g.,
          # &quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
          # (e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
          # `google.rpc.Code.INVALID_ARGUMENT`.
      &quot;slotCapacity&quot;: &quot;A String&quot;, # Maximum slots available to this reservation and its children. A slot is a
          # unit of computational power in BigQuery, and serves as the unit of
          # parallelism. In a scan of a multi-partitioned table, a single slot operates
          # on a single partition of the table.
          #
          # If the new reservation&#x27;s slot capacity exceed the parent&#x27;s slot capacity or
          # if total slot capacity of the new reservation and its siblings exceeds the
          # parent&#x27;s slot capacity, the request will fail with
          # `google.rpc.Code.RESOURCE_EXHAUSTED`.
      &quot;useParentReservation&quot;: True or False, # If true, any query using this reservation will also be submitted to the
          # parent reservation. This allows the query to share the additional slot
          # capacity of the parent with other queries in the parent reservation. If the
          # parent also has this field set to true, then this process will continue
          # until it encounters a reservation for which this is false.
          # If false, a query using this reservation will
          # execute with the maximum slot capacity as specified above.
          # If not specified, default value is true.
          # Ignored for top-level reservation.
    }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, force=None, x__xgafv=None)</code>
  <pre>Deletes a reservation.
Returns `google.rpc.Code.FAILED_PRECONDITION` in the following cases:
  1. When reservation has child reservations. This check can be bypassed by
     setting DeleteReservationRequest.force flag to true.
  2. When top-level reservation with slot pools is being deleted.

Args:
  name: string, Resource name of the reservation to retrieve. E.g.,
   projects/myproject/locations/us-central1/reservations/my_reservation (required)
  force: boolean, If true, deletes all the child reservations of the given reservation.
Otherwise, attempting to delete a reservation that has child
reservations will fail with error code
`google.rpc.Code.FAILED_PRECONDITION`.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Returns information about the reservation.

Args:
  name: string, Resource name of the reservation to retrieve. E.g.,
   projects/myproject/locations/us-central1/reservations/path/to/reserv (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A reservation is a mechanism used to guarantee slots to users.
      &quot;name&quot;: &quot;A String&quot;, # The resource name of the reservation, e.g.,
          # &quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
          # (e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
          # `google.rpc.Code.INVALID_ARGUMENT`.
      &quot;slotCapacity&quot;: &quot;A String&quot;, # Maximum slots available to this reservation and its children. A slot is a
          # unit of computational power in BigQuery, and serves as the unit of
          # parallelism. In a scan of a multi-partitioned table, a single slot operates
          # on a single partition of the table.
          #
          # If the new reservation&#x27;s slot capacity exceed the parent&#x27;s slot capacity or
          # if total slot capacity of the new reservation and its siblings exceeds the
          # parent&#x27;s slot capacity, the request will fail with
          # `google.rpc.Code.RESOURCE_EXHAUSTED`.
      &quot;useParentReservation&quot;: True or False, # If true, any query using this reservation will also be submitted to the
          # parent reservation. This allows the query to share the additional slot
          # capacity of the parent with other queries in the parent reservation. If the
          # parent also has this field set to true, then this process will continue
          # until it encounters a reservation for which this is false.
          # If false, a query using this reservation will
          # execute with the maximum slot capacity as specified above.
          # If not specified, default value is true.
          # Ignored for top-level reservation.
    }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, filter=None, pageToken=None, pageSize=None, x__xgafv=None)</code>
  <pre>Lists all the reservations for the project in the specified location.

Args:
  parent: string, The parent resource name containing project and location, e.g.:
  &quot;projects/myproject/locations/us-central1&quot; (required)
  filter: string, Can be used to filter out reservations based on names, capacity, etc, e.g.:
filter=&quot;reservation.slot_capacity &gt; 200&quot;
filter=&quot;reservation.name = \&quot;*dev/*\&quot;&quot;
Advanced filtering syntax can be
[here](https://cloud.google.com/logging/docs/view/advanced-filters).
  pageToken: string, The next_page_token value returned from a previous List request, if any.
  pageSize: integer, The maximum number of items to return.
  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 ReservationService.ListReservations.
    &quot;reservations&quot;: [ # List of reservations visible to the user.
      { # A reservation is a mechanism used to guarantee slots to users.
          &quot;name&quot;: &quot;A String&quot;, # The resource name of the reservation, e.g.,
              # &quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
              # (e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
              # `google.rpc.Code.INVALID_ARGUMENT`.
          &quot;slotCapacity&quot;: &quot;A String&quot;, # Maximum slots available to this reservation and its children. A slot is a
              # unit of computational power in BigQuery, and serves as the unit of
              # parallelism. In a scan of a multi-partitioned table, a single slot operates
              # on a single partition of the table.
              #
              # If the new reservation&#x27;s slot capacity exceed the parent&#x27;s slot capacity or
              # if total slot capacity of the new reservation and its siblings exceeds the
              # parent&#x27;s slot capacity, the request will fail with
              # `google.rpc.Code.RESOURCE_EXHAUSTED`.
          &quot;useParentReservation&quot;: True or False, # If true, any query using this reservation will also be submitted to the
              # parent reservation. This allows the query to share the additional slot
              # capacity of the parent with other queries in the parent reservation. If the
              # parent also has this field set to true, then this process will continue
              # until it encounters a reservation for which this is false.
              # If false, a query using this reservation will
              # execute with the maximum slot capacity as specified above.
              # If not specified, default value is true.
              # Ignored for top-level reservation.
        },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token to retrieve the next page of results, or empty if there are no
        # more results in the list.
  }</pre>
</div>

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

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

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

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates an existing reservation resource. Applicable only for child
reservations.

Args:
  name: string, The resource name of the reservation, e.g.,
&quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
(e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
`google.rpc.Code.INVALID_ARGUMENT`. (required)
  body: object, The request body.
    The object takes the form of:

{ # A reservation is a mechanism used to guarantee slots to users.
    &quot;name&quot;: &quot;A String&quot;, # The resource name of the reservation, e.g.,
        # &quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
        # (e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
        # `google.rpc.Code.INVALID_ARGUMENT`.
    &quot;slotCapacity&quot;: &quot;A String&quot;, # Maximum slots available to this reservation and its children. A slot is a
        # unit of computational power in BigQuery, and serves as the unit of
        # parallelism. In a scan of a multi-partitioned table, a single slot operates
        # on a single partition of the table.
        # 
        # If the new reservation&#x27;s slot capacity exceed the parent&#x27;s slot capacity or
        # if total slot capacity of the new reservation and its siblings exceeds the
        # parent&#x27;s slot capacity, the request will fail with
        # `google.rpc.Code.RESOURCE_EXHAUSTED`.
    &quot;useParentReservation&quot;: True or False, # If true, any query using this reservation will also be submitted to the
        # parent reservation. This allows the query to share the additional slot
        # capacity of the parent with other queries in the parent reservation. If the
        # parent also has this field set to true, then this process will continue
        # until it encounters a reservation for which this is false.
        # If false, a query using this reservation will
        # execute with the maximum slot capacity as specified above.
        # If not specified, default value is true.
        # Ignored for top-level reservation.
  }

  updateMask: string, Standard field mask for the set of fields to be updated.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A reservation is a mechanism used to guarantee slots to users.
      &quot;name&quot;: &quot;A String&quot;, # The resource name of the reservation, e.g.,
          # &quot;projects/*/locations/*/reservations/dev/team/product&quot;. Reservation names
          # (e.g., &quot;dev/team/product&quot;) exceeding a depth of six will fail with
          # `google.rpc.Code.INVALID_ARGUMENT`.
      &quot;slotCapacity&quot;: &quot;A String&quot;, # Maximum slots available to this reservation and its children. A slot is a
          # unit of computational power in BigQuery, and serves as the unit of
          # parallelism. In a scan of a multi-partitioned table, a single slot operates
          # on a single partition of the table.
          #
          # If the new reservation&#x27;s slot capacity exceed the parent&#x27;s slot capacity or
          # if total slot capacity of the new reservation and its siblings exceeds the
          # parent&#x27;s slot capacity, the request will fail with
          # `google.rpc.Code.RESOURCE_EXHAUSTED`.
      &quot;useParentReservation&quot;: True or False, # If true, any query using this reservation will also be submitted to the
          # parent reservation. This allows the query to share the additional slot
          # capacity of the parent with other queries in the parent reservation. If the
          # parent also has this field set to true, then this process will continue
          # until it encounters a reservation for which this is false.
          # If false, a query using this reservation will
          # execute with the maximum slot capacity as specified above.
          # If not specified, default value is true.
          # Ignored for top-level reservation.
    }</pre>
</div>

</body></html>