X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osmclient%2Fv1%2Fvim.py;h=849f6dc7975ef17f01fa8be4b737f326a0a0328f;hb=refs%2Fchanges%2F41%2F9041%2F4;hp=f51f19283313b70b7abb8d482445b423fc0e23dd;hpb=ef3e9bd9d3aea645aa43461122904ad69a27b2c3;p=osm%2Fosmclient.git diff --git a/osmclient/v1/vim.py b/osmclient/v1/vim.py index f51f192..849f6dc 100644 --- a/osmclient/v1/vim.py +++ b/osmclient/v1/vim.py @@ -20,7 +20,8 @@ OSM vim API handling from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound -import json +import yaml +import time class Vim(object): @@ -44,8 +45,12 @@ class Vim(object): datacenter['uuid']), vim_account) def _detach(self, vim_name): + tenant_name = 'osm' + tenant = self._get_ro_tenant() + if tenant is None: + raise ClientException("tenant {} not found".format(tenant_name)) return self._ro_http.delete_cmd('openmano/{}/datacenters/{}' - .format('osm', vim_name)) + .format(tenant["uuid"], vim_name)) def create(self, name, vim_access): vim_account = {} @@ -60,19 +65,11 @@ class Vim(object): vim_account['datacenter']['type'] = vim_access['vim-type'] vim_config = {} - vim_config['use_floating_ip'] = False - - if ('floating_ip_pool' in vim_access and - vim_access['floating_ip_pool'] is not None): - vim_config['use_floating_ip'] = True - - if 'keypair' in vim_access and vim_access['keypair'] is not None: - vim_config['keypair'] = vim_access['keypair'] - elif 'config' in vim_access and vim_access['config'] is not None: - 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"]): - vim_config = json.loads(vim_access['config']) + if 'config' in vim_access and vim_access['config'] is not None: + vim_config = yaml.safe_load(vim_access['config']) - vim_account['datacenter']['config'] = vim_config + if vim_config: + vim_account['datacenter']['config'] = vim_config vim_account = self.update_vim_account_dict(vim_account, vim_access, vim_config) @@ -81,6 +78,27 @@ class Vim(object): raise ClientException("failed to create vim") else: self._attach(name, vim_account) + self._update_ro_accounts() + + + def _update_ro_accounts(self): + get_ro_accounts = self._http.get_cmd('api/operational/{}ro-account' + .format(self._client.so_rbac_project_path)) + if not get_ro_accounts or 'rw-ro-account:ro-account' not in get_ro_accounts: + return + for account in get_ro_accounts['rw-ro-account:ro-account']['account']: + if account['ro-account-type'] == 'openmano': + # Refresh the Account Status + refresh_body = {"input": { + "ro-account": account['name'], + "project-name": self._client._so_project + } + } + refresh_status = self._http.post_cmd('api/operations/update-ro-account-status', + refresh_body) + if refresh_status and 'error' in refresh_status: + raise ClientException("Failed to refersh RO Account Status") + def update_vim_account_dict(self, vim_account, vim_access, vim_config): if vim_access['vim-type'] == 'vmware': @@ -124,34 +142,62 @@ class Vim(object): self._detach(vim_name) # detach. continue if error, # it could be the datacenter is left without attachment - - if 'result' not in self._ro_http.delete_cmd('openmano/datacenters/{}' - .format(vim_name)): - raise ClientException("failed to delete vim {}".format(vim_name)) - - def list(self): - resp = self._http.get_cmd('v1/api/operational/datacenters') - if not resp or 'rw-launchpad:datacenters' not in resp: - return list() - - datacenters = resp['rw-launchpad:datacenters'] - - vim_accounts = list() - if 'ro-accounts' not in datacenters: + resp = self._ro_http.delete_cmd('openmano/datacenters/{}' + .format(vim_name)) + if 'result' not in resp: + raise ClientException("failed to delete vim {} - {}".format(vim_name, resp)) + self._update_ro_accounts() + + def list(self, ro_update): + if ro_update: + self._update_ro_accounts() + # the ro_update needs to be made synchronous, for now this works around the issue + # and waits a resonable amount of time for the update to finish + time.sleep(2) + + if self._client._so_version == 'v3': + resp = self._http.get_cmd('v1/api/operational/{}ro-account-state' + .format(self._client.so_rbac_project_path)) + datacenters = [] + if not resp or 'rw-ro-account:ro-account-state' not in resp: + return list() + + ro_accounts = resp['rw-ro-account:ro-account-state'] + for ro_account in ro_accounts['account']: + if 'datacenters' not in ro_account: + continue + if 'datacenters' not in ro_account['datacenters']: + continue + for datacenter in ro_account['datacenters']['datacenters']: + datacenters.append({"name": datacenter['name'], "uuid": datacenter['uuid'] + if 'uuid' in datacenter else None}) + + vim_accounts = datacenters return vim_accounts - - tenant = self._get_ro_tenant() - if tenant is None: + else: + # Backwards Compatibility + resp = self._http.get_cmd('v1/api/operational/datacenters') + if not resp or 'rw-launchpad:datacenters' not in resp: + return list() + + datacenters = resp['rw-launchpad:datacenters'] + + vim_accounts = list() + if 'ro-accounts' not in datacenters: + return vim_accounts + + tenant = self._get_ro_tenant() + if tenant is None: + return vim_accounts + + for roaccount in datacenters['ro-accounts']: + if 'datacenters' not in roaccount: + continue + for datacenter in roaccount['datacenters']: + vim_accounts.append(self._get_ro_datacenter(datacenter['name'], + tenant['uuid'])) return vim_accounts - for roaccount in datacenters['ro-accounts']: - if 'datacenters' not in roaccount: - continue - for datacenter in roaccount['datacenters']: - vim_accounts.append(self._get_ro_datacenter(datacenter['name'], - tenant['uuid'])) - return vim_accounts - def _get_ro_tenant(self, name='osm'): resp = self._ro_http.get_cmd('openmano/tenants/{}'.format(name)) @@ -182,24 +228,47 @@ class Vim(object): return self._get_ro_datacenter(name, tenant['uuid']) def get_datacenter(self, name): - resp = self._http.get_cmd('v1/api/operational/datacenters') - if not resp: - return None - - if not resp or 'rw-launchpad:datacenters' not in resp: - return None - if 'ro-accounts' not in resp['rw-launchpad:datacenters']: + if self._client._so_version == 'v3': + resp = self._http.get_cmd('v1/api/operational/{}ro-account-state' + .format(self._client.so_rbac_project_path)) + if not resp: + return None, None + + if not resp or 'rw-ro-account:ro-account-state' not in resp: + return None, None + + ro_accounts = resp['rw-ro-account:ro-account-state'] + for ro_account in ro_accounts['account']: + if 'datacenters' not in ro_account: + continue + if 'datacenters' not in ro_account['datacenters']: + continue + for datacenter in ro_account['datacenters']['datacenters']: + if datacenter['name'] == name: + return datacenter, ro_account['name'] + return None, None + else: + # Backwards Compatibility + resp = self._http.get_cmd('v1/api/operational/datacenters') + if not resp: + return None + + if not resp or 'rw-launchpad:datacenters' not in resp: + return None + if 'ro-accounts' not in resp['rw-launchpad:datacenters']: + return None + for roaccount in resp['rw-launchpad:datacenters']['ro-accounts']: + if 'datacenters' not in roaccount: + continue + for datacenter in roaccount['datacenters']: + if datacenter['name'] == name: + return datacenter return None - for roaccount in resp['rw-launchpad:datacenters']['ro-accounts']: - if 'datacenters' not in roaccount: - continue - for datacenter in roaccount['datacenters']: - if datacenter['name'] == name: - return datacenter - return None def get_resource_orchestrator(self): - resp = self._http.get_cmd('v1/api/operational/resource-orchestrator') + resp = self._http.get_cmd('v1/api/operational/{}resource-orchestrator' + .format(self._client.so_rbac_project_path)) + if not resp or 'rw-launchpad:resource-orchestrator' not in resp: return None return resp['rw-launchpad:resource-orchestrator']