Add UT for ocata and windriver 53/16653/1
authorBin Yang <bin.yang@windriver.com>
Fri, 29 Sep 2017 16:02:32 +0000 (00:02 +0800)
committerBin Yang <bin.yang@windriver.com>
Fri, 29 Sep 2017 16:02:32 +0000 (00:02 +0800)
Change-Id: I6b921443cdd1181e1953962afeb11a706329c5e9
Issue-Id: MULTICLOUD-83
Signed-off-by: Bin Yang <bin.yang@windriver.com>
13 files changed:
newton/newton/proxy/views/identityV3.py
ocata/ocata/extensions/tests/__init__.py [new file with mode: 0644]
ocata/ocata/extensions/tests/test_epacaps.py [new file with mode: 0644]
ocata/ocata/extensions/tests/test_extensions.py [new file with mode: 0644]
ocata/ocata/proxy/tests/__init__.py [new file with mode: 0644]
ocata/ocata/proxy/tests/test_identity_proxy.py [new file with mode: 0644]
ocata/ocata/proxy/tests/test_service_proxy.py [new file with mode: 0644]
windriver/titanium_cloud/extensions/tests/__init__.py [new file with mode: 0644]
windriver/titanium_cloud/extensions/tests/test_epacaps.py [new file with mode: 0644]
windriver/titanium_cloud/extensions/tests/test_extensions.py [new file with mode: 0644]
windriver/titanium_cloud/proxy/tests/__init__.py [new file with mode: 0644]
windriver/titanium_cloud/proxy/tests/test_identity_proxy.py [new file with mode: 0644]
windriver/titanium_cloud/proxy/tests/test_service_proxy.py [new file with mode: 0644]

index 36f488a..bf63ad6 100644 (file)
@@ -51,6 +51,10 @@ class Tokens(APIView):
         try:
             tenant_name = request.data.get("tenant_name")
 
+            #backward support for keystone v2.0 API
+            if not tenant_name and request.data.get("auth"):
+                tenant_name = request.data["auth"].get("tenant_name")
+
             # prepare request resource to vim instance
             vim = VimDriverUtils.get_vim_info(vimid)
             sess = VimDriverUtils.get_session(vim, tenantname = tenant_name)
