Add API(v2) to create grafana
[yardstick.git] / api / resources / v2 / openrcs.py
1 import uuid
2 import logging
3 import re
4 import os
5
6 import yaml
7 from oslo_serialization import jsonutils
8
9 from api import ApiResource
10 from api.database.v2.handlers import V2OpenrcHandler
11 from api.database.v2.handlers import V2EnvironmentHandler
12 from yardstick.common import constants as consts
13 from yardstick.common.utils import result_handler
14 from yardstick.common.utils import makedirs
15 from yardstick.common.utils import source_env
16
17 LOG = logging.getLogger(__name__)
18 LOG.setLevel(logging.DEBUG)
19
20
21 class V2Openrcs(ApiResource):
22
23     def post(self):
24         return self._dispatch_post()
25
26     def upload_openrc(self, args):
27         try:
28             upload_file = args['file']
29         except KeyError:
30             return result_handler(consts.API_ERROR, 'file must be provided')
31
32         try:
33             environment_id = args['environment_id']
34         except KeyError:
35             return result_handler(consts.API_ERROR, 'environment_id must be provided')
36
37         try:
38             uuid.UUID(environment_id)
39         except ValueError:
40             return result_handler(consts.API_ERROR, 'invalid environment id')
41
42         LOG.info('writing openrc: %s', consts.OPENRC)
43         makedirs(consts.CONF_DIR)
44         upload_file.save(consts.OPENRC)
45         source_env(consts.OPENRC)
46
47         LOG.info('parsing openrc')
48         try:
49             openrc_data = self._get_openrc_dict()
50         except Exception:
51             LOG.exception('parse openrc failed')
52             return result_handler(consts.API_ERROR, 'parse openrc failed')
53
54         openrc_id = str(uuid.uuid4())
55         self._write_into_database(environment_id, openrc_id, openrc_data)
56
57         LOG.info('writing ansible cloud conf')
58         try:
59             self._generate_ansible_conf_file(openrc_data)
60         except Exception:
61             LOG.exception('write cloud conf failed')
62             return result_handler(consts.API_ERROR, 'genarate ansible conf failed')
63         LOG.info('finish writing ansible cloud conf')
64
65         return result_handler(consts.API_SUCCESS, {'openrc': openrc_data, 'uuid': openrc_id})
66
67     def update_openrc(self, args):
68         try:
69             openrc_vars = args['openrc']
70         except KeyError:
71             return result_handler(consts.API_ERROR, 'openrc must be provided')
72
73         try:
74             environment_id = args['environment_id']
75         except KeyError:
76             return result_handler(consts.API_ERROR, 'environment_id must be provided')
77
78         try:
79             uuid.UUID(environment_id)
80         except ValueError:
81             return result_handler(consts.API_ERROR, 'invalid environment id')
82
83         LOG.info('writing openrc: %s', consts.OPENRC)
84         makedirs(consts.CONF_DIR)
85
86         lines = ['export {}={}\n'.format(k, v) for k, v in openrc_vars.items()]
87         LOG.debug('writing: %s', ''.join(lines))
88         with open(consts.OPENRC, 'w') as f:
89             f.writelines(lines)
90         LOG.info('writing openrc: Done')
91
92         LOG.info('source openrc: %s', consts.OPENRC)
93         try:
94             source_env(consts.OPENRC)
95         except Exception:
96             LOG.exception('source openrc failed')
97             return result_handler(consts.API_ERROR, 'source openrc failed')
98         LOG.info('source openrc: Done')
99
100         openrc_id = str(uuid.uuid4())
101         self._write_into_database(environment_id, openrc_id, openrc_vars)
102
103         LOG.info('writing ansible cloud conf')
104         try:
105             self._generate_ansible_conf_file(openrc_vars)
106         except Exception:
107             LOG.exception('write cloud conf failed')
108             return result_handler(consts.API_ERROR, 'genarate ansible conf failed')
109         LOG.info('finish writing ansible cloud conf')
110
111         return result_handler(consts.API_SUCCESS, {'openrc': openrc_vars, 'uuid': openrc_id})
112
113     def _write_into_database(self, environment_id, openrc_id, openrc_data):
114         LOG.info('writing openrc to database')
115         openrc_handler = V2OpenrcHandler()
116         openrc_init_data = {
117             'uuid': openrc_id,
118             'environment_id': environment_id,
119             'content': jsonutils.dumps(openrc_data)
120         }
121         openrc_handler.insert(openrc_init_data)
122
123         LOG.info('binding openrc to environment: %s', environment_id)
124         environment_handler = V2EnvironmentHandler()
125         environment_handler.update_attr(environment_id, {'openrc_id': openrc_id})
126
127     def _get_openrc_dict(self):
128         with open(consts.OPENRC) as f:
129             content = f.readlines()
130
131         result = {}
132         for line in content:
133             m = re.search(r'(\ .*)=(.*)', line)
134             if m:
135                 try:
136                     value = os.environ[m.group(1).strip()]
137                 except KeyError:
138                     pass
139                 else:
140                     result.update({m.group(1).strip(): value})
141
142         return result
143
144     def _generate_ansible_conf_file(self, openrc_data):
145         ansible_conf = {
146             'clouds': {
147                 'opnfv': {
148                     'auth': {
149                     }
150                 }
151             }
152         }
153         black_list = ['OS_IDENTITY_API_VERSION', 'OS_IMAGE_API_VERSION']
154
155         for k, v in openrc_data.items():
156             if k.startswith('OS') and k not in black_list:
157                 key = k[3:].lower()
158                 ansible_conf['clouds']['opnfv']['auth'][key] = v
159
160         try:
161             value = openrc_data['OS_IDENTITY_API_VERSION']
162         except KeyError:
163             pass
164         else:
165             ansible_conf['clouds']['opnfv']['identity_api_version'] = value
166
167         makedirs(consts.OPENSTACK_CONF_DIR)
168         with open(consts.CLOUDS_CONF, 'w') as f:
169             yaml.dump(ansible_conf, f, default_flow_style=False)
170
171
172 class V2Openrc(ApiResource):
173
174     def get(self, openrc_id):
175         try:
176             uuid.UUID(openrc_id)
177         except ValueError:
178             return result_handler(consts.API_ERROR, 'invalid openrc id')
179
180         LOG.info('Geting openrc: %s', openrc_id)
181         openrc_handler = V2OpenrcHandler()
182         try:
183             openrc = openrc_handler.get_by_uuid(openrc_id)
184         except ValueError:
185             return result_handler(consts.API_ERROR, 'no such openrc id')
186
187         LOG.info('load openrc content')
188         content = jsonutils.loads(openrc.content)
189
190         return result_handler(consts.API_ERROR, {'openrc': content})
191
192     def delete(self, openrc_id):
193         try:
194             uuid.UUID(openrc_id)
195         except ValueError:
196             return result_handler(consts.API_ERROR, 'invalid openrc id')
197
198         LOG.info('Geting openrc: %s', openrc_id)
199         openrc_handler = V2OpenrcHandler()
200         try:
201             openrc = openrc_handler.get_by_uuid(openrc_id)
202         except ValueError:
203             return result_handler(consts.API_ERROR, 'no such openrc id')
204
205         LOG.info('update openrc in environment')
206         environment_handler = V2EnvironmentHandler()
207         environment_handler.update_attr(openrc.environment_id, {'openrc_id': None})
208
209         openrc_handler.delete_by_uuid(openrc_id)
210
211         return result_handler(consts.API_SUCCESS, {'openrc': openrc_id})