Fix: Make osmclient Python 3 compatible.
[osm/osmclient.git] / osmclient / v1 / client.py
index 6d5e4a1..b7ce83b 100644 (file)
@@ -27,30 +27,100 @@ from osmclient.v1 import package
 from osmclient.v1 import vca
 from osmclient.v1 import utils
 from osmclient.common import http
-import pycurl
 
 
 class Client(object):
 
-    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]
+    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'
 
-        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'])
+        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
 
-        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'])
+        self._so_project = so_project
+
+        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_version = self.get_so_version(http_client)
+
+        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.vca = vca.Vca(http_client, client=self, **kwargs)
+        self.utils = utils.Utils(http_client, **kwargs)
+
+    @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'
 
-        upload_client  = http.Http('https://{}:{}/composer/upload?api_server=https://localhost&upload_server=https://{}'.format(self._host,upload_port,self._host))
 
-        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)