summaryrefslogtreecommitdiffstats
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
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
-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__)