diff options
-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 | ||||
-rw-r--r-- | newton/newton/requests/tests/mock_info.py | 554 | ||||
-rw-r--r-- | newton/newton/requests/tests/test_flavor.py | 288 | ||||
-rw-r--r-- | newton/newton/requests/tests/test_network.py | 255 | ||||
-rw-r--r-- | newton/newton/requests/views/flavor.py | 5 | ||||
-rw-r--r-- | ocata/ocata/extensions/urls.py | 6 | ||||
-rw-r--r-- | ocata/ocata/proxy/urls.py | 4 | ||||
-rw-r--r-- | ocata/ocata/proxy/views/identityV3.py | 6 | ||||
-rw-r--r-- | windriver/titanium_cloud/extensions/views/extensions.py | 18 | ||||
-rw-r--r-- | windriver/titanium_cloud/proxy/urls.py | 4 | ||||
-rw-r--r-- | windriver/titanium_cloud/proxy/views/identityV3.py | 6 |
13 files changed, 1212 insertions, 20 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) diff --git a/newton/newton/requests/tests/mock_info.py b/newton/newton/requests/tests/mock_info.py new file mode 100644 index 00000000..9bcad7e0 --- /dev/null +++ b/newton/newton/requests/tests/mock_info.py @@ -0,0 +1,554 @@ +# Copyright (c) 2017 Intel Corporation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +MOCK_VIM_INFO = { + "createTime": "2017-04-01 02:22:27", + "domain": "Default", + "name": "TiS_R4", + "password": "admin", + "tenant": "admin", + "type": "openstack", + "url": "http://128.224.180.14:5000/v3", + "userName": "admin", + "vendor": "WindRiver", + "version": "newton", + "vimId": "windriver-hudson-dc_RegionOne", + 'cloud_owner': 'windriver-hudson-dc', + 'cloud_region_id': 'RegionOne', + 'cloud_extra_info': '', + 'cloud_epa_caps': '{"huge_page":"true","cpu_pinning":"true",\ + "cpu_thread_policy":"true","numa_aware":"true","sriov":"true",\ + "dpdk_vswitch":"true","rdt":"false","numa_locality_pci":"true"}', + 'insecure': 'True', +} + +MOCK_TOKEN_ID = "1a62b3971d774404a504c5d9a3e506e3" + +MOCK_CATALOG_RESPONSE = { + "catalog": [ + { + "id": "99aefcc82a9246f98f8c281e61ffc754", + "endpoints": [ + { + "region": "RegionOne", + "url": "http://128.224.180.14:9696", + "id": "39583c1508ad4b71b380570a745ee10a", + "interface": "public", + "region_id": "RegionOne" + }, + { + "url": "http://192.168.204.2:9696", + "region": "RegionOne", + "id": "37e8d07ba24e4b8f93490c9daaba06e2", + "interface": "internal", + "region_id": "RegionOne" + }, + { + "interface": "admin", + "id": "7eee4ca98d444b1abb00a50d4b89373f", + "region_id": "RegionOne", + "region": "RegionOne", + "url": "http://192.168.204.2:9696" + } + ], + "name": "neutron", + "type": "network" + }, + { + "endpoints": [ + { + "interface": "public", + "id": "10496738fa374295a4a88a63b81a1589", + "region_id": "RegionOne", + "url": "http://128.224.180.14:8777", + "region": "RegionOne" + }, + { + "id": "02dcb8c0bd464c4489fa0a0c9f28571f", + "region_id": "RegionOne", + "interface": "internal", + "url": "http://192.168.204.2:8777", + "region": "RegionOne" + }, + { + "region_id": "RegionOne", + "id": "8a73b0d3743b4e78b87614690f6e97fe", + "interface": "admin", + "url": "http://192.168.204.2:8777", + "region": "RegionOne" + } + ], + "id": "d131054da83f4c93833799747a0f4709", + "name": "ceilometer", + "type": "metering" + }, + { + "type": "volumev2", + "name": "cinderv2", + "endpoints": [ + { + "id": "35a67ad36f0447d19c9662babf7cf609", + "interface": "public", + "region_id": "RegionOne", + "url": "http://128.224.180.14:8776/v2/fcca3cc49d5e42caae15459e27103efc", + "region": "RegionOne" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:8776/v2/fcca3cc49d5e42caae15459e27103efc", + "id": "c6ea42052268420fa2c8d351ee68c922", + "interface": "internal", + "region_id": "RegionOne" + }, + { + "region_id": "RegionOne", + "id": "91cb24853dc3450d847b0c286a2e44ea", + "interface": "admin", + "region": "RegionOne", + "url": "http://192.168.204.2:8776/v2/fcca3cc49d5e42caae15459e27103efc" + } + ], + "id": "40440057102440739c30be10a66bc5d1" + }, + { + "name": "heat", + "type": "orchestration", + "id": "35300cce88db4bd4bb5a72ffe3b88b00", + "endpoints": [ + { + "id": "58999d7b4a94439089ecfb2aca2d7f6c", + "region_id": "RegionOne", + "interface": "public", + "region": "RegionOne", + "url": "http://128.224.180.14:8004/v1/fcca3cc49d5e42caae15459e27103efc" + }, + { + "url": "http://192.168.204.2:8004/v1/fcca3cc49d5e42caae15459e27103efc", + "region": "RegionOne", + "interface": "internal", + "id": "1e0ee1a2aef84802b921d422372a567e", + "region_id": "RegionOne" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:8004/v1/fcca3cc49d5e42caae15459e27103efc", + "id": "17661bf4859741b8a43a461dedad1871", + "region_id": "RegionOne", + "interface": "admin" + } + ] + }, + { + "id": "08dc6912aea64c01925012c8a6df250a", + "endpoints": [ + { + "id": "02792c4eed77486083f9b2e52d7b94b0", + "region_id": "RegionOne", + "interface": "public", + "region": "RegionOne", + "url": "http://128.224.180.14:5000/v3" + }, + { + "id": "b6d5cad394b94309ae40d8de88059c5f", + "region_id": "RegionOne", + "interface": "internal", + "url": "http://192.168.204.2:5000/v3", + "region": "RegionOne" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:35357/v3", + "region_id": "RegionOne", + "id": "1f18e2b7c6a34493b86853b65917888e", + "interface": "admin" + } + ], + "type": "identity", + "name": "keystone" + }, + { + "name": "vim", + "type": "nfv", + "endpoints": [ + { + "url": "http://128.224.180.14:4545", + "region": "RegionOne", + "id": "b33e317345e4480ab0786e4960995ec9", + "interface": "public", + "region_id": "RegionOne" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:4545", + "interface": "internal", + "id": "03c85828d5bf432ab04831aa65ac9c52", + "region_id": "RegionOne" + }, + { + "id": "067983abb061476cb53a9e23a740d98f", + "region_id": "RegionOne", + "interface": "admin", + "url": "http://192.168.204.2:4545", + "region": "RegionOne" + } + ], + "id": "01636c856fc84988b38b9117eb4a8021" + }, + { + "name": "aodh", + "type": "alarming", + "id": "eb269151d0e44744a5b5449657bdc61c", + "endpoints": [ + { + "id": "5bfc6c056e0244c493642eb82f6aaa11", + "region_id": "RegionOne", + "interface": "public", + "url": "http://128.224.180.14:8042", + "region": "RegionOne" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:8042", + "region_id": "RegionOne", + "id": "ad69c7f76dce4089a195b9221ddbfb44", + "interface": "internal" + }, + { + "interface": "admin", + "id": "3e8fcdfa7bcb40b0ae33c282adfcc9ff", + "region_id": "RegionOne", + "region": "RegionOne", + "url": "http://192.168.204.2:8042" + } + ] + }, + { + "name": "sysinv", + "type": "platform", + "endpoints": [ + { + "region": "RegionOne", + "url": "http://128.224.180.14:6385/v1", + "interface": "public", + "id": "ba4ba8104590421b84672306c7e0e1f1", + "region_id": "RegionOne" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:6385/v1", + "interface": "internal", + "id": "a1cba34b163f496ab1acd6e9b51e39a2", + "region_id": "RegionOne" + }, + { + "url": "http://192.168.204.2:6385/v1", + "region": "RegionOne", + "id": "7c171210a2c841a6a52a5713e316d6fc", + "interface": "admin", + "region_id": "RegionOne" + } + ], + "id": "256bbad671f946fea543e6bd71f98875" + }, + { + "id": "e84665dcce814c05b4c5084964547534", + "endpoints": [ + { + "url": "http://128.224.180.14:8000/v1/fcca3cc49d5e42caae15459e27103efc", + "region": "RegionOne", + "region_id": "RegionOne", + "id": "b2ed1a23dc6944bea129c20861e0286a", + "interface": "public" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:8000/v1/fcca3cc49d5e42caae15459e27103efc", + "interface": "internal", + "id": "c4df7c6bc15646848eff35caf6ffea8e", + "region_id": "RegionOne" + }, + { + "region_id": "RegionOne", + "id": "61b3dabb761443a89ab549f437c05ab0", + "interface": "admin", + "region": "RegionOne", + "url": "http://192.168.204.2:8000/v1/fcca3cc49d5e42caae15459e27103efc" + } + ], + "name": "heat-cfn", + "type": "cloudformation" + }, + { + "id": "823024424a014981a3721229491c0b1a", + "endpoints": [ + { + "region": "RegionOne", + "url": "http://128.224.180.14:8776/v1/fcca3cc49d5e42caae15459e27103efc", + "region_id": "RegionOne", + "id": "4a52e4e54ff440789f9a797919c4a0f2", + "interface": "public" + }, + { + "url": "http://192.168.204.2:8776/v1/fcca3cc49d5e42caae15459e27103efc", + "region": "RegionOne", + "id": "d4f9a84476524a39844f0fce63f1022e", + "region_id": "RegionOne", + "interface": "internal" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:8776/v1/fcca3cc49d5e42caae15459e27103efc", + "interface": "admin", + "id": "81bf3810a8cc4697b68c6e93b5b8fe1f", + "region_id": "RegionOne" + } + ], + "type": "volume", + "name": "cinder" + }, + { + "name": "glance", + "type": "image", + "endpoints": [ + { + "id": "bd930aba961946cfb1401bada56d55e3", + "region_id": "RegionOne", + "interface": "public", + "region": "RegionOne", + "url": "http://128.224.180.14:9292" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:9292", + "id": "c11da585f0b141b99d1e18bb9a607beb", + "region_id": "RegionOne", + "interface": "internal" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:9292", + "id": "31b26c625a6a4fc7910dc5935155996e", + "interface": "admin", + "region_id": "RegionOne" + } + ], + "id": "3b78cf039bc54d1bbb99ab3a4be15ef1" + }, + { + "id": "b8701374bf254de1beee8a2c9ecc6b33", + "endpoints": [ + { + "region_id": "RegionOne", + "id": "f7407f330c8b4577b1d377d3fab9c2f8", + "interface": "public", + "region": "RegionOne", + "url": "http://128.224.180.14:15491" + }, + { + "url": "http://192.168.204.2:5491", + "region": "RegionOne", + "interface": "internal", + "id": "0b37ce31a32f4b6fa5e1aa0d6c20680f", + "region_id": "RegionOne" + }, + { + "region_id": "RegionOne", + "id": "7b87ea72adf245e1991e9e0df29b7ea9", + "interface": "admin", + "region": "RegionOne", + "url": "http://192.168.204.2:5491" + } + ], + "type": "patching", + "name": "patching" + }, + { + "id": "0ec0923a58f04ffeb6fced3bbc5c0947", + "endpoints": [ + { + "url": "http://128.224.180.14:8774/v2.1/fcca3cc49d5e42caae15459e27103efc", + "region": "RegionOne", + "id": "13168b12da17451fb39630de67db168f", + "region_id": "RegionOne", + "interface": "public" + }, + { + "id": "22dd6a44209f42d986b82e3aa6535f82", + "interface": "internal", + "region_id": "RegionOne", + "region": "RegionOne", + "url": "http://192.168.204.2:8774/v2.1/fcca3cc49d5e42caae15459e27103efc" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:8774/v2.1/fcca3cc49d5e42caae15459e27103efc", + "id": "552a991ae501492f841c1b6e2ff38fc5", + "region_id": "RegionOne", + "interface": "admin" + } + ], + "type": "compute", + "name": "nova" + }, + { + "id": "50b219650f1049b097b3f14e8c70cdf8", + "endpoints": [ + { + "interface": "public", + "id": "5a4276cd6e4d43e883cf8640d4e13f7d", + "region_id": "RegionOne", + "region": "RegionOne", + "url": "http://128.224.180.14:8776/v3/fcca3cc49d5e42caae15459e27103efc" + }, + { + "region": "RegionOne", + "url": "http://192.168.204.2:8776/v3/fcca3cc49d5e42caae15459e27103efc", + "region_id": "RegionOne", + "id": "c796df3ca5a84fc18db5b43a55283953", + "interface": "internal" + }, + { + "region_id": "RegionOne", + "id": "cf55c2b34d0049ba835a2e48b9ad0e2e", + "interface": "admin", + "url": "http://192.168.204.2:8776/v3/fcca3cc49d5e42caae15459e27103efc", + "region": "RegionOne" + } + ], + "type": "volumev3", + "name": "cinderv3" + } + ] +} + +MOCK_AUTH_STATE = { + "body": { + "token": { + "is_domain": "false", + "expires_at": "2017-08-27T14:19:15.000000Z", + "issued_at": "2017-08-27T13:19:15.000000Z", + "roles": [ + { + "id": "9fe2ff9ee4384b1894a90878d3e92bab", + "name": "_member_" + }, + { + "id": "b86a7e02935844b899d3d326f83c1b1f", + "name": "admin" + }, + { + "name": "heat_stack_owner", + "id": "7de502236e954c8282de32e773fc052e" + } + ], + "methods": [ + "password" + ], + "catalog": MOCK_CATALOG_RESPONSE['catalog'], + "project": { + "name": "admin", + "id": "fcca3cc49d5e42caae15459e27103efc", + "domain": { + "id": "default", + "name": "Default" + } + }, + "user": { + "name": "admin", + "id": "9efb043c7629497a8028d7325ca1afb0", + "domain": { + "id": "default", + "name": "Default" + } + }, + "audit_ids": [ + "_ZWT10DtSZKRXIvIcxun7w" + ] + } + }, + "auth_token": MOCK_TOKEN_ID +} + +MOCK_INTERNAL_METADATA_CATALOG = { + "identity": { + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/identity", + "prefix": "http://128.224.180.14:5000", + "suffix": "v3" + }, + "patching": { + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/patching", + "suffix": "", + "prefix": "http://128.224.180.14:15491" + }, + "orchestration": { + "suffix": "v1/fcca3cc49d5e42caae15459e27103efc", + "prefix": "http://128.224.180.14:8004", + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/orchestration" + }, + "volume": { + "prefix": "http://128.224.180.14:8776", + "suffix": "v1/fcca3cc49d5e42caae15459e27103efc", + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/volume" + }, + "metering": { + "suffix": "", + "prefix": "http://128.224.180.14:8777", + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/metering" + }, + "volumev3": { + "prefix": "http://128.224.180.14:8776", + "suffix": "v3/fcca3cc49d5e42caae15459e27103efc", + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/volumev3" + }, + "compute": { + "suffix": "v2.1/fcca3cc49d5e42caae15459e27103efc", + "prefix": "http://128.224.180.14:8774", + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/compute" + }, + "platform": { + "prefix": "http://128.224.180.14:6385", + "suffix": "v1", + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/platform" + }, + "nfv": { + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/nfv", + "prefix": "http://128.224.180.14:4545", + "suffix": "" + }, + "volumev2": { + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/volumev2", + "suffix": "v2/fcca3cc49d5e42caae15459e27103efc", + "prefix": "http://128.224.180.14:8776" + }, + "image": { + "suffix": "", + "prefix": "http://128.224.180.14:9292", + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/image" + }, + "network": { + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/network", + "prefix": "http://128.224.180.14:9696", + "suffix": "" + }, + "alarming": { + "suffix": "", + "prefix": "http://128.224.180.14:8042", + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/alarming" + }, + "cloudformation": { + "proxy_prefix": "http://172.16.77.20:9003/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/cloudformation", + "prefix": "http://128.224.180.14:8000", + "suffix": "v1/fcca3cc49d5e42caae15459e27103efc" + } +} diff --git a/newton/newton/requests/tests/test_flavor.py b/newton/newton/requests/tests/test_flavor.py new file mode 100644 index 00000000..cb7a4ffe --- /dev/null +++ b/newton/newton/requests/tests/test_flavor.py @@ -0,0 +1,288 @@ +# Copyright (c) 2017 Intel Corporation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import mock +import unittest + +from django.test import Client +from rest_framework import status + +from newton.requests.views.flavor import Flavors +from newton.requests.views.util import VimDriverUtils +from newton.requests.tests import mock_info + + +MOCK_GET_FLAVORS_RESPONSE = { + "flavors": [ + {"id": "uuid_1", "name": "flavor_1"}, + {"id": "uuid_2", "name": "flavor_2"} + ] +} + +MOCK_GET_FLAVOR_RESPONSE = { + "flavor": { + "id": "uuid_1", + "name": "flavor_1" + } +} + +MOCK_POST_FLAVOR_REQUEST = { + "id": "uuid_3", + "name": "flavor_3" +} + +MOCK_POST_FLAVOR_REQUEST_EXISTING = { + "id": "uuid_1", + "name": "flavor_1" +} + +MOCK_POST_FLAVOR_RESPONSE = { + "flavor": { + "id": "uuid_3", + "name": "flavor_3" + } +} + + +class MockResponse(object): + status_code = 200 + content = '' + + def json(self): + pass + + +class TestFlavors(unittest.TestCase): + def setUp(self): + self.client = Client() + + def tearDown(self): + pass + + @mock.patch.object(Flavors, 'get_flavor_extra_specs') + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_get_flavors(self, mock_get_vim_info, mock_get_session, mock_get_flavor_extra_specs): + + mock_session_specs = ["get"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_flavors_response_obj = mock.Mock(spec=MockResponse) + mock_get_flavors_response_obj.status_code = 200 + mock_get_flavors_response_obj.content = MOCK_GET_FLAVORS_RESPONSE + mock_get_flavors_response_obj.json.return_value = MOCK_GET_FLAVORS_RESPONSE + mock_session.get.return_value = mock_get_flavors_response_obj + + mock_extra_specs = mock.Mock(spec=MockResponse) + mock_extra_specs.json.return_value = {"extra_specs": {}} + + mock_get_flavor_extra_specs.return_value = mock_extra_specs + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.get( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc/flavors", + {}, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + context = response.json() + + self.assertEquals(status.HTTP_200_OK, response.status_code) + self.assertIsNotNone(context['flavors']) + self.assertEqual(MOCK_GET_FLAVORS_RESPONSE["flavors"], context['flavors']) + + @mock.patch.object(Flavors, 'get_flavor_extra_specs') + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_get_flavor(self, mock_get_vim_info, mock_get_session, mock_get_flavor_extra_specs): + + mock_session_specs = ["get"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_flavor_response_obj = mock.Mock(spec=MockResponse) + mock_get_flavor_response_obj.status_code = 200 + mock_get_flavor_response_obj.content = MOCK_GET_FLAVOR_RESPONSE + mock_get_flavor_response_obj.json.return_value = MOCK_GET_FLAVOR_RESPONSE + mock_session.get.return_value = mock_get_flavor_response_obj + + mock_extra_specs = mock.Mock(spec=MockResponse) + mock_extra_specs.json.return_value = {"extra_specs": {}} + + mock_get_flavor_extra_specs.return_value = mock_extra_specs + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.get( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc" + "/flavors/uuid_1", + {}, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + context = response.json() + + self.assertEquals(status.HTTP_200_OK, response.status_code) + self.assertEqual(MOCK_GET_FLAVOR_RESPONSE["id"], context["id"]) + + @mock.patch.object(Flavors, 'get_flavor_extra_specs') + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_get_flavor_not_found(self, mock_get_vim_info, mock_get_session, mock_get_flavor_extra_specs): + mock_session_specs = ["get"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_flavor_response_obj = mock.Mock(spec=MockResponse) + mock_get_flavor_response_obj.status_code = 404 + mock_get_flavor_response_obj.content = {} + mock_get_flavor_response_obj.json.return_value = {} + mock_session.get.return_value = mock_get_flavor_response_obj + + mock_extra_specs = mock.Mock(spec=MockResponse) + mock_extra_specs.json.return_value = {"extra_specs": {}} + + mock_get_flavor_extra_specs.return_value = mock_extra_specs + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.get( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc" + "/flavors/uuid_1", + {}, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + # TODO(sshank): 404 status is not possible. + self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code) + self.assertIn('error', response.data) + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_post_flavor(self, mock_get_vim_info, mock_get_session): + + mock_session_specs = ["get", "post"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_flavors_response_obj = mock.Mock(spec=MockResponse) + mock_get_flavors_response_obj.status_code = 200 + mock_get_flavors_response_obj.content = MOCK_GET_FLAVORS_RESPONSE + mock_get_flavors_response_obj.json.return_value = MOCK_GET_FLAVORS_RESPONSE + mock_session.get.return_value = mock_get_flavors_response_obj + + mock_post_flavor_response_obj = mock.Mock(spec=MockResponse) + mock_post_flavor_response_obj.status_code = 202 + mock_post_flavor_response_obj.content = MOCK_POST_FLAVOR_RESPONSE + mock_post_flavor_response_obj.json.return_value = MOCK_POST_FLAVOR_RESPONSE + mock_session.post.return_value = mock_post_flavor_response_obj + + mock_extra_specs = mock.Mock(spec=MockResponse) + mock_extra_specs.json.return_value = {"extra_specs": {}} + + #mock_get_flavor_extra_specs.return_value = mock_extra_specs + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.post( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc/flavors", + MOCK_POST_FLAVOR_REQUEST, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + context = response.json() + + self.assertEquals(status.HTTP_202_ACCEPTED, response.status_code) + self.assertIsNotNone(context['id']) + self.assertEqual(1, context['returnCode']) + + @mock.patch.object(Flavors, 'get_flavor_extra_specs') + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_post_flavor_existing(self, mock_get_vim_info, mock_get_session, mock_get_flavor_extra_specs): + mock_session_specs = ["get", "post"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_flavors_response_obj = mock.Mock(spec=MockResponse) + mock_get_flavors_response_obj.status_code = 200 + mock_get_flavors_response_obj.content = MOCK_GET_FLAVORS_RESPONSE + mock_get_flavors_response_obj.json.return_value = MOCK_GET_FLAVORS_RESPONSE + mock_session.get.return_value = mock_get_flavors_response_obj + + mock_post_flavor_response_obj = mock.Mock(spec=MockResponse) + mock_post_flavor_response_obj.status_code = 202 + mock_post_flavor_response_obj.content = MOCK_POST_FLAVOR_RESPONSE + mock_post_flavor_response_obj.json.return_value = MOCK_POST_FLAVOR_RESPONSE + mock_session.post.return_value = mock_post_flavor_response_obj + + mock_extra_specs = mock.Mock(spec=MockResponse) + mock_extra_specs.json.return_value = {"extra_specs": {}} + + mock_get_flavor_extra_specs.return_value = mock_extra_specs + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.post( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc/flavors", + MOCK_POST_FLAVOR_REQUEST_EXISTING, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + context = response.json() + self.assertEquals(status.HTTP_200_OK, response.status_code) + self.assertIsNotNone(context['returnCode']) + self.assertEqual(0, context['returnCode']) + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_post_flavor_empty(self, mock_get_vim_info, mock_get_session): + mock_session_specs = ["get", "post"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_flavors_response_obj = mock.Mock(spec=MockResponse) + mock_get_flavors_response_obj.status_code = 200 + mock_get_flavors_response_obj.content = MOCK_GET_FLAVORS_RESPONSE + mock_get_flavors_response_obj.json.return_value = MOCK_GET_FLAVORS_RESPONSE + mock_session.get.return_value = mock_get_flavors_response_obj + + mock_post_flavor_response_obj = mock.Mock(spec=MockResponse) + mock_post_flavor_response_obj.status_code = 202 + mock_post_flavor_response_obj.content = MOCK_POST_FLAVOR_RESPONSE + mock_post_flavor_response_obj.json.return_value = MOCK_POST_FLAVOR_RESPONSE + mock_session.post.return_value = mock_post_flavor_response_obj + + mock_extra_specs = mock.Mock(spec=MockResponse) + mock_extra_specs.json.return_value = {"extra_specs": {}} + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.post( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc/flavors", + {}, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + context = response.json() + self.assertIn('error', context) + self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code) + + @mock.patch.object(Flavors, 'get_flavor_extra_specs') + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_delete_flavor(self, mock_get_vim_info, mock_get_session, mock_get_flavor_extra_specs): + mock_session_specs = ["delete"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_delete_flavor_response_obj = mock.Mock(spec=MockResponse) + mock_delete_flavor_response_obj.status_code = 204 + + mock_session.delete.return_value = mock_delete_flavor_response_obj + + mock_extra_specs = mock.Mock(spec=MockResponse) + mock_extra_specs.json.return_value = {"extra_specs": {}} + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.delete( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc" + "/flavors/uuid_1", + HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + self.assertEqual(status.HTTP_204_NO_CONTENT, response.status_code) + self.assertIsNone(response.data) diff --git a/newton/newton/requests/tests/test_network.py b/newton/newton/requests/tests/test_network.py new file mode 100644 index 00000000..3eb8b0e6 --- /dev/null +++ b/newton/newton/requests/tests/test_network.py @@ -0,0 +1,255 @@ +# Copyright (c) 2017 Intel Corporation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import mock +import unittest + +from django.test import Client +from rest_framework import status + +from newton.requests.views.util import VimDriverUtils +from newton.requests.tests import mock_info + + +MOCK_GET_NETWORKS_RESPONSE = { + "networks": [ + {"name": "network_1"}, + {"name": "network_2"} + ] +} + +MOCK_GET_NETWORK_RESPONSE = { + "network": { + "network_id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb", + "name": "network_3" + } +} + +MOCK_POST_NETWORK_REQUEST = { + "name": "network_3" +} + +MOCK_POST_NETWORK_REQUEST_EXISTING = { + "name": "network_1" +} + +MOCK_POST_NETWORK_RESPONSE = { + "network": { + "network_id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb" + } +} + + +class MockResponse(object): + status_code = 200 + content = '' + + def json(self): + pass + + +class TestNetwork(unittest.TestCase): + def setUp(self): + self.client = Client() + + def tearDown(self): + pass + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_get_networks(self, mock_get_vim_info, mock_get_session): + + mock_session_specs = ["get"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + mock_get_networks_response_obj = mock.Mock(spec=MockResponse) + mock_get_networks_response_obj.status_code = 200 + mock_get_networks_response_obj.content = MOCK_GET_NETWORKS_RESPONSE + mock_get_networks_response_obj.json.return_value = MOCK_GET_NETWORKS_RESPONSE + mock_session.get.return_value = mock_get_networks_response_obj + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.get( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc/networks", + {}, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + context = response.json() + self.assertEquals(status.HTTP_200_OK, response.status_code) + self.assertIsNotNone(context['networks']) + self.assertEqual(MOCK_GET_NETWORKS_RESPONSE["networks"], context['networks']) + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_get_network(self, mock_get_vim_info, mock_get_session): + + mock_session_specs = ["get"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + mock_get_network_response_obj = mock.Mock(spec=MockResponse) + mock_get_network_response_obj.status_code = 200 + mock_get_network_response_obj.content = MOCK_GET_NETWORK_RESPONSE + mock_get_network_response_obj.json.return_value = MOCK_GET_NETWORK_RESPONSE + mock_session.get.return_value = mock_get_network_response_obj + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.get( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc" + "/networks/f5dc173b-6804-445a-a6d8-c705dad5b5eb", + {}, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + context = response.json() + self.assertEquals(status.HTTP_200_OK, response.status_code) + self.assertEquals(MOCK_GET_NETWORK_RESPONSE['network_id'], context['network_id']) + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_get_network_not_found(self, mock_get_vim_info, mock_get_session): + + mock_session_specs = ["get"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + mock_get_network_response_obj = mock.Mock(spec=MockResponse) + mock_get_network_response_obj.status_code = 404 + mock_get_network_response_obj.context = {} + mock_get_network_response_obj.json.return_value = {} + mock_session.get.return_value = mock_get_network_response_obj + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.get( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc" + "/networks/f5dc173b-6804-445a-a6d8-c705dad5b5eb", + {}, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + # TODO(sshank): 404 status is not possible. + self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code) + self.assertIn('error', response.data) + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_post(self, mock_get_vim_info, mock_get_session): + + mock_session_specs = ["get", "post"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_networks_response_obj = mock.Mock(spec=MockResponse) + mock_get_networks_response_obj.status_code = 200 + mock_get_networks_response_obj.content = MOCK_GET_NETWORKS_RESPONSE + mock_get_networks_response_obj.json.return_value = MOCK_GET_NETWORKS_RESPONSE + + mock_post_network_response_obj = mock.Mock(spec=MockResponse) + mock_post_network_response_obj.status_code = 202 + mock_post_network_response_obj.content = MOCK_POST_NETWORK_RESPONSE + mock_post_network_response_obj.json.return_value = MOCK_POST_NETWORK_RESPONSE + + mock_session.get.return_value = mock_get_networks_response_obj + mock_session.post.return_value = mock_post_network_response_obj + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.post( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc/networks", + MOCK_POST_NETWORK_REQUEST, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + context = response.json() + self.assertEquals(status.HTTP_202_ACCEPTED, response.status_code) + self.assertIsNotNone(context['network_id']) + self.assertEqual(1, context['returnCode']) + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_post_existing(self, mock_get_vim_info, mock_get_session): + mock_session_specs = ["get", "post"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_networks_response_obj = mock.Mock(spec=MockResponse) + mock_get_networks_response_obj.status_code = 200 + mock_get_networks_response_obj.content = MOCK_GET_NETWORKS_RESPONSE + mock_get_networks_response_obj.json.return_value = MOCK_GET_NETWORKS_RESPONSE + + mock_post_network_response_obj = mock.Mock(spec=MockResponse) + mock_post_network_response_obj.status_code = 202 + mock_post_network_response_obj.content = MOCK_POST_NETWORK_RESPONSE + mock_post_network_response_obj.json.return_value = MOCK_POST_NETWORK_RESPONSE + + mock_session.get.return_value = mock_get_networks_response_obj + mock_session.post.return_value = mock_post_network_response_obj + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.post( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc/networks", + MOCK_POST_NETWORK_REQUEST_EXISTING, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + context = response.json() + self.assertEquals(status.HTTP_200_OK, response.status_code) + self.assertIsNotNone(context['returnCode']) + self.assertEqual(0, context['returnCode']) + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_post_empty_body(self, mock_get_vim_info, mock_get_session): + mock_session_specs = ["get", "post"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_get_networks_response_obj = mock.Mock(spec=MockResponse) + mock_get_networks_response_obj.status_code = 200 + mock_get_networks_response_obj.content = MOCK_GET_NETWORKS_RESPONSE + mock_get_networks_response_obj.json.return_value = MOCK_GET_NETWORKS_RESPONSE + + mock_post_network_response_obj = mock.Mock(spec=MockResponse) + mock_post_network_response_obj.status_code = 202 + mock_post_network_response_obj.content = MOCK_POST_NETWORK_RESPONSE + mock_post_network_response_obj.json.return_value = MOCK_POST_NETWORK_RESPONSE + + mock_session.get.return_value = mock_get_networks_response_obj + mock_session.post.return_value = mock_post_network_response_obj + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.post( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc/networks", + {}, HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + context = response.json() + self.assertIn('error', context) + self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code) + + @mock.patch.object(VimDriverUtils, 'get_session') + @mock.patch.object(VimDriverUtils, 'get_vim_info') + def test_delete(self, mock_get_vim_info, mock_get_session): + + mock_session_specs = ["delete"] + mock_session = mock.Mock(name='mock_session', spec=mock_session_specs) + + mock_delete_network_response_obj = mock.Mock(spec=MockResponse) + mock_delete_network_response_obj.status_code = 204 + + mock_session.delete.return_value = mock_delete_network_response_obj + + mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO + mock_get_session.return_value = mock_session + + response = self.client.delete( + "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/fcca3cc49d5e42caae15459e27103efc" + "/networks/f5dc173b-6804-445a-a6d8-c705dad5b5eb", + HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID) + + self.assertEqual(status.HTTP_204_NO_CONTENT, response.status_code) + self.assertIsNone(response.data) diff --git a/newton/newton/requests/views/flavor.py b/newton/newton/requests/views/flavor.py index f63f7752..87d5481e 100644 --- a/newton/newton/requests/views/flavor.py +++ b/newton/newton/requests/views/flavor.py @@ -90,7 +90,6 @@ class Flavors(APIView): if wanted == flavor["name"]: content["flavors"].append(flavor) - #iterate each flavor to get extra_specs for flavor in content["flavors"]: extraResp = self.get_flavor_extra_specs(sess, flavor["id"]) @@ -197,7 +196,7 @@ class Flavors(APIView): extraSpecs = request.data.pop("extraSpecs", None) #create flavor first resp = self.create_flavor(sess, request) - if resp.status_code == 200: + if resp.status_code == 202: resp_body = resp.json()["flavor"] else: return resp @@ -219,7 +218,7 @@ class Flavors(APIView): resp_body.update({"extraSpecs":tmpSpecs}) else: #rollback - delete_flavor(self, request, vimid, tenantid, flavorid) + self.delete_flavor(self, request, vimid, tenantid, flavorid) return extraResp VimDriverUtils.replace_key_by_mapping(resp_body, self.keys_mapping) diff --git a/ocata/ocata/extensions/urls.py b/ocata/ocata/extensions/urls.py index 4dc46983..9aaf1331 100644 --- a/ocata/ocata/extensions/urls.py +++ b/ocata/ocata/extensions/urls.py @@ -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) diff --git a/ocata/ocata/proxy/urls.py b/ocata/ocata/proxy/urls.py index 6f41d080..12777bf6 100644 --- a/ocata/ocata/proxy/urls.py +++ b/ocata/ocata/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/ocata/ocata/proxy/views/identityV3.py b/ocata/ocata/proxy/views/identityV3.py index 534ebe8f..ca9a2111 100644 --- a/ocata/ocata/proxy/views/identityV3.py +++ b/ocata/ocata/proxy/views/identityV3.py @@ -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 diff --git a/windriver/titanium_cloud/extensions/views/extensions.py b/windriver/titanium_cloud/extensions/views/extensions.py index 2dd61fe9..3b231c02 100644 --- a/windriver/titanium_cloud/extensions/views/extensions.py +++ b/windriver/titanium_cloud/extensions/views/extensions.py @@ -12,9 +12,18 @@ # 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": "" } ] diff --git a/windriver/titanium_cloud/proxy/urls.py b/windriver/titanium_cloud/proxy/urls.py index dbad26fa..31a3c8f7 100644 --- a/windriver/titanium_cloud/proxy/urls.py +++ b/windriver/titanium_cloud/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/windriver/titanium_cloud/proxy/views/identityV3.py b/windriver/titanium_cloud/proxy/views/identityV3.py index a6efa6ac..2938caec 100644 --- a/windriver/titanium_cloud/proxy/views/identityV3.py +++ b/windriver/titanium_cloud/proxy/views/identityV3.py @@ -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 |