<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_v1.html">BigQuery Reservation API</a> . <a href="bigqueryreservation_v1.projects.html">projects</a> . <a href="bigqueryreservation_v1.projects.locations.html">locations</a> . <a href="bigqueryreservation_v1.projects.locations.capacityCommitments.html">capacityCommitments</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, enforceSingleAdminProjectPerOrg=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a new capacity commitment resource.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a capacity commitment. Attempting to delete capacity commitment</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Returns information about the capacity commitment.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists all the capacity commitments for the admin project.</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="#merge">merge(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Merges capacity commitments of the same plan into a single commitment.</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 capacity commitment.</p>
<p class="toc_element">
  <code><a href="#split">split(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Splits capacity commitment to two commitments of the same plan and</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, enforceSingleAdminProjectPerOrg=None, x__xgafv=None)</code>
  <pre>Creates a new capacity commitment resource.

Args:
  parent: string, Required. Resource name of the parent reservation. E.g.,
   `projects/myproject/locations/US` (required)
  body: object, The request body.
    The object takes the form of:

{ # Capacity commitment is a way to purchase compute capacity for BigQuery jobs
    # (in the form of slots) with some committed period of usage. Annual
    # commitments renew by default. Commitments can be removed after their
    # commitment end time passes.
    # 
    # In order to remove annual commitment, its plan needs to be changed
    # to monthly or flex first.
    # 
    # A capacity commitment resource exists as a child resource of the admin
    # project.
  &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
      # capacity commitments.
  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
      # `projects/myproject/locations/US/capacityCommitments/123`
  &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
      # ACTIVE capacity commitments.
  &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
      # passes. Once the plan is changed, committed period is extended according to
      # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
  &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
  &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
      # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
  },
  &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
  &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
}

  enforceSingleAdminProjectPerOrg: boolean, If true, fail the request if another project in the organization has a
capacity commitment.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Capacity commitment is a way to purchase compute capacity for BigQuery jobs
      # (in the form of slots) with some committed period of usage. Annual
      # commitments renew by default. Commitments can be removed after their
      # commitment end time passes.
      #
      # In order to remove annual commitment, its plan needs to be changed
      # to monthly or flex first.
      #
      # A capacity commitment resource exists as a child resource of the admin
      # project.
    &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
        # capacity commitments.
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
        # `projects/myproject/locations/US/capacityCommitments/123`
    &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
        # ACTIVE capacity commitments.
    &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
        # passes. Once the plan is changed, committed period is extended according to
        # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
    &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
    &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
        # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
    },
    &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
    &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Deletes a capacity commitment. Attempting to delete capacity commitment
before its commitment_end_time will fail with the error code
`google.rpc.Code.FAILED_PRECONDITION`.

