Add backward support for identity v2.0 API 29/14529/2
authorBin Yang <bin.yang@windriver.com>
Fri, 22 Sep 2017 17:20:11 +0000 (01:20 +0800)
committerBin Yang <bin.yang@windriver.com>
Fri, 22 Sep 2017 17:21:52 +0000 (01:21 +0800)
Add NBI v2.0/tokens and convert to SBI v3/auth/tokens

Change-Id: I5734e18f78844f15847b3a0a2d906b70e75fd260
Issue-Id: INT-225
Signed-off-by: Bin Yang <bin.yang@windriver.com>
newton/newton/extensions/urls.py
newton/newton/proxy/urls.py
newton/newton/proxy/views/identityV3.py
ocata/ocata/extensions/urls.py
ocata/ocata/proxy/urls.py
ocata/ocata/proxy/views/identityV3.py
windriver/titanium_cloud/extensions/views/extensions.py
windriver/titanium_cloud/proxy/urls.py
windriver/titanium_cloud/proxy/views/identityV3.py

index e87a02e..1a0eb4b 100644 (file)
@@ -19,10 +19,8 @@ from newton.extensions.views import extensions
 from newton.extensions.views import epacaps
 
 urlpatterns = [
-    url(r'^sions$', extensions.Extensions.as_view()),
-    url(r'^sions/$', extensions.Extensions.as_view()),
-    url(r'^sions/epa-caps$', epacaps.EpaCaps.as_view()),
-    url(r'^sions/epa-caps/$', epacaps.EpaCaps.as_view()),
+    url(r'^sions/?$', extensions.Extensions.as_view()),
+    url(r'^sions/epa-caps/?$', epacaps.EpaCaps.as_view()),
 ]
 
 urlpatterns = format_suffix_patterns(urlpatterns)
