summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--newton/newton/extensions/urls.py6
-rw-r--r--newton/newton/proxy/urls.py4
-rw-r--r--newton/newton/proxy/views/identityV3.py76
-rw-r--r--newton/newton/requests/tests/mock_info.py554
-rw-r--r--newton/newton/requests/tests/test_flavor.py288
-rw-r--r--newton/newton/requests/tests/test_network.py255
-rw-r--r--newton/newton/requests/views/flavor.py5
-rw-r--r--ocata/ocata/extensions/urls.py6
-rw-r--r--ocata/ocata/proxy/urls.py4
-rw-r--r--ocata/ocata/proxy/views/identityV3.py6
-rw-r--r--windriver/titanium_cloud/extensions/views/extensions.py18
-rw-r--r--windriver/titanium_cloud/proxy/urls.py4
-rw-r--r--windriver/titanium_cloud/proxy/views/identityV3.py6
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