1 # Copyright 2017 Sandvine
5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
6 # not use this file except in compliance with the License. You may obtain
7 # a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 # License for the specific language governing permissions and limitations
21 from osmclient
.common
.exceptions
import ClientException
22 from osmclient
.common
.exceptions
import NotFound
27 def __init__(self
, http
=None, ro_http
=None, client
=None):
29 self
._ro
_http
= ro_http
32 def _attach(self
, vim_name
, vim_account
):
34 tenant
= self
._get
_ro
_tenant
()
36 raise ClientException("tenant {} not found".format(tenant_name
))
38 datacenter
= self
._get
_ro
_datacenter
(vim_name
)
39 if datacenter
is None:
40 raise Exception('datacenter {} not found'.format(vim_name
))
42 return self
._ro
_http
.post_cmd('openmano/{}/datacenters/{}'
43 .format(tenant
['uuid'],
44 datacenter
['uuid']), vim_account
)
46 def _detach(self
, vim_name
):
47 return self
._ro
_http
.delete_cmd('openmano/{}/datacenters/{}'
48 .format('osm', vim_name
))
50 def create(self
, name
, vim_access
):
52 vim_account
['datacenter'] = {}
54 # currently assumes vim_acc
55 if ('vim-type' not in vim_access
):
56 #'openstack' not in vim_access['vim-type']):
57 raise Exception("vim type not provided")
59 vim_account
['datacenter']['name'] = name
60 vim_account
['datacenter']['type'] = vim_access
['vim-type']
63 vim_config
['use_floating_ip'] = False
65 if ('floating_ip_pool' in vim_access
and
66 vim_access
['floating_ip_pool'] is not None):
67 vim_config
['use_floating_ip'] = True
69 if 'keypair' in vim_access
and vim_access
['keypair'] is not None:
70 vim_config
['keypair'] = vim_access
['keypair']
71 elif 'config' in vim_access
and vim_access
['config'] is not None:
72 if any(var
in vim_access
['config'] for var
in ["admin_password","admin_username","orgname","nsx_user","nsx_password","nsx_manager","vcenter_ip","vcenter_port","vcenter_user","vcenter_password"]):
73 vim_config
= json
.loads(vim_access
['config'])
75 vim_account
['datacenter']['config'] = vim_config
77 vim_account
= self
.update_vim_account_dict(vim_account
, vim_access
, vim_config
)
79 resp
= self
._ro
_http
.post_cmd('openmano/datacenters', vim_account
)
80 if resp
and 'error' in resp
:
81 raise ClientException("failed to create vim")
83 self
._attach
(name
, vim_account
)
85 def update_vim_account_dict(self
, vim_account
, vim_access
, vim_config
):
86 if vim_access
['vim-type'] == 'vmware':
87 if 'admin_username' in vim_config
:
88 vim_account
['datacenter']['admin_username'] = vim_config
['admin_username']
89 if 'admin_password' in vim_config
:
90 vim_account
['datacenter']['admin_password'] = vim_config
['admin_password']
91 if 'nsx_manager' in vim_config
:
92 vim_account
['datacenter']['nsx_manager'] = vim_config
['nsx_manager']
93 if 'nsx_user' in vim_config
:
94 vim_account
['datacenter']['nsx_user'] = vim_config
['nsx_user']
95 if 'nsx_password' in vim_config
:
96 vim_account
['datacenter']['nsx_password'] = vim_config
['nsx_password']
97 if 'orgname' in vim_config
:
98 vim_account
['datacenter']['orgname'] = vim_config
['orgname']
99 if 'vcenter_ip' in vim_config
:
100 vim_account
['datacenter']['vcenter_ip'] = vim_config
['vcenter_ip']
101 if 'vcenter_user' in vim_config
:
102 vim_account
['datacenter']['vcenter_user'] = vim_config
['vcenter_user']
103 if 'vcenter_password' in vim_config
:
104 vim_account
['datacenter']['vcenter_password'] = vim_config
['vcenter_password']
105 if 'vcenter_port' in vim_config
:
106 vim_account
['datacenter']['vcenter_port'] = vim_config
['vcenter_port']
107 vim_account
['datacenter']['vim_url'] = vim_access
['vim-url']
108 vim_account
['datacenter']['vim_url_admin'] = vim_access
['vim-url']
109 vim_account
['datacenter']['description'] = vim_access
['description']
110 vim_account
['datacenter']['vim_username'] = vim_access
['vim-username']
111 vim_account
['datacenter']['vim_password'] = vim_access
['vim-password']
112 vim_account
['datacenter']['vim_tenant_name'] = vim_access
['vim-tenant-name']
114 vim_account
['datacenter']['vim_url'] = vim_access
['vim-url']
115 vim_account
['datacenter']['vim_url_admin'] = vim_access
['vim-url']
116 vim_account
['datacenter']['description'] = vim_access
['description']
117 vim_account
['datacenter']['vim_username'] = vim_access
['vim-username']
118 vim_account
['datacenter']['vim_password'] = vim_access
['vim-password']
119 vim_account
['datacenter']['vim_tenant_name'] = vim_access
['vim-tenant-name']
122 def delete(self
, vim_name
):
124 self
._detach
(vim_name
)
125 # detach. continue if error,
126 # it could be the datacenter is left without attachment
128 if 'result' not in self
._ro
_http
.delete_cmd('openmano/datacenters/{}'
130 raise ClientException("failed to delete vim {}".format(vim_name
))
133 resp
= self
._http
.get_cmd('v1/api/operational/datacenters')
134 if not resp
or 'rw-launchpad:datacenters' not in resp
:
137 datacenters
= resp
['rw-launchpad:datacenters']
139 vim_accounts
= list()
140 if 'ro-accounts' not in datacenters
:
143 tenant
= self
._get
_ro
_tenant
()
147 for roaccount
in datacenters
['ro-accounts']:
148 if 'datacenters' not in roaccount
:
150 for datacenter
in roaccount
['datacenters']:
151 vim_accounts
.append(self
._get
_ro
_datacenter
(datacenter
['name'],
155 def _get_ro_tenant(self
, name
='osm'):
156 resp
= self
._ro
_http
.get_cmd('openmano/tenants/{}'.format(name
))
161 if 'tenant' in resp
and 'uuid' in resp
['tenant']:
162 return resp
['tenant']
166 def _get_ro_datacenter(self
, name
, tenant_uuid
='any'):
167 resp
= self
._ro
_http
.get_cmd('openmano/{}/datacenters/{}'
168 .format(tenant_uuid
, name
))
170 raise NotFound("datacenter {} not found".format(name
))
172 if 'datacenter' in resp
and 'uuid' in resp
['datacenter']:
173 return resp
['datacenter']
175 raise NotFound("datacenter {} not found".format(name
))
178 tenant
= self
._get
_ro
_tenant
()
180 raise NotFound("no ro tenant found")
182 return self
._get
_ro
_datacenter
(name
, tenant
['uuid'])
184 def get_datacenter(self
, name
):
185 resp
= self
._http
.get_cmd('v1/api/operational/datacenters')
189 if not resp
or 'rw-launchpad:datacenters' not in resp
:
191 if 'ro-accounts' not in resp
['rw-launchpad:datacenters']:
193 for roaccount
in resp
['rw-launchpad:datacenters']['ro-accounts']:
194 if 'datacenters' not in roaccount
:
196 for datacenter
in roaccount
['datacenters']:
197 if datacenter
['name'] == name
:
201 def get_resource_orchestrator(self
):
202 resp
= self
._http
.get_cmd('v1/api/operational/resource-orchestrator')
203 if not resp
or 'rw-launchpad:resource-orchestrator' not in resp
:
205 return resp
['rw-launchpad:resource-orchestrator']