diff options
author | Bin Yang <bin.yang@windriver.com> | 2017-09-23 01:20:11 +0800 |
---|---|---|
committer | Bin Yang <bin.yang@windriver.com> | 2017-09-23 01:21:52 +0800 |
commit | d48dc5d5af174535d5d96c2bbaee3d03715ed2b9 (patch) | |
tree | c5a1cfc07fc8d5df4cfe52aeb5d0ea4e4896333f /newton | |
parent | 2de8e160c31f3ecf951fb4e85a96aa1e814b0a33 (diff) |
Add backward support for identity v2.0 API
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>
Diffstat (limited to 'newton')
-rw-r--r-- | newton/newton/extensions/urls.py | 6 | ||||
-rw-r--r-- | newton/newton/proxy/urls.py | 4 | ||||
-rw-r--r-- | newton/newton/proxy/views/identityV3.py | 76 |
3 files changed, 81 insertions, 5 deletions
diff --git a/newton/newton/extensions/urls.py b/newton/newton/extensions/urls.py index e87a02eb..1a0eb4b7 100644 --- a/newton/newton/extensions/urls.py +++ b/newton/newton/extensions/urls.py @@ -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) diff --git a/newton/newton/proxy/urls.py b/newton/newton/proxy/urls.py index f9584635..ee2da591 100644 --- a/newton/newton/proxy/urls.py +++ b/newton/newton/proxy/urls.py @@ -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()), diff --git a/newton/newton/proxy/views/identityV3.py b/newton/newton/proxy/views/identityV3.py index 1afe14cf..36f488a2 100644 --- a/newton/newton/proxy/views/identityV3.py +++ b/newton/newton/proxy/views/identityV3.py @@ -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) |