Fix #1063 flake tests
[osm/osmclient.git] / osmclient / v1 / ns.py
index d8631f5..e6b747f 100644 (file)
@@ -22,19 +22,20 @@ from osmclient.common import utils
 from osmclient.common.exceptions import ClientException
 from osmclient.common.exceptions import NotFound
 import uuid
-import pprint
+import yaml
 
 
 class Ns(object):
-    def __init__(self,http=None,client=None):
-        self._http=http
-        self._client=client
+
+    def __init__(self, http=None, client=None):
+        self._http = http
+        self._client = client
 
     def list(self):
         """Returns a list of ns's
         """
-        resp = self._http.get_cmd('api/running/ns-instance-config')
-
+        resp = self._http.get_cmd('api/running/{}ns-instance-config'
+                .format(self._client.so_rbac_project_path))
         if not resp or 'nsr:ns-instance-config' not in resp:
             return list()
 
@@ -43,106 +44,166 @@ class Ns(object):
 
         return resp['nsr:ns-instance-config']['nsr']
 
-    def get(self,name):
+    def get(self, name):
         """Returns an ns based on name
         """
         for ns in self.list():
-           if name == ns['name']:
-               return ns
+            if name == ns['name']:
+                return ns
         raise NotFound("ns {} not found".format(name))
 
-    def create(self,nsd_name,nsr_name,account,vim_network_prefix=None,ssh_keys=None,description='default description',admin_status='ENABLED'):
-        postdata={}
+    def scale(self, ns_name, ns_scale_group, instance_index):
+        postdata = {}
+        postdata['instance'] = list()
+        instance = {}
+        instance['id'] = instance_index
+        postdata['instance'].append(instance)
+
+        ns = self.get(ns_name)
+        resp = self._http.post_cmd(
+            'v1/api/config/{}ns-instance-config/nsr/{}/scaling-group/{}/instance'
+            .format(self._client.so_rbac_project_path, ns['id'], ns_scale_group), postdata)
+        if 'success' not in resp:
+            raise ClientException(
+                "failed to scale ns: {} result: {}".format(
+                    ns_name,
+                    resp))
+
+    def create(self, nsd_name, nsr_name, account, config=None,
+               ssh_keys=None, description='default description',
+               admin_status='ENABLED'):
+        postdata = {}
         postdata['nsr'] = list()
-        nsr={}
-        nsr['id']=str(uuid.uuid1())
+        nsr = {}
+        nsr['id'] = str(uuid.uuid1())
 
-        nsd=self._client.nsd.get(nsd_name)
+        nsd = self._client.nsd.get(nsd_name)
         
-        datacenter=self._client.vim.get_datacenter(account)
-        if datacenter is None:
-            raise NotFound("cannot find datacenter account {}".format(account)) 
-
-        nsr['nsd']=nsd
-        nsr['name']=nsr_name
-        nsr['short-name']=nsr_name
-        nsr['description']=description
-        nsr['admin-status']=admin_status
-        nsr['om-datacenter']=datacenter['uuid']
+        if self._client._so_version == 'v3':
+            datacenter, resource_orchestrator = self._client.vim.get_datacenter(account)
+            if datacenter is None or resource_orchestrator is None:
+                raise NotFound("cannot find datacenter account {}".format(account))
+            if 'uuid' not in datacenter:
+                raise NotFound("The RO Datacenter - {} is invalid. Please select another".format(account))
+        else:
+            # Backwards Compatiility
+            datacenter = self._client.vim.get_datacenter(account)
+            if datacenter is None:
+                raise NotFound("cannot find datacenter account {}".format(account))
+
+        nsr['nsd'] = nsd
+        nsr['name'] = nsr_name
+        nsr['short-name'] = nsr_name
+        nsr['description'] = description
+        nsr['admin-status'] = admin_status
+        
+        if self._client._so_version == 'v3':
+            # New format for V3
+            nsr['resource-orchestrator'] = resource_orchestrator
+            nsr['datacenter'] = datacenter['name']
+        else:
+            # Backwards Compatiility
+            nsr['om-datacenter'] = datacenter['uuid']
 
         if ssh_keys is not None:
             # ssh_keys is comma separate list
-            ssh_keys_format=[]
+            ssh_keys_format = []
             for key in ssh_keys.split(','):
-                ssh_keys_format.append({'key-pair-ref':key})
+                ssh_keys_format.append({'key-pair-ref': key})
 
-            nsr['ssh-authorized-key']=ssh_keys_format
+            nsr['ssh-authorized-key'] = ssh_keys_format
 
-        if vim_network_prefix is not None:
-            for index,vld in enumerate(nsr['nsd']['vld']):
-                network_name = vld['name']
-                nsr['nsd']['vld'][index]['vim-network-name'] = '{}-{}'.format(vim_network_prefix,network_name)
+        ns_config = {}
 
