partnercenter/azext_partnercenter/clients/offer_client.py (128 lines of code) (raw):

# -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- # pylint: disable=line-too-long # pylint: disable=protected-access from azext_partnercenter.models.offer_setup import OfferSetup from azext_partnercenter.models import (ListingContact, ListingUri, Offer, Listing, Resource) from azext_partnercenter.vendored_sdks.v1.partnercenter.models import ( MicrosoftIngestionApiModelsProductsAzureProduct, MicrosoftIngestionApiModelsCommonTypeValuePair, MicrosoftIngestionApiModelsProductsAzureProductSetup) from ._base_client import BaseClient from ._util import get_combined_paged_results class OfferClient(BaseClient): def delete(self, offer_external_id): filter_expr = self._get_sdk_odata_filter_expression_by_external_offer_id(offer_external_id) products = self._sdk.product_client.products_get(self._get_access_token(), filter=filter_expr) if len(products.value) == 0: return None product_id = products.value[0].id self._sdk.product_client.products_product_id_delete(product_id, self._get_access_token()) return None def list(self): results = get_combined_paged_results(lambda skip_token: self._sdk.product_client.products_get( self._get_access_token(), skip_token=skip_token)) return list(map(self._map_product_to_offer, results)) def create(self, offer_external_id, offer_alias, resource_type): external_id = MicrosoftIngestionApiModelsCommonTypeValuePair( type='AzureOfferID', value=offer_external_id) external_ids = [external_id] authorization = self._get_access_token() product = MicrosoftIngestionApiModelsProductsAzureProduct(external_ids=external_ids, name=offer_alias, resource_type=resource_type, id=offer_external_id, is_modular_publishing=True) product = self._sdk.product_client.products_post(authorization=authorization, microsoft_ingestion_api_models_products_azure_product=product) return self._map_product_to_offer(product) def get(self, offer_external_id): filter_expr = self._get_sdk_odata_filter_expression_by_external_offer_id(offer_external_id) products = self._sdk.product_client.products_get(self._get_access_token(), filter=filter_expr) if len(products.value) == 0: return None product = products.value[0] return self._map_product_to_offer(product) def publish(self, offer_external_id, target): """Publishes all draft changes for the offer to the target environment""" offer = self.get(offer_external_id) result = self._graph_api_client.publish_submission(target, offer.resource.durable_id) return result def _map_product_to_offer(self, product): return Offer( id=(next((x for x in product['externalIDs'] if x['type'] == "AzureOfferId"), None))['value'], alias=product.name, type=product.resource_type, resource=Resource(durable_id=product.id, type=product.resource_type) ) # removed def get_setup(self, offer_external_id): offer = self.get(offer_external_id) result = self._sdk.product_client.products_product_id_setup_get(offer.resource.durable_id, self._get_access_token()) print(result) return self._map_setup(offer_external_id, result) # removed def update_setup(self, parameters: OfferSetup): offer = self.get(parameters.id) channel_state = MicrosoftIngestionApiModelsCommonTypeValuePair(type='Reseller', value='Enabled' if parameters.reseller else 'Disabled') channel_states = [channel_state] kwargs = { 'resource_type': 'AzureProductSetup', 'enable_test_drive': parameters.test_drive, 'selling_option': 'ListAndSell' if parameters.sell_through_microsoft else 'ListingOnly', 'trial_uri': parameters.trial_uri, 'channel_states': channel_states } # test drive option is only valid for VM and Azure App offer types if parameters.test_drive: kwargs['test_drive_type'] = 'AzureResourceManager' api_product_setup = MicrosoftIngestionApiModelsProductsAzureProductSetup(**kwargs) # TODO: check for failure, esure update occurred before trying to fetch latest setup instance self._sdk.product_client.products_product_id_setup_post( offer.resource.durable_id, self._get_access_token(), microsoft_ingestion_api_models_products_azure_product_setup=api_product_setup) offer_setup = self.get_setup(parameters.id) return offer_setup # removed def _map_setup(self, offer_external_id, api_setup: MicrosoftIngestionApiModelsProductsAzureProductSetup) -> OfferSetup: reseller = (next((x for x in api_setup.channel_states if x['type'] == "Reseller"), None))['value'] == 'Enabled' sell_through_microsoft = api_setup.selling_option == 'ListAndSell' offer_setup = OfferSetup( id=offer_external_id, reseller=reseller, test_drive=api_setup.enable_test_drive, sell_through_microsoft=sell_through_microsoft, trial_uri=api_setup.trial_uri, ) return offer_setup def _map_channel_state(self, channel_state): return { 'type': channel_state.type, 'value': channel_state.value } def get_listing(self, offer_external_id): offer = self.get(offer_external_id) if offer is None: return None branch_listings = get_combined_paged_results(lambda: self._sdk.branches_client.products_product_id_branches_get_by_module_modulemodule_get( offer.resource.durable_id, "Listing", self._api_client.configuration.access_token)) # TODO: circle back on this as not sure what to do when multiple offer listings exist current_draft_module = next((b for b in branch_listings if not hasattr(b, 'variant_id')), None) if current_draft_module is None: return None instance_id = current_draft_module.current_draft_instance_id listings = get_combined_paged_results( lambda: self._sdk.listing_client.products_product_id_listings_get_by_instance_id_instance_i_dinstance_id_get( offer.resource.durable_id, instance_id, self._get_access_token())) # TODO: there should only be 1 active listing (that we can confirm as of now) if len(listings) == 0: return None listing = listings[0] return Listing( title=listing.title if hasattr(listing, 'title') else '', summary=listing.summary if hasattr(listing, 'summary') else '', description=listing.description if hasattr(listing, 'description') else '', language_code=listing.language_code if hasattr(listing, 'language_code') else '', short_description=listing.short_description if hasattr(listing, 'short_description') else '', getting_started_instructions=listing.getting_started_instructions if hasattr(listing, 'getting_started_instructions') else '', # keywords=listing.keywords, offer_id=offer_external_id, odata_etag=listing.odata_etag, contacts=list(map(lambda c: ListingContact(**c.to_dict()), listing.listing_contacts)), uris=list(map(lambda c: ListingUri(**c.to_dict()), listing.listing_uris)), resource=Resource(durable_id=listing.id, type=listing.resource_type) ) def _get_sdk_product_by_external_offer_id(self, offer_external_id): """Package Internal helper method to get the SDK product object by Offer ID""" filter_expr = self._get_sdk_odata_filter_expression_by_external_offer_id(offer_external_id) products = self._sdk.product_client.products_get(self._get_access_token(), filter=filter_expr) if products is None or len(products.value) == 0: return None return products.value[0] def _get_sdk_odata_filter_expression_by_external_offer_id(self, offer_id): """Gets the odata filter expression for filtering by Offer ID found in externalIDs collection""" return f'externalIDs/Any(i:i/type eq \'AzureOfferId\' and i/value eq \'{offer_id}\')'