summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pom.xml64
-rw-r--r--version.properties28
-rwxr-xr-xvio/docker/docker-entrypoint.sh6
-rwxr-xr-xvio/docker/instance-run.sh2
-rw-r--r--vio/pom.xml2
-rw-r--r--vio/requirements.txt1
-rw-r--r--vio/setup.py18
-rw-r--r--vio/tox.ini15
-rw-r--r--vio/version.properties2
-rw-r--r--vio/vio/pub/config/config.py2
-rw-r--r--vio/vio/pub/msapi/extsys.py7
-rw-r--r--vio/vio/settings-cover.py20
-rw-r--r--vio/vio/swagger/urls.py56
-rw-r--r--vio/vio/tests/__init__.py10
-rw-r--r--vio/vio/tests/test_flavor_view.py160
-rw-r--r--vio/vio/tests/test_limits_view.py68
-rw-r--r--vio/vio/tests/test_network_view.py145
-rw-r--r--vio/vio/tests/test_operate.py75
-rw-r--r--vio/vio/tests/test_port_view.py164
-rw-r--r--vio/vio/tests/test_server_view.py162
-rw-r--r--vio/vio/tests/test_subnet_view.py170
-rw-r--r--vio/vio/tests/test_tenant_view.py67
-rw-r--r--vio/vio/tests/tests_registry_view.py115
23 files changed, 1267 insertions, 92 deletions
diff --git a/pom.xml b/pom.xml
index 263afcf..0eb2260 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,70 +1,30 @@
<?xml version="1.0"?>
<!--
- Copyright (c) 2017 VMware, Inc.
+ Copyright 2017 VMware 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:
+ 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
+ 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.
+ 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<parent>
<groupId>org.onap.oparent</groupId>
<artifactId>oparent</artifactId>
<version>1.0.0-SNAPSHOT</version>
- <relativePath>../oparent</relativePath>
</parent>
-
<modelVersion>4.0.0</modelVersion>
<groupId>org.onap.multicloud.openstack.vmware</groupId>
<artifactId>multicloud-vio</artifactId>
<version>1.0.0-SNAPSHOT</version>
- <name>multicloud-openstack-vmware</name>
<packaging>pom</packaging>
-
- <modules>
- <module>vio</module>
- </modules>
-
- <build>
- <plugins>
- <plugin>
- <groupId>com.mycila</groupId>
- <artifactId>license-maven-plugin</artifactId>
- <version>2.3</version>
- <configuration>
- <includes>
- <include>**\*.java</include>
- </includes>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-release-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.3</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-deploy-plugin</artifactId>
- <version>2.7</version>
- <configuration>
- <retryFailedDeploymentCount>2</retryFailedDeploymentCount>
- </configuration>
- </plugin>
- </plugins>
- </build>
+ <name>multicloud-opentack-vmware</name>
+ <description>multicloud vio</description>
</project>
diff --git a/version.properties b/version.properties
new file mode 100644
index 0000000..639c1f7
--- /dev/null
+++ b/version.properties
@@ -0,0 +1,28 @@
+#!/bin/bash
+# Copyright (c) 2017 VMware, 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.
+
+# Versioning variables
+# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
+# because they are used in Jenkins, whose plug-in doesn't support
+
+major=1
+minor=1
+patch=0
+
+base_version=${major}.${minor}.${patch}
+
+# Release must be completed with git revision # in Jenkins
+release_version=${base_version}
+snapshot_version=${base_version}-SNAPSHOT
diff --git a/vio/docker/docker-entrypoint.sh b/vio/docker/docker-entrypoint.sh
index 6c9d3e3..632c558 100755
--- a/vio/docker/docker-entrypoint.sh
+++ b/vio/docker/docker-entrypoint.sh
@@ -15,12 +15,6 @@ fi
echo "MSB_ADDR=$MSB_ADDR"
echo
-# Wait for MSB initialization
-echo Wait for MSB initialization
-for i in {1..20}; do
- curl -sS -m 1 $MSB_ADDR > /dev/null && break
- sleep $i
-done
echo
diff --git a/vio/docker/instance-run.sh b/vio/docker/instance-run.sh
index 2393c5d..d01cebb 100755
--- a/vio/docker/instance-run.sh
+++ b/vio/docker/instance-run.sh
@@ -1,7 +1,5 @@
#!/bin/bash -v
-redis-server &
-
cd ./vio
./run.sh
diff --git a/vio/pom.xml b/vio/pom.xml
index dd05ffe..0c60fac 100644
--- a/vio/pom.xml
+++ b/vio/pom.xml
@@ -26,7 +26,7 @@
<artifactId>multicloud-vio</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
- <name>multicloud/opentack/vmware</name>
+ <name>multicloud-opentack-vmware</name>
<description>multicloud vio</description>
<build>
<plugins>
diff --git a/vio/requirements.txt b/vio/requirements.txt
index ca74dbc..6cecedc 100644
--- a/vio/requirements.txt
+++ b/vio/requirements.txt
@@ -16,6 +16,7 @@ httplib2==0.9.2
openstacksdk==0.9.14
# for unit test
+django-nose>=1.4.0
coverage==4.2
mock==2.0.0
unittest_xml_reporting==1.12.0
diff --git a/vio/setup.py b/vio/setup.py
new file mode 100644
index 0000000..324e5ad
--- /dev/null
+++ b/vio/setup.py
@@ -0,0 +1,18 @@
+# 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.
+
+import setuptools
+
+setuptools.setup(
+ name="vio",
+ version="1.0",
+ packages=setuptools.find_packages(),
+ include_package_data=True,
+ zip_safe=True
+)
diff --git a/vio/tox.ini b/vio/tox.ini
index bf5d800..966b7bb 100644
--- a/vio/tox.ini
+++ b/vio/tox.ini
@@ -7,8 +7,21 @@ downloadcache = ~/cache/pip
[testenv]
deps = -r{toxinidir}/requirements.txt
-commands = coverage run --branch manage.py test vio
+commands =
+ /usr/bin/find . -type f -name "*.py[c|o]" -delete
+ python manage.py test vio
[testenv:pep8]
deps=flake8
commands=flake8
+
+[testenv:py27]
+commands =
+ {[testenv]commands}
+
+[testenv:cover]
+setenv=
+ DJANGO_SETTINGS_MODULE = vio.settings-cover
+commands =
+ coverage erase
+ {[testenv]commands}
diff --git a/vio/version.properties b/vio/version.properties
index 5128787..7f86aa1 100644
--- a/vio/version.properties
+++ b/vio/version.properties
@@ -3,7 +3,7 @@
# because they are used in Jenkins, whose plug-in doesn't support
major=1
-minor=0
+minor=1
patch=0
base_version=${major}.${minor}.${patch}
diff --git a/vio/vio/pub/config/config.py b/vio/vio/pub/config/config.py
index 1231dd0..c24bd97 100644
--- a/vio/vio/pub/config/config.py
+++ b/vio/vio/pub/config/config.py
@@ -45,7 +45,7 @@ REG_TO_MSB_WHEN_START = False
REG_TO_MSB_REG_URL = "/api/microservices/v1/services"
REG_TO_MSB_REG_PARAM = {
"serviceName": "multicloud-vio",
- "version": "v1",
+ "version": "v0",
"url": "/api/multicloud-vio/v0",
"protocol": "REST",
"visualRange": "1",
diff --git a/vio/vio/pub/msapi/extsys.py b/vio/vio/pub/msapi/extsys.py
index 5584a3f..b3ed044 100644
--- a/vio/vio/pub/msapi/extsys.py
+++ b/vio/vio/pub/msapi/extsys.py
@@ -31,6 +31,7 @@ def get_vim_by_id(vim_id):
ret['type'] = ret['cloud-type']
ret['version'] = ret['cloud-region-version']
ret['vimId'] = vim_id
+ ret['name'] = vim_id
ret['userName'] = ret['esr-system-info-list'][
'esr-system-info'][0]['username']
ret['password'] = ret['esr-system-info-list'][
@@ -39,4 +40,10 @@ def get_vim_by_id(vim_id):
'esr-system-info'][0]['default-tenant']
ret['url'] = ret['esr-system-info-list'][
'esr-system-info'][0]['service-url']
+ ret['domain'] = ret['esr-system-info-list'][
+ 'esr-system-info'][0]['cloud-domain']
+ ret['cacert'] = ret['esr-system-info-list'][
+ 'esr-system-info'][0]['ssl-cacert']
+ ret['insecure'] = ret['esr-system-info-list'][
+ 'esr-system-info'][0]['ssl-insecure']
return ret
diff --git a/vio/vio/settings-cover.py b/vio/vio/settings-cover.py
new file mode 100644
index 0000000..781e0b3
--- /dev/null
+++ b/vio/vio/settings-cover.py
@@ -0,0 +1,20 @@
+# 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.
+
+from vio.settings import * # noqa
+from vio.settings import INSTALLED_APPS
+
+INSTALLED_APPS.append('django_nose')
+
+TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
+
+NOSE_ARGS = [
+ '--with-coverage',
+ '--cover-package=vio',
+]
diff --git a/vio/vio/swagger/urls.py b/vio/vio/swagger/urls.py
index bbcc6e0..2a6eb48 100644
--- a/vio/vio/swagger/urls.py
+++ b/vio/vio/swagger/urls.py
@@ -81,25 +81,25 @@ urlpatterns = [
url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z_-]+)/'
r'(?P<tenantid>[0-9a-zA-Z]+)/hosts/(?P<hostname>[0-9a-zA-Z_-]+)$',
HostView.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)\
- /(?P<tenantid>[0-9a-zA-Z\-\_]+)/networks$',
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)/'
+ r'(?P<tenantid>[0-9a-zA-Z\-\_]+)/networks$',
CreateNetworkView.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)\
- /(?P<tenantid>[0-9a-zA-Z\-\_]+)/networks/'
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)/'
+ r'(?P<tenantid>[0-9a-zA-Z\-\_]+)/networks/'
r'(?P<networkid>[0-9a-zA-Z\-\_]+)$',
DeleteNetworkView.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)\
- /(?P<tenantid>[0-9a-zA-Z\-\_]+)/subnets$',
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)/'
+ r'(?P<tenantid>[0-9a-zA-Z\-\_]+)/subnets$',
CreateSubnetView.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)\
- /(?P<tenantid>[0-9a-zA-Z\-\_]+)/subnets/'
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)/'
+ r'(?P<tenantid>[0-9a-zA-Z\-\_]+)/subnets/'
r'(?P<subnetid>[0-9a-zA-Z\-\_]+)$',
DeleteSubnetView.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)\
- /(?P<tenantid>[0-9a-zA-Z\-\_]+)/ports$',
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)/'
+ r'(?P<tenantid>[0-9a-zA-Z\-\_]+)/ports$',
CreatePortView.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)\
- /(?P<tenantid>[0-9a-zA-Z\-\_]+)/ports/'
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-zA-Z\-\_]+)/'
+ r'(?P<tenantid>[0-9a-zA-Z\-\_]+)/ports/'
r'(?P<portid>[0-9a-zA-Z\-\_]+)$',
DeletePortView.as_view()),
@@ -115,44 +115,44 @@ urlpatterns = [
url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/identity$',
IdentityServer.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)\
- /identity/(?P<other>(.*))$',
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/'
+ r'identity/(?P<other>(.*))$',
IdentityServer.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)\
- /glance/(?P<other>(.*))$',
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/'
+ r'glance/(?P<other>(.*))$',
ImageServer.as_view()),
url(
- r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)\
- /cinder/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
+ r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/'
+ r'cinder/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
VolumeServer.as_view()),
url(
- r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)\
- /cinderv2/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
+ r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/'
+ r'cinderv2/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
VolumeServer.as_view()),
url(
- r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)\
- /cinderv3/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
+ r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/'
+ r'cinderv3/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
VolumeServer.as_view()),
url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/neutron$',
NetWorkServer.as_view()),
- url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)\
- /neutron/(?P<other>(.*))$',
+ url(r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/'
+ r'neutron/(?P<other>(.*))$',
NetWorkServer.as_view()),
url(
- r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)\
- /heat/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
+ r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/'
+ r'heat/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
HeatServer.as_view()),
url(
- r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)\
- /nova/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
+ r'^api/multicloud-vio/v0/(?P<vimid>[0-9a-z-A-Z\-\_]+)/'
+ r'nova/(?P<tenantid>[0-9a-z-A-Z\-\_]+)/(?P<other>(.*))$',
ComputeServer.as_view()),
# Extensions
diff --git a/vio/vio/tests/__init__.py b/vio/vio/tests/__init__.py
new file mode 100644
index 0000000..802f3fb
--- /dev/null
+++ b/vio/vio/tests/__init__.py
@@ -0,0 +1,10 @@
+# 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.
diff --git a/vio/vio/tests/test_flavor_view.py b/vio/vio/tests/test_flavor_view.py
new file mode 100644
index 0000000..a344359
--- /dev/null
+++ b/vio/vio/tests/test_flavor_view.py
@@ -0,0 +1,160 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+import json
+import mock
+from rest_framework import status
+from vio.swagger.views.flavor.views import FlavorsView, FlavorView
+
+from vio.pub.msapi import extsys
+from vio.pub.vim.vimapi.nova.OperateFlavors import OperateFlavors
+from vio.swagger import nova_utils
+
+VIM_INFO = {'vimId': 1, 'name': 'name1', 'userName': 'user1',
+ 'password': '1234', 'url': 'abc', 'tenant': 't1'}
+
+
+class FlavorViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.fsv = FlavorsView()
+ self.fv = FlavorView()
+
+ def tearDown(self):
+ pass
+
+ @mock.patch.object(nova_utils, 'flavor_formatter')
+ @mock.patch.object(OperateFlavors, 'find_flavor')
+ @mock.patch.object(OperateFlavors, 'get_flavor')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_flavor_list_view_fail(self, mock_vim_info, mock_get_flavor,
+ mock_find_flavor, mock_formatter):
+
+ mock_vim_info.return_value = VIM_INFO
+
+ class Request:
+ def __init__(self, query_params, body, method):
+ self.query_params = query_params
+ self.body = body
+ self.method = method
+ req = Request({'k': 'v'},
+ json.dumps({'name': 'flavor-name', 'flavor_id': 1}),
+ "POST")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.fsv.post(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(nova_utils, 'flavor_formatter')
+ @mock.patch.object(OperateFlavors, 'get_flavor')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_flavor_get_fail(self, mock_vim_info,
+ mock_get_flavor, mock_formatter):
+ mock_vim_info.return_value = VIM_INFO
+
+ mock_formatter.return_value = {"id": 1, "name": "nova"}
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.fv.get(req, "vimid", "tenantid", "flavorid").status_code)
+
+ @mock.patch.object(nova_utils, 'flavor_formatter')
+ @mock.patch.object(OperateFlavors, 'list_flavors')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_flavors_get_fail(self, mock_vim_info,
+ mock_flavors, mock_formatter):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Flavor:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ f1 = Flavor(1, "f1")
+ f2 = Flavor(2, "f2")
+ flavors = [f1, f2]
+ mock_flavors.return_value = flavors
+ mock_formatter.return_value = flavors
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.fsv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(nova_utils, 'flavor_formatter')
+ @mock.patch.object(OperateFlavors, 'get_flavor')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_flavor_get(self, mock_vim_info, mock_flavors, mock_formatter):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Flavor:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ f1 = Flavor(1, "f1")
+ f2 = Flavor(2, "f2")
+ flavors = [f1, f2]
+ mock_flavors.return_value = flavors
+ mock_formatter.return_value = {"id": 1, "name": "nova"}
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.fv.get(req, "vimid", "tenantid", "flavorid").status_code)
+
+ @mock.patch.object(OperateFlavors, 'delete_flavor')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_flavor_delete_view(self, mock_vim_info, mock_delete_flavor):
+
+ mock_vim_info.return_value = VIM_INFO
+
+ class Flavor:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ f = Flavor(1, "f1")
+
+ mock_delete_flavor.return_value = f
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "DELETE")
+ self.assertEqual(
+ status.HTTP_204_NO_CONTENT,
+ self.fv.delete(req, "vimid", "tenantid", "flavorid").status_code)
+
+ @mock.patch.object(OperateFlavors, 'delete_flavor')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_flavor_delete_view_fail(self, mock_vim_info, mock_delete_flavor):
+
+ mock_vim_info.return_value = VIM_INFO
+ mock_delete_flavor.side_effect = TypeError("wrong type")
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "DELETE")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.fv.delete(req, "vimid", "tenantid", "flavorid").status_code)
diff --git a/vio/vio/tests/test_limits_view.py b/vio/vio/tests/test_limits_view.py
new file mode 100644
index 0000000..6bfb67e
--- /dev/null
+++ b/vio/vio/tests/test_limits_view.py
@@ -0,0 +1,68 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+# import json
+import mock
+from rest_framework import status
+from vio.swagger.views.limits.views import LimitsView
+
+
+from vio.pub.msapi import extsys
+from vio.swagger import nova_utils
+from vio.pub.vim.vimapi.nova.OperateLimits import OperateLimits
+
+VIM_INFO = {'vimId': 1, 'name': 'name1', 'userName': 'user1',
+ 'password': '1234', 'url': 'abc', 'tenant': 't1'}
+
+
+class LimitsViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.lv = LimitsView()
+
+ def tearDown(self):
+ pass
+
+ @mock.patch.object(nova_utils, 'server_limits_formatter')
+ @mock.patch.object(OperateLimits, 'get_limits')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_server_get_limit(self, mock_vim_info,
+ mock_limits, mock_formatter):
+ mock_vim_info.return_value = VIM_INFO
+ mock_limits.return_value = {"name": "name1", "project_id": 1}
+ mock_formatter.return_value = {"name": "name1", "project_id": 1}
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.lv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(nova_utils, 'server_limits_formatter')
+ @mock.patch.object(OperateLimits, 'get_limits')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_server_get_limit_fail(self, mock_vim_info,
+ mock_limits, mock_formatter):
+ mock_vim_info.return_value = VIM_INFO
+ mock_limits.side_effect = KeyError('wrong type')
+ mock_formatter.return_value = {"name": "name1", "project_id": 1}
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.lv.get(req, "vimid", "tenantid").status_code)
diff --git a/vio/vio/tests/test_network_view.py b/vio/vio/tests/test_network_view.py
new file mode 100644
index 0000000..f3d191b
--- /dev/null
+++ b/vio/vio/tests/test_network_view.py
@@ -0,0 +1,145 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+import json
+import mock
+from rest_framework import status
+from vio.swagger.views.network.views import CreateNetworkView
+from vio.swagger.views.network.views import DeleteNetworkView
+
+from vio.pub.utils import syscomm
+from vio.pub.vim.vimapi.network.OperateNetwork import OperateNetwork
+
+
+class NetworkViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.cnv = CreateNetworkView()
+ self.dnv = DeleteNetworkView()
+
+ def tearDown(self):
+ pass
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperateNetwork, 'list_networks')
+ def test_network_lists_view(self, mock_list_networks, mock_fun_name):
+ mock_list_networks.return_value = {'networks': [
+ {"vimName": "name1", "vimId": 1},
+ {"vimName": "name2", "vimId": 2}]}
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.cnv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_network_lists_view_fail(self, mock_fun_name):
+ on = OperateNetwork()
+ on.list_networks = mock.Mock([])
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.cnv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperateNetwork, 'list_network')
+ def test_network_list_view_fail(self, mock_list_network, mock_fun_name):
+
+ mock_fun_name.return_value = "fun_name"
+ mock_list_network.return_value = \
+ {"vimName": "name", "vimId": 1, "returnCode": 0}
+
+ class Request:
+ def __init__(self, query_params, body, method):
+ self.query_params = query_params
+ self.body = body
+ self.method = method
+ req = Request({'k': 'v'},
+ json.dumps([{'name': 'net-name', 'id': 1}]),
+ "POST")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.cnv.post(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperateNetwork, 'list_network')
+ def test_network_list_view(self, mock_list_network, mock_fun_name):
+ mock_list_network.return_value = {'networks': [
+ {"vimName": "name1", "vimId": 1},
+ {"vimName": "name2", "vimId": 2}]}
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.dnv.get(req, "vimid", "tenantid", "networkid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_network_list_view_fail2(self, mock_fun_name):
+ on = OperateNetwork()
+ on.list_network = mock.Mock([])
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.dnv.get(req, "vimid", "tenantid", "networkid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperateNetwork, 'delete_network')
+ def test_delete_network(self, mock_delete_network, mock_fun_name):
+ mock_delete_network.return_value = {"name": "name1", "id": 1}
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "DELETE")
+ self.assertEqual(
+ status.HTTP_204_NO_CONTENT,
+ self.dnv.delete(req, "vimid", "tenantid", "networkid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_delete_network_fail(self, mock_fun_name):
+ op = OperateNetwork()
+ op.delete_network = mock.Mock()
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "DELETE")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.dnv.delete(req, "vimid", "tenantid", "networkid").status_code)
diff --git a/vio/vio/tests/test_operate.py b/vio/vio/tests/test_operate.py
new file mode 100644
index 0000000..ac50bfe
--- /dev/null
+++ b/vio/vio/tests/test_operate.py
@@ -0,0 +1,75 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+from vio.pub.vim.vimapi.network.OperateSubnet import OperateSubnet
+from vio.pub.vim.vimapi.network.OperateNetwork import OperateNetwork
+from vio.pub.vim.vimapi.network.OperatePort import OperatePort
+
+
+class OperateTest(unittest.TestCase):
+
+ def tearDown(self):
+ pass
+
+ def test_operatenetwork(self):
+
+ class Network:
+ def __init__(self, status):
+ self.status = status
+ network = Network("ok")
+ network.id = 1
+ network.name = "name1"
+ network.project_id = 2
+ network.provider_segmentation_id = 3
+ network.provider_network_type = 4
+ network.provider_physical_network = 5
+ network.is_shared = 6
+ network.is_router_external = 7
+ op = OperateNetwork()
+ self.assertDictContainsSubset({"status": "ok"}, op._convert(network))
+
+ def test_operatesubnet(self):
+ class Subnet:
+ def __init__(self, status):
+ self.status = status
+ subnet = Subnet("ok")
+ subnet.id = 1
+ subnet.network_id = 2
+ subnet.name = "name1"
+ subnet.allocation_pools = "pool1"
+ subnet.gateway_ip = "0.0.0.0"
+ subnet.dns_nameservers = "server1"
+ subnet.ip_version = "1.0"
+ subnet.is_dhcp_enabled = "true"
+ subnet.host_routes = 1
+ subnet.cidr = 1
+
+ os = OperateSubnet()
+ self.assertDictContainsSubset({"status": "ok"}, os._convert(subnet))
+
+ def test_operateport(self):
+ class Port:
+ def __init__(self, status):
+ self.status = status
+ port = Port("ok")
+ port.id = 1
+ port.network_id = 1
+ port.name = "name"
+ port.binding_vnic_type = 1
+ port.mac_address = "aa:aa:aa:aa:aa:aa"
+ port.subnet_id = 2
+ port.security_group_ids = 1
+ port.fixed_ips = [{"subnet_id": 1}]
+
+ op = OperatePort()
+ self.assertDictContainsSubset({"status": "ok"}, op._convert(port))
diff --git a/vio/vio/tests/test_port_view.py b/vio/vio/tests/test_port_view.py
new file mode 100644
index 0000000..b8d433d
--- /dev/null
+++ b/vio/vio/tests/test_port_view.py
@@ -0,0 +1,164 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+import json
+import mock
+from rest_framework import status
+from vio.swagger.views.port.views import CreatePortView, DeletePortView
+
+
+from vio.pub.utils import syscomm
+from vio.pub.vim.vimapi.network.OperatePort import OperatePort
+
+
+class PortViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.cpv = CreatePortView()
+ self.dpv = DeletePortView()
+
+ def tearDown(self):
+ pass
+
+ @mock.patch.object(OperatePort, 'list_port')
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_port_list_view(self, mock_list_port, mock_fun_name):
+
+ # mock_fun_name.return_value = "fun_name"
+ mock_list_port.return_value = {'vimName': 'name1', 'vimId': 1}
+
+ class Request:
+ def __init__(self, query_params, body, method):
+ self.query_params = query_params
+ self.body = body
+ self.method = method
+ req = Request({'k': 'v'},
+ json.dumps(
+ {"subnetId": 1, "networkId": 2, "name": "name1"}),
+ "POST")
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.cpv.post(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_port_list_view_fail(self, mock_fun_name):
+ mock_fun_name.return_value = "fun_name"
+ op = OperatePort()
+ op.list_port = mock.Mock({})
+
+ class Request:
+ def __init__(self, query_params, body, method):
+ self.query_params = query_params
+ self.body = body
+ self.method = method
+ req = Request({'k': 'v'},
+ json.dumps(
+ {"subnetId": 1, "networkId": 2, "name": "name1"}),
+ "POST")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.cpv.post(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperatePort, 'list_ports')
+ def test_port_lists_view(self, mock_list_ports, mock_fun_name):
+ mock_list_ports.return_value = {'ports': [
+ {"vimName": "a", "vimId": 1},
+ {"vimName": "b", "vimId": 2}]}
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.cpv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_port_lists_view_fail(self, mock_fun_name):
+ op = OperatePort()
+ op.list_port = mock.Mock([])
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.cpv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperatePort, 'list_port')
+ def test_port_list_view2(self, mock_list_port, mock_fun_name):
+ mock_list_port.return_value = {"vimName": "a", "vimId": 1},\
+ {"vimName": "b", "vimId": 2}
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.dpv.get(req, "vimid", "tenantid", "portid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_port_list_view_fail2(self, mock_fun_name):
+ on = OperatePort()
+ on.list_port = mock.Mock([])
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.dpv.get(req, "vimid", "tenantid", "portid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperatePort, 'delete_port')
+ def test_delete_port(self, mock_delete_port, mock_fun_name):
+ mock_delete_port.return_value.return_value = {"name": "name1",
+ "id": 1}
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "DELETE")
+ self.assertEqual(
+ status.HTTP_204_NO_CONTENT,
+ self.dpv.delete(req, "vimid", "tenantid", "portid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_delete_port_fail(self, mock_fun_name):
+ op = OperatePort()
+ op.delete_port = mock.Mock()
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "DELETE")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.dpv.delete(req, "vimid", "tenantid", "portid").status_code)
diff --git a/vio/vio/tests/test_server_view.py b/vio/vio/tests/test_server_view.py
new file mode 100644
index 0000000..f70fc80
--- /dev/null
+++ b/vio/vio/tests/test_server_view.py
@@ -0,0 +1,162 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+import json
+import mock
+from rest_framework import status
+from vio.swagger.views.server.views import ListServersView, GetServerView
+
+
+from vio.pub.msapi import extsys
+from vio.swagger import nova_utils
+from vio.pub.vim.vimapi.nova.OperateServers import OperateServers
+
+VIM_INFO = {'vimId': 1, 'name': 'name1', 'userName': 'user1',
+ 'password': '1234', 'url': 'abc', 'tenant': 't1'}
+
+
+class ServerViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.lsv = ListServersView()
+ self.gsv = GetServerView()
+
+ def tearDown(self):
+ pass
+
+ @mock.patch.object(nova_utils, 'server_formatter')
+ @mock.patch.object(OperateServers, 'list_server_interfaces')
+ @mock.patch.object(OperateServers, 'list_servers')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_server_get(self, mock_vim_info, mock_servers,
+ mock_interfaces, mock_formatter):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Server:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ s1 = Server(1, "s1")
+ s2 = Server(2, "s2")
+ servers = [s1, s2]
+ mock_servers.return_value = servers
+ mock_interfaces.return_value = servers
+ mock_formatter.return_value = servers
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.lsv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(nova_utils, 'server_formatter')
+ @mock.patch.object(OperateServers, 'list_server_interfaces')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_server_get_fail(self, mock_vim_info,
+ mock_interfaces, mock_formatter):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Server:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ s1 = Server(1, "s1")
+ s2 = Server(2, "s2")
+ servers = [s1, s2]
+ os = OperateServers()
+ os.list_servers = mock.Mock(return_value=[])
+ mock_interfaces.return_value = servers
+ mock_formatter.return_value = servers
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.lsv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(OperateServers, 'get_server')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_server_get_view_fail(self, mock_vim_info, mock_servers):
+ mock_vim_info.return_value = VIM_INFO
+
+ mock_servers.side_effect = TypeError('wrong type')
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.gsv.get(req, "vimid", "tenant", "serverid").status_code)
+
+ @mock.patch.object(OperateServers, 'delete_server')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_delete_server_view(self, mock_vim_info, mock_delete_server):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Project:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ p1 = Project(1, "p1")
+ mock_delete_server.return_value = p1
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_204_NO_CONTENT,
+ self.gsv.delete(req, "vimid", "tenantid", "serverid").status_code)
+
+ @mock.patch.object(OperateServers, 'delete_server')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_delete_server_view_fail(self, mock_vim_info, mock_delete_server):
+ mock_vim_info.return_value = VIM_INFO
+ mock_delete_server.side_effect = TypeError("wrong type")
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.gsv.delete(req, "vimid", "tenantid", "serverid").status_code)
+
+ @mock.patch.object(nova_utils, 'server_formatter')
+ @mock.patch.object(OperateServers, 'find_server')
+ @mock.patch.object(OperateServers, 'get_server')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_server_post_fail(self, mock_vim_info, mock_get_servers,
+ mock_find_servers, mock_formatter):
+ mock_vim_info.return_value = VIM_INFO
+ mock_find_servers.return_value = {"id": 1, "name": "name1"}
+ mock_get_servers.return_value = {"id": 1, "name": "name1"}
+ mock_formatter.return_value = {"id": 1, "name": "name1"}
+
+ class Request:
+ def __init__(self, query_params, body, method):
+ self.query_params = query_params
+ self.body = body
+ self.method = method
+ req = Request({'k': 'v'},
+ json.dumps({"name": "abc", "networkId": 3,
+ "cidr": 2, "ipVersion": 1}),
+ "POST")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.lsv.post(req, "vimid", "tenantid").status_code)
diff --git a/vio/vio/tests/test_subnet_view.py b/vio/vio/tests/test_subnet_view.py
new file mode 100644
index 0000000..772bf53
--- /dev/null
+++ b/vio/vio/tests/test_subnet_view.py
@@ -0,0 +1,170 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+import json
+import mock
+from rest_framework import status
+from vio.swagger.views.subnet.views import CreateSubnetView, DeleteSubnetView
+
+
+from vio.pub.utils import syscomm
+from vio.pub.vim.vimapi.network.OperateSubnet import OperateSubnet
+
+
+class SubnetViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.csv = CreateSubnetView()
+ self.dsv = DeleteSubnetView()
+
+ def tearDown(self):
+ pass
+
+ @mock.patch.object(OperateSubnet, 'list_subnet')
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_subnet_list_view(self, mock_list_port, mock_fun_name):
+
+ # mock_fun_name = "fun_name"
+ mock_list_port.return_value = {"vimName": "name", "vimId": 1,
+ "tenantId": 1}
+
+ class Request:
+ def __init__(self, query_params, body, method):
+ self.query_params = query_params
+ self.body = body
+ self.method = method
+ req = Request({'k': 'v'},
+ json.dumps({"name": "name1", "networkId": 3,
+ "cidr": 2, "ipVersion": 1}),
+ "POST")
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.csv.post(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperateSubnet, 'list_subnets')
+ def test_subnet_lists_view(self, mock_list_subnets, mock_fun_name):
+
+ class Subnet:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ s1 = Subnet(1, "s1")
+ s2 = Subnet(2, "s2")
+ subnets = [s1, s2]
+ mock_list_subnets.return_value = subnets
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.csv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_subnet_lists_view_fail(self, mock_fun_name):
+
+ os = OperateSubnet()
+ os.list_subnets = mock.Mock(return_value=[])
+
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.csv.get(req, "vimid", "tenantid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperateSubnet, 'list_subnet')
+ def test_subnet_get_view(self, mock_list_subnet, mock_fun_name):
+
+ class Subnet:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ s = Subnet(1, "s1")
+
+ mock_list_subnet.return_value = s
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.dsv.get(req, "vimId", "tenantid", "subnetid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_subnet_get_view_fail(self, mock_fun_name):
+
+ os = OperateSubnet()
+ os.list_subnet = mock.Mock(return_value=[])
+
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "GET")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.dsv.get(req, "vimid", "tenantid", "subnetid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ @mock.patch.object(OperateSubnet, 'delete_subnet')
+ def test_subnet_delete_view(self, mock_delete_subnet, mock_fun_name):
+
+ class Subnet:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ s = Subnet(1, "s1")
+
+ mock_delete_subnet.return_value = s
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "DELETE")
+ self.assertEqual(
+ status.HTTP_204_NO_CONTENT,
+ self.dsv.delete(req, "vimid", "tenantid", "subnetid").status_code)
+
+ @mock.patch.object(syscomm, 'fun_name')
+ def test_subnet_delete_view_fail(self, mock_fun_name):
+
+ os = OperateSubnet()
+ os.delete_subnet = mock.Mock(return_value=[])
+
+ mock_fun_name.return_value = "fun_name"
+
+ class Request:
+ def __init__(self, query_params, method):
+ self.query_params = query_params
+ self.method = method
+ req = Request({'k': 'v'}, "DELETE")
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.dsv.delete(req, "vimid", "tenantid", "subnetid").status_code)
diff --git a/vio/vio/tests/test_tenant_view.py b/vio/vio/tests/test_tenant_view.py
new file mode 100644
index 0000000..75df3ec
--- /dev/null
+++ b/vio/vio/tests/test_tenant_view.py
@@ -0,0 +1,67 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+import mock
+from rest_framework import status
+from vio.swagger.views.tenant.views import ListTenantsView
+
+
+from vio.pub.msapi import extsys
+from vio.pub.vim.vimapi.keystone.OperateTenant import OperateTenant
+
+VIM_INFO = {'vimId': 1, 'name': 'name1', 'userName': 'user1',
+ 'password': '1234', 'url': 'abc', 'tenant': 't1'}
+
+
+class TenantViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.lvt = ListTenantsView()
+
+ def tearDown(self):
+ pass
+
+ @mock.patch.object(OperateTenant, 'get_projects')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_tenant_view(self, mock_vim_info, mock_projects):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Project:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ p1 = Project(1, "p1")
+ p2 = Project(2, "p2")
+ projects = [p1, p2]
+ mock_projects.return_value = projects
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'query': 'param'})
+ self.assertEqual(
+ status.HTTP_200_OK, self.lvt.get(req, "vimid").status_code)
+
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_tenant_view_fail(self, mock_vim_info):
+ mock_vim_info.return_value = VIM_INFO
+ ot = OperateTenant()
+ ot.get_projects = mock.Mock(return_value=[])
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'query': 'param'})
+ self.assertEqual(
+ self.lvt.get(req, "vimid").status_code,
+ status.HTTP_500_INTERNAL_SERVER_ERROR)
diff --git a/vio/vio/tests/tests_registry_view.py b/vio/vio/tests/tests_registry_view.py
new file mode 100644
index 0000000..9013332
--- /dev/null
+++ b/vio/vio/tests/tests_registry_view.py
@@ -0,0 +1,115 @@
+# Copyright (c) 2017 VMware, 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.
+
+import unittest
+import mock
+from rest_framework import status
+from vio.swagger.views.registry.views import Registry
+
+
+from vio.pub.msapi import extsys
+from vio.pub.vim.vimapi.keystone.OperateTenant import OperateTenant
+from vio.pub.vim.vimapi.glance.OperateImage import OperateImage
+
+VIM_INFO = {'vimId': 1, 'name': 'name1', 'userName': 'user1',
+ 'password': '1234', 'url': 'abc', 'tenant': 't1'}
+
+
+class RegistryViewTest(unittest.TestCase):
+
+ def setUp(self):
+ self.reg = Registry()
+
+ def tearDown(self):
+ pass
+
+ @mock.patch.object(OperateTenant, 'get_projects')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_reg_delete_view(self, mock_vim_info, mock_projects):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Project:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+ p1 = Project(1, "p1")
+ p2 = Project(2, "p2")
+ projects = [p1, p2]
+ mock_projects.return_value = projects
+
+ class Request:
+ def __init__(self, query_params):
+ self.query_params = query_params
+ req = Request({'k': 'v'})
+ self.assertEqual(
+ status.HTTP_200_OK,
+ self.reg.delete(req, "vimid").status_code)
+
+ @mock.patch.object(OperateTenant, 'get_projects')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_reg_get_tenants_view(self, mock_vim_info, mock_projects):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Project:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+
+ def to_dict(self):
+ return {"name": self.name, "id": self.id}
+ p1 = Project(1, "p1")
+ p2 = Project(2, "p2")
+ projects = [p1, p2]
+ mock_projects.return_value = projects
+
+ self.assertEqual(
+ {'tenants': [{'id': 1, 'name': 'p1'}, {'id': 2, 'name': 'p2'}]},
+ self.reg._get_tenants("vimid"))
+
+ @mock.patch.object(OperateTenant, 'get_projects')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_reg_get_tenants_view_fail(self, mock_vim_info, mock_projects):
+ mock_vim_info.return_value = VIM_INFO
+
+ mock_projects.side_effect = TypeError("wrong type")
+
+ self.assertEqual(
+ status.HTTP_500_INTERNAL_SERVER_ERROR,
+ self.reg._get_tenants("vimid").status_code)
+
+ @mock.patch.object(OperateImage, 'get_vim_images')
+ @mock.patch.object(extsys, 'get_vim_by_id')
+ def test_reg_get_images_view(self, mock_vim_info, mock_images):
+ mock_vim_info.return_value = VIM_INFO
+
+ class Image:
+ def __init__(self, id, name):
+ self.id = id
+ self.name = name
+
+ def to_dict(self):
+ return {"name": self.name, "id": self.id}
+ i1 = Image(1, "i1")
+ i2 = Image(2, "i2")
+ images = [i1, i2]
+ mock_images.return_value = images
+
+ class Auth:
+ def __init__(self, id):
+ self.id = id
+
+ def get(self, username):
+ self.username = username
+ a = Auth(1)
+ self.assertEqual(
+ {'images': [{'id': 1, 'name': 'i1'}, {'id': 2, 'name': 'i2'}]},
+ self.reg._get_images(a))