// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package google.cloud.channel.v1;
import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/cloud/channel/v1/channel_partner_links.proto";
import "google/cloud/channel/v1/common.proto";
import "google/cloud/channel/v1/customers.proto";
import "google/cloud/channel/v1/entitlements.proto";
import "google/cloud/channel/v1/offers.proto";
import "google/cloud/channel/v1/products.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
option go_package = "google.golang.org/genproto/googleapis/cloud/channel/v1;channel";
option java_multiple_files = true;
option java_outer_classname = "ServiceProto";
option java_package = "com.google.cloud.channel.v1";
// CloudChannelService enables Google cloud resellers and distributors to manage
// their customers, channel partners, entitlements and reports.
//
// Using this service:
// 1. Resellers or distributors can manage a customer entity.
// 2. Distributors can register an authorized reseller in their channel and then
// enable delegated admin access for the reseller.
// 3. Resellers or distributors can manage entitlements for their customers.
//
// The service primarily exposes the following resources:
// - [Customer][google.cloud.channel.v1.Customer]s: A Customer represents an entity managed by a reseller or
// distributor. A customer typically represents an enterprise. In an n-tier
// resale channel hierarchy, customers are generally represented as leaf nodes.
// Customers primarily have an Entitlement sub-resource discussed below.
//
// - [Entitlement][google.cloud.channel.v1.Entitlement]s: An Entitlement represents an entity which provides a
// customer means to start using a service. Entitlements are created or updated
// as a result of a successful fulfillment.
//
// - [ChannelPartnerLink][google.cloud.channel.v1.ChannelPartnerLink]s: A ChannelPartnerLink is an entity that identifies
// links between distributors and their indirect resellers in a channel.
service CloudChannelService {
option (google.api.default_host) = "cloudchannel.googleapis.com";
option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/apps.order";
// List downstream [Customer][google.cloud.channel.v1.Customer]s.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
//
// Return Value:
//
List of [Customer][google.cloud.channel.v1.Customer]s pertaining to the reseller or empty list if
// there are none.
rpc ListCustomers(ListCustomersRequest) returns (ListCustomersResponse) {
option (google.api.http) = {
get: "/v1/{parent=accounts/*}/customers"
};
}
// Returns a requested [Customer][google.cloud.channel.v1.Customer] resource.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: If the customer resource doesn't exist. Usually
// the result of an invalid name parameter.
//
// Return Value:
//
[Customer][google.cloud.channel.v1.Customer] resource if found, error otherwise.
rpc GetCustomer(GetCustomerRequest) returns (Customer) {
option (google.api.http) = {
get: "/v1/{name=accounts/*/customers/*}"
};
option (google.api.method_signature) = "name";
}
// Confirms the existence of Cloud Identity accounts, based on the domain and
// whether the Cloud Identity accounts are owned by the reseller.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * INVALID_VALUE: Invalid domain value in the request.
// * NOT_FOUND: If there is no [CloudIdentityCustomerAccount][google.cloud.channel.v1.CloudIdentityCustomerAccount] customer
// for the domain specified in the request.
//
// Return Value:
//
List of [CloudIdentityCustomerAccount][google.cloud.channel.v1.CloudIdentityCustomerAccount] resources if any exist for
// the domain, otherwise an error is returned.
rpc CheckCloudIdentityAccountsExist(CheckCloudIdentityAccountsExistRequest) returns (CheckCloudIdentityAccountsExistResponse) {
option (google.api.http) = {
post: "/v1/{parent=accounts/*}:checkCloudIdentityAccountsExist"
body: "*"
};
}
// Creates a new [Customer][google.cloud.channel.v1.Customer] resource under the reseller or distributor
// account.
//
// Possible Error Codes:
//
// - PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// - INVALID_ARGUMENT:
//
// - Missing or invalid required parameters in the request.
// - Domain field value doesn't match the domain specified in primary
// email.
//
//
//
//
// Return Value:
//
If successful, the newly created [Customer][google.cloud.channel.v1.Customer] resource, otherwise
// returns an error.
rpc CreateCustomer(CreateCustomerRequest) returns (Customer) {
option (google.api.http) = {
post: "/v1/{parent=accounts/*}/customers"
body: "customer"
};
}
// Updates an existing [Customer][google.cloud.channel.v1.Customer] resource belonging to the reseller or
// distributor.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: No [Customer][google.cloud.channel.v1.Customer] resource found for the name
// specified in the request.
//
// Return Value:
//
If successful, the updated [Customer][google.cloud.channel.v1.Customer] resource, otherwise returns
// an error.
rpc UpdateCustomer(UpdateCustomerRequest) returns (Customer) {
option (google.api.http) = {
patch: "/v1/{customer.name=accounts/*/customers/*}"
body: "customer"
};
}
// Deletes the given [Customer][google.cloud.channel.v1.Customer] permanently and irreversibly.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the account making the request does not own
// this customer.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * FAILED_PRECONDITION: If the customer has existing entitlements.
// * NOT_FOUND: No [Customer][google.cloud.channel.v1.Customer] resource found for the name
// specified in the request.
rpc DeleteCustomer(DeleteCustomerRequest) returns (google.protobuf.Empty) {
option (google.api.http) = {
delete: "/v1/{name=accounts/*/customers/*}"
};
option (google.api.method_signature) = "name";
}
// Creates a Cloud Identity for the given customer using the customer's
// information or the information provided here, if present.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the request.
// * NOT_FOUND: If the customer is not found for the reseller.
// * ALREADY_EXISTS: If the customer's primary email already exists. In this
// case, retry after changing the customer's primary contact email.
// * INTERNAL: Any non-user error related to a technical issue in the
// backend. Contact Cloud Channel support in this case.
// * UNKNOWN: Any non-user error related to a technical issue in the backend.
// Contact Cloud Channel support in this case.
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc ProvisionCloudIdentity(ProvisionCloudIdentityRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{customer=accounts/*/customers/*}:provisionCloudIdentity"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "Customer"
metadata_type: "OperationMetadata"
};
}
// List [Entitlement][google.cloud.channel.v1.Entitlement]s belonging to a customer.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the request.
//
// Return Value:
//
List of [Entitlement][google.cloud.channel.v1.Entitlement]s belonging to the customer, or empty list if
// there are none.
rpc ListEntitlements(ListEntitlementsRequest) returns (ListEntitlementsResponse) {
option (google.api.http) = {
get: "/v1/{parent=accounts/*/customers/*}/entitlements"
};
}
// List [TransferableSku][google.cloud.channel.v1.TransferableSku]s of a customer based on Cloud Identity ID or
// Customer Name in the request.
//
// This method is used when a reseller lists the entitlements
// information of a customer that is not owned. The reseller should provide
// the customer's Cloud Identity ID or Customer Name.
//
// Possible Error Codes:
//
// - PERMISSION_DENIED, due to one of the following reasons:
//
// - If the customer doesn't belong to the reseller and no auth token,
// or an invalid auth token is supplied.
- If the reseller account
// making the request and the reseller account being queried for are
// different.
//
//
// - INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
//
//
// Return Value:
//
List of [TransferableSku][google.cloud.channel.v1.TransferableSku] for the given customer.
rpc ListTransferableSkus(ListTransferableSkusRequest) returns (ListTransferableSkusResponse) {
option (google.api.http) = {
post: "/v1/{parent=accounts/*}:listTransferableSkus"
body: "*"
};
}
// List [TransferableOffer][google.cloud.channel.v1.TransferableOffer]s of a customer based on Cloud Identity ID or
// Customer Name in the request.
//
// This method is used when a reseller gets the entitlement
// information of a customer that is not owned. The reseller should provide
// the customer's Cloud Identity ID or Customer Name.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED, due to one of the following reasons: (a) If the
// customer doesn't belong to the reseller and no auth token or invalid auth
// token is supplied. (b) If the reseller account making the request and the
// reseller account being queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
//
// Return Value:
// List of [TransferableOffer][google.cloud.channel.v1.TransferableOffer] for the given customer and SKU.
rpc ListTransferableOffers(ListTransferableOffersRequest) returns (ListTransferableOffersResponse) {
option (google.api.http) = {
post: "/v1/{parent=accounts/*}:listTransferableOffers"
body: "*"
};
}
// Returns a requested [Entitlement][google.cloud.channel.v1.Entitlement] resource.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: If the entitlement is not found for the customer.
//
// Return Value:
//
If found, the requested [Entitlement][google.cloud.channel.v1.Entitlement] resource, otherwise returns
// an error.
rpc GetEntitlement(GetEntitlementRequest) returns (Entitlement) {
option (google.api.http) = {
get: "/v1/{name=accounts/*/customers/*/entitlements/*}"
};
}
// Creates an entitlement for a customer.
//
// Possible Error Codes:
//
// - PERMISSION_DENIED: If the customer doesn't belong to the reseller.
//
- INVALID_ARGUMENT:
// - Missing or invalid required parameters in the request.
// - Cannot purchase an entitlement if there is already an
// entitlement for customer, for a SKU from the same product family.
// - INVALID_VALUE: Offer passed in isn't valid. Make sure OfferId is
// valid. If it is valid, then contact Google Channel support for further
// troubleshooting.
//
//
// - NOT_FOUND: If the customer or offer resource is not found for the
// reseller.
// - ALREADY_EXISTS: This failure can happen in the following cases:
//
// - If the SKU has been already purchased for the customer.
// - If the customer's primary email already exists. In this case retry
// after changing the customer's primary contact email.
//
//
//
// - CONDITION_NOT_MET or FAILED_PRECONDITION: This
// failure can happen in the following cases:
//
// - Purchasing a SKU that requires domain verification and the
// domain has not been verified.
// - Purchasing an Add-On SKU like Vault or Drive without purchasing
// the pre-requisite SKU, such as Google Workspace Business Starter.
// - Applicable only for developer accounts: reseller and resold
// domain. Must meet the following domain naming requirements:
//
// - Domain names must start with goog-test.
// - Resold domain names must include the reseller domain.
//
//
//
//
// - INTERNAL: Any non-user error related to a technical issue in the
// backend. Contact Cloud Channel Support in this case.
// - UNKNOWN: Any non-user error related to a technical issue in the
// backend. Contact Cloud Channel Support in this case.
//
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc CreateEntitlement(CreateEntitlementRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{parent=accounts/*/customers/*}/entitlements"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Change parameters of the entitlement
//
// An entitlement parameters update is a long-running operation and results in
// updates to the entitlement as a result of fulfillment.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request. For example, if the number of seats being changed to is greater
// than the allowed number of max seats for the resource. Or decreasing seats
// for a commitment based plan.
// * NOT_FOUND: Entitlement resource not found.
// * INTERNAL: Any non-user error related to a technical issue
// in the backend. In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc ChangeParameters(ChangeParametersRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{name=accounts/*/customers/*/entitlements/*}:changeParameters"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Updates the renewal settings for an existing customer entitlement.
//
// An entitlement update is a long-running operation and results in updates to
// the entitlement as a result of fulfillment.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: Entitlement resource not found.
// * NOT_COMMITMENT_PLAN: Renewal Settings are only applicable for a
// commitment plan. Can't enable or disable renewal for non-commitment plans.
// * INTERNAL: Any non user error related to a technical issue in the
// backend. In this case, contact Cloud Channel support.
// * UNKNOWN: Any non user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc ChangeRenewalSettings(ChangeRenewalSettingsRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{name=accounts/*/customers/*/entitlements/*}:changeRenewalSettings"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Updates the Offer for an existing customer entitlement.
//
// An entitlement update is a long-running operation and results in updates to
// the entitlement as a result of fulfillment.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: Offer or Entitlement resource not found.
// * INTERNAL: Any non-user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc ChangeOffer(ChangeOfferRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{name=accounts/*/customers/*/entitlements/*}:changeOffer"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Starts paid service for a trial entitlement.
//
// Starts paid service for a trial entitlement immediately. This method is
// only applicable if a plan has already been set up for a trial entitlement
// but has some trial days remaining.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: Entitlement resource not found.
// * FAILED_PRECONDITION/NOT_IN_TRIAL: This method only works for
// entitlement on trial plans.
// * INTERNAL: Any non-user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue
// in the backend. In this case, contact Cloud Channel support.
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc StartPaidService(StartPaidServiceRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{name=accounts/*/customers/*/entitlements/*}:startPaidService"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Suspends a previously fulfilled entitlement.
// An entitlement suspension is a long-running operation.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: Entitlement resource not found.
// * NOT_ACTIVE: Entitlement is not active.
// * INTERNAL: Any non-user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc SuspendEntitlement(SuspendEntitlementRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{name=accounts/*/customers/*/entitlements/*}:suspend"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Cancels a previously fulfilled entitlement.
// An entitlement cancellation is a long-running operation.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller or
// if the reseller account making the request and reseller account being
// queried for are different.
// * FAILED_PRECONDITION: If there are any Google Cloud projects linked to the
// Google Cloud entitlement's Cloud Billing subaccount.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: Entitlement resource not found.
// * DELETION_TYPE_NOT_ALLOWED: Cancel is only allowed for Google Workspace
// add-ons or entitlements for Google Cloud's development platform.
// * INTERNAL: Any non-user error related to a technical issue in the
// backend. In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The response will contain
// google.protobuf.Empty on success. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc CancelEntitlement(CancelEntitlementRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{name=accounts/*/customers/*/entitlements/*}:cancel"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "google.protobuf.Empty"
metadata_type: "OperationMetadata"
};
}
// Activates a previously suspended entitlement. The entitlement must be in a
// suspended state for it to be activated. Entitlements suspended for pending
// ToS acceptance can't be activated using this method. An entitlement
// activation is a long-running operation and can result in updates to
// the state of the customer entitlement.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller or
// if the reseller account making the request and reseller account being
// queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: Entitlement resource not found.
// * SUSPENSION_NOT_RESELLER_INITIATED: Can't activate an
// entitlement that is pending TOS acceptance. Only reseller initiated
// suspensions can be activated.
// * NOT_SUSPENDED: Can't activate entitlements that are already in ACTIVE
// state. Can only activate suspended entitlements.
// * INTERNAL: Any non-user error related to a technical issue
// in the backend. In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in the backend.
// In this case, contact Cloud Channel support.
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc ActivateEntitlement(ActivateEntitlementRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{name=accounts/*/customers/*/entitlements/*}:activate"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Transfers customer entitlements to new reseller.
//
// Possible Error Codes:
//
// - PERMISSION_DENIED: If the customer doesn't belong to the
// reseller.
- INVALID_ARGUMENT: Missing or invalid required
// parameters in the request.
- NOT_FOUND: If the customer or offer
// resource is not found for the reseller.
- ALREADY_EXISTS: If the
// SKU has been already transferred for the customer.
-
// CONDITION_NOT_MET or FAILED_PRECONDITION: This failure can happen in the
// following cases:
// - Transferring a SKU that requires domain verification and the
// domain has not been verified.
// - Transferring an Add-On SKU like Vault or Drive without transferring
// the pre-requisite SKU, such as G Suite Basic
- Applicable only for
// developer accounts: reseller and resold domain must follow the domain
// naming convention as follows:
//
// - Domain names must start with goog-test.
// - Resold domain names must include the reseller domain.
//
//
// - All transferring entitlements must be specified.
//
//
// - INTERNAL: Any non-user error related to a technical issue in the
// backend. Please contact Cloud Channel Support in this case.
// - UNKNOWN: Any non-user error related to a technical issue in the
// backend. Please contact Cloud Channel Support in this case.
//
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc TransferEntitlements(TransferEntitlementsRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{parent=accounts/*/customers/*}:transferEntitlements"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "TransferEntitlementsResponse"
metadata_type: "OperationMetadata"
};
}
// Transfers customer entitlements from current reseller to Google.
//
// Possible Error Codes:
//
// - PERMISSION_DENIED: If the customer doesn't belong to the reseller.
//
- INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// - NOT_FOUND: If the customer or offer resource is not found
// for the reseller.
// - ALREADY_EXISTS: If the SKU has been already
// transferred for the customer.
// - CONDITION_NOT_MET or FAILED_PRECONDITION: This failure can happen in
// the following cases:
//
// - Transferring a SKU that requires domain verification and the
// domain has not been verified.
// - Transferring an Add-On SKU like Vault or Drive without purchasing
// the pre-requisite SKU, such as G Suite Basic
- Applicable only for
// developer accounts: reseller and resold domain must follow the domain
// naming convention as follows:
//
// - Domain names must start with goog-test.
// - Resold domain names must include the reseller domain.
//
//
//
//
// - INTERNAL: Any non-user error related to a technical issue in the
// backend. Please contact Cloud Channel Support in this case.
// - UNKNOWN: Any non-user error related to a technical issue in the
// backend. Please contact Cloud Channel Support in this case.
//
//
// Return Value:
//
Long Running Operation ID.
//
// To get the results of the operation, call the GetOperation method of
// CloudChannelOperationsService. The response will contain
// google.protobuf.Empty on success. The Operation metadata will contain an
// instance of [OperationMetadata][google.cloud.channel.v1.OperationMetadata].
rpc TransferEntitlementsToGoogle(TransferEntitlementsToGoogleRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{parent=accounts/*/customers/*}:transferEntitlementsToGoogle"
body: "*"
};
option (google.longrunning.operation_info) = {
response_type: "google.protobuf.Empty"
metadata_type: "OperationMetadata"
};
}
// List [ChannelPartnerLink][google.cloud.channel.v1.ChannelPartnerLink]s belonging to a distributor.
// To call this method, you must be a distributor.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
//
// Return Value:
//
If successful, returns the list of [ChannelPartnerLink][google.cloud.channel.v1.ChannelPartnerLink] resources
// for the distributor account, otherwise returns an error.
rpc ListChannelPartnerLinks(ListChannelPartnerLinksRequest) returns (ListChannelPartnerLinksResponse) {
option (google.api.http) = {
get: "/v1/{parent=accounts/*}/channelPartnerLinks"
};
}
// Returns a requested [ChannelPartnerLink][google.cloud.channel.v1.ChannelPartnerLink] resource.
// To call this method, you must be a distributor.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: ChannelPartnerLink resource not found. Results
// due invalid channel partner link name.
//
// Return Value:
//
[ChannelPartnerLink][google.cloud.channel.v1.ChannelPartnerLink] resource if found, otherwise returns an error.
rpc GetChannelPartnerLink(GetChannelPartnerLinkRequest) returns (ChannelPartnerLink) {
option (google.api.http) = {
get: "/v1/{name=accounts/*/channelPartnerLinks/*}"
};
}
// Initiates a channel partner link between a distributor and a reseller or
// between resellers in an n-tier reseller channel.
// To accept the invite, the invited partner should follow the invite_link_uri
// provided in the response. If the link creation is accepted, a valid link is
// set up between the two involved parties.
// To call this method, you must be a distributor.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * ALREADY_EXISTS: If the ChannelPartnerLink sent in the request already
// exists.
// * NOT_FOUND: If no Cloud Identity customer exists for domain provided.
// * INTERNAL: Any non-user error related to a technical issue in the
// backend. In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in
// the backend. In this case, contact Cloud Channel support.
//
// Return Value:
//
Newly created [ChannelPartnerLink][google.cloud.channel.v1.ChannelPartnerLink] resource if successful,
// otherwise error is returned.
rpc CreateChannelPartnerLink(CreateChannelPartnerLinkRequest) returns (ChannelPartnerLink) {
option (google.api.http) = {
post: "/v1/{parent=accounts/*}/channelPartnerLinks"
body: "channel_partner_link"
};
}
// Updates a channel partner link. A distributor calls this method to change a
// link's status. For example, suspend a partner link.
// To call this method, you must be a distributor.
//
// Possible Error Codes:
//
// - PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being queried for are different.
// - INVALID_ARGUMENT:
//
// - Missing or invalid required parameters in the request.
// - Updating link state from invited to active or suspended.
// - Sending reseller_cloud_identity_id, invite_url or name in update
// mask.
//
//
// - NOT_FOUND: ChannelPartnerLink resource not found.
// - INTERNAL: Any non-user error related to a technical issue in the
// backend. In this case, contact Cloud Channel support.
// - UNKNOWN: Any non-user error related to a technical issue in the
// backend. In this case, contact Cloud Channel support.
//
//
// Return Value:
//
If successful, the updated [ChannelPartnerLink][google.cloud.channel.v1.ChannelPartnerLink] resource, otherwise
// returns an error.
rpc UpdateChannelPartnerLink(UpdateChannelPartnerLinkRequest) returns (ChannelPartnerLink) {
option (google.api.http) = {
patch: "/v1/{name=accounts/*/channelPartnerLinks/*}"
body: "*"
};
}
// Lists the Products the reseller is authorized to sell.
//
// Possible Error Codes:
//
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
rpc ListProducts(ListProductsRequest) returns (ListProductsResponse) {
option (google.api.http) = {
get: "/v1/products"
};
}
// Lists the SKUs for a product the reseller is authorized to sell.
//
// Possible Error Codes:
//
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
rpc ListSkus(ListSkusRequest) returns (ListSkusResponse) {
option (google.api.http) = {
get: "/v1/{parent=products/*}/skus"
};
}
// Lists the Offers the reseller can sell.
//
// Possible Error Codes:
//
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
rpc ListOffers(ListOffersRequest) returns (ListOffersResponse) {
option (google.api.http) = {
get: "/v1/{parent=accounts/*}/offers"
};
}
// Lists the Purchasable SKUs for following cases:
//
// * SKUs that can be newly purchased for a customer
// * SKUs that can be upgraded/downgraded to, for an entitlement.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
rpc ListPurchasableSkus(ListPurchasableSkusRequest) returns (ListPurchasableSkusResponse) {
option (google.api.http) = {
get: "/v1/{customer=accounts/*/customers/*}:listPurchasableSkus"
};
}
// Lists the Purchasable Offers for the following cases:
//
// * Offers that can be newly purchased for a customer
// * Offers that can be changed to, for an entitlement.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the customer doesn't belong to the reseller
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
rpc ListPurchasableOffers(ListPurchasableOffersRequest) returns (ListPurchasableOffersResponse) {
option (google.api.http) = {
get: "/v1/{customer=accounts/*/customers/*}:listPurchasableOffers"
};
}
// Registers a service account with subscriber privileges on the Cloud Pub/Sub
// topic created for this Channel Services account. Once you create a
// subscriber, you will get the events as per [SubscriberEvent][google.cloud.channel.v1.SubscriberEvent]
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being provided are different, or if the impersonated user
// is not a super admin.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * INTERNAL: Any non-user error related to a technical issue in the
// backend. In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in
// the backend. In this case, contact Cloud Channel support.
//
// Return Value:
// Topic name with service email address registered if successful,
// otherwise error is returned.
rpc RegisterSubscriber(RegisterSubscriberRequest) returns (RegisterSubscriberResponse) {
option (google.api.http) = {
post: "/v1/{account=accounts/*}:register"
body: "*"
};
}
// Unregisters a service account with subscriber privileges on the Cloud
// Pub/Sub topic created for this Channel Services account. If there are no
// more service account left with sunbscriber privileges, the topic will be
// deleted. You can check this by calling ListSubscribers api.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being provided are different, or if the impersonated user
// is not a super admin.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: If the topic resource doesn't exist.
// * INTERNAL: Any non-user error related to a technical issue in the
// backend. In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in
// the backend. In this case, contact Cloud Channel support.
//
// Return Value:
// Topic name from which service email address has been unregistered if
// successful, otherwise error is returned. If the service email was already
// not associated with the topic, the success response will be returned.
rpc UnregisterSubscriber(UnregisterSubscriberRequest) returns (UnregisterSubscriberResponse) {
option (google.api.http) = {
post: "/v1/{account=accounts/*}:unregister"
body: "*"
};
}
// Lists service accounts with subscriber privileges on the Cloud Pub/Sub
// topic created for this Channel Services account.
//
// Possible Error Codes:
//
// * PERMISSION_DENIED: If the reseller account making the request and the
// reseller account being provided are different, or if the account is not
// a super admin.
// * INVALID_ARGUMENT: Missing or invalid required parameters in the
// request.
// * NOT_FOUND: If the topic resource doesn't exist.
// * INTERNAL: Any non-user error related to a technical issue in the
// backend. In this case, contact Cloud Channel support.
// * UNKNOWN: Any non-user error related to a technical issue in
// the backend. In this case, contact Cloud Channel support.
//
// Return Value:
// List of service email addresses if successful, otherwise error is
// returned.
rpc ListSubscribers(ListSubscribersRequest) returns (ListSubscribersResponse) {
option (google.api.http) = {
get: "/v1/{account=accounts/*}:listSubscribers"
};
}
}
// Request message for [CloudChannelService.CheckCloudIdentityAccountsExist][google.cloud.channel.v1.CloudChannelService.CheckCloudIdentityAccountsExist].
message CheckCloudIdentityAccountsExistRequest {
// Required. The resource name of the reseller account.
// The parent takes the format: accounts/{account_id}
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Required. Domain for which the Cloud Identity account customer is fetched.
string domain = 2 [(google.api.field_behavior) = REQUIRED];
}
// Entity representing a Cloud Identity account which may or may not be
// associated with a Channel Services API partner.
message CloudIdentityCustomerAccount {
// True if a Cloud Identity account exists for a specific domain.
bool existing = 1;
// True if the Cloud Identity account is associated with a customer
// belonging to the Channel Services partner making the API call.
bool owned = 2;
// Name of the customer that owns the Cloud Identity account. This field is
// populated ONLY if owned = true.
// The customer_name takes the format:
// accounts/{account_id}/customers/{customer_id}
string customer_name = 3;
// Cloud Identity ID of the customer. This field is populated ONLY if
// existing = true.
string customer_cloud_identity_id = 4;
}
// Response message for
// [CloudChannelService.CheckCloudIdentityAccountsExist][google.cloud.channel.v1.CloudChannelService.CheckCloudIdentityAccountsExist].
message CheckCloudIdentityAccountsExistResponse {
// The Cloud Identity accounts associated with the domain.
repeated CloudIdentityCustomerAccount cloud_identity_accounts = 1;
}
// Request message for [CloudChannelService.ListCustomers][google.cloud.channel.v1.CloudChannelService.ListCustomers]
message ListCustomersRequest {
// Required. The resource name of the reseller account from which to list customers.
// The parent takes the format: accounts/{account_id}.
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. The maximum number of customers to return. The service may return fewer
// than this value. If unspecified, at most 10 customers will be returned. The
// maximum value is 50; values about 50 will be coerced to 50.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results, if other than the first one.
// Typically obtained via
// [ListCustomersResponse.next_page_token][google.cloud.channel.v1.ListCustomersResponse.next_page_token] of the previous
// [CloudChannelService.ListCustomers][google.cloud.channel.v1.CloudChannelService.ListCustomers] call.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for [CloudChannelService.ListCustomers][google.cloud.channel.v1.CloudChannelService.ListCustomers].
message ListCustomersResponse {
// The customers belonging to the reseller or distributor.
repeated Customer customers = 1;
// A token to retrieve the next page of results.
// Pass to [ListCustomersRequest.page_token][google.cloud.channel.v1.ListCustomersRequest.page_token] to obtain that page.
string next_page_token = 2;
}
// Request message for [CloudChannelService.GetCustomer][google.cloud.channel.v1.CloudChannelService.GetCustomer].
message GetCustomerRequest {
// Required. The resource name of the customer to retrieve.
// The name takes the format: accounts/{account_id}/customers/{customer_id}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Customer"
}
];
}
// Request message for [CloudChannelService.CreateCustomer][google.cloud.channel.v1.CloudChannelService.CreateCustomer]
message CreateCustomerRequest {
// Required. The resource name of reseller account in which to create the customer.
// The parent takes the format: accounts/{account_id}
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Required. The customer to create.
Customer customer = 2 [(google.api.field_behavior) = REQUIRED];
}
// Request message for [CloudChannelService.UpdateCustomer][google.cloud.channel.v1.CloudChannelService.UpdateCustomer].
message UpdateCustomerRequest {
// Required. New contents of the customer.
Customer customer = 2 [(google.api.field_behavior) = REQUIRED];
// The update mask that applies to the resource.
// Optional.
google.protobuf.FieldMask update_mask = 3;
}
// Request message for [CloudChannelService.DeleteCustomer][google.cloud.channel.v1.CloudChannelService.DeleteCustomer].
message DeleteCustomerRequest {
// Required. The resource name of the customer to delete.
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Customer"
}
];
}
// Request message for [CloudChannelService.ProvisionCloudIdentity][google.cloud.channel.v1.CloudChannelService.ProvisionCloudIdentity]
message ProvisionCloudIdentityRequest {
// Required. Resource name of the customer.
// Format: accounts/{account_id}/customers/{customer_id}
string customer = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Customer"
}
];
// CloudIdentity-specific customer information.
CloudIdentityInfo cloud_identity_info = 2;
// Admin user information.
AdminUser user = 3;
// If set, validate the request and preview the review, but do not actually
// post it.
bool validate_only = 4;
}
// Request message for [CloudChannelService.ListEntitlements][google.cloud.channel.v1.CloudChannelService.ListEntitlements]
message ListEntitlementsRequest {
// Required. The resource name of the reseller's customer account for which to list
// entitlements.
// The parent takes the format: accounts/{account_id}/customers/{customer_id}
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Customer"
}
];
// Optional. Requested page size. Server might return fewer results than requested.
// If unspecified, at most 50 entitlements will be returned.
// The maximum value is 100; values above 100 will be coerced to 100.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results, if other than the first one.
// Typically obtained via
// [ListEntitlementsResponse.next_page_token][google.cloud.channel.v1.ListEntitlementsResponse.next_page_token] of the previous
// [CloudChannelService.ListEntitlements][google.cloud.channel.v1.CloudChannelService.ListEntitlements] call.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for [CloudChannelService.ListEntitlements][google.cloud.channel.v1.CloudChannelService.ListEntitlements].
message ListEntitlementsResponse {
// The entitlements belonging to the reseller's customer.
repeated Entitlement entitlements = 1;
// A token to List next page of results.
// Pass to [ListEntitlementsRequest.page_token][google.cloud.channel.v1.ListEntitlementsRequest.page_token] to obtain that page.
string next_page_token = 2;
}
// Request message for [CloudChannelService.ListTransferableSkus][google.cloud.channel.v1.CloudChannelService.ListTransferableSkus]
message ListTransferableSkusRequest {
// Specifies the identity of transferred customer.
// Either a cloud_identity_id of the customer OR the customer name is
// required to look up transferable SKUs.
oneof transferred_customer_identity {
// Customer's Cloud Identity ID
string cloud_identity_id = 4;
// A reseller is required to create a customer and use the resource name of
// the created customer here.
// The customer_name takes the format:
// accounts/{account_id}/customers/{customer_id}
string customer_name = 7;
}
// Required. The resource name of the reseller's account.
// The parent takes the format: accounts/{account_id}
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Requested page size. Server might return fewer results than requested.
// If unspecified, at most 100 SKUs will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
// Optional.
int32 page_size = 2;
// A token identifying a page of results, if other than the first one.
// Typically obtained via
// [ListTransferableSkusResponse.next_page_token][google.cloud.channel.v1.ListTransferableSkusResponse.next_page_token] of the previous
// [CloudChannelService.ListTransferableSkus][google.cloud.channel.v1.CloudChannelService.ListTransferableSkus] call.
// Optional.
string page_token = 3;
// This token is generated by the Super Admin of the resold customer to
// authorize a reseller to access their Cloud Identity and purchase
// entitlements on their behalf. This token can be omitted once the
// authorization is generated. See https://support.google.com/a/answer/7643790
// for more details.
string auth_token = 5;
// The BCP-47 language code, such as "en-US". If specified, the
// response will be localized to the corresponding language code. Default is
// "en-US".
// Optional.
string language_code = 6;
}
// Response message for [CloudChannelService.ListTransferableSkus][google.cloud.channel.v1.CloudChannelService.ListTransferableSkus].
message ListTransferableSkusResponse {
// Information about existing SKUs for a customer that would need to be
// transferred.
repeated TransferableSku transferable_skus = 1;
// A token to retrieve the next page of results.
// Pass to [ListTransferableSkusRequest.page_token][google.cloud.channel.v1.ListTransferableSkusRequest.page_token] to obtain
// that page.
string next_page_token = 2;
}
// Request message for [CloudChannelService.ListTransferableOffers][google.cloud.channel.v1.CloudChannelService.ListTransferableOffers]
message ListTransferableOffersRequest {
// Specifies the identity of transferred customer.
// Either a cloud_identity_id of the customer OR the customer name is
// required to look up transferrable Offers.
oneof transferred_customer_identity {
// Customer's Cloud Identity ID
string cloud_identity_id = 4;
// A reseller should create a customer and use the resource name of
// the created customer here.
string customer_name = 5;
}
// Required. The resource name of the reseller's account.
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Requested page size. Server might return fewer results than requested.
// If unspecified, at most 100 Offers will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
int32 page_size = 2;
// A token identifying a page of results, if other than the first one.
// Typically obtained via
// [ListTransferableOffersResponse.next_page_token][google.cloud.channel.v1.ListTransferableOffersResponse.next_page_token] of the previous
// [CloudChannelService.ListTransferableOffers][google.cloud.channel.v1.CloudChannelService.ListTransferableOffers] call.
string page_token = 3;
// Required. SKU for which the Offers are being looked up.
string sku = 6 [(google.api.field_behavior) = REQUIRED];
// The BCP-47 language code, such as "en-US". If specified, the
// response will be localized to the corresponding language code. Default is
// "en-US".
string language_code = 7;
}
// Response message for [CloudChannelService.ListTransferableOffers][google.cloud.channel.v1.CloudChannelService.ListTransferableOffers].
message ListTransferableOffersResponse {
// Information about Offers for a customer that can be used for
// transfer.
repeated TransferableOffer transferable_offers = 1;
// A token to retrieve the next page of results.
// Pass to [ListTransferableOffersRequest.page_token][google.cloud.channel.v1.ListTransferableOffersRequest.page_token] to obtain
// that page.
string next_page_token = 2;
}
// TransferableOffer represents an Offer that can be used in Transfer.
// Read-only.
message TransferableOffer {
// Offer with parameter constraints updated to allow the Transfer.
Offer offer = 1;
}
// Request message for [CloudChannelService.GetEntitlement][google.cloud.channel.v1.CloudChannelService.GetEntitlement].
message GetEntitlementRequest {
// Required. The resource name of the entitlement to retrieve.
// The name takes the format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{id}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Entitlement"
}
];
}
// Request message for [CloudChannelService.ListChannelPartnerLinks][google.cloud.channel.v1.CloudChannelService.ListChannelPartnerLinks]
message ListChannelPartnerLinksRequest {
// Required. The resource name of the reseller account for listing channel partner
// links.
// The parent takes the format: accounts/{account_id}
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. Requested page size. Server might return fewer results than requested.
// If unspecified, server will pick a default size (25).
// The maximum value is 200, values above 200 will be coerced to 200.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results, if other than the first one.
// Typically obtained via
// [ListChannelPartnerLinksResponse.next_page_token][google.cloud.channel.v1.ListChannelPartnerLinksResponse.next_page_token] of the previous
// [CloudChannelService.ListChannelPartnerLinks][google.cloud.channel.v1.CloudChannelService.ListChannelPartnerLinks] call.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. The level of granularity the ChannelPartnerLink will display.
ChannelPartnerLinkView view = 4 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for [CloudChannelService.ListChannelPartnerLinks][google.cloud.channel.v1.CloudChannelService.ListChannelPartnerLinks].
message ListChannelPartnerLinksResponse {
// The Channel partner links for a reseller.
repeated ChannelPartnerLink channel_partner_links = 1;
// A token to retrieve the next page of results.
// Pass to [ListChannelPartnerLinksRequest.page_token][google.cloud.channel.v1.ListChannelPartnerLinksRequest.page_token] to obtain that page.
string next_page_token = 2;
}
// Request message for [CloudChannelService.GetChannelPartnerLink][google.cloud.channel.v1.CloudChannelService.GetChannelPartnerLink].
message GetChannelPartnerLinkRequest {
// Required. The resource name of the channel partner link to retrieve.
// The name takes the format: accounts/{account_id}/channelPartnerLinks/{id}
// where {id} is the Cloud Identity ID of the partner.
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. The level of granularity the ChannelPartnerLink will display.
ChannelPartnerLinkView view = 2 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.CreateChannelPartnerLink][google.cloud.channel.v1.CloudChannelService.CreateChannelPartnerLink]
message CreateChannelPartnerLinkRequest {
// Required. The resource name of reseller's account for which to create a channel
// partner link.
// The parent takes the format: accounts/{account_id}
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Required. The channel partner link to create.
// Either channel_partner_link.reseller_cloud_identity_id or domain can be
// used to create a link.
ChannelPartnerLink channel_partner_link = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. The invited partner's domain. Either domain or
// channel_partner_link.reseller_cloud_identity_id can be used to create a
// link.
string domain = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.UpdateChannelPartnerLink][google.cloud.channel.v1.CloudChannelService.UpdateChannelPartnerLink]
message UpdateChannelPartnerLinkRequest {
// Required. The resource name of the channel partner link to cancel.
// The name takes the format: accounts/{account_id}/channelPartnerLinks/{id}
// where {id} is the Cloud Identity ID of the partner.
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Required. The channel partner link to update. Only field
// channel_partner_link.link_state is allowed to be updated.
ChannelPartnerLink channel_partner_link = 2 [(google.api.field_behavior) = REQUIRED];
// Required. The update mask that applies to the resource.
// The only allowable value for update mask is
// channel_partner_link.link_state.
google.protobuf.FieldMask update_mask = 3 [(google.api.field_behavior) = REQUIRED];
}
// Request message for [CloudChannelService.CreateEntitlement][google.cloud.channel.v1.CloudChannelService.CreateEntitlement]
message CreateEntitlementRequest {
// Required. The resource name of reseller's customer account in which to create the
// entitlement.
// The parent takes the format: accounts/{account_id}/customers/{customer_id}
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Customer"
}
];
// Required. The entitlement to create.
Entitlement entitlement = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.TransferEntitlements][google.cloud.channel.v1.CloudChannelService.TransferEntitlements].
message TransferEntitlementsRequest {
// Required. The resource name of reseller's customer account where the entitlements
// transfer to.
// The parent takes the format: accounts/{account_id}/customers/{customer_id}
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Required. The new entitlements to be created or transferred.
repeated Entitlement entitlements = 2 [(google.api.field_behavior) = REQUIRED];
// This token is generated by the Super Admin of the resold customer to
// authorize a reseller to access their Cloud Identity and purchase
// entitlements on their behalf. This token can be omitted once the
// authorization is generated. See https://support.google.com/a/answer/7643790
// for more details.
string auth_token = 4;
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 6 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for [CloudChannelService.TransferEntitlements][google.cloud.channel.v1.CloudChannelService.TransferEntitlements].
// This will be put into the response field of google.longrunning.Operation.
message TransferEntitlementsResponse {
// The entitlements that have been transferred.
repeated Entitlement entitlements = 1;
}
// Request message for [CloudChannelService.TransferEntitlementsToGoogle][google.cloud.channel.v1.CloudChannelService.TransferEntitlementsToGoogle].
message TransferEntitlementsToGoogleRequest {
// Required. The resource name of reseller's customer account where the entitlements
// transfer from.
// The parent takes the format: accounts/{account_id}/customers/{customer_id}
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Required. The entitlements to be transferred to Google.
repeated Entitlement entitlements = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.ChangeParametersRequest][].
message ChangeParametersRequest {
// Required. The name of the entitlement to update.
// The name takes the format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Required. Entitlement parameters to update. Only editable parameters are allowed to
// be changed.
repeated Parameter parameters = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be
// a valid [UUID](https://tools.ietf.org/html/rfc4122) with the exception that
// zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. Purchase order ID provided by the reseller.
string purchase_order_id = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.ChangeRenewalSettings][google.cloud.channel.v1.CloudChannelService.ChangeRenewalSettings].
message ChangeRenewalSettingsRequest {
// Required. The name of the entitlement to update.
// The name takes the format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Required. New renewal settings.
RenewalSettings renewal_settings = 4 [(google.api.field_behavior) = REQUIRED];
// Optional. A request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.ChangeOffer][google.cloud.channel.v1.CloudChannelService.ChangeOffer].
message ChangeOfferRequest {
// Required. The name of the entitlement to update.
// Format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Required. New Offer.
// Format: accounts/{account_id}/offers/{offer_id}.
string offer = 2 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Offer"
}
];
// Optional. Parameters needed to purchase the Offer.
repeated Parameter parameters = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. Purchase order id provided by the reseller.
string purchase_order_id = 5 [(google.api.field_behavior) = OPTIONAL];
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 6 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.StartPaidService][google.cloud.channel.v1.CloudChannelService.StartPaidService].
message StartPaidServiceRequest {
// Required. The name of the entitlement for which paid service is being started.
// The name takes the format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.CancelEntitlement][google.cloud.channel.v1.CloudChannelService.CancelEntitlement].
message CancelEntitlementRequest {
// Required. The resource name of the entitlement to cancel.
// The name takes the format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.SuspendEntitlement][google.cloud.channel.v1.CloudChannelService.SuspendEntitlement].
message SuspendEntitlementRequest {
// Required. The resource name of the entitlement to suspend.
// The name takes the format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for [CloudChannelService.ActivateEntitlement][google.cloud.channel.v1.CloudChannelService.ActivateEntitlement].
message ActivateEntitlementRequest {
// Required. The resource name of the entitlement to activate.
// The name takes the format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique request ID so
// that if you must retry your request, the server will know to ignore the
// request if it has already been completed.
//
// For example, consider a situation where you make an initial request and
// the request times out. If you make the request again with the same
// request ID, the server can check if the original operation with the same
// request ID was received, and if so, will ignore the second request.
//
// The request ID must be a valid [UUID](https://tools.ietf.org/html/rfc4122)
// with the exception that zero UUID is not supported
// (`00000000-0000-0000-0000-000000000000`).
string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for ListProducts.
message ListProductsRequest {
// Required. The resource name of the reseller account.
// Format: accounts/{account_id}.
string account = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. Requested page size. Server might return fewer results than requested.
// If unspecified, at most 100 Products will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results, if other than the first one.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. The BCP-47 language code, such as "en-US". If specified, the
// response will be localized to the corresponding language code. Default is
// "en-US".
string language_code = 4 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for ListProducts.
message ListProductsResponse {
// List of Products requested.
repeated Product products = 1;
// A token to retrieve the next page of results.
string next_page_token = 2;
}
// Request message for ListSkus.
message ListSkusRequest {
// Required. The resource name of the Product for which to list SKUs.
// The parent takes the format: products/{product_id}.
// Supports products/- to retrieve SKUs for all products.
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Product"
}
];
// Required. Resource name of the reseller.
// Format: accounts/{account_id}.
string account = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. Requested page size. Server might return fewer results than requested.
// If unspecified, at most 100 SKUs will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results, if other than the first one.
// Optional.
string page_token = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. The BCP-47 language code, such as "en-US". If specified, the
// response will be localized to the corresponding language code. Default is
// "en-US".
string language_code = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for ListSkus.
message ListSkusResponse {
// The list of SKUs requested.
repeated Sku skus = 1;
// A token to retrieve the next page of results.
string next_page_token = 2;
}
// Request message for ListOffers.
message ListOffersRequest {
// Required. The resource name of the reseller account from which to list Offers.
// The parent takes the format: accounts/{account_id}.
string parent = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. Requested page size. Server might return fewer results than requested.
// If unspecified, at most 500 Offers will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results, if other than the first one.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. The expression to filter results by name (name of
// the Offer), sku.name (name of the SKU) or sku.product.name (name of the
// Product).
// Example 1: sku.product.name=products/p1 AND sku.name!=products/p1/skus/s1
// Example 2: name=accounts/a1/offers/o1
string filter = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. The BCP-47 language code, such as "en-US". If specified, the
// response will be localized to the corresponding language code. Default is
// "en-US".
string language_code = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for ListOffers.
message ListOffersResponse {
// The list of Offers requested.
repeated Offer offers = 1;
// A token to retrieve the next page of results.
string next_page_token = 2;
}
// Request message for ListPurchasableSkus.
message ListPurchasableSkusRequest {
// List SKUs for a new entitlement. Make the purchase using
// [CloudChannelService.CreateEntitlement][google.cloud.channel.v1.CloudChannelService.CreateEntitlement].
message CreateEntitlementPurchase {
// Required. List SKUs belonging to this Product.
// Format: products/{product_id}.
// Supports products/- to retrieve SKUs for all products.
string product = 1 [(google.api.field_behavior) = REQUIRED];
}
// List SKUs for upgrading or downgrading an entitlement. Make the purchase
// using [CloudChannelService.ChangeOffer][google.cloud.channel.v1.CloudChannelService.ChangeOffer].
message ChangeOfferPurchase {
// Change Type enum.
enum ChangeType {
// Not used.
CHANGE_TYPE_UNSPECIFIED = 0;
// SKU is an upgrade on the current entitlement.
UPGRADE = 1;
// SKU is a downgrade on the current entitlement.
DOWNGRADE = 2;
}
// Required. Resource name of the entitlement.
// Format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string entitlement = 1 [(google.api.field_behavior) = REQUIRED];
// Required. Change Type for the entitlement.
ChangeType change_type = 2 [(google.api.field_behavior) = REQUIRED];
}
// Purchase option for the request. Defines the purchase for which the SKUs
// are being listed.
oneof purchase_option {
// List SKUs for CreateEntitlement purchase.
CreateEntitlementPurchase create_entitlement_purchase = 2;
// List SKUs for ChangeOffer purchase with a new SKU.
ChangeOfferPurchase change_offer_purchase = 3;
}
// Required. The resource name of the customer for which to list SKUs.
// Format: accounts/{account_id}/customers/{customer_id}.
string customer = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Customer"
}
];
// Optional. Requested page size. Server might return fewer results than requested.
// If unspecified, at most 100 SKUs will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
int32 page_size = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results, if other than the first one.
string page_token = 5 [(google.api.field_behavior) = OPTIONAL];
// Optional. The BCP-47 language code, such as "en-US". If specified, the
// response will be localized to the corresponding language code. Default is
// "en-US".
string language_code = 6 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for ListPurchasableSkus.
message ListPurchasableSkusResponse {
// The list of SKUs requested.
repeated PurchasableSku purchasable_skus = 1;
// A token to retrieve the next page of results.
string next_page_token = 2;
}
// SKU that can be used for a puchase. This is used in ListPurchasableSku API
// response.
message PurchasableSku {
// SKU
Sku sku = 1;
}
// Request message for ListPurchasableOffers.
message ListPurchasableOffersRequest {
// List Offers for CreateEntitlement purchase.
message CreateEntitlementPurchase {
// Required. SKU that the result should be restricted to.
// Format: products/{product_id}/skus/{sku_id}.
string sku = 1 [(google.api.field_behavior) = REQUIRED];
}
// List Offers for ChangeOffer purchase.
message ChangeOfferPurchase {
// Required. Resource name of the entitlement.
// Format:
// accounts/{account_id}/customers/{customer_id}/entitlements/{entitlement_id}
string entitlement = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. Resource name of the SKU that is being changed to. Should be provided if
// upgrading or downgrading an entitlement. Format:
// products/{product_id}/skus/{sku_id}
string new_sku = 2 [(google.api.field_behavior) = OPTIONAL];
}
// Purchase option for the request. Defines the purchase for which the Offers
// are being listed.
oneof purchase_option {
// List Offers for CreateEntitlement purchase.
CreateEntitlementPurchase create_entitlement_purchase = 2;
// List Offers for ChangeOffer purchase.
ChangeOfferPurchase change_offer_purchase = 3;
}
// Required. The resource name of the customer for which to list Offers.
// Format: accounts/{account_id}/customers/{customer_id}.
string customer = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "cloudchannel.googleapis.com/Customer"
}
];
// Optional. Requested page size. Server might return fewer results than requested.
// If unspecified, at most 100 Offers will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
int32 page_size = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results, if other than the first one.
string page_token = 5 [(google.api.field_behavior) = OPTIONAL];
// Optional. The BCP-47 language code, such as "en-US". If specified, the
// response will be localized to the corresponding language code. Default is
// "en-US".
string language_code = 6 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for ListPurchasableOffers.
message ListPurchasableOffersResponse {
// The list of Offers requested.
repeated PurchasableOffer purchasable_offers = 1;
// A token to retrieve the next page of results.
string next_page_token = 2;
}
// Offer that can be puchased for a customer. This is used in
// ListPurchasableOffer API response.
message PurchasableOffer {
// Offer.
Offer offer = 1;
}
// Request Message for RegisterSubscriber.
message RegisterSubscriberRequest {
// Required. Resource name of the account.
string account = 1 [(google.api.field_behavior) = REQUIRED];
// Required. Service account which will provide subscriber access to the
// registered topic.
string service_account = 2 [(google.api.field_behavior) = REQUIRED];
}
// Response Message for RegisterSubscriber.
message RegisterSubscriberResponse {
// Name of the topic to which the subscriber will listen to.
string topic = 1;
}
// Request Message for UnregisterSubscriber.
message UnregisterSubscriberRequest {
// Required. Resource name of the account.
string account = 1 [(google.api.field_behavior) = REQUIRED];
// Required. Service account which will be unregistered from getting subscriber access
// to the topic.
string service_account = 2 [(google.api.field_behavior) = REQUIRED];
}
// Response Message for UnregisterSubscriber.
message UnregisterSubscriberResponse {
// Name of the topic from which the service account subscriber access has been
// removed.
string topic = 1;
}
// Request Message for ListSubscribers.
message ListSubscribersRequest {
// Required. Resource name of the account.
string account = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. The maximum number of service accounts to return. The service may return
// fewer than this value.
// If unspecified, at most 100 service accounts will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A page token, received from a previous `ListSubscribers` call.
// Provide this to retrieve the subsequent page.
//
// When paginating, all other parameters provided to `ListSubscribers` must
// match the call that provided the page token.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Response Message for ListSubscribers.
message ListSubscribersResponse {
// Name of the topic registered with the reseller.
string topic = 1;
// List of service accounts which have subscriber access to the topic.
repeated string service_accounts = 2;
// A token that can be sent as `page_token` to retrieve the next page.
// If this field is omitted, there are no subsequent pages.
string next_page_token = 3;
}