summaryrefslogtreecommitdiffstats
path: root/newton
diff options
context:
space:
mode:
authorVictor Morales <victor.morales@intel.com>2017-09-28 13:49:14 -0700
committerVictor Morales <victor.morales@intel.com>2017-09-28 13:52:24 -0700
commitd48ab8f98174169ebcf910b7db511357a748838b (patch)
tree8f1f720637e49679a0879daa3dfb891a625c4677 /newton
parent0aa903c0dc422a8660cfe64616a4d191318816e6 (diff)
Create UTs for Tenants APIView
The Tenants APIView class didn't have Unit Tests that validates its functionality. This change creates UTs for two specific scenarios * Retrieving tenants/projects information * Retrieving tenants/projects information thru a querystring Change-Id: Ibeaf8af991ae3c3d926867f04285449f41f050c9 Signed-off-by: Victor Morales <victor.morales@intel.com> Issue-Id: MULTICLOUD-83
Diffstat (limited to 'newton')
-rw-r--r--newton/newton/requests/tests/test_tenant.py78
-rw-r--r--newton/newton/requests/views/tenants.py39
-rw-r--r--newton/newton/requests/views/util.py6
3 files changed, 99 insertions, 24 deletions
diff --git a/newton/newton/requests/tests/test_tenant.py b/newton/newton/requests/tests/test_tenant.py
new file mode 100644
index 00000000..67c02b51
--- /dev/null
+++ b/newton/newton/requests/tests/test_tenant.py
@@ -0,0 +1,78 @@
+# 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
+from rest_framework import status
+
+from newton.requests.tests import mock_info
+from newton.requests.tests import test_base
+from newton.requests.views.util import VimDriverUtils
+
+MOCK_GET_PROJECTS_RESPONSE = {
+ "tenants":[
+ {"id": "1", "name": "project"},
+ {"id": "2", "name": "project2"},
+ ]
+}
+
+
+class TestNetwork(test_base.TestRequest):
+
+ @mock.patch.object(VimDriverUtils, 'get_session')
+ @mock.patch.object(VimDriverUtils, 'get_vim_info')
+ def test_retrieve_projects(
+ self, mock_get_vim_info, mock_get_session):
+ mock_get_vim_info.return_value = mock_info.MOCK_VIM_INFO
+ mock_get_session.side_effect = [
+ test_base.get_mock_session(
+ ["get"],
+ {"get": { "content": MOCK_GET_PROJECTS_RESPONSE }}),
+ ]
+
+ response = self.client.get((
+ "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/"
+ "tenants"), {},
+ HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID)
+
+ self.assertEquals(status.HTTP_200_OK, response.status_code)
+ content = response.json()
+ self.assertIsNotNone(content["tenants"])
+ self.assertEquals(
+ len(MOCK_GET_PROJECTS_RESPONSE["tenants"]),
+ len(content["tenants"])
+ )
+ self.assertEquals(mock_info.MOCK_VIM_INFO["name"],
+ content["vimName"])
+ self.assertEquals(mock_info.MOCK_VIM_INFO["vimId"],
+ content["vimId"])
+
+ @mock.patch.object(VimDriverUtils, 'get_session')
+ @mock.patch.object(VimDriverUtils, 'get_vim_info')
+ def test_retrieve_projects_by_querystring(
+ self, mock_get_vim_info, mock_get_session):
+ mock_vim_identity_v2 = mock_info.MOCK_VIM_INFO.copy()
+ mock_vim_identity_v2["url"] = "http://128.224.180.14:5000/v2"
+ mock_get_vim_info.return_value = mock_vim_identity_v2
+ mock_get_session.side_effect = [
+ test_base.get_mock_session(
+ ["get"],
+ {"get": {"content": MOCK_GET_PROJECTS_RESPONSE}}),
+ ]
+
+ response = self.client.get((
+ "/api/multicloud-newton/v0/windriver-hudson-dc_RegionOne/"
+ "tenants?name=project"), {},
+ HTTP_X_AUTH_TOKEN=mock_info.MOCK_TOKEN_ID)
+
+ self.assertEquals(status.HTTP_200_OK, response.status_code)
diff --git a/newton/newton/requests/views/tenants.py b/newton/newton/requests/views/tenants.py
index 901839a4..88b9454b 100644
--- a/newton/newton/requests/views/tenants.py
+++ b/newton/newton/requests/views/tenants.py
@@ -11,25 +11,27 @@
# 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 logging
-import json
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 newton.pub.exceptions import VimDriverNewtonException
-
from newton.requests.views.util import VimDriverUtils
logger = logging.getLogger(__name__)
-DEBUG=True
class Tenants(APIView):
- service = {'service_type': 'identity',
- 'interface': 'public'}
+ service = {
+ 'service_type': 'identity',
+ 'interface': 'public'
+ }
+
keys_mapping = [
("projects", "tenants"),
]
@@ -41,12 +43,9 @@ class Tenants(APIView):
query = VimDriverUtils.get_query_part(request)
vim = VimDriverUtils.get_vim_info(vimid)
+ req_resouce = "/projects"
if '/v2' in vim["url"]:
req_resouce = "/v2.0/tenants"
- elif '/v3' in vim["url"]:
- req_resouce = "/projects"
- else:
- req_resouce = "/projects"
sess = VimDriverUtils.get_session(vim)
resp = sess.get(req_resouce, endpoint_filter=self.service)
@@ -57,28 +56,30 @@ class Tenants(APIView):
}
content.update(vim_dict)
- VimDriverUtils.replace_key_by_mapping(content,
- self.keys_mapping)
+ VimDriverUtils.replace_key_by_mapping(
+ content, self.keys_mapping)
if query:
_, tenantname = query.split('=')
if tenantname:
- tmp=content["tenants"]
+ tmp = content["tenants"]
content["tenants"] = []
# convert the key naming in hosts
for tenant in tmp:
if tenantname == tenant['name']:
content["tenants"].append(tenant)
-
return Response(data=content, status=resp.status_code)
except VimDriverNewtonException as e:
- return Response(data={'error': e.content}, status=e.status_code)
+ return Response(
+ data={'error': e.content}, status=e.status_code)
except HttpError as e:
- logger.error("HttpError: status:%s, response:%s" % (e.http_status, e.response.json()))
- return Response(data=e.response.json(), status=e.http_status)
+ 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:
logger.error(traceback.format_exc())
- return Response(data={'error': str(e)},
- status=status.HTTP_500_INTERNAL_SERVER_ERROR)
-
+ return Response(
+ data={'error': str(e)},
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR)
diff --git a/newton/newton/requests/views/util.py b/newton/newton/requests/views/util.py
index a65ec3ee..59eed5ab 100644
--- a/newton/newton/requests/views/util.py
+++ b/newton/newton/requests/views/util.py
@@ -11,18 +11,14 @@
# 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 logging
-import datetime
+import logging
from django.core.cache import cache
-
-from keystoneauth1 import _utils as utils
from keystoneauth1.identity import v2 as keystone_v2
from keystoneauth1.identity import v3 as keystone_v3
from keystoneauth1 import session
-#from newton.pub.msapi.extsys import get_vim_by_id
from newton.pub.msapi import extsys
logger = logging.getLogger(__name__)