<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, pageSize=None, filter=None, pageToken=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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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, pageSize=None, filter=None, pageToken=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)
  pageSize: integer, The maximum number of items to return.
  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.
  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;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;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;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;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;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;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;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;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;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>