Args:
  name: string, Required. Resource name of the capacity commitment to delete. E.g.,
   `projects/myproject/locations/US/capacityCommitments/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="get">get(name, x__xgafv=None)</code>
  <pre>Returns information about the capacity commitment.

Args:
  name: string, Required. Resource name of the capacity commitment to retrieve. E.g.,
   `projects/myproject/locations/US/capacityCommitments/123` (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Capacity commitment is a way to purchase compute capacity for BigQuery jobs
      # (in the form of slots) with some committed period of usage. Annual
      # commitments renew by default. Commitments can be removed after their
      # commitment end time passes.
      #
      # In order to remove annual commitment, its plan needs to be changed
      # to monthly or flex first.
      #
      # A capacity commitment resource exists as a child resource of the admin
      # project.
    &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
        # capacity commitments.
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
        # `projects/myproject/locations/US/capacityCommitments/123`
    &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
        # ACTIVE capacity commitments.
    &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
        # passes. Once the plan is changed, committed period is extended according to
        # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
    &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
    &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
        # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
    },
    &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
    &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, pageToken=None, pageSize=None, x__xgafv=None)</code>
  <pre>Lists all the capacity commitments for the admin project.

Args:
  parent: string, Required. Resource name of the parent reservation. E.g.,
   `projects/myproject/locations/US` (required)
  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.ListCapacityCommitments.
    &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;capacityCommitments&quot;: [ # List of capacity commitments visible to the user.
      { # Capacity commitment is a way to purchase compute capacity for BigQuery jobs
          # (in the form of slots) with some committed period of usage. Annual
          # commitments renew by default. Commitments can be removed after their
          # commitment end time passes.
          #
          # In order to remove annual commitment, its plan needs to be changed
          # to monthly or flex first.
          #
          # A capacity commitment resource exists as a child resource of the admin
          # project.
        &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
            # capacity commitments.
        &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
            # `projects/myproject/locations/US/capacityCommitments/123`
        &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
            # ACTIVE capacity commitments.
        &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
            # passes. Once the plan is changed, committed period is extended according to
            # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
        &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
        &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
            # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        },
        &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
        &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
      },
    ],
  }</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="merge">merge(parent, body=None, x__xgafv=None)</code>
  <pre>Merges capacity commitments of the same plan into a single commitment.

The resulting capacity commitment has the greater commitment_end_time
out of the to-be-merged capacity commitments.

Attempting to merge capacity commitments of different plan will fail
with the error code `google.rpc.Code.FAILED_PRECONDITION`.

Args:
  parent: string, Parent resource that identifies admin project and location e.g.,
 `projects/myproject/locations/us` (required)
  body: object, The request body.
    The object takes the form of:

{ # The request for ReservationService.MergeCapacityCommitments.
    &quot;capacityCommitmentIds&quot;: [ # Ids of capacity commitments to merge.
        # These capacity commitments must exist under admin project and location
        # specified in the parent.
        # ID is the last portion of capacity commitment name e.g., &#x27;abc&#x27; for
        # projects/myproject/locations/US/capacityCommitments/abc
      &quot;A String&quot;,
    ],
  }

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

Returns:
  An object of the form:

    { # Capacity commitment is a way to purchase compute capacity for BigQuery jobs
      # (in the form of slots) with some committed period of usage. Annual
      # commitments renew by default. Commitments can be removed after their
      # commitment end time passes.
      #
      # In order to remove annual commitment, its plan needs to be changed
      # to monthly or flex first.
      #
      # A capacity commitment resource exists as a child resource of the admin
      # project.
    &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
        # capacity commitments.
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
        # `projects/myproject/locations/US/capacityCommitments/123`
    &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
        # ACTIVE capacity commitments.
    &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
        # passes. Once the plan is changed, committed period is extended according to
        # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
    &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
    &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
        # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
    },
    &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
    &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
  }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates an existing capacity commitment.

Only `plan` and `renewal_plan` fields can be updated.

Plan can only be changed to a plan of a longer commitment period.
Attempting to change to a plan with shorter commitment period will fail
with the error code `google.rpc.Code.FAILED_PRECONDITION`.

Args:
  name: string, Output only. The resource name of the capacity commitment, e.g.,
`projects/myproject/locations/US/capacityCommitments/123` (required)
  body: object, The request body.
    The object takes the form of:

{ # Capacity commitment is a way to purchase compute capacity for BigQuery jobs
    # (in the form of slots) with some committed period of usage. Annual
    # commitments renew by default. Commitments can be removed after their
    # commitment end time passes.
    # 
    # In order to remove annual commitment, its plan needs to be changed
    # to monthly or flex first.
    # 
    # A capacity commitment resource exists as a child resource of the admin
    # project.
  &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
      # capacity commitments.
  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
      # `projects/myproject/locations/US/capacityCommitments/123`
  &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
      # ACTIVE capacity commitments.
  &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
      # passes. Once the plan is changed, committed period is extended according to
      # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
  &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
  &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
      # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
  },
  &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
  &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
}

  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:

    { # Capacity commitment is a way to purchase compute capacity for BigQuery jobs
      # (in the form of slots) with some committed period of usage. Annual
      # commitments renew by default. Commitments can be removed after their
      # commitment end time passes.
      #
      # In order to remove annual commitment, its plan needs to be changed
      # to monthly or flex first.
      #
      # A capacity commitment resource exists as a child resource of the admin
      # project.
    &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
        # capacity commitments.
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
        # `projects/myproject/locations/US/capacityCommitments/123`
    &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
        # ACTIVE capacity commitments.
    &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
        # passes. Once the plan is changed, committed period is extended according to
        # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
    &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
    &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
        # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
    },
    &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
    &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
  }</pre>
</div>

<div class="method">
    <code class="details" id="split">split(name, body=None, x__xgafv=None)</code>
  <pre>Splits capacity commitment to two commitments of the same plan and
`commitment_end_time`.

A common use case is to enable downgrading commitments.

For example, in order to downgrade from 10000 slots to 8000, you might
split a 10000 capacity commitment into commitments of 2000 and 8000. Then,
you would change the plan of the first one to `FLEX` and then delete it.

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

{ # The request for ReservationService.SplitCapacityCommitment.
    &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in the capacity commitment after the split.
  }

  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.SplitCapacityCommitment.
    &quot;second&quot;: { # Capacity commitment is a way to purchase compute capacity for BigQuery jobs # Second capacity commitment, result of a split.
        # (in the form of slots) with some committed period of usage. Annual
        # commitments renew by default. Commitments can be removed after their
        # commitment end time passes.
        #
        # In order to remove annual commitment, its plan needs to be changed
        # to monthly or flex first.
        #
        # A capacity commitment resource exists as a child resource of the admin
        # project.
      &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
          # capacity commitments.
      &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
          # `projects/myproject/locations/US/capacityCommitments/123`
      &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
          # ACTIVE capacity commitments.
      &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
          # passes. Once the plan is changed, committed period is extended according to
          # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
      &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
      &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
          # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      },
      &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
      &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
    },
    &quot;first&quot;: { # Capacity commitment is a way to purchase compute capacity for BigQuery jobs # First capacity commitment, result of a split.
        # (in the form of slots) with some committed period of usage. Annual
        # commitments renew by default. Commitments can be removed after their
        # commitment end time passes.
        #
        # In order to remove annual commitment, its plan needs to be changed
        # to monthly or flex first.
        #
        # A capacity commitment resource exists as a child resource of the admin
        # project.
      &quot;commitmentEndTime&quot;: &quot;A String&quot;, # Output only. The end of the current commitment period. It is applicable only for ACTIVE
          # capacity commitments.
      &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the capacity commitment, e.g.,
          # `projects/myproject/locations/US/capacityCommitments/123`
      &quot;commitmentStartTime&quot;: &quot;A String&quot;, # Output only. The start of the current commitment period. It is applicable only for
          # ACTIVE capacity commitments.
      &quot;renewalPlan&quot;: &quot;A String&quot;, # The plan this capacity commitment is converted to after commitment_end_time
          # passes. Once the plan is changed, committed period is extended according to
          # commitment plan. Only applicable for ANNUAL and TRIAL commitments.
      &quot;plan&quot;: &quot;A String&quot;, # Capacity commitment commitment plan.
      &quot;failureStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. For FAILED commitment plan, provides the reason of failure.
          # 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;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;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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      },
      &quot;slotCount&quot;: &quot;A String&quot;, # Number of slots in this commitment.
      &quot;state&quot;: &quot;A String&quot;, # Output only. State of the commitment.
    },
  }</pre>
</div>

</body></html>