From d48ab8f98174169ebcf910b7db511357a748838b Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Thu, 28 Sep 2017 13:49:14 -0700 Subject: 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 Issue-Id: MULTICLOUD-83 --- newton/newton/requests/tests/test_tenant.py | 78 +++++++++++++++++++++++++++++ newton/newton/requests/views/tenants.py | 39 ++++++++------- newton/newton/requests/views/util.py | 6 +-- 3 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 newton/newton/requests/tests/test_tenant.py 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__) -- cgit 1.2.3-korg