index f958463..ee2da59 100644 (file)
@@ -23,7 +23,9 @@ urlpatterns = [
     #        identityV2.Tokens.as_view()),
     url(r'^identity/v3/auth/tokens$',
         identityV3.Tokens.as_view()),
-    url(r'^identity/(?:v2.0/|)tenants$',
+    url(r'^identity/v2.0/tokens$',
+        identityV3.TokensV2.as_view()),
+    url(r'^identity/v2.0/tenants$',
         services.GetTenants.as_view()),
     url(r'^(?P<servicetype>[0-9a-zA-Z_-]{,18})/(?P<requri>[0-9a-zA-Z./_-]*)$',
         services.Services.as_view()),
index 1afe14c..36f488a 100644 (file)
@@ -81,3 +81,79 @@ class Tokens(APIView):
             return Response(data={'error': str(e)},
                             status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
+
+class TokensV2(Tokens):
+    '''
+    Backward compatible API for /v2.0/tokens
+    '''
+
+    def __init__(self):
+        self.proxy_prefix = config.MULTICLOUD_PREFIX
+        self._logger = logger
+
+    def post(self, request, vimid=""):
+        self._logger.debug("TokensV2--post::META> %s" % request.META)
+        self._logger.debug("TokensV2--post::data> %s" % request.data)
+        self._logger.debug("TokensV2--post::vimid > %s" % (vimid))
+
+        try:
+            resp = super(TokensV2,self).post(request, vimid)
+            self._logger.debug("TokensV2--resp:: headers:%s, data:%s" % (resp._headers, resp.data))
+            if resp.status_code == status.HTTP_201_CREATED:
+                v3_content =  resp.data
+                v3_token = v3_content['token']
+
+                #convert catalog
+                v2_catalog = []
+                for v3_catalog in v3_token['catalog']:
+                    v2_catalog1 = {
+                        "type": v3_catalog["type"],
+                        "name": v3_catalog["name"],
+                        "endpoints": []
+                    }
+
+                    #convert endpoints
+                    v2_catalog1_endpoints = {"id": v3_catalog['id']}
+                    for v3_endpoint in v3_catalog['endpoints']:
+                        if v3_endpoint['interface'] == 'public':
+                            v2_catalog1_endpoints['publicURL'] = v3_endpoint['url']
+                        elif v3_endpoint['interface'] == 'admin':
+                            v2_catalog1_endpoints['adminURL'] = v3_endpoint['url']
+                        elif v3_endpoint['interface'] == 'internal':
+                            v2_catalog1_endpoints['internalURL'] = v3_endpoint['url']
+
+                    v2_catalog1['endpoints'].append(v2_catalog1_endpoints)
+
+                    v2_catalog.append(v2_catalog1)
+
+
+                #conversion between v3 tokens response and v2.0 tokens response
+                v3_token["project"]['enabled'] = 'true'
+                v2_content = {
+                    "access": {
+                        "token": {
+                            "id" : resp.get('X-Subject-Token', None),
+                            "issued_at": v3_token["issued_at"],
+                            "expires" : v3_token["expires_at"],
+                            "tenant" : v3_token["project"],
+                        },
+                        "serviceCatalog": v2_catalog,
+    #                    "user": v3_token["user"],
+                    }
+                }
+
+                return Response(data=v2_content, status=resp.status_code)
+
+            else:
+                return resp
+        except VimDriverNewtonException as e:
+
+            return Response(data={'error': e.content}, status=e.status_code)
+        except HttpError as e:
+            self._logger.error("HttpError: status:%s, response:%s" % (e.http_status, e.response.json()))
+            return Response(data=e.response.json(), status=e.http_status)
+        except Exception as e:
+            self._logger.error(traceback.format_exc())
+
+            return Response(data={'error': str(e)},
+                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
index 4dc4698..9aaf133 100644 (file)
@@ -19,10 +19,8 @@ from ocata.extensions.views import extensions
 from ocata.extensions.views import epacaps
 
 urlpatterns = [
-    url(r'^sions$', extensions.Extensions.as_view()),
-    url(r'^sions/$', extensions.Extensions.as_view()),
-    url(r'^sions/epa-caps$', epacaps.EpaCaps.as_view()),
-    url(r'^sions/epa-caps/$', epacaps.EpaCaps.as_view()),
+    url(r'^sions/?$', extensions.Extensions.as_view()),
+    url(r'^sions/epa-caps/?$', epacaps.EpaCaps.as_view()),
 ]
 
 urlpatterns = format_suffix_patterns(urlpatterns)
index 6f41d08..12777bf 100644 (file)
@@ -23,7 +23,9 @@ urlpatterns = [
     #        identityV2.Tokens.as_view()),
     url(r'^identity/v3/auth/tokens$',
         identityV3.Tokens.as_view()),
-    url(r'^identity/(?:v2.0/|)tenants$',
+    url(r'^identity/v2.0/tokens$',
+        identityV3.TokensV2.as_view()),
+    url(r'^identity/v2.0/tenants$',
         services.GetTenants.as_view()),
     url(r'^(?P<servicetype>[0-9a-zA-Z_-]{,18})/(?P<requri>[0-9a-zA-Z./_-]*)$',
         services.Services.as_view()),
index 534ebe8..ca9a211 100644 (file)
@@ -25,3 +25,9 @@ class Tokens(newton_identityV3.Tokens):
     def __init__(self):
         self.proxy_prefix = config.MULTICLOUD_PREFIX
         self._logger = logger
+
+class TokensV2(newton_identityV3.TokensV2):
+
+    def __init__(self):
+        self.proxy_prefix = config.MULTICLOUD_PREFIX
+        self._logger = logger
index 2dd61fe..3b231c0 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import logging
+import traceback
+
+from keystoneauth1.exceptions import HttpError
+from rest_framework import status
+from rest_framework.response import Response
+from rest_framework.views import APIView
 
 from titanium_cloud.pub.config import config
+from newton.pub.exceptions import VimDriverNewtonException
+from newton.requests.views.util import VimDriverUtils
 from newton.extensions.views import extensions as newton_extensions
+from newton.pub.msapi import extsys
 
 logger = logging.getLogger(__name__)
 
@@ -39,17 +48,14 @@ class Extensions(newton_extensions.Extensions):
                         "alias": "epa-caps",
                         "description": "Multiple network support",
                         "name": "EPACapsQuery",
-                        "url": self.proxy_prefix + "/%s/extensions/epa-caps" \
-                                       % (vimid),
+                        "url": self.proxy_prefix + "/%s/extensions/epa-caps" % (vimid),
                         "spec": ""
                     },
                     {
                         "alias": "guest-monitor",
                         "description": "Multiple network support",
-                        "name": "EPACapsQuery",
-                        "url": self.proxy_prefix +\
-                               "/%s/extensions/guest-monitor/{server_id}" \
-                                       % (vimid),
+                        "name": "Guest Monitor",
+                        "url": self.proxy_prefix + "/%s/extensions/guest-monitor/{server_id}" % (vimid),
                         "spec": ""
                     }
                 ]
index dbad26f..31a3c8f 100644 (file)
@@ -23,7 +23,9 @@ urlpatterns = [
     #        identityV2.Tokens.as_view()),
     url(r'^identity/v3/auth/tokens/?$',
         identityV3.Tokens.as_view()),
-    url(r'^identity/(?:v2.0/|)tenants/?$',
+    url(r'^identity/v2.0/tokens/?$',
+        identityV3.TokensV2.as_view()),
+    url(r'^identity/v2.0/tenants/?$',
         services.GetTenants.as_view()),
     url(r'^(?P<servicetype>[0-9a-zA-Z_-]{,18})/(?P<requri>[0-9a-zA-Z./_-]*)$',
         services.Services.as_view()),
index a6efa6a..2938cae 100644 (file)
@@ -25,3 +25,9 @@ class Tokens(newton_identityV3.Tokens):
     def __init__(self):
         self.proxy_prefix = config.MULTICLOUD_PREFIX
         self._logger = logger
+
+class TokensV2(newton_identityV3.TokensV2):
+
+    def __init__(self):
+        self.proxy_prefix = config.MULTICLOUD_PREFIX
+        self._logger = logger