diff --git a/ocata/ocata/extensions/tests/__init__.py b/ocata/ocata/extensions/tests/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ocata/ocata/extensions/tests/test_epacaps.py b/ocata/ocata/extensions/tests/test_epacaps.py
new file mode 100644 (file)
index 0000000..a78e4c2
--- /dev/null
@@ -0,0 +1,67 @@
+# Copyright (c) 2017 Intel Corporation.
+#
+# 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 json
+
+import mock
+from django.test import Client
+from rest_framework import status
+import unittest
+
+from newton.requests.views.util import VimDriverUtils
+
+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": "ocata",
+    "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',
+}
+
+
+class TestEpaCaps(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    def test_get_epa_caps_info(self, mock_get_vim_info):
+        mock_get_vim_info.return_value = MOCK_VIM_INFO
+        cloud_owner = "windriver-hudson-dc"
+        cloud_region_id = "RegionOne"
+        vimid = cloud_owner + "_" + cloud_region_id
+
+        response = self.client.get(
+            "/api/multicloud-ocata/v0/" + vimid + "/extensions/epa-caps")
+        json_content = response.json()
+
+        self.assertEquals(status.HTTP_200_OK, response.status_code)
+        self.assertEquals(4, len(json_content.keys()))
+        self.assertEquals(cloud_owner, json_content["cloud-owner"])
+        self.assertEquals(cloud_region_id, json_content["cloud-region-id"])
+        self.assertEquals(vimid, json_content["vimid"])
+        self.assertEquals(json.loads(MOCK_VIM_INFO['cloud_epa_caps']),
+                          json_content["cloud-epa-caps"])
\ No newline at end of file
diff --git a/ocata/ocata/extensions/tests/test_extensions.py b/ocata/ocata/extensions/tests/test_extensions.py
new file mode 100644 (file)
index 0000000..16bcf47
--- /dev/null
@@ -0,0 +1,45 @@
+# Copyright (c) 2017 Intel Corporation.
+#
+# 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.
+
+from django.test import Client
+from rest_framework import status
+import unittest
+
+
+class TestExtensions(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    def test_get_extensions_info(self):
+        cloud_owner = "windriver-hudson-dc"
+        cloud_region_id = "RegionOne"
+        vimid = cloud_owner + "_" + cloud_region_id
+
+        response = self.client.get(
+            "/api/multicloud-ocata/v0/" + vimid + "/extensions/")
+        json_content = response.json()
+
+        self.assertEquals(status.HTTP_200_OK, response.status_code)
+        self.assertEquals(4, len(json_content.keys()))
+
+        self.assertEquals(cloud_owner, json_content["cloud-owner"])
+        self.assertEquals(cloud_region_id, json_content["cloud-region-id"])
+        self.assertEquals(vimid, json_content["vimid"])
+
+        self.assertEquals("epa-caps", json_content["extensions"][0]["alias"])
+        self.assertEquals("Multiple network support", json_content["extensions"][0]["description"])
+        self.assertEquals("EPACapsQuery", json_content["extensions"][0]["name"])
+        self.assertEquals("http://127.0.0.1:80/api/multicloud-ocata/v0/%s/extensions/epa-caps" % vimid,
+                          json_content["extensions"][0]["url"])
+        self.assertEquals("", json_content["extensions"][0]["spec"])
\ No newline at end of file
diff --git a/ocata/ocata/proxy/tests/__init__.py b/ocata/ocata/proxy/tests/__init__.py
new file mode 100644 (file)
index 0000000..48b6e44
--- /dev/null
@@ -0,0 +1,13 @@
+# Copyright (c) 2017 Wind River Systems, 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.
diff --git a/ocata/ocata/proxy/tests/test_identity_proxy.py b/ocata/ocata/proxy/tests/test_identity_proxy.py
new file mode 100644 (file)
index 0000000..a77592f
--- /dev/null
@@ -0,0 +1,533 @@
+# Copyright (c) 2017 Wind River Systems, 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 json
+
+import mock
+import unittest
+
+from django.test import Client
+from rest_framework import status
+
+from keystoneauth1 import session
+from keystoneauth1.exceptions import HttpError
+
+from newton.requests.views.util import VimDriverUtils
+from ocata.proxy.views.identityV3 import Tokens
+
+mock_viminfo = {
+    "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": "ocata",
+    "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
+}
+
+
+class TestIdentityService(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    @mock.patch.object(VimDriverUtils, 'get_session')
+    @mock.patch.object(VimDriverUtils, 'get_auth_state')
+    @mock.patch.object(VimDriverUtils, 'update_token_cache')
+    def test_token(self, mock_update_token_cache, mock_get_auth_state, mock_get_session, mock_get_vim_info):
+        '''
+                test API: get token
+        :param mock_update_token_cache:
+        :param mock_get_auth_state:
+        :param mock_get_session:
+        :param mock_get_vim_info:
+        :return:
+        '''
+
+        #mock VimDriverUtils APIs
+        mock_session_specs = ["get"]
+        mock_session_get_response = {'status':200}
+        mock_session = mock.Mock(name='mock_session', spec=mock_session_specs)
+        mock_session.get.return_value = mock_session_get_response
+
+        mock_get_vim_info.return_value = mock_viminfo
+        mock_get_session.return_value = mock_session
+        mock_get_auth_state.return_value = json.dumps(mock_auth_state)
+        mock_update_token_cache.return_value = mock_token_id
+
+        #simulate client to make the request
+        data ={}
+        response = self.client.post("/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/identity/v3/auth/tokens", data=data, format='json')
+        self.failUnlessEqual(status.HTTP_201_CREATED, response.status_code)
+        context = response.json()
+
+        self.assertTrue(response['X-Subject-Token'] == mock_token_id)
+        self.assertTrue(context['token']['catalog'] != None)
diff --git a/ocata/ocata/proxy/tests/test_service_proxy.py b/ocata/ocata/proxy/tests/test_service_proxy.py
new file mode 100644 (file)
index 0000000..f916e33
--- /dev/null
@@ -0,0 +1,855 @@
+# Copyright (c) 2017 Wind River Systems, 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 copy
+import json
+
+from django.test import Client
+import mock
+from rest_framework import status
+import unittest
+
+
+from newton.requests.views.util import VimDriverUtils
+
+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": "ocata",
+    "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-ocata/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-ocata/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-ocata/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-ocata/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-ocata/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-ocata/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-ocata/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-ocata/v0/windriver-hudson-dc_RegionOne/platform"
+   },
+   "nfv" : {
+      "proxy_prefix" : "http://172.16.77.20:9003/api/multicloud-ocata/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-ocata/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-ocata/v0/windriver-hudson-dc_RegionOne/image"
+   },
+   "network" : {
+      "proxy_prefix" : "http://172.16.77.20:9003/api/multicloud-ocata/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-ocata/v0/windriver-hudson-dc_RegionOne/alarming"
+   },
+   "cloudformation" : {
+      "proxy_prefix" : "http://172.16.77.20:9003/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/cloudformation",
+      "prefix" : "http://128.224.180.14:8000",
+      "suffix" : "v1/fcca3cc49d5e42caae15459e27103efc"
+   }
+}
+
+
+MOCK_GET_SERVERS_RESPONSE = {
+   "servers" : [
+      {
+         "links" : [
+            {
+               "href" : "http://128.224.180.14:8774/v2.1/fcca3cc49d5e42caae15459e27103efc/servers/b2581b5c-7c56-4564-819d-fe7a2ce9c261",
+               "rel" : "self"
+            },
+            {
+               "href" : "http://128.224.180.14:8774/fcca3cc49d5e42caae15459e27103efc/servers/b2581b5c-7c56-4564-819d-fe7a2ce9c261",
+               "rel" : "bookmark"
+            }
+         ],
+         "id" : "b2581b5c-7c56-4564-819d-fe7a2ce9c261",
+         "name" : "t1"
+      },
+      {
+         "id" : "ff7b51ca-a272-45f4-b54c-e40b8099e67d",
+         "name" : "t2",
+         "links" : [
+            {
+               "rel" : "self",
+               "href" : "http://128.224.180.14:8774/v2.1/fcca3cc49d5e42caae15459e27103efc/servers/ff7b51ca-a272-45f4-b54c-e40b8099e67d"
+            },
+            {
+               "rel" : "bookmark",
+               "href" : "http://128.224.180.14:8774/fcca3cc49d5e42caae15459e27103efc/servers/ff7b51ca-a272-45f4-b54c-e40b8099e67d"
+            }
+         ]
+      }
+   ]
+}
+
+MOCK_POST_SERVER_REQUEST = {
+    "server" : {
+        "accessIPv4": "1.2.3.4",
+        "accessIPv6": "80fe::",
+        "name" : "new-server-test",
+        "imageRef" : "70a599e0-31e7-49b7-b260-868f441e862b",
+        "flavorRef" : "1",
+        "availability_zone": "nova",
+        "OS-DCF:diskConfig": "AUTO",
+        "metadata" : {
+            "My Server Name" : "Apache1"
+        },
+        "personality": [
+            {
+                "path": "/etc/banner.txt",
+                "contents": "ICAgICAgDQoiQSBjbG91ZCBkb2VzIG5vdCBrbm93IHdoeSBp dCBtb3ZlcyBpbiBqdXN0IHN1Y2ggYSBkaXJlY3Rpb24gYW5k IGF0IHN1Y2ggYSBzcGVlZC4uLkl0IGZlZWxzIGFuIGltcHVs c2lvbi4uLnRoaXMgaXMgdGhlIHBsYWNlIHRvIGdvIG5vdy4g QnV0IHRoZSBza3kga25vd3MgdGhlIHJlYXNvbnMgYW5kIHRo ZSBwYXR0ZXJucyBiZWhpbmQgYWxsIGNsb3VkcywgYW5kIHlv dSB3aWxsIGtub3csIHRvbywgd2hlbiB5b3UgbGlmdCB5b3Vy c2VsZiBoaWdoIGVub3VnaCB0byBzZWUgYmV5b25kIGhvcml6 b25zLiINCg0KLVJpY2hhcmQgQmFjaA=="
+            }
+        ],
+        "security_groups": [
+            {
+                "name": "default"
+            }
+        ],
+        "user_data" : "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg=="
+    },
+    "OS-SCH-HNT:scheduler_hints": {
+        "same_host": "48e6a9f6-30af-47e0-bc04-acaed113bb4e"
+    }
+}
+
+MOCK_POST_SERVER_RESPONSE = {
+    "server": {
+        "OS-DCF:diskConfig": "AUTO",
+        "adminPass": "6NpUwoz2QDRN",
+        "id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb",
+        "links": [
+            {
+                "href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
+                "rel": "self"
+            },
+            {
+                "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
+                "rel": "bookmark"
+            }
+        ],
+        "security_groups": [
+            {
+                "name": "default"
+            }
+        ]
+    }
+}
+
+
+MOCK_PATCH_IMAGE_REQUEST = [
+    {
+        "op": "replace",
+        "path": "/name",
+        "value": "Fedora 17"
+    },
+    {
+        "op": "replace",
+        "path": "/tags",
+        "value": [
+            "fedora",
+            "beefy"
+        ]
+    }
+]
+
+MOCK_PATCH_IMAGE_RESPONSE = {
+    "checksum": "710544e7f0c828b42f51207342622d33",
+    "container_format": "ovf",
+    "created_at": "2016-06-29T16:13:07Z",
+    "disk_format": "vhd",
+    "file": "/v2/images/2b61ed2b-f800-4da0-99ff-396b742b8646/file",
+    "id": "2b61ed2b-f800-4da0-99ff-396b742b8646",
+    "min_disk": 20,
+    "min_ram": 512,
+    "name": "Fedora 17",
+    "owner": "02a7fb2dd4ef434c8a628c511dcbbeb6",
+    "protected": "false",
+    "schema": "/v2/schemas/image",
+    "self": "/v2/images/2b61ed2b-f800-4da0-99ff-396b742b8646",
+    "size": 21909,
+    "status": "active",
+    "tags": [
+        "beefy",
+        "fedora"
+    ],
+    "updated_at": "2016-07-25T14:48:18Z",
+    "virtual_size": "",
+    "visibility": "private"
+}
+
+
+class MockResponse(object):
+   status_code = 200
+   content = ''
+
+   def json(self):
+      pass
+
+
+class TestServiceProxy(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    @mock.patch.object(VimDriverUtils, 'get_session')
+    @mock.patch.object(VimDriverUtils, 'get_token_cache')
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    def test_get_token(self, mock_get_vim_info, mock_get_token_cache, mock_get_session):
+       mock_session_specs = ["head"]
+       mock_session = mock.Mock(name='mock_session', spec=mock_session_specs)
+       mock_get_servers_response_obj = mock.Mock(spec=MockResponse)
+       mock_get_servers_response_obj.status_code=200
+       mock_get_servers_response_obj.content = MOCK_GET_SERVERS_RESPONSE
+       mock_get_servers_response_obj.json.return_value=MOCK_GET_SERVERS_RESPONSE
+       mock_session.head.return_value = mock_get_servers_response_obj
+
+       mock_get_vim_info.return_value = MOCK_VIM_INFO
+       mock_get_session.return_value = mock_session
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE),json.dumps(MOCK_INTERNAL_METADATA_CATALOG))
+       response = self.client.head(
+          "/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+          {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_200_OK, response.status_code)
+
+    def test_unauthorized_access(self):
+       response = self.client.get(
+          "/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers")
+       self.assertEquals(status.HTTP_403_FORBIDDEN, response.status_code)
+
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    def test_expired_auth_token(self, mock_get_vim_info):
+       mock_get_vim_info.return_value = MOCK_VIM_INFO
+
+       response = self.client.get(
+          "/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+          {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_403_FORBIDDEN, response.status_code)
+
+    @mock.patch.object(VimDriverUtils, 'get_token_cache')
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    def test_request_without_servicetype(self, mock_get_vim_info, mock_get_token_cache):
+       mock_get_vim_info.return_value = MOCK_VIM_INFO
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE), {})
+       servicetype = "compute"
+       url = ("/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/" + servicetype +
+              "/v2.1/fcca3cc49d5e42caae15459e27103efc/servers")
+       response = self.client.get(url, {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code)
+
+       metadata_catalog = copy.deepcopy(MOCK_INTERNAL_METADATA_CATALOG)
+       metadata_catalog[servicetype] = None
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE), json.dumps(metadata_catalog))
+
+       response = self.client.get(url, {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code)
+
+       metadata_catalog = copy.deepcopy(MOCK_INTERNAL_METADATA_CATALOG)
+       metadata_catalog[servicetype]['prefix'] = None
+       metadata_catalog[servicetype]['proxy_prefix'] = None
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE), json.dumps(metadata_catalog))
+
+       response = self.client.get(url, {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code)
+
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    @mock.patch.object(VimDriverUtils, 'get_session')
+    @mock.patch.object(VimDriverUtils, 'get_auth_state')
+    @mock.patch.object(VimDriverUtils, 'update_token_cache')
+    @mock.patch.object(VimDriverUtils, 'get_token_cache')
+    def test_crud_resources(self, mock_get_token_cache, mock_update_token_cache, mock_get_auth_state, mock_get_session, mock_get_vim_info):
+       '''
+       Test service proxy API: GET
+
+       :param mock_get_token_cache:
+       :param mock_update_token_cache:
+       :param mock_get_auth_state:
+       :param mock_get_session:
+       :param mock_get_vim_info:
+       :return:
+       '''
+
+       #mock VimDriverUtils APIs
+       mock_session_specs = ["get", "post", "put", "patch", "delete"]
+
+       mock_get_servers_response_obj = mock.Mock(spec=MockResponse)
+       mock_get_servers_response_obj.status_code=200
+       mock_get_servers_response_obj.content = MOCK_GET_SERVERS_RESPONSE
+       mock_get_servers_response_obj.json.return_value=MOCK_GET_SERVERS_RESPONSE
+
+       mock_post_server_response_obj = mock.Mock(spec=MockResponse)
+       mock_post_server_response_obj.status_code=202
+       mock_post_server_response_obj.content = MOCK_POST_SERVER_RESPONSE
+       mock_post_server_response_obj.json.return_value=MOCK_POST_SERVER_RESPONSE
+
+       mock_patch_server_response_obj = mock.Mock(spec=MockResponse)
+       mock_patch_server_response_obj.status_code=202
+       mock_patch_server_response_obj.content = MOCK_PATCH_IMAGE_REQUEST
+       mock_patch_server_response_obj.json.return_value=MOCK_PATCH_IMAGE_REQUEST
+
+       mock_delete_server_response_obj = mock.Mock(spec=MockResponse)
+       mock_delete_server_response_obj.status_code=204
+
+       mock_session = mock.Mock(name='mock_session', spec=mock_session_specs)
+       mock_session.get.return_value = mock_get_servers_response_obj
+       mock_session.post.return_value = mock_post_server_response_obj
+       mock_session.patch.return_value = mock_patch_server_response_obj
+       mock_session.delete.return_value = mock_delete_server_response_obj
+
+       mock_get_vim_info.return_value = MOCK_VIM_INFO
+       mock_get_session.return_value = mock_session
+       mock_get_auth_state.return_value = json.dumps(MOCK_AUTH_STATE)
+       mock_update_token_cache.return_value = MOCK_TOKEN_ID
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE),json.dumps(MOCK_INTERNAL_METADATA_CATALOG))
+
+       # Create resource
+       response = self.client.post(
+           "/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+           MOCK_POST_SERVER_REQUEST, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+
+       self.assertEquals(status.HTTP_202_ACCEPTED, response.status_code)
+       context = response.json()
+       self.assertEquals(MOCK_TOKEN_ID, response['X-Subject-Token'])
+       self.assertIsNotNone(context['server'])
+
+       # Retrieve resource
+       response = self.client.get(
+           "/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+           {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_200_OK, response.status_code)
+       context = response.json()
+
+       self.assertEquals(MOCK_TOKEN_ID, response['X-Subject-Token'])
+       self.assertIsNotNone(context['servers'])
+
+       # Update resource
+       response = self.client.get(
+           "/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+           {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_200_OK, response.status_code)
+       context = response.json()
+
+       self.assertEquals(MOCK_TOKEN_ID, response['X-Subject-Token'])
+       self.assertIsNotNone(context['servers'])
+
+       #simulate client to make the request
+       response = self.client.delete(
+           "/api/multicloud-ocata/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers/324dfb7d-f4a9-419a-9a19-237df04b443b",
+           HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+
+       self.assertEquals(status.HTTP_204_NO_CONTENT, response.status_code)
+       self.assertEquals(MOCK_TOKEN_ID, response['X-Subject-Token'])
diff --git a/windriver/titanium_cloud/extensions/tests/__init__.py b/windriver/titanium_cloud/extensions/tests/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/windriver/titanium_cloud/extensions/tests/test_epacaps.py b/windriver/titanium_cloud/extensions/tests/test_epacaps.py
new file mode 100644 (file)
index 0000000..544b8ef
--- /dev/null
@@ -0,0 +1,67 @@
+# Copyright (c) 2017 Intel Corporation.
+#
+# 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 json
+
+import mock
+from django.test import Client
+from rest_framework import status
+import unittest
+
+from newton.requests.views.util import VimDriverUtils
+
+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": "titanium_cloud",
+    "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',
+}
+
+
+class TestEpaCaps(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    def test_get_epa_caps_info(self, mock_get_vim_info):
+        mock_get_vim_info.return_value = MOCK_VIM_INFO
+        cloud_owner = "windriver-hudson-dc"
+        cloud_region_id = "RegionOne"
+        vimid = cloud_owner + "_" + cloud_region_id
+
+        response = self.client.get(
+            "/api/multicloud-titanium_cloud/v0/" + vimid + "/extensions/epa-caps")
+        json_content = response.json()
+
+        self.assertEquals(status.HTTP_200_OK, response.status_code)
+        self.assertEquals(4, len(json_content.keys()))
+        self.assertEquals(cloud_owner, json_content["cloud-owner"])
+        self.assertEquals(cloud_region_id, json_content["cloud-region-id"])
+        self.assertEquals(vimid, json_content["vimid"])
+        self.assertEquals(json.loads(MOCK_VIM_INFO['cloud_epa_caps']),
+                          json_content["cloud-epa-caps"])
\ No newline at end of file
diff --git a/windriver/titanium_cloud/extensions/tests/test_extensions.py b/windriver/titanium_cloud/extensions/tests/test_extensions.py
new file mode 100644 (file)
index 0000000..93d990b
--- /dev/null
@@ -0,0 +1,45 @@
+# Copyright (c) 2017 Intel Corporation.
+#
+# 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.
+
+from django.test import Client
+from rest_framework import status
+import unittest
+
+
+class TestExtensions(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    def test_get_extensions_info(self):
+        cloud_owner = "windriver-hudson-dc"
+        cloud_region_id = "RegionOne"
+        vimid = cloud_owner + "_" + cloud_region_id
+
+        response = self.client.get(
+            "/api/multicloud-titanium_cloud/v0/" + vimid + "/extensions/")
+        json_content = response.json()
+
+        self.assertEquals(status.HTTP_200_OK, response.status_code)
+        self.assertEquals(4, len(json_content.keys()))
+
+        self.assertEquals(cloud_owner, json_content["cloud-owner"])
+        self.assertEquals(cloud_region_id, json_content["cloud-region-id"])
+        self.assertEquals(vimid, json_content["vimid"])
+
+        self.assertEquals("epa-caps", json_content["extensions"][0]["alias"])
+        self.assertEquals("Multiple network support", json_content["extensions"][0]["description"])
+        self.assertEquals("EPACapsQuery", json_content["extensions"][0]["name"])
+        self.assertEquals("http://127.0.0.1:80/api/multicloud-titanium_cloud/v0/%s/extensions/epa-caps" % vimid,
+                          json_content["extensions"][0]["url"])
+        self.assertEquals("", json_content["extensions"][0]["spec"])
\ No newline at end of file
diff --git a/windriver/titanium_cloud/proxy/tests/__init__.py b/windriver/titanium_cloud/proxy/tests/__init__.py
new file mode 100644 (file)
index 0000000..48b6e44
--- /dev/null
@@ -0,0 +1,13 @@
+# Copyright (c) 2017 Wind River Systems, 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.
diff --git a/windriver/titanium_cloud/proxy/tests/test_identity_proxy.py b/windriver/titanium_cloud/proxy/tests/test_identity_proxy.py
new file mode 100644 (file)
index 0000000..72ffd45
--- /dev/null
@@ -0,0 +1,533 @@
+# Copyright (c) 2017 Wind River Systems, 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 json
+
+import mock
+import unittest
+
+from django.test import Client
+from rest_framework import status
+
+from keystoneauth1 import session
+from keystoneauth1.exceptions import HttpError
+
+from newton.requests.views.util import VimDriverUtils
+from titanium_cloud.proxy.views.identityV3 import Tokens
+
+mock_viminfo = {
+    "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": "titanium_cloud",
+    "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
+}
+
+
+class TestIdentityService(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    @mock.patch.object(VimDriverUtils, 'get_session')
+    @mock.patch.object(VimDriverUtils, 'get_auth_state')
+    @mock.patch.object(VimDriverUtils, 'update_token_cache')
+    def test_token(self, mock_update_token_cache, mock_get_auth_state, mock_get_session, mock_get_vim_info):
+        '''
+                test API: get token
+        :param mock_update_token_cache:
+        :param mock_get_auth_state:
+        :param mock_get_session:
+        :param mock_get_vim_info:
+        :return:
+        '''
+
+        #mock VimDriverUtils APIs
+        mock_session_specs = ["get"]
+        mock_session_get_response = {'status':200}
+        mock_session = mock.Mock(name='mock_session', spec=mock_session_specs)
+        mock_session.get.return_value = mock_session_get_response
+
+        mock_get_vim_info.return_value = mock_viminfo
+        mock_get_session.return_value = mock_session
+        mock_get_auth_state.return_value = json.dumps(mock_auth_state)
+        mock_update_token_cache.return_value = mock_token_id
+
+        #simulate client to make the request
+        data ={}
+        response = self.client.post("/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/identity/v3/auth/tokens", data=data, format='json')
+        self.failUnlessEqual(status.HTTP_201_CREATED, response.status_code)
+        context = response.json()
+
+        self.assertTrue(response['X-Subject-Token'] == mock_token_id)
+        self.assertTrue(context['token']['catalog'] != None)
diff --git a/windriver/titanium_cloud/proxy/tests/test_service_proxy.py b/windriver/titanium_cloud/proxy/tests/test_service_proxy.py
new file mode 100644 (file)
index 0000000..6f43f25
--- /dev/null
@@ -0,0 +1,855 @@
+# Copyright (c) 2017 Wind River Systems, 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 copy
+import json
+
+from django.test import Client
+import mock
+from rest_framework import status
+import unittest
+
+
+from newton.requests.views.util import VimDriverUtils
+
+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": "titanium_cloud",
+    "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-titanium_cloud/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-titanium_cloud/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-titanium_cloud/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-titanium_cloud/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-titanium_cloud/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-titanium_cloud/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-titanium_cloud/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-titanium_cloud/v0/windriver-hudson-dc_RegionOne/platform"
+   },
+   "nfv" : {
+      "proxy_prefix" : "http://172.16.77.20:9003/api/multicloud-titanium_cloud/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-titanium_cloud/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-titanium_cloud/v0/windriver-hudson-dc_RegionOne/image"
+   },
+   "network" : {
+      "proxy_prefix" : "http://172.16.77.20:9003/api/multicloud-titanium_cloud/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-titanium_cloud/v0/windriver-hudson-dc_RegionOne/alarming"
+   },
+   "cloudformation" : {
+      "proxy_prefix" : "http://172.16.77.20:9003/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/cloudformation",
+      "prefix" : "http://128.224.180.14:8000",
+      "suffix" : "v1/fcca3cc49d5e42caae15459e27103efc"
+   }
+}
+
+
+MOCK_GET_SERVERS_RESPONSE = {
+   "servers" : [
+      {
+         "links" : [
+            {
+               "href" : "http://128.224.180.14:8774/v2.1/fcca3cc49d5e42caae15459e27103efc/servers/b2581b5c-7c56-4564-819d-fe7a2ce9c261",
+               "rel" : "self"
+            },
+            {
+               "href" : "http://128.224.180.14:8774/fcca3cc49d5e42caae15459e27103efc/servers/b2581b5c-7c56-4564-819d-fe7a2ce9c261",
+               "rel" : "bookmark"
+            }
+         ],
+         "id" : "b2581b5c-7c56-4564-819d-fe7a2ce9c261",
+         "name" : "t1"
+      },
+      {
+         "id" : "ff7b51ca-a272-45f4-b54c-e40b8099e67d",
+         "name" : "t2",
+         "links" : [
+            {
+               "rel" : "self",
+               "href" : "http://128.224.180.14:8774/v2.1/fcca3cc49d5e42caae15459e27103efc/servers/ff7b51ca-a272-45f4-b54c-e40b8099e67d"
+            },
+            {
+               "rel" : "bookmark",
+               "href" : "http://128.224.180.14:8774/fcca3cc49d5e42caae15459e27103efc/servers/ff7b51ca-a272-45f4-b54c-e40b8099e67d"
+            }
+         ]
+      }
+   ]
+}
+
+MOCK_POST_SERVER_REQUEST = {
+    "server" : {
+        "accessIPv4": "1.2.3.4",
+        "accessIPv6": "80fe::",
+        "name" : "new-server-test",
+        "imageRef" : "70a599e0-31e7-49b7-b260-868f441e862b",
+        "flavorRef" : "1",
+        "availability_zone": "nova",
+        "OS-DCF:diskConfig": "AUTO",
+        "metadata" : {
+            "My Server Name" : "Apache1"
+        },
+        "personality": [
+            {
+                "path": "/etc/banner.txt",
+                "contents": "ICAgICAgDQoiQSBjbG91ZCBkb2VzIG5vdCBrbm93IHdoeSBp dCBtb3ZlcyBpbiBqdXN0IHN1Y2ggYSBkaXJlY3Rpb24gYW5k IGF0IHN1Y2ggYSBzcGVlZC4uLkl0IGZlZWxzIGFuIGltcHVs c2lvbi4uLnRoaXMgaXMgdGhlIHBsYWNlIHRvIGdvIG5vdy4g QnV0IHRoZSBza3kga25vd3MgdGhlIHJlYXNvbnMgYW5kIHRo ZSBwYXR0ZXJucyBiZWhpbmQgYWxsIGNsb3VkcywgYW5kIHlv dSB3aWxsIGtub3csIHRvbywgd2hlbiB5b3UgbGlmdCB5b3Vy c2VsZiBoaWdoIGVub3VnaCB0byBzZWUgYmV5b25kIGhvcml6 b25zLiINCg0KLVJpY2hhcmQgQmFjaA=="
+            }
+        ],
+        "security_groups": [
+            {
+                "name": "default"
+            }
+        ],
+        "user_data" : "IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg=="
+    },
+    "OS-SCH-HNT:scheduler_hints": {
+        "same_host": "48e6a9f6-30af-47e0-bc04-acaed113bb4e"
+    }
+}
+
+MOCK_POST_SERVER_RESPONSE = {
+    "server": {
+        "OS-DCF:diskConfig": "AUTO",
+        "adminPass": "6NpUwoz2QDRN",
+        "id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb",
+        "links": [
+            {
+                "href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
+                "rel": "self"
+            },
+            {
+                "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
+                "rel": "bookmark"
+            }
+        ],
+        "security_groups": [
+            {
+                "name": "default"
+            }
+        ]
+    }
+}
+
+
+MOCK_PATCH_IMAGE_REQUEST = [
+    {
+        "op": "replace",
+        "path": "/name",
+        "value": "Fedora 17"
+    },
+    {
+        "op": "replace",
+        "path": "/tags",
+        "value": [
+            "fedora",
+            "beefy"
+        ]
+    }
+]
+
+MOCK_PATCH_IMAGE_RESPONSE = {
+    "checksum": "710544e7f0c828b42f51207342622d33",
+    "container_format": "ovf",
+    "created_at": "2016-06-29T16:13:07Z",
+    "disk_format": "vhd",
+    "file": "/v2/images/2b61ed2b-f800-4da0-99ff-396b742b8646/file",
+    "id": "2b61ed2b-f800-4da0-99ff-396b742b8646",
+    "min_disk": 20,
+    "min_ram": 512,
+    "name": "Fedora 17",
+    "owner": "02a7fb2dd4ef434c8a628c511dcbbeb6",
+    "protected": "false",
+    "schema": "/v2/schemas/image",
+    "self": "/v2/images/2b61ed2b-f800-4da0-99ff-396b742b8646",
+    "size": 21909,
+    "status": "active",
+    "tags": [
+        "beefy",
+        "fedora"
+    ],
+    "updated_at": "2016-07-25T14:48:18Z",
+    "virtual_size": "",
+    "visibility": "private"
+}
+
+
+class MockResponse(object):
+   status_code = 200
+   content = ''
+
+   def json(self):
+      pass
+
+
+class TestServiceProxy(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    @mock.patch.object(VimDriverUtils, 'get_session')
+    @mock.patch.object(VimDriverUtils, 'get_token_cache')
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    def test_get_token(self, mock_get_vim_info, mock_get_token_cache, mock_get_session):
+       mock_session_specs = ["head"]
+       mock_session = mock.Mock(name='mock_session', spec=mock_session_specs)
+       mock_get_servers_response_obj = mock.Mock(spec=MockResponse)
+       mock_get_servers_response_obj.status_code=200
+       mock_get_servers_response_obj.content = MOCK_GET_SERVERS_RESPONSE
+       mock_get_servers_response_obj.json.return_value=MOCK_GET_SERVERS_RESPONSE
+       mock_session.head.return_value = mock_get_servers_response_obj
+
+       mock_get_vim_info.return_value = MOCK_VIM_INFO
+       mock_get_session.return_value = mock_session
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE),json.dumps(MOCK_INTERNAL_METADATA_CATALOG))
+       response = self.client.head(
+          "/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+          {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_200_OK, response.status_code)
+
+    def test_unauthorized_access(self):
+       response = self.client.get(
+          "/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers")
+       self.assertEquals(status.HTTP_403_FORBIDDEN, response.status_code)
+
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    def test_expired_auth_token(self, mock_get_vim_info):
+       mock_get_vim_info.return_value = MOCK_VIM_INFO
+
+       response = self.client.get(
+          "/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+          {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_403_FORBIDDEN, response.status_code)
+
+    @mock.patch.object(VimDriverUtils, 'get_token_cache')
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    def test_request_without_servicetype(self, mock_get_vim_info, mock_get_token_cache):
+       mock_get_vim_info.return_value = MOCK_VIM_INFO
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE), {})
+       servicetype = "compute"
+       url = ("/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/" + servicetype +
+              "/v2.1/fcca3cc49d5e42caae15459e27103efc/servers")
+       response = self.client.get(url, {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code)
+
+       metadata_catalog = copy.deepcopy(MOCK_INTERNAL_METADATA_CATALOG)
+       metadata_catalog[servicetype] = None
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE), json.dumps(metadata_catalog))
+
+       response = self.client.get(url, {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code)
+
+       metadata_catalog = copy.deepcopy(MOCK_INTERNAL_METADATA_CATALOG)
+       metadata_catalog[servicetype]['prefix'] = None
+       metadata_catalog[servicetype]['proxy_prefix'] = None
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE), json.dumps(metadata_catalog))
+
+       response = self.client.get(url, {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code)
+
+    @mock.patch.object(VimDriverUtils, 'get_vim_info')
+    @mock.patch.object(VimDriverUtils, 'get_session')
+    @mock.patch.object(VimDriverUtils, 'get_auth_state')
+    @mock.patch.object(VimDriverUtils, 'update_token_cache')
+    @mock.patch.object(VimDriverUtils, 'get_token_cache')
+    def test_crud_resources(self, mock_get_token_cache, mock_update_token_cache, mock_get_auth_state, mock_get_session, mock_get_vim_info):
+       '''
+       Test service proxy API: GET
+
+       :param mock_get_token_cache:
+       :param mock_update_token_cache:
+       :param mock_get_auth_state:
+       :param mock_get_session:
+       :param mock_get_vim_info:
+       :return:
+       '''
+
+       #mock VimDriverUtils APIs
+       mock_session_specs = ["get", "post", "put", "patch", "delete"]
+
+       mock_get_servers_response_obj = mock.Mock(spec=MockResponse)
+       mock_get_servers_response_obj.status_code=200
+       mock_get_servers_response_obj.content = MOCK_GET_SERVERS_RESPONSE
+       mock_get_servers_response_obj.json.return_value=MOCK_GET_SERVERS_RESPONSE
+
+       mock_post_server_response_obj = mock.Mock(spec=MockResponse)
+       mock_post_server_response_obj.status_code=202
+       mock_post_server_response_obj.content = MOCK_POST_SERVER_RESPONSE
+       mock_post_server_response_obj.json.return_value=MOCK_POST_SERVER_RESPONSE
+
+       mock_patch_server_response_obj = mock.Mock(spec=MockResponse)
+       mock_patch_server_response_obj.status_code=202
+       mock_patch_server_response_obj.content = MOCK_PATCH_IMAGE_REQUEST
+       mock_patch_server_response_obj.json.return_value=MOCK_PATCH_IMAGE_REQUEST
+
+       mock_delete_server_response_obj = mock.Mock(spec=MockResponse)
+       mock_delete_server_response_obj.status_code=204
+
+       mock_session = mock.Mock(name='mock_session', spec=mock_session_specs)
+       mock_session.get.return_value = mock_get_servers_response_obj
+       mock_session.post.return_value = mock_post_server_response_obj
+       mock_session.patch.return_value = mock_patch_server_response_obj
+       mock_session.delete.return_value = mock_delete_server_response_obj
+
+       mock_get_vim_info.return_value = MOCK_VIM_INFO
+       mock_get_session.return_value = mock_session
+       mock_get_auth_state.return_value = json.dumps(MOCK_AUTH_STATE)
+       mock_update_token_cache.return_value = MOCK_TOKEN_ID
+       mock_get_token_cache.return_value = (json.dumps(MOCK_AUTH_STATE),json.dumps(MOCK_INTERNAL_METADATA_CATALOG))
+
+       # Create resource
+       response = self.client.post(
+           "/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+           MOCK_POST_SERVER_REQUEST, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+
+       self.assertEquals(status.HTTP_202_ACCEPTED, response.status_code)
+       context = response.json()
+       self.assertEquals(MOCK_TOKEN_ID, response['X-Subject-Token'])
+       self.assertIsNotNone(context['server'])
+
+       # Retrieve resource
+       response = self.client.get(
+           "/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+           {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_200_OK, response.status_code)
+       context = response.json()
+
+       self.assertEquals(MOCK_TOKEN_ID, response['X-Subject-Token'])
+       self.assertIsNotNone(context['servers'])
+
+       # Update resource
+       response = self.client.get(
+           "/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers",
+           {}, HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+       self.assertEquals(status.HTTP_200_OK, response.status_code)
+       context = response.json()
+
+       self.assertEquals(MOCK_TOKEN_ID, response['X-Subject-Token'])
+       self.assertIsNotNone(context['servers'])
+
+       #simulate client to make the request
+       response = self.client.delete(
+           "/api/multicloud-titanium_cloud/v0/windriver-hudson-dc_RegionOne/compute/v2.1/fcca3cc49d5e42caae15459e27103efc/servers/324dfb7d-f4a9-419a-9a19-237df04b443b",
+           HTTP_X_AUTH_TOKEN=MOCK_TOKEN_ID)
+
+       self.assertEquals(status.HTTP_204_NO_CONTENT, response.status_code)
+       self.assertEquals(MOCK_TOKEN_ID, response['X-Subject-Token'])