4 from oslo_serialization import jsonutils
5 from docker import Client
7 from api import ApiResource
8 from api.database.v2.handlers import V2EnvironmentHandler
9 from api.database.v2.handlers import V2OpenrcHandler
10 from api.database.v2.handlers import V2PodHandler
11 from api.database.v2.handlers import V2ContainerHandler
12 from yardstick.common.utils import result_handler
13 from yardstick.common.utils import change_obj_to_dict
14 from yardstick.common import constants as consts
16 LOG = logging.getLogger(__name__)
17 LOG.setLevel(logging.DEBUG)
20 class V2Environments(ApiResource):
23 environment_handler = V2EnvironmentHandler()
24 environments = [change_obj_to_dict(e) for e in environment_handler.list_all()]
26 for e in environments:
27 container_info = e['container_id']
28 e['container_id'] = jsonutils.loads(container_info) if container_info else {}
31 'environments': environments
34 return result_handler(consts.API_SUCCESS, data)
37 return self._dispatch_post()
39 def create_environment(self, args):
43 return result_handler(consts.API_ERROR, 'name must be provided')
45 env_id = str(uuid.uuid4())
47 environment_handler = V2EnvironmentHandler()
53 environment_handler.insert(env_init_data)
55 return result_handler(consts.API_SUCCESS, {'uuid': env_id})
58 class V2Environment(ApiResource):
60 def get(self, environment_id):
62 uuid.UUID(environment_id)
64 return result_handler(consts.API_ERROR, 'invalid environment id')
66 environment_handler = V2EnvironmentHandler()
68 environment = environment_handler.get_by_uuid(environment_id)
70 return result_handler(consts.API_ERROR, 'no such environment id')
72 environment = change_obj_to_dict(environment)
73 container_id = environment['container_id']
74 environment['container_id'] = jsonutils.loads(container_id) if container_id else {}
75 return result_handler(consts.API_SUCCESS, {'environment': environment})
77 def delete(self, environment_id):
79 uuid.UUID(environment_id)
81 return result_handler(consts.API_ERROR, 'invalid environment id')
83 environment_handler = V2EnvironmentHandler()
85 environment = environment_handler.get_by_uuid(environment_id)
87 return result_handler(consts.API_ERROR, 'no such environment id')
89 if environment.openrc_id:
90 LOG.info('delete openrc: %s', environment.openrc_id)
91 openrc_handler = V2OpenrcHandler()
92 openrc_handler.delete_by_uuid(environment.openrc_id)
94 if environment.pod_id:
95 LOG.info('delete pod: %s', environment.pod_id)
96 pod_handler = V2PodHandler()
97 pod_handler.delete_by_uuid(environment.pod_id)
99 if environment.container_id:
100 LOG.info('delete containers')
101 container_info = jsonutils.loads(environment.container_id)
103 container_handler = V2ContainerHandler()
104 client = Client(base_url=consts.DOCKER_URL)
105 for k, v in container_info.items():
106 LOG.info('start delete: %s', k)
107 container = container_handler.get_by_uuid(v)
108 LOG.debug('container name: %s', container.name)
110 client.remove_container(container.name, force=True)
112 LOG.exception('remove container failed')
113 container_handler.delete_by_uuid(v)
115 environment_handler.delete_by_uuid(environment_id)
117 return result_handler(consts.API_SUCCESS, {'environment': environment_id})