Fix bug 1721: charms can include reference to .charm files
[osm/osmclient.git] / osmclient / v1 / ns.py
index d8631f5..5006c1f 100644 (file)
@@ -22,130 +22,209 @@ 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')
-
-        if not resp or 'nsr:ns-instance-config' not in resp:
+        """Returns a list of ns's"""
+        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()
 
-        if 'nsr' not in resp['nsr:ns-instance-config']:
+        if "nsr" not in resp["nsr:ns-instance-config"]:
             return list()
 
-        return resp['nsr:ns-instance-config']['nsr']
+        return resp["nsr:ns-instance-config"]["nsr"]
 
-    def get(self,name):
-        """Returns an ns based on 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={}
-        postdata['nsr'] = list()
-        nsr={}
-        nsr['id']=str(uuid.uuid1())
-
-        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']
+    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())
+
+        nsd = self._client.nsd.get(nsd_name)
+
+        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=[]
-            for key in ssh_keys.split(','):
-                ssh_keys_format.append({'key-pair-ref':key})
-
-            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)
-
-        postdata['nsr'].append(nsr)
-
-        resp = self._http.post_cmd('api/config/ns-instance-config/nsr',postdata)
-
-        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(id))
-
-    def get_field(self,ns_name,field):
-        nsr=self.get(ns_name)
+            ssh_keys_format = []
+            for key in ssh_keys.split(","):
+                ssh_keys_format.append({"key-pair-ref": key})
+
+            nsr["ssh-authorized-key"] = ssh_keys_format
+
+        ns_config = {}
+
+        if config:
+            ns_config = yaml.safe_load(config)
+
+        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']
+
+                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)
+
+        resp = self._http.post_cmd(
+            "api/config/{}ns-instance-config/nsr".format(
+                self._client.so_rbac_project_path
+            ),
+            postdata,
+        )
+
+        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]
+        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)
-        if 'success' not in resp:
-            raise ClientException("failed to delete ns {}".format(name))
+        resp = self._terminate(ns_name)
+        if "success" not in resp:
+            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:
-                    mon_list[vnf['name']] = vnf['monitoring-param']
+            if ns["id"] == vnf["nsr-id-ref"]:
+                if "monitoring-param" in vnf:
+                    mon_list[vnf["name"]] = vnf["monitoring-param"]
 
         return mon_list