-        postdata['nsr'].append(nsr)
+        if config: 
+            ns_config = yaml.safe_load(config)
 
-        resp = self._http.post_cmd('api/config/ns-instance-config/nsr',postdata)
+        if ns_config and 'vim-network-name' in ns_config:
+            for network in ns_config['vim-network-name']:
+                # now find this network
+                vld_name = network['name']
+                # vim_vld_name = network['vim-network-name']
 
-        if 'success' not in resp:
-            raise ClientException("failed to create ns: {} nsd: {} result: {}".format(nsr_name,nsd_name,resp))
+                for index, vld in enumerate(nsr['nsd']['vld']):
+                    if vld['name'] == vld_name:
+                        nsr['nsd']['vld'][index]['vim-network-name'] = network['vim-network-name']
+
+        postdata['nsr'].append(nsr)
 
-    def get_opdata(self,id):
-        return self._http.get_cmd('api/operational/ns-instance-opdata/nsr/{}?deep'.format(id))
+        resp = self._http.post_cmd(
+            'api/config/{}ns-instance-config/nsr'
+            .format(self._client.so_rbac_project_path),
+            postdata)
 
-    def get_field(self,ns_name,field):
-        nsr=self.get(ns_name)
+        if 'success' not in resp:
+            raise ClientException(
+                "failed to create ns: {} nsd: {} result: {}".format(
+                    nsr_name,
+                    nsd_name,
+                    resp))
+
+    def get_opdata(self, id):
+        return self._http.get_cmd(
+              'api/operational/{}ns-instance-opdata/nsr/{}?deep'
+              .format(self._client.so_rbac_project_path, id))
+
+    def get_field(self, ns_name, field):
+        nsr = self.get(ns_name)
         if nsr is None:
             raise NotFound("failed to retrieve ns {}".format(ns_name))
 
         if field in nsr:
             return nsr[field]
 
-        nsopdata=self.get_opdata(nsr['id'])
+        nsopdata = self.get_opdata(nsr['id'])
 
         if field in nsopdata['nsr:nsr']:
             return nsopdata['nsr:nsr'][field]
 
-        raise NotFound("failed to find {} in ns {}".format(field,ns_name)) 
+        raise NotFound("failed to find {} in ns {}".format(field, ns_name))
 
-    def _terminate(self,ns_name):
-        ns=self.get(ns_name)
+    def _terminate(self, ns_name):
+        ns = self.get(ns_name)
         if ns is None:
-            raise NotFound("cannot find ns {}".format(ns_name)) 
-  
-        return self._http.delete_cmd('api/config/ns-instance-config/nsr/'+ns['id'])
+            raise NotFound("cannot find ns {}".format(ns_name))
+
+        return self._http.delete_cmd('api/config/{}ns-instance-config/nsr/{}'
+                    .format(self._client.so_rbac_project_path, ns['id']))
 
-    def delete(self,ns_name,wait=True):
-        vnfs = self.get_field(ns_name,'constituent-vnfr-ref')
+    def delete(self, ns_name, wait=True):
+        vnfs = self.get_field(ns_name, 'constituent-vnfr-ref')
 
-        resp=self._terminate(ns_name)
+        resp = self._terminate(ns_name)
         if 'success' not in resp:
-            raise ClientException("failed to delete ns {}".format(name))
+            raise ClientException("failed to delete ns {}".format(ns_name))
 
         # helper method to check if pkg exists
-        def check_not_exists( func ):
+        def check_not_exists(func):
             try:
                 func()
-                return False 
+                return False
             except NotFound:
-                return True 
+                return True
 
         for vnf in vnfs:
-            if not utils.wait_for_value(lambda: check_not_exists(lambda: self._client.vnf.get(vnf['vnfr-id']))):
-                raise ClientException("vnf {} failed to delete".format(vnf['vnfr-id']))
-        if not utils.wait_for_value(lambda: check_not_exists(lambda: self.get(ns_name))):
+            if (not utils.wait_for_value(
+                lambda:
+                check_not_exists(lambda:
+                                 self._client.vnf.get(vnf['vnfr-id'])))):
+                raise ClientException(
+                    "vnf {} failed to delete".format(vnf['vnfr-id']))
+        if not utils.wait_for_value(lambda:
+                                    check_not_exists(lambda:
+                                                     self.get(ns_name))):
             raise ClientException("ns {} failed to delete".format(ns_name))
 
-    def get_monitoring(self,ns_name):
-        ns=self.get(ns_name)
-        mon_list={}
+    def get_monitoring(self, ns_name):
+        ns = self.get(ns_name)
+        mon_list = {}
         if ns is None:
             return mon_list
 
-        vnfs=self._client.vnf.list()
+        vnfs = self._client.vnf.list()
         for vnf in vnfs:
             if ns['id'] == vnf['nsr-id-ref']:
                 if 'monitoring-param' in vnf: