349 lines
15 KiB
Python
349 lines
15 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import copy
|
|
|
|
import mock
|
|
from neutron.plugins.common import constants
|
|
from neutron.tests.unit.api.v2 import test_base
|
|
from neutron.tests.unit.extensions import base as test_extensions_base
|
|
from oslo_utils import uuidutils
|
|
from webob import exc
|
|
|
|
from gbpservice.neutron.extensions import servicechain
|
|
from gbpservice.neutron.tests.unit import common as cm
|
|
|
|
|
|
_uuid = uuidutils.generate_uuid
|
|
_get_path = test_base._get_path
|
|
SERVICE_CHAIN_PLUGIN_BASE_NAME = (
|
|
servicechain.ServiceChainPluginBase.__module__ + '.' +
|
|
servicechain.ServiceChainPluginBase.__name__)
|
|
SERVICECHAIN_URI = 'servicechain'
|
|
SERVICECHAIN_NODES_URI = SERVICECHAIN_URI + '/' + 'servicechain_nodes'
|
|
SERVICECHAIN_SPECS_URI = SERVICECHAIN_URI + '/' + 'servicechain_specs'
|
|
SERVICECHAIN_INSTANCES_URI = SERVICECHAIN_URI + '/' + 'servicechain_instances'
|
|
SERVICE_PROFILE_URI = SERVICECHAIN_URI + '/' + 'service_profiles'
|
|
|
|
|
|
class ServiceChainExtensionTestCase(test_extensions_base.ExtensionTestCase):
|
|
fmt = 'json'
|
|
|
|
def setUp(self):
|
|
super(ServiceChainExtensionTestCase, self).setUp()
|
|
plural_mappings = {}
|
|
self._setUpExtension(
|
|
SERVICE_CHAIN_PLUGIN_BASE_NAME, constants.SERVICECHAIN,
|
|
servicechain.RESOURCE_ATTRIBUTE_MAP, servicechain.Servicechain,
|
|
SERVICECHAIN_URI, plural_mappings=plural_mappings)
|
|
self.instance = self.plugin.return_value
|
|
|
|
def _test_create_servicechain_node(self, data, expected_value,
|
|
default_data=None):
|
|
if not default_data:
|
|
default_data = data
|
|
self.instance.create_servicechain_node.return_value = expected_value
|
|
res = self.api.post(_get_path(SERVICECHAIN_NODES_URI, fmt=self.fmt),
|
|
self.serialize(data),
|
|
content_type='application/%s' % self.fmt)
|
|
|
|
self.instance.create_servicechain_node.assert_called_once_with(
|
|
mock.ANY, servicechain_node=default_data)
|
|
|
|
self.assertEqual(exc.HTTPCreated.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_node', res)
|
|
self.assertEqual(expected_value, res['servicechain_node'])
|
|
|
|
def test_create_servicechain_node_with_defaults(self):
|
|
servicechain_node_id = _uuid()
|
|
data = {
|
|
'servicechain_node': {
|
|
'service_profile_id': _uuid(),
|
|
'tenant_id': _uuid(),
|
|
'config': 'test_config',
|
|
'service_type': None,
|
|
}
|
|
}
|
|
default_attrs = (
|
|
cm.get_create_servicechain_node_default_attrs_and_prj_id())
|
|
default_data = copy.copy(data)
|
|
default_data['servicechain_node'].update(default_attrs)
|
|
expected_value = dict(default_data['servicechain_node'])
|
|
expected_value['id'] = servicechain_node_id
|
|
|
|
self._test_create_servicechain_node(data, expected_value, default_data)
|
|
|
|
def test_create_servicechain_node(self):
|
|
servicechain_node_id = _uuid()
|
|
data = {
|
|
'servicechain_node': cm.get_create_servicechain_node_attrs()
|
|
}
|
|
expected_value = dict(data['servicechain_node'])
|
|
expected_value['id'] = servicechain_node_id
|
|
|
|
self._test_create_servicechain_node(data, expected_value)
|
|
|
|
def test_list_servicechain_nodes(self):
|
|
servicechain_node_id = _uuid()
|
|
expected_value = [{'tenant_id': _uuid(), 'id': servicechain_node_id}]
|
|
self.instance.get_servicechain_nodes.return_value = expected_value
|
|
|
|
res = self.api.get(_get_path(SERVICECHAIN_NODES_URI, fmt=self.fmt))
|
|
|
|
self.instance.get_servicechain_nodes.assert_called_once_with(
|
|
mock.ANY, fields=mock.ANY, filters=mock.ANY)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_nodes', res)
|
|
self.assertEqual(expected_value, res['servicechain_nodes'])
|
|
|
|
def test_get_servicechain_node(self):
|
|
servicechain_node_id = _uuid()
|
|
expected_value = {
|
|
'tenant_id': _uuid(), 'id': servicechain_node_id}
|
|
self.instance.get_servicechain_node.return_value = expected_value
|
|
|
|
res = self.api.get(_get_path(SERVICECHAIN_NODES_URI,
|
|
id=servicechain_node_id,
|
|
fmt=self.fmt))
|
|
|
|
self.instance.get_servicechain_node.assert_called_once_with(
|
|
mock.ANY, servicechain_node_id, fields=mock.ANY)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_node', res)
|
|
self.assertEqual(expected_value, res['servicechain_node'])
|
|
|
|
def test_update_servicechain_node(self):
|
|
servicechain_node_id = _uuid()
|
|
update_data = {
|
|
'servicechain_node': cm.get_update_servicechain_node_attrs()
|
|
}
|
|
expected_value = {'tenant_id': _uuid(), 'id': servicechain_node_id}
|
|
self.instance.update_servicechain_node.return_value = expected_value
|
|
|
|
res = self.api.put(_get_path(SERVICECHAIN_NODES_URI,
|
|
id=servicechain_node_id,
|
|
fmt=self.fmt),
|
|
self.serialize(update_data))
|
|
|
|
self.instance.update_servicechain_node.assert_called_once_with(
|
|
mock.ANY, servicechain_node_id, servicechain_node=update_data)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_node', res)
|
|
self.assertEqual(expected_value, res['servicechain_node'])
|
|
|
|
def test_delete_servicechain_node(self):
|
|
self._test_entity_delete('servicechain_node')
|
|
|
|
def _test_create_servicechain_spec(self, data, expected_value,
|
|
default_data=None):
|
|
if not default_data:
|
|
default_data = data
|
|
self.instance.create_servicechain_spec.return_value = expected_value
|
|
|
|
res = self.api.post(_get_path(SERVICECHAIN_SPECS_URI, fmt=self.fmt),
|
|
self.serialize(data),
|
|
content_type='application/%s' % self.fmt)
|
|
|
|
self.instance.create_servicechain_spec.assert_called_once_with(
|
|
mock.ANY, servicechain_spec=default_data)
|
|
self.assertEqual(exc.HTTPCreated.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_spec', res)
|
|
self.assertEqual(expected_value, res['servicechain_spec'])
|
|
|
|
def test_create_servicechain_spec_with_defaults(self):
|
|
servicechain_spec_id = _uuid()
|
|
data = {
|
|
'servicechain_spec': {
|
|
'nodes': [_uuid(), _uuid()], 'tenant_id': _uuid()
|
|
}
|
|
}
|
|
default_attrs = (
|
|
cm.get_create_servicechain_spec_default_attrs_and_prj_id())
|
|
default_data = copy.copy(data)
|
|
default_data['servicechain_spec'].update(default_attrs)
|
|
expected_value = dict(default_data['servicechain_spec'])
|
|
expected_value['id'] = servicechain_spec_id
|
|
|
|
self._test_create_servicechain_spec(data, expected_value, default_data)
|
|
|
|
def test_create_servicechain_spec(self):
|
|
servicechain_spec_id = _uuid()
|
|
data = {
|
|
'servicechain_spec': cm.get_create_servicechain_spec_attrs()
|
|
}
|
|
expected_value = dict(data['servicechain_spec'])
|
|
expected_value['id'] = servicechain_spec_id
|
|
|
|
self._test_create_servicechain_spec(data, expected_value)
|
|
|
|
def test_list_servicechain_specs(self):
|
|
servicechain_spec_id = _uuid()
|
|
expected_value = [{'tenant_id': _uuid(), 'id': servicechain_spec_id}]
|
|
self.instance.get_servicechain_specs.return_value = expected_value
|
|
|
|
res = self.api.get(_get_path(SERVICECHAIN_SPECS_URI, fmt=self.fmt))
|
|
|
|
self.instance.get_servicechain_specs.assert_called_once_with(
|
|
mock.ANY, fields=mock.ANY, filters=mock.ANY)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_specs', res)
|
|
self.assertEqual(expected_value, res['servicechain_specs'])
|
|
|
|
def test_get_servicechain_spec(self):
|
|
servicechain_spec_id = _uuid()
|
|
expected_value = {'tenant_id': _uuid(), 'id': servicechain_spec_id}
|
|
self.instance.get_servicechain_spec.return_value = expected_value
|
|
|
|
res = self.api.get(_get_path(SERVICECHAIN_SPECS_URI,
|
|
id=servicechain_spec_id,
|
|
fmt=self.fmt))
|
|
|
|
self.instance.get_servicechain_spec.assert_called_once_with(
|
|
mock.ANY, servicechain_spec_id, fields=mock.ANY)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_spec', res)
|
|
self.assertEqual(expected_value, res['servicechain_spec'])
|
|
|
|
def test_update_servicechain_spec(self):
|
|
servicechain_spec_id = _uuid()
|
|
update_data = {
|
|
'servicechain_spec': cm.get_update_servicechain_spec_attrs()
|
|
}
|
|
expected_value = {'tenant_id': _uuid(), 'id': servicechain_spec_id}
|
|
self.instance.update_servicechain_spec.return_value = expected_value
|
|
|
|
res = self.api.put(_get_path(SERVICECHAIN_SPECS_URI,
|
|
id=servicechain_spec_id,
|
|
fmt=self.fmt),
|
|
self.serialize(update_data))
|
|
|
|
self.instance.update_servicechain_spec.assert_called_once_with(
|
|
mock.ANY, servicechain_spec_id, servicechain_spec=update_data)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_spec', res)
|
|
self.assertEqual(expected_value, res['servicechain_spec'])
|
|
|
|
def test_delete_servicechain_spec(self):
|
|
self._test_entity_delete('servicechain_spec')
|
|
|
|
def _test_create_servicechain_instance(self, data, expected_value,
|
|
default_data=None):
|
|
if not default_data:
|
|
default_data = data
|
|
self.instance.create_servicechain_instance.return_value = (
|
|
expected_value)
|
|
res = self.api.post(_get_path(SERVICECHAIN_INSTANCES_URI,
|
|
fmt=self.fmt),
|
|
self.serialize(data),
|
|
content_type='application/%s' % self.fmt)
|
|
|
|
self.instance.create_servicechain_instance.assert_called_once_with(
|
|
mock.ANY, servicechain_instance=default_data)
|
|
self.assertEqual(exc.HTTPCreated.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_instance', res)
|
|
self.assertEqual(expected_value, res['servicechain_instance'])
|
|
|
|
def test_create_servicechain_instance_with_defaults(self):
|
|
servicechain_instance_id = _uuid()
|
|
data = {
|
|
'servicechain_instance': {
|
|
'servicechain_specs': [_uuid()],
|
|
'tenant_id': _uuid(),
|
|
'provider_ptg_id': _uuid(),
|
|
'consumer_ptg_id': _uuid(),
|
|
'management_ptg_id': _uuid(),
|
|
'classifier_id': _uuid(),
|
|
}
|
|
}
|
|
default_attrs = (
|
|
cm.get_create_servicechain_instance_default_attrs_and_prj_id())
|
|
default_data = copy.copy(data)
|
|
default_data['servicechain_instance'].update(default_attrs)
|
|
expected_value = dict(default_data['servicechain_instance'])
|
|
expected_value['id'] = servicechain_instance_id
|
|
|
|
self._test_create_servicechain_instance(data, expected_value,
|
|
default_data)
|
|
|
|
def test_create_servicechain_instance(self):
|
|
servicechain_instance_id = _uuid()
|
|
data = {'servicechain_instance':
|
|
cm.get_create_servicechain_instance_attrs()}
|
|
expected_value = dict(data['servicechain_instance'])
|
|
expected_value['id'] = servicechain_instance_id
|
|
|
|
self._test_create_servicechain_instance(data, expected_value)
|
|
|
|
def test_list_servicechain_instances(self):
|
|
servicechain_instance_id = _uuid()
|
|
expected_value = [{'tenant_id': _uuid(),
|
|
'id': servicechain_instance_id}]
|
|
self.instance.get_servicechain_instances.return_value = expected_value
|
|
|
|
res = self.api.get(_get_path(SERVICECHAIN_INSTANCES_URI, fmt=self.fmt))
|
|
|
|
self.instance.get_servicechain_instances.assert_called_once_with(
|
|
mock.ANY, fields=mock.ANY, filters=mock.ANY)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_instances', res)
|
|
self.assertEqual(expected_value, res['servicechain_instances'])
|
|
|
|
def test_get_servicechain_instance(self):
|
|
servicechain_instance_id = _uuid()
|
|
expected_value = {'tenant_id': _uuid(), 'id': servicechain_instance_id}
|
|
self.instance.get_servicechain_instance.return_value = expected_value
|
|
|
|
res = self.api.get(_get_path(SERVICECHAIN_INSTANCES_URI,
|
|
id=servicechain_instance_id,
|
|
fmt=self.fmt))
|
|
|
|
self.instance.get_servicechain_instance.assert_called_once_with(
|
|
mock.ANY, servicechain_instance_id, fields=mock.ANY)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_instance', res)
|
|
self.assertEqual(expected_value, res['servicechain_instance'])
|
|
|
|
def test_update_servicechain_instance(self):
|
|
servicechain_instance_id = _uuid()
|
|
update_data = {'servicechain_instance':
|
|
cm.get_update_servicechain_instance_attrs()}
|
|
expected_value = {'tenant_id': _uuid(), 'id': servicechain_instance_id}
|
|
self.instance.update_servicechain_instance.return_value = (
|
|
expected_value)
|
|
|
|
res = self.api.put(_get_path(SERVICECHAIN_INSTANCES_URI,
|
|
id=servicechain_instance_id,
|
|
fmt=self.fmt),
|
|
self.serialize(update_data))
|
|
|
|
self.instance.update_servicechain_instance.assert_called_once_with(
|
|
mock.ANY, servicechain_instance_id,
|
|
servicechain_instance=update_data)
|
|
self.assertEqual(exc.HTTPOk.code, res.status_int)
|
|
res = self.deserialize(res)
|
|
self.assertIn('servicechain_instance', res)
|
|
self.assertEqual(expected_value, res['servicechain_instance'])
|
|
|
|
def test_delete_servicechain_instance(self):
|
|
self._test_entity_delete('servicechain_instance')
|