<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_v1beta1.html">BigQuery Reservation API</a> . <a href="bigqueryreservation_v1beta1.projects.html">projects</a> . <a href="bigqueryreservation_v1beta1.projects.locations.html">locations</a> . <a href="bigqueryreservation_v1beta1.projects.locations.reservations.html">reservations</a> . <a href="bigqueryreservation_v1beta1.projects.locations.reservations.assignments.html">assignments</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates an assignment object which allows the given project to submit jobs</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a assignment. No expansion will happen.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists assignments.</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="#move">move(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Moves an assignment under a new reservation.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Creates an assignment object which allows the given project to submit jobs
of a certain type using slots from the specified reservation.

Currently a
resource (project, folder, organization) can only have one assignment per
each (job_type, location) combination, and that reservation will be used
for all jobs of the matching type.

Different assignments can be created on different levels of the
projects, folders or organization hierarchy.  During query execution,
the assignment is looked up at the project, folder and organization levels
in that order. The first assignment found is applied to the query.

When creating assignments, it does not matter if other assignments exist at
higher levels.

Example:

* The organization `organizationA` contains two projects, `project1`
  and `project2`.
* Assignments for all three entities (`organizationA`, `project1`, and
  `project2`) could all be created and mapped to the same or different
  reservations.

Returns `google.rpc.Code.PERMISSION_DENIED` if user does not have
&#x27;bigquery.admin&#x27; permissions on the project using the reservation
and the project that owns this reservation.

Returns `google.rpc.Code.INVALID_ARGUMENT` when location of the assignment
does not match location of the reservation.

Args:
  parent: string, Required. The parent resource name of the assignment
E.g. `projects/myproject/locations/US/reservations/team1-prod` (required)
  body: object, The request body.
    The object takes the form of:

{ # A Assignment allows a project to submit jobs
    # of a certain type using slots from the specified reservation.
  &quot;jobType&quot;: &quot;A String&quot;, # Which type of jobs will use the reservation.
  &quot;name&quot;: &quot;A String&quot;, # Output only. Name of the resource. E.g.:
      # `projects/myproject/locations/US/reservations/team1-prod/assignments/123`.
  &quot;assignee&quot;: &quot;A String&quot;, # The resource which will use the reservation. E.g.
      # `projects/myproject`, `folders/123`, or `organizations/456`.
  &quot;state&quot;: &quot;A String&quot;, # Output only. State of the assignment.
}

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A Assignment allows a project to submit jobs
      # of a certain type using slots from the specified reservation.
    &quot;jobType&quot;: &quot;A String&quot;, # Which type of jobs will use the reservation.
    &quot;name&quot;: &quot;A String&quot;, # Output only. Name of the resource. E.g.:
        # `projects/myproject/locations/US/reservations/team1-prod/assignments/123`.
    &quot;assignee&quot;: &quot;A String&quot;, # The resource which will use the reservation. E.g.
        # `projects/myproject`, `folders/123`, or `organizations/456`.
    &quot;state&quot;: &quot;A String&quot;, # Output only. State of the assignment.
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Deletes a assignment. No expansion will happen.

Example:

* Organization `organizationA` contains two projects, `project1` and
  `project2`.
* Reservation `res1` exists and was created previously.
* CreateAssignment was used previously to define the following
  associations between entities and reservations: `&lt;organizationA, res1&gt;`
  and `&lt;project1, res1&gt;`

In this example, deletion of the `&lt;organizationA, res1&gt;` assignment won&#x27;t
affect the other assignment `&lt;project1, res1&gt;`. After said deletion,
queries from `project1` will still use `res1` while queries from
`project2` will switch to use on-demand mode.

Args:
  name: string, Required. Name of the resource, e.g.
  `projects/myproject/locations/US/reservations/team1-prod/assignments/123` (required)
  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="list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</code>
  <pre>Lists assignments.

Only explicitly created assignments will be returned.

Example:

* Organization `organizationA` contains two projects, `project1` and
  `project2`.
* Reservation `res1` exists and was created previously.
* CreateAssignment was used previously to define the following
  associations between entities and reservations: `&lt;organizationA, res1&gt;`
  and `&lt;project1, res1&gt;`

In this example, ListAssignments will just return the above two assignments
for reservation `res1`, and no expansion/merge will happen.

The wildcard &quot;-&quot; can be used for
reservations in the request. In that case all assignments belongs to the
specified project and location will be listed.

**Note** &quot;-&quot; cannot be used for projects nor locations.

Args:
  parent: string, Required. The parent resource name e.g.:

`projects/myproject/locations/US/reservations/team1-prod`

Or:

`projects/myproject/locations/US/reservations/-` (required)
  pageSize: integer, The maximum number of items to return.
  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.ListAssignments.
    &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.
    &quot;assignments&quot;: [ # List of assignments visible to the user.
      { # A Assignment allows a project to submit jobs
          # of a certain type using slots from the specified reservation.
        &quot;jobType&quot;: &quot;A String&quot;, # Which type of jobs will use the reservation.
        &quot;name&quot;: &quot;A String&quot;, # Output only. Name of the resource. E.g.:
            # `projects/myproject/locations/US/reservations/team1-prod/assignments/123`.
        &quot;assignee&quot;: &quot;A String&quot;, # The resource which will use the reservation. E.g.
            # `projects/myproject`, `folders/123`, or `organizations/456`.
        &quot;state&quot;: &quot;A String&quot;, # Output only. State of the assignment.
      },
    ],
  }</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="move">move(name, body=None, x__xgafv=None)</code>
  <pre>Moves an assignment under a new reservation.

This differs from removing an existing assignment and recreating a new one
by providing a transactional change that ensures an assignee always has an
associated reservation.

Args:
  name: string, Required. The resource name of the assignment,
e.g.
`projects/myproject/locations/US/reservations/team1-prod/assignments/123` (required)
  body: object, The request body.
    The object takes the form of:

{ # The request for
      # ReservationService.MoveAssignment.
      # 
      # **Note**: &quot;bigquery.reservationAssignments.create&quot; permission is required on
      # the destination_id.
      # 
      # **Note**: &quot;bigquery.reservationAssignments.create&quot; and
      # &quot;bigquery.reservationAssignments.delete&quot; permission are required on the
      # related assignee.
    &quot;destinationId&quot;: &quot;A String&quot;, # The new reservation ID, e.g.:
        #   `projects/myotherproject/locations/US/reservations/team2-prod`
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A Assignment allows a project to submit jobs
      # of a certain type using slots from the specified reservation.
    &quot;jobType&quot;: &quot;A String&quot;, # Which type of jobs will use the reservation.
    &quot;name&quot;: &quot;A String&quot;, # Output only. Name of the resource. E.g.:
        # `projects/myproject/locations/US/reservations/team1-prod/assignments/123`.
    &quot;assignee&quot;: &quot;A String&quot;, # The resource which will use the reservation. E.g.
        # `projects/myproject`, `folders/123`, or `organizations/456`.
    &quot;state&quot;: &quot;A String&quot;, # Output only. State of the assignment.
  }</pre>
</div>

</body></html>