Fix bug 1721: charms can include reference to .charm files
[osm/osmclient.git] / osmclient / v1 / client.py
index 6d5e4a1..7d01cfa 100644 (file)
@@ -24,33 +24,98 @@ from osmclient.v1 import ns
 from osmclient.v1 import nsd
 from osmclient.v1 import vim
 from osmclient.v1 import package
-from osmclient.v1 import vca
 from osmclient.v1 import utils
 from osmclient.common import http
-import pycurl
+from osmclient.common import package_tool
 
 
 class Client(object):
+    def __init__(
+        self,
+        host=None,
+        so_port=8008,
+        so_project="default",
+        ro_host=None,
+        ro_port=9090,
+        upload_port=8443,
+        **kwargs
+    ):
+        self._user = "admin"
+        self._password = "admin"
 
-    def __init__(self, host=None,ro_port=9090,upload_port=8443,**kwargs):
-        self._user='admin'
-        self._password='admin'
-        self._host = host.split(':')[0]
-        self._so_port = host.split(':')[1]
+        if len(host.split(":")) > 1:
+            # backwards compatible, port provided as part of host
+            self._host = host.split(":")[0]
+            self._so_port = host.split(":")[1]
+        else:
+            self._host = host
+            self._so_port = so_port
 
-        http_client    = http.Http('https://{}:{}/'.format(self._host,self._so_port))
-        http_client.set_http_header( ['Accept: application/vnd.yand.data+json','Content-Type: application/json'])
+        self._so_project = so_project
 
-        ro_http_client = http.Http('http://{}:{}/'.format(self._host,ro_port))
-        ro_http_client.set_http_header( ['Accept: application/vnd.yand.data+json','Content-Type: application/json'])
+        http_client = http.Http("https://{}:{}/".format(self._host, self._so_port))
+        http_client.set_http_header(
+            ["Accept: application/vnd.yand.data+json", "Content-Type: application/json"]
+        )
 
-        upload_client  = http.Http('https://{}:{}/composer/upload?api_server=https://localhost&upload_server=https://{}'.format(self._host,upload_port,self._host))
+        self._so_version = self.get_so_version(http_client)
 
-        self.vnf  = vnf.Vnf(http_client,**kwargs)
-        self.vnfd = vnfd.Vnfd(http_client,**kwargs)
-        self.ns   = ns.Ns(http=http_client,client=self,**kwargs)
-        self.nsd  = nsd.Nsd(http_client,**kwargs)
-        self.vim  = vim.Vim(http=http_client,ro_http=ro_http_client,client=self,**kwargs)
-        self.package = package.Package(http=http_client,upload_http=upload_client,client=self,**kwargs)
-        self.vca     = vca.Vca(http_client,**kwargs)
-        self.utils   = utils.Utils(http_client,**kwargs)
+        if ro_host is None:
+            ro_host = host
+        ro_http_client = http.Http("http://{}:{}/".format(ro_host, ro_port))
+        ro_http_client.set_http_header(
+            ["Accept: application/vnd.yand.data+json", "Content-Type: application/json"]
+        )
+
+        upload_client_url = "https://{}:{}/composer/upload?api_server={}{}".format(
+            self._host,
+            upload_port,
+            "https://localhost&upload_server=https://",
+            self._host,
+        )
+
+        if self._so_version == "v3":
+            upload_client_url = (
+                "https://{}:{}/composer/upload?api_server={}{}&project_name={}".format(
+                    self._host,
+                    upload_port,
+                    "https://localhost&upload_server=https://",
+                    self._host,
+                    self._so_project,
+                )
+            )
+
+        upload_client = http.Http(upload_client_url)
+
+        self.vnf = vnf.Vnf(http_client, client=self, **kwargs)
+        self.vnfd = vnfd.Vnfd(http_client, client=self, **kwargs)
+        self.ns = ns.Ns(http=http_client, client=self, **kwargs)
+        self.nsd = nsd.Nsd(http_client, client=self, **kwargs)
+        self.vim = vim.Vim(
+            http=http_client, ro_http=ro_http_client, client=self, **kwargs
+        )
+        self.package = package.Package(
+            http=http_client, upload_http=upload_client, client=self, **kwargs
+        )
+        self.utils = utils.Utils(http_client, **kwargs)
+        self.package_tool = package_tool.PackageTool(client=self)
+
+    @property
+    def so_rbac_project_path(self):
+        if self._so_version == "v3":
+            return "project/{}/".format(self._so_project)
+        else:
+            return ""
+
+    def get_so_version(self, http_client):
+        try:
+            resp = http_client.get_cmd("api/operational/version")
+            if not resp or "rw-base:version" not in resp:
+                return "v2"
+
+            if resp["rw-base:version"]["version"].split(".")[0] == "5":
+                # SO Version 5.x.x.x.x translates to OSM V3
+                return "v3"
+            return "v2"
+        except Exception:
+            return "v2"