diff options
-rw-r--r-- | pom.xml | 64 | ||||
-rw-r--r-- | version.properties | 28 | ||||
-rwxr-xr-x | vio/docker/docker-entrypoint.sh | 6 | ||||
-rwxr-xr-x | vio/docker/instance-run.sh | 2 | ||||
-rw-r--r-- | vio/pom.xml | 2 | ||||
-rw-r--r-- | vio/requirements.txt | 1 | ||||
-rw-r--r-- | vio/setup.py | 18 | ||||
-rw-r--r-- | vio/tox.ini | 15 | ||||
-rw-r--r-- | vio/version.properties | 2 | ||||
-rw-r--r-- | vio/vio/pub/config/config.py | 2 | ||||
-rw-r--r-- | vio/vio/pub/msapi/extsys.py | 7 | ||||
-rw-r--r-- | vio/vio/settings-cover.py | 20 | ||||
-rw-r--r-- | vio/vio/swagger/urls.py | 56 | ||||
-rw-r--r-- | vio/vio/tests/__init__.py | 10 | ||||
-rw-r--r-- | vio/vio/tests/test_flavor_view.py | 160 | ||||
-rw-r--r-- | vio/vio/tests/test_limits_view.py | 68 | ||||
-rw-r--r-- | vio/vio/tests/test_network_view.py | 145 | ||||
-rw-r--r-- | vio/vio/tests/test_operate.py | 75 | ||||
-rw-r--r-- | vio/vio/tests/test_port_view.py | 164 | ||||
-rw-r--r-- | vio/vio/tests/test_server_view.py | 162 | ||||
-rw-r--r-- | vio/vio/tests/test_subnet_view.py | 170 | ||||
-rw-r--r-- | vio/vio/tests/test_tenant_view.py | 67 | ||||
-rw-r--r-- | vio/vio/tests/tests_registry_view.py | 115 |
23 files changed, 1267 insertions, 92 deletions
@@ -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)) |