# -*- coding: utf-8 -*- # # Copyright 2020 Google LLC. All Rights Reserved. # # 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. """Helpers for interacting with the Procurement API.""" from __future__ import absolute_import from __future__ import division from __future__ import unicode_literals from apitools.base.py import exceptions as apitools_exceptions from googlecloudsdk.api_lib.util import apis from googlecloudsdk.api_lib.util import exceptions from googlecloudsdk.core import properties COMMERCE_PROCUREMENT_CONSUMER_API_NAME = 'cloudcommerceconsumerprocurement' COMMERCE_PROCUREMENT_CONSUMER_API_VERSION = 'v1alpha1' def GetMessagesModule(): return apis.GetMessagesModule(COMMERCE_PROCUREMENT_CONSUMER_API_NAME, COMMERCE_PROCUREMENT_CONSUMER_API_VERSION) def GetClientInstance(): return apis.GetClientInstance(COMMERCE_PROCUREMENT_CONSUMER_API_NAME, COMMERCE_PROCUREMENT_CONSUMER_API_VERSION) class Accounts(object): """The Accounts set of Commerce Procurement Consumer API functions.""" GET_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsAccountsGetRequest LIST_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsAccountsListRequest @staticmethod def GetService(): return GetClientInstance().billingAccounts_accounts @staticmethod def Get(account_name): """Calls the Procurement Consumer Accounts.Get method. Args: account_name: Name of an account. Returns: (Account) """ request = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsAccountsGetRequest( name=account_name) try: return Accounts.GetService().Get(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) @staticmethod def List(billing_account_name, page_size, page_token): """Calls the Procurement Consumer Accounts.List method. Args: billing_account_name: Name of a billing account. page_size: Max size of records to be retrieved in page. page_token: Token to specify page in list. Returns: List of Accounts and next page token if applicable. """ request = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsAccountsListRequest( parent=billing_account_name, pageSize=page_size, pageToken=page_token) try: return Accounts.GetService().List(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) class Entitlements(object): """The Entitlements set of Commerce Procurement Consumer API functions.""" GET_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementProjectsEntitlementsGetRequest LIST_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementProjectsEntitlementsListRequest @staticmethod def GetService(): return GetClientInstance().projects_entitlements @staticmethod def Get(entitlement_name): """Calls the Procurement Consumer Entitlements.Get method. Args: entitlement_name: Name of an entitlement. Returns: (Entitlement) """ request = GetMessagesModule( ).CloudcommerceconsumerprocurementProjectsEntitlementsGetRequest( name=entitlement_name) try: return Entitlements.GetService().Get(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) @staticmethod def List(page_size, page_token): """Calls the Procurement Consumer Entitlements.List method. Args: page_size: Max size of records to be retrieved in page. page_token: Token to specify page in list. Returns: List of Entitlements and next page token if applicable. """ project_name = 'projects/%s' % properties.VALUES.core.project.GetOrFail() request = GetMessagesModule( ).CloudcommerceconsumerprocurementProjectsEntitlementsListRequest( parent=project_name, pageSize=page_size, pageToken=page_token) try: return Entitlements.GetService().List(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) class FreeTrials(object): """The Free Trials set of Commerce Procurement Consumer API functions.""" CREATE_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementProjectsFreeTrialsCreateRequest LIST_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementProjectsFreeTrialsListRequest @staticmethod def GetService(): return GetClientInstance().projects_freeTrials @staticmethod def Create(provider_id, product_external_name): """Calls the Procurement Consumer FreeTrials.Create method. Args: provider_id: Id of the provider. product_external_name: Name of the product. Returns: (Operation) """ project_name = 'projects/%s' % properties.VALUES.core.project.GetOrFail() provider_name = 'providers/%s' % provider_id free_trial = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1FreeTrial( provider=provider_name, productExternalName=product_external_name) request = GetMessagesModule( ).CloudcommerceconsumerprocurementProjectsFreeTrialsCreateRequest( parent=project_name, googleCloudCommerceConsumerProcurementV1alpha1FreeTrial=free_trial) try: return FreeTrials.GetService().Create(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) @staticmethod def List(page_size, page_token, filter_rule): """Calls the Procurement Consumer FreeTrials.List method. Args: page_size: Max size of records to be retrieved in page. page_token: Token to specify page in list. filter_rule: The filter that can be used to limit the the result. Returns: List of Free Trials and next page token if applicable. """ project_name = 'projects/%s' % properties.VALUES.core.project.GetOrFail() request = GetMessagesModule( ).CloudcommerceconsumerprocurementProjectsFreeTrialsListRequest( parent=project_name, pageSize=page_size, pageToken=page_token, filter=filter_rule) try: return FreeTrials.GetService().List(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) class Orders(object): """The Orders set of Commerce Procurement Consumer API functions.""" CANCEL_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersCancelRequest GET_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersGetRequest LIST_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersListRequest MODIFY_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersModifyRequest PLACE_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersPlaceRequest @staticmethod def GetService(): return GetClientInstance().billingAccounts_orders @staticmethod def Cancel(order_name, etag): """Calls the Procurement Consumer Orders.Cancel method. Args: order_name: Name of an order. etag: Weak etag for validation purpose. Returns: (Operation) """ cancel_detail_request = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1CancelOrderRequest( etag=etag) request = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersCancelRequest( name=order_name, googleCloudCommerceConsumerProcurementV1alpha1CancelOrderRequest=cancel_detail_request ) try: return Orders.GetService().Cancel(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) @staticmethod def Get(order_name): """Calls the Procurement Consumer Orders.Get method. Args: order_name: Name of an order. Returns: (Order) """ request = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersGetRequest( name=order_name) try: return Orders.GetService().Get(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) @staticmethod def List(billing_account_name, page_size, page_token, filter_rule): """Calls the Procurement Consumer Orders.List method. Args: billing_account_name: Name of a billing account. page_size: Max size of records to be retrieved in page. page_token: Token to specify page in list. filter_rule: The filter that can be used to limit the the result. Returns: List of orders and next page token if applicable. """ request = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersListRequest( parent=billing_account_name, pageSize=page_size, pageToken=page_token, filter=filter_rule) try: return Orders.GetService().List(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) @staticmethod def Modify(order_name, etag, product_requests, quote_change_type, new_quote_external_name): """Calls the Procurement Consumer Orders.Cancel method. Args: order_name: Name of an order. etag: Weak etag for validation purpose. product_requests: Modification details if order modification is based on product plans. quote_change_type: Change type if order modification is based on quote. new_quote_external_name: External name of new quote. Returns: (Operation) """ if product_requests: modification = [] for product_request in product_requests: product_external_name = '' flavor_external_name = '' parameters = [] for (key, value) in product_request.items(): if key == 'line-item-id' or key == 'line-item-change-type': continue if key == 'product-external-name': product_external_name = product_request['product-external-name'] continue if key == 'flavor-external-name': flavor_external_name = product_request['flavor-external-name'] continue value_split = value.split(':', 1) if len(value_split) < 2: value_argument = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ParameterValue( stringValue=value) elif value_split[0] == 'str': value_argument = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ParameterValue( stringValue=value_split[1]) elif value_split[0] == 'int': value_argument = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ParameterValue( int64Value=int(value_split[1])) elif value_split[0] == 'double': value_argument = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ParameterValue( doubleValue=float(value_split[1])) else: raise ValueError('Unrecognized value type {}'.format( value_split[0])) parameters.append(GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1Parameter( name=key, value=value_argument)) if product_external_name and flavor_external_name: new_line_item_info = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1LineItemInfo( productExternalName=product_external_name, flavorExternalName=flavor_external_name, parameters=parameters) else: new_line_item_info = None modification.append(GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyProductsOrderRequestModification( lineItemId=product_request['line-item-id'], changeType=GetLineItemChangeTypeEnum( product_request['line-item-change-type']), newLineItemInfo=new_line_item_info)) modify_detail_request = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyOrderRequest( etag=etag, modifyProductsOrderRequest=GetMessagesModule(). GoogleCloudCommerceConsumerProcurementV1alpha1ModifyProductsOrderRequest( modifications=modification)) else: modify_detail_request = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyOrderRequest( etag=etag, modifyQuoteOrderRequest=GetMessagesModule(). GoogleCloudCommerceConsumerProcurementV1alpha1ModifyQuoteOrderRequest( changeType=GetQuoteChangeTypeEnum(quote_change_type), newQuoteExternalName=new_quote_external_name)) request = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersModifyRequest( name=order_name, googleCloudCommerceConsumerProcurementV1alpha1ModifyOrderRequest=modify_detail_request ) try: return Orders.GetService().Modify(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) @staticmethod def Place(billing_account_name, display_name, provider_id, request_id, product_requests, quote_external_name): """Calls the Procurement Consumer Orders.Cancel method. Args: billing_account_name: Name of parent billing account. display_name: Display name of the order. provider_id: Id of the provider for which the order is created. request_id: Id of the request for idempotency purpose. product_requests: Request about product info to place order against. quote_external_name: External name of the quote to place order against. Returns: (Operation) """ provider_name = 'providers/%s' % provider_id if product_requests: line_item_info = [] for product_request in product_requests: parameters = [] for (key, value) in product_request.items(): if key == 'product-external-name' or key == 'flavor-external-name': continue value_split = value.split(':', 1) if len(value_split) < 2: value_argument = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ParameterValue( stringValue=value) elif value_split[0] == 'str': value_argument = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ParameterValue( stringValue=value_split[1]) elif value_split[0] == 'int': value_argument = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ParameterValue( int64Value=int(value_split[1])) elif value_split[0] == 'double': value_argument = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ParameterValue( doubleValue=float(value_split[1])) else: raise ValueError('Unrecognized value type {}.'.format( value_split[0])) parameters.append(GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1Parameter( name=key, value=value_argument)) line_item_info.append(GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1LineItemInfo( productExternalName=product_request['product-external-name'], flavorExternalName=product_request['flavor-external-name'], parameters=parameters)) place_detail_request = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1PlaceOrderRequest( displayName=display_name, provider=provider_name, requestId=request_id, placeProductsOrderRequest=GetMessagesModule(). GoogleCloudCommerceConsumerProcurementV1alpha1PlaceProductsOrderRequest( lineItemInfo=line_item_info)) else: place_detail_request = GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1PlaceOrderRequest( displayName=display_name, provider=provider_name, requestId=request_id, placeQuoteOrderRequest=GetMessagesModule() .GoogleCloudCommerceConsumerProcurementV1alpha1PlaceQuoteOrderRequest( quoteExternalName=quote_external_name)) request = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersPlaceRequest( parent=billing_account_name, googleCloudCommerceConsumerProcurementV1alpha1PlaceOrderRequest=place_detail_request ) try: return Orders.GetService().Place(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) class Operations(object): """The Operations set of Commerce Procurement Consumer API functions.""" GET_ORDER_OPERATION_REQUEST = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersOperationsGetRequest @staticmethod def GetOrderOperationService(): return GetClientInstance().billingAccounts_orders_operations @staticmethod def GetOrderOperation(operation_name): """Calls the Procurement Consumer Orders.Operations.Get method. Args: operation_name: Name of the order operation. Returns: Order operation. """ request = GetMessagesModule( ).CloudcommerceconsumerprocurementBillingAccountsOrdersOperationsGetRequest( name=operation_name) try: return Operations.GetOrderOperationService().Get(request) except apitools_exceptions.HttpError as error: raise exceptions.HttpException(error) def GetLineItemChangeTypeEnum(raw_input): """Converts raw input to line item change type. Args: raw_input: Raw input of the line item change type. Returns: Converted line item change type. Raises: ValueError: The raw input is not recognized as a valid change type. """ if raw_input == 'UPDATE': return GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyProductsOrderRequestModification( ).ChangeTypeValueValuesEnum.LINE_ITEM_CHANGE_TYPE_UPDATE elif raw_input == 'CANCEL': return GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyProductsOrderRequestModification( ).ChangeTypeValueValuesEnum.LINE_ITEM_CHANGE_TYPE_CANCEL elif raw_input == 'REVERT_CANCELLATION': return GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyProductsOrderRequestModification( ).ChangeTypeValueValuesEnum.LINE_ITEM_CHANGE_TYPE_REVERT_CANCELLATION else: raise ValueError('Unrecognized line item change type {}.'.format(raw_input)) def GetQuoteChangeTypeEnum(raw_input): """Converts raw input to quote change type. Args: raw_input: Raw input of the quote change type. Returns: Converted quote change type. Raises: ValueError: The raw input is not recognized as a valid change type. """ if raw_input == 'UPDATE': return GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyQuoteOrderRequest( ).ChangeTypeValueValuesEnum.QUOTE_CHANGE_TYPE_UPDATE elif raw_input == 'CANCEL': return GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyQuoteOrderRequest( ).ChangeTypeValueValuesEnum.QUOTE_CHANGE_TYPE_CANCEL elif raw_input == 'REVERT_CANCELLATION': return GetMessagesModule( ).GoogleCloudCommerceConsumerProcurementV1alpha1ModifyQuoteOrderRequest( ).ChangeTypeValueValuesEnum.QUOTE_CHANGE_TYPE_REVERT_CANCELLATION else: raise ValueError('Unrecognized quote change type {}.'.format(raw_input))