Merge "Open storperf testcase to huawei-pod2"
[yardstick.git] / api / resources / v2 / environments.py
1 import uuid
2 import logging
3
4 from oslo_serialization import jsonutils
5 from docker import Client
6
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
15
16 LOG = logging.getLogger(__name__)
17 LOG.setLevel(logging.DEBUG)
18
19
20 class V2Environments(ApiResource):
21
22     def get(self):
23         environment_handler = V2EnvironmentHandler()
24         environments = [change_obj_to_dict(e) for e in environment_handler.list_all()]
25
26         for e in environments:
27             container_info = e['container_id']
28             e['container_id'] = jsonutils.loads(container_info) if container_info else {}
29
30         data = {
31             'environments': environments
32         }
33
34         return result_handler(consts.API_SUCCESS, data)
35
36     def post(self):
37         return self._dispatch_post()
38
39     def create_environment(self, args):
40         try:
41             name = args['name']
42         except KeyError:
43             return result_handler(consts.API_ERROR, 'name must be provided')
44
45         env_id = str(uuid.uuid4())
46
47         environment_handler = V2EnvironmentHandler()
48
49         env_init_data = {
50             'name': name,
51             'uuid': env_id
52         }
53         environment_handler.insert(env_init_data)
54
55         return result_handler(consts.API_SUCCESS, {'uuid': env_id})
56
57
58 class V2Environment(ApiResource):
59
60     def get(self, environment_id):
61         try:
62             uuid.UUID(environment_id)
63         except ValueError:
64             return result_handler(consts.API_ERROR, 'invalid environment id')
65
66         environment_handler = V2EnvironmentHandler()
67         try:
68             environment = environment_handler.get_by_uuid(environment_id)
69         except ValueError:
70             return result_handler(consts.API_ERROR, 'no such environment id')
71
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})
76
77     def delete(self, environment_id):
78         try:
79             uuid.UUID(environment_id)
80         except ValueError:
81             return result_handler(consts.API_ERROR, 'invalid environment id')
82
83         environment_handler = V2EnvironmentHandler()
84         try:
85             environment = environment_handler.get_by_uuid(environment_id)
86         except ValueError:
87             return result_handler(consts.API_ERROR, 'no such environment id')
88
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)
93
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)
98
99         if environment.container_id:
100             LOG.info('delete containers')
101             container_info = jsonutils.loads(environment.container_id)
102
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)
109                 try:
110                     client.remove_container(container.name, force=True)
111                 except Exception:
112                     LOG.exception('remove container failed')
113                 container_handler.delete_by_uuid(v)
114
115         environment_handler.delete_by_uuid(environment_id)
116
117         return result_handler(consts.API_SUCCESS, {'environment': environment_id})