import logging from django.conf import settings from alibabacloud_tea_openapi.models import Config as AlicloudConfig from alibabacloud_ros20190910.client import Client as AlicloudROSClient from alibabacloud_ros20190910.models import ( DeleteStackRequest, ListStacksRequest, ListStacksRequestTag, ) from labs.lab_manager_v2.tasks.base import BaseLabTask from labs.lab_manager_v2.exceptions import LabTaskRecoverableError from labs.lab_manager_v2.consts import get_region_metadata logger = logging.getLogger(__name__) class AlicloudROSStackDeleteTask(BaseLabTask): def run(self): db_lab_instance = self.db_lab_instance lab_region = get_region_metadata(db_lab_instance.region_name) region_code = lab_region["region-code"] client = AlicloudROSClient( config=AlicloudConfig( access_key_id=settings.ALICLOUD_ROS_ACCESS_KEY_ID, access_key_secret=settings.ALICLOUD_ROS_ACCESS_KEY_SECRET, region_id=region_code, ) ) response = client.list_stacks( request=ListStacksRequest( region_id=region_code, tag=[ ListStacksRequestTag( key="trainer", value=db_lab_instance.unique_tag, ) ], ) ) if response.status_code != 200: raise LabTaskRecoverableError( f"Failed to list alicloud ros stacks for lab {db_lab_instance.unique_tag}, " f"response status code: {response.status_code}" ) stacks = response.body.stacks if len(stacks) != 1: raise LabTaskRecoverableError( f"Failed to list alicloud ros stacks for lab {db_lab_instance.unique_tag}, " f"expected 1 stack, but got {len(stacks)}" ) stack = stacks[0] response = client.delete_stack( request=DeleteStackRequest(region_id=region_code, stack_id=stack.stack_id) ) if response.status_code != 200: raise LabTaskRecoverableError( f"Failed to delete Alicloud ROS stack for lab {db_lab_instance.unique_tag}, " f"response status code: {response.status_code}, " )