iact3/plugin/ros.py (189 lines of code) (raw):

import json from Tea.exceptions import TeaException from alibabacloud_ros20190910.client import Client as ROSClient from iact3.plugin.base_plugin import TeaSDKPlugin class ROSPlugin(TeaSDKPlugin): product = 'ROS' def api_client(self): return ROSClient def models_path(self, action_name): return 'alibabacloud_ros20190910.models.{}'.format(action_name) def runtime_kwargs(self): return { 'autoretry': True, 'max_attempts': 3, 'read_timeout': 60000, 'connect_timeout': 60000 } class StackPlugin(ROSPlugin): IGNORE_ERRORS = ('StackNotFound',) @staticmethod def _convert_parameters(parameters: dict, kwargs: dict): if not parameters: return assert isinstance(parameters, dict) json_dumps_param = {} for k, v in parameters.items(): json_dumps_param[k] = json.dumps(v) if isinstance(v, (list, dict)) else v kwargs['Parameters'] = [dict(ParameterKey=k, ParameterValue=v) for k, v in json_dumps_param.items() if v is not None] @staticmethod def _convert_notification_urls(notification_urls, kwargs): if not notification_urls: return assert isinstance(notification_urls, list) kwargs['NotificationUrls'] = notification_urls async def create_stack(self, stack_name: str, template_body: str = None, parameters: dict = None, timeout_in_minutes: int = None, client_token=None, disable_rollback=None, stack_policy_url=None, stack_policy_body=None, notification_urls=None, deletion_protection=None, create_option=None, tags=None, ram_role_name=None, template_id=None, template_version=None, resource_group_id=None, template_url=None): kwargs = dict( StackName=stack_name, TemplateBody=template_body, TimeoutInMinutes=timeout_in_minutes, ClientToken=client_token, DisableRollback=disable_rollback, StackPolicyURL=stack_policy_url, StackPolicyBody=stack_policy_body, NotificationURLs=notification_urls, DeletionProtection=deletion_protection, CreateOption=create_option, RamRoleName=ram_role_name, TemplateId=template_id, TemplateVersion=template_version, ResourceGroupId=resource_group_id, TemplateURL=template_url ) self._convert_parameters(parameters, kwargs) self._convert_notification_urls(notification_urls, kwargs) self._convert_tags(tags, kwargs) result = await self.send_request('CreateStackRequest', **kwargs) return result['StackId'] async def delete_stack(self, stack_id, retain_all_resources=None): kwargs = dict( StackId=stack_id, RetainAllResources=retain_all_resources ) try: return await self.send_request('DeleteStackRequest', **kwargs) except TeaException as ex: if ex.code not in self.IGNORE_ERRORS: raise async def get_stack(self, stack_id, client_token=None, output_option=None): kwargs = dict( StackId=stack_id, ClientToken=client_token, OutputOption=output_option, ) try: return await self.send_request('GetStackRequest', **kwargs) except TeaException as ex: if ex.code not in self.IGNORE_ERRORS: raise async def list_stacks(self, stack_id=None, stack_name=None): request_kwargs = dict( StackId=stack_id, StackName=[stack_name] if stack_name else None ) result = await self.send_request('ListStacksRequest', **request_kwargs) return result.get('Stacks') async def fetch_all_stacks(self, tags, stack_id=None): kwargs = {'StackId': stack_id} self._convert_tags(tags, kwargs, tag_key='Tag') return await self.fetch_all('ListStacksRequest', kwargs, 'Stacks') async def list_stack_resources(self, stack_id): kwargs = dict( StackId=stack_id ) result = await self.send_request('ListStackResourcesRequest', **kwargs) return result.get('Resources') async def get_stack_resource(self, stack_id, logical_resource_id, show_resource_attributes=False, resource_attributes=None): kwargs = dict( StackId=stack_id, LogicalResourceId=logical_resource_id ) if show_resource_attributes: kwargs.update( ShowResourceAttributes='true' ) elif resource_attributes: kwargs.update( ResourceAttributes=resource_attributes, ) return await self.send_request('GetStackResourceRequest', **kwargs) async def list_stack_events(self, stack_id): kwargs = dict( StackId=stack_id ) return await self.fetch_all('ListStackEventsRequest', kwargs, 'Events') async def get_regions(self) -> list: response = await self.send_request('DescribeRegionsRequest') return [region['RegionId'] for region in response['Regions'] or []] async def get_parameter_constraints(self, template_body: str = None, template_url: str = None, template_id: str = None, template_version: str = None, parameters_key_filter: list = None, parameters: dict = None, parameters_order: list = None, client_token: str = None): kwargs = dict( TemplateBody=template_body, TemplateURL=template_url, TemplateId=template_id, TemplateVersion=template_version, ParametersKeyFilter=parameters_key_filter, ParametersOrder=parameters_order, ClientToken=client_token ) self._convert_parameters(parameters, kwargs) result = await self.send_request('GetTemplateParameterConstraints', **kwargs) return result['ParameterConstraints'] async def get_template(self, template_id: str, template_version: str = None): kwargs = dict( TemplateId=template_id, TemplateVersion=template_version ) return await self.send_request('GetTemplate', **kwargs) async def get_template_estimate_cost(self, template_body: str = None, parameters: dict = None, region_id: str = None, template_url: str = None): kwargs = dict( TemplateBody=template_body, TemplateURL=template_url, RegionId=region_id ) self._convert_parameters(parameters, kwargs) result = await self.send_request('GetTemplateEstimateCostRequest', **kwargs) return result['Resources'] async def validate_template(self, template_body: str = None, region_id: str = None, template_url: str = None): kwargs = dict( TemplateBody=template_body, TemplateURL=template_url, RegionId=region_id ) result = await self.send_request('ValidateTemplateRequest', ignoreException=True, **kwargs) return result async def preview_stack(self, template_body: str = None, parameters: dict = None, region_id: str = None, template_url: str = None, stack_name: str = None): kwargs = dict( TemplateBody=template_body, TemplateURL=template_url, RegionId=region_id, StackName=stack_name ) self._convert_parameters(parameters, kwargs) result = await self.send_request('PreviewStackRequest', **kwargs) return result['Stack']['Resources'] async def generate_template_policy(self, template_body: str = None, template_url: str = None): kwargs = dict( TemplateBody=template_body, TemplateURL=template_url ) result = await self.send_request('GenerateTemplatePolicyRequest', ignoreException=True, **kwargs) return result['Policy']