Create UTs for Tenants APIView 13/16513/1
authorVictor Morales <victor.morales@intel.com>
Thu, 28 Sep 2017 20:49:14 +0000 (13:49 -0700)
committerVictor Morales <victor.morales@intel.com>
Thu, 28 Sep 2017 20:52:24 +0000 (13:52 -0700)
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

newton/newton/requests/tests/test_tenant.py [new file with mode: 0644]
newton/newton/requests/views/tenants.py
newton/newton/requests/views/util.py

diff --git a/newton/newton/requests/tests/test_tenant.py b/newton/newton/requests/tests/test_tenant.py
new file mode 100644 (file)
index 0000000..67c02b5
--- /dev/null
@@ -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)
index 901839a..88b9454 100644 (file)
 # 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)
index a65ec3e..59eed5a 100644 (file)
 # 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__)