partnercenter/azext_partnercenter/clients/plan_client.py (95 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 import (Plan, Resource)
from azext_partnercenter.clients import OfferClient
from azext_partnercenter.vendored_sdks.v1.partnercenter.models import ProductsProductIDVariantsGetRequest
from ._util import get_combined_paged_results
from ._base_client import BaseClient
class PlanClient(BaseClient):
def __init__(self, cli_ctx, *_):
super().__init__(cli_ctx, *_)
self._offer_client = OfferClient(cli_ctx, *_)
def create(self, offer_external_id, plan_external_id, name, subtype=None):
resource_type = "AzureSkuVariant"
offer = self._offer_client.get(offer_external_id)
product_id = offer.resource.durable_id
prod_var_req = ProductsProductIDVariantsGetRequest(resource_type=resource_type, friendly_name=name, external_id=plan_external_id)
if subtype:
prod_var_req['SubType'] = subtype
result = self._sdk.variant_client.products_product_id_variants_post(product_id=product_id,
authorization=self._api_client.configuration.access_token,
products_product_id_variants_get_request=prod_var_req)
return Plan(
id=result.external_id,
name=result.friendly_name,
offer_id=offer_external_id,
state=result.state,
cloud_availabilities=result.cloud_availabilities,
resource=Resource(durable_id=result.id, type=result.resource_type),
subtype=subtype,
)
def get(self, offer_external_id, plan_external_id):
return self.find_by_external_id(offer_external_id, plan_external_id)
def list(self, offer_external_id):
offer = self._offer_client.get(offer_external_id)
if offer is None:
return []
offer_durable_id = offer.resource.durable_id
variants = get_combined_paged_results(lambda: self._sdk.variant_client.products_product_id_variants_get(
offer_durable_id,
self._api_client.configuration.access_token))
items = []
for variant in variants:
if "externalID" in variant:
item = Plan(
id=variant['externalID'],
name=variant['friendlyName'],
offer_id=offer_external_id,
state=variant['state'],
cloud_availabilities=variant['cloudAvailabilities'],
resource=Resource(durable_id=variant['id'], type=variant['resourceType'])
)
items.append(item)
return items
def find_by_external_id(self, offer_external_id, plan_external_id):
plans = self.list(offer_external_id)
return next((plan for plan in plans if plan.id == plan_external_id), None)
# TODO: remove get_listing
def get_listing(self, offer_external_id, plan_external_id):
offer = self._offer_client.get(offer_external_id)
offer_durable_id = offer.resource.durable_id
branches = self._sdk.branches_client.products_product_id_branches_get_by_module_modulemodule_get(offer_durable_id, 'Listing',
self._get_access_token())
plan = self.find_by_external_id(offer_external_id, plan_external_id)
branch_listing = next((b for b in branches if b['variantID'] == plan._resource.durable_id), None)
instance_id = branch_listing['currentDraftInstanceID']
listing = self._sdk.listing_client.products_product_id_listings_get_by_instance_id_instance_i_dinstance_id_get(
offer_durable_id, instance_id, self._get_access_token()
)
return {
'name': listing['title'],
'shortDescription': listing['shortDescription'],
'description': listing['description']
}
# TODO: remove if automated tests show this is unneeded
def _get(self, offer_durable_id, plan_durable_id):
"""Internal get of the plan"""
product = self._sdk.product_client.products_product_id_get(offer_durable_id, self._api_client.configuration.access_token)
variant = self._sdk.variant_client.products_product_id_variants_variant_id_get(
offer_durable_id,
plan_durable_id,
self._api_client.configuration.access_token)
item = Plan(
id=variant['externalID'],
name=variant['friendlyName'],
offer_id=product['externalIDs'][0]['value'],
state=variant['state'],
cloud_availabilities=variant['cloudAvailabilities'],
resource=Resource(id=variant['id'], type=variant['resourceType'])
)
return item
def delete(self, offer_external_id, plan_external_id):
offer = self._offer_client.get(offer_external_id)
if offer is None:
return
plan = self.find_by_external_id(offer_external_id, plan_external_id)
if plan is None:
return
offer_durable_id = offer.resource.durable_id
plan_resource_id = plan._resource.durable_id
self._sdk.variant_client.products_product_id_variants_variant_id_delete(offer_durable_id, plan_resource_id, self._api_client.configuration.access_token, async_req=True)