Merge "Jira: DAISY-490 we can not change the segment type of DATAPLANE, when it is in use." into stable/mitaka
This commit is contained in:
@@ -522,6 +522,29 @@ class Controller(controller.BaseController):
|
||||
raise HTTPBadRequest(explanation=e.msg, request=req)
|
||||
return dict(networks=networks)
|
||||
|
||||
def _is_dataplane_in_use(self, context, network_meta,
|
||||
network_id, orig_segment_type):
|
||||
if network_meta.get('custom_name', None):
|
||||
network_name = network_meta.get('custom_name', None)
|
||||
else:
|
||||
network_name = network_meta.get('name', None)
|
||||
update_segment_type = network_meta.get('segmentation_type')
|
||||
try:
|
||||
assigned_network = \
|
||||
registry.get_assigned_networks_data_by_network_id(
|
||||
context, network_id)
|
||||
except exception.NotFound as e:
|
||||
msg = (_("Failed to find assigned network, %s") %
|
||||
utils.exception_to_str(e))
|
||||
LOG.error(msg)
|
||||
raise HTTPNotFound(explanation=msg)
|
||||
if assigned_network:
|
||||
if update_segment_type != orig_segment_type:
|
||||
msg = (_("DATAPLANE %s is in use, can not "
|
||||
"change segment type ") % network_name)
|
||||
LOG.error(msg)
|
||||
raise HTTPForbidden(explanation=msg)
|
||||
|
||||
@utils.mutating
|
||||
def update_network(self, req, network_id, network_meta):
|
||||
"""
|
||||
@@ -618,6 +641,13 @@ class Controller(controller.BaseController):
|
||||
msg = (_('Networks with the same vlan_id must '
|
||||
'have the same cidr'))
|
||||
raise HTTPBadRequest(explanation=msg)
|
||||
dataplane_type = network_meta.get('network_type',
|
||||
orig_network_meta['network_type'])
|
||||
if dataplane_type == 'DATAPLANE':
|
||||
orig_segment_type = orig_network_meta.get('segmentation_type')
|
||||
self._is_dataplane_in_use(req.context,
|
||||
network_meta, network_id,
|
||||
orig_segment_type)
|
||||
|
||||
if network_meta.get('ip_ranges', None) and \
|
||||
eval(network_meta['ip_ranges']):
|
||||
|
||||
@@ -4223,6 +4223,13 @@ def network_destroy(context, network_id):
|
||||
|
||||
return network_ref
|
||||
|
||||
def get_assigned_networks_by_network_id(context, network_id,
|
||||
session=None, force_show_deleted=False):
|
||||
# get the assign networks by network id
|
||||
assign_networks = \
|
||||
_get_assigned_networks_by_network_id(context, network_id, session=session)
|
||||
return assign_networks
|
||||
|
||||
def delete_network_ip_range(context, network_id):
|
||||
session = get_session()
|
||||
with session.begin():
|
||||
|
||||
@@ -383,6 +383,11 @@ def init(mapper):
|
||||
action="get_network",
|
||||
conditions=dict(method=["GET"]))
|
||||
|
||||
mapper.connect("/assigned_networks/{network_id}",
|
||||
controller=networks_resource,
|
||||
action="get_assigned_networks_by_network_id",
|
||||
conditions=dict(method=["GET"]))
|
||||
|
||||
mapper.connect("/networks/update_phyname_of_network",
|
||||
controller=networks_resource,
|
||||
action="update_phyname_of_network",
|
||||
|
||||
@@ -354,6 +354,28 @@ class Controller(object):
|
||||
network_data = dict(network=network_data)
|
||||
return network_data
|
||||
|
||||
@utils.mutating
|
||||
def get_assigned_networks_by_network_id(self, req, network_id):
|
||||
"""Return assigned network by the given network id."""
|
||||
try:
|
||||
assigned_network = \
|
||||
self.db_api.get_assigned_networks_by_network_id(
|
||||
req.context, network_id)
|
||||
msg = "Successfully retrieved " \
|
||||
"network %(network_id)s" % {'network_id': network_id}
|
||||
LOG.debug(msg)
|
||||
if 'network' not in assigned_network:
|
||||
assigned_network = dict(network=assigned_network)
|
||||
return assigned_network
|
||||
except exception.NotFound:
|
||||
msg = _LI("Network %(network_id)s "
|
||||
"not found") % {'network_id': network_id}
|
||||
LOG.info(msg)
|
||||
raise exc.HTTPNotFound()
|
||||
except Exception:
|
||||
LOG.exception(_LE("Unable to show network %s") % network_id)
|
||||
raise
|
||||
|
||||
@utils.mutating
|
||||
def update_network(self, req, network_id, body):
|
||||
"""Updates an existing network with the registry.
|
||||
|
||||
@@ -569,6 +569,11 @@ def delete_network_metadata(context, network_id):
|
||||
return c.delete_network(network_id)
|
||||
|
||||
|
||||
def get_assigned_networks_data_by_network_id(context, network_id):
|
||||
c = get_registry_client(context)
|
||||
return c.get_assigned_networks_by_network_id(network_id)
|
||||
|
||||
|
||||
def get_network_metadata(context, network_id):
|
||||
c = get_registry_client(context)
|
||||
return c.get_networks(network_id)
|
||||
|
||||
8
code/daisy/daisy/registry/client/v1/client.py
Normal file → Executable file
8
code/daisy/daisy/registry/client/v1/client.py
Normal file → Executable file
@@ -1069,6 +1069,14 @@ class RegistryClient(BaseClient):
|
||||
data = jsonutils.loads(res.read())
|
||||
return data['network']
|
||||
|
||||
def get_assigned_networks_by_network_id(self, network_id):
|
||||
"""
|
||||
Get assigend networks about an network
|
||||
"""
|
||||
res = self.do_request("GET", "/assigned_networks/%s" % network_id)
|
||||
data = jsonutils.loads(res.read())
|
||||
return data['network']
|
||||
|
||||
def get_networks_detailed(self, cluster_id, **kwargs):
|
||||
"""
|
||||
Returns a list of detailed host data mappings from Registry
|
||||
|
||||
609
code/daisy/daisy/tests/api/test_network.py
Executable file
609
code/daisy/daisy/tests/api/test_network.py
Executable file
@@ -0,0 +1,609 @@
|
||||
from daisy.api.v1 import networks
|
||||
from daisy.common import exception
|
||||
from daisy.context import RequestContext
|
||||
import daisy.registry.client.v1.api as registry
|
||||
from daisy import test
|
||||
import mock
|
||||
from oslo_serialization import jsonutils
|
||||
import webob
|
||||
|
||||
network_list = [{u'alias': None,
|
||||
u'capability': u'high',
|
||||
u'cidr': u'192.168.1.1/24',
|
||||
u'cluster_id': u'63d26456-9975-4d7c-a400-45a1ae64b9f3',
|
||||
u'created_at': u'2016-08-31T02:40:17.000000',
|
||||
u'deleted': False,
|
||||
u'deleted_at': None,
|
||||
u'description': u'',
|
||||
u'gateway': u'',
|
||||
u'gre_id_end': None,
|
||||
u'gre_id_start': None,
|
||||
u'id': u'8f7cc123-08d6-4424-9352-383bc5890bb6',
|
||||
u'ip': None,
|
||||
u'ip_ranges': [],
|
||||
u'ml2_type': None,
|
||||
u'mtu': 1500,
|
||||
u'name': u'PUBLICAPI',
|
||||
u'network_type': u'PUBLICAPI',
|
||||
u'physnet_name': u'physnet_enp132s0f1',
|
||||
u'segmentation_type': None,
|
||||
u'type': u'default',
|
||||
u'updated_at': u'2016-08-31T02:41:16.000000',
|
||||
u'vlan_end': 4094,
|
||||
u'vlan_id': None,
|
||||
u'vlan_start': 1,
|
||||
u'vni_end': None,
|
||||
u'vni_start': None},
|
||||
{u'alias': None,
|
||||
u'capability': u'high',
|
||||
u'cidr': u'192.168.1.1/24',
|
||||
u'cluster_id': u'63d26456-9975-4d7c-a400-45a1ae64b9f3',
|
||||
u'created_at': u'2016-08-31T02:40:17.000000',
|
||||
u'deleted': False,
|
||||
u'deleted_at': None,
|
||||
u'description': u'',
|
||||
u'gateway': None,
|
||||
u'gre_id_end': None,
|
||||
u'gre_id_start': None,
|
||||
u'id': u'79052a8a-b51f-461a-bdbc-c36bc69d6126',
|
||||
u'ip': None,
|
||||
u'ip_ranges': [],
|
||||
u'ml2_type': u'ovs',
|
||||
u'mtu': 1500,
|
||||
u'name': u'physnet1',
|
||||
u'network_type': u'DATAPLANE',
|
||||
u'physnet_name': u'physnet_enp132s0f2',
|
||||
u'segmentation_type': u'vlan',
|
||||
u'type': u'default',
|
||||
u'updated_at': u'2016-08-31T02:41:38.000000',
|
||||
u'vlan_end': 4094,
|
||||
u'vlan_id': None,
|
||||
u'vlan_start': 1,
|
||||
u'vni_end': None,
|
||||
u'vni_start': None},
|
||||
{u'alias': None,
|
||||
u'capability': u'high',
|
||||
u'cidr': u'199.168.1.1/24',
|
||||
u'cluster_id': u'63d26456-9975-4d7c-a400-45a1ae64b9f3',
|
||||
u'created_at': u'2016-08-31T02:40:17.000000',
|
||||
u'deleted': False,
|
||||
u'deleted_at': None,
|
||||
u'description': u'',
|
||||
u'gateway': u'',
|
||||
u'gre_id_end': None,
|
||||
u'gre_id_start': None,
|
||||
u'id': u'1fafc035-d945-4cf1-807a-86d2a6c2a65c',
|
||||
u'ip': None,
|
||||
u'ip_ranges': [],
|
||||
u'ml2_type': None,
|
||||
u'mtu': 1500,
|
||||
u'name': u'MANAGEMENT',
|
||||
u'network_type': u'MANAGEMENT',
|
||||
u'physnet_name': u'physnet_enp132s0f0',
|
||||
u'segmentation_type': None,
|
||||
u'type': u'default',
|
||||
u'updated_at': u'2016-08-31T02:41:38.000000',
|
||||
u'vlan_end': 4094,
|
||||
u'vlan_id': None,
|
||||
u'vlan_start': 1,
|
||||
u'vni_end': None,
|
||||
u'vni_start': None}]
|
||||
|
||||
|
||||
class TestNetworkApi(test.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestNetworkApi, self).setUp()
|
||||
self.controller = networks.Controller()
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.api.'
|
||||
'get_assigned_networks_data_by_network_id')
|
||||
def test_update_network(self, get_assigned_networks_data_by_network_id):
|
||||
self.controller.get_network_meta_or_404 = \
|
||||
mock.Mock(return_value=network_list[0])
|
||||
registry.get_networks_detail = mock.Mock(return_value=network_list)
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_id = "123"
|
||||
network_meta = {'network_type': 'DATAPLANE',
|
||||
'cluster_id': 'test', 'gateway': '192.168.1.1'}
|
||||
registry.update_network_metadata = mock.Mock(return_value=network_meta)
|
||||
get_assigned_networks_data_by_network_id.return_value = []
|
||||
update_network = self.controller.update_network(
|
||||
req, network_id, network_meta)
|
||||
self.assertEqual(network_meta['network_type'],
|
||||
update_network['network_meta']['network_type'])
|
||||
|
||||
def test_add_network(self):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_meta = {'network_type': 'DATAPLANE',
|
||||
'gateway': '192.168.1.1', 'name': 'pysnet1'}
|
||||
registry.add_network_metadata = mock.Mock(return_value=network_meta)
|
||||
add_network = self.controller.add_network(req, network_meta)
|
||||
self.assertEqual(network_meta['network_type'],
|
||||
add_network['network_meta']['network_type'])
|
||||
|
||||
def test_verify_uniqueness_of_network_custom_name(self):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
networks = {u'networks': [
|
||||
{u'name': u'PUBLICAPI',
|
||||
u'network_type': u'PUBLICAPI',
|
||||
u'custom_name': u'publicapi'},
|
||||
{u'name': u'physnet1',
|
||||
u'network_type': u'DATAPLANE',
|
||||
u'custom_name': u'physneta'},
|
||||
{u'name': u'MANAGEMENT',
|
||||
u'network_type': u'MANAGEMENT',
|
||||
u'custom_name': u'management'}]}
|
||||
network_meta = {u'custom_name': u'management'}
|
||||
self.assertRaises(
|
||||
webob.exc.HTTPConflict,
|
||||
self.controller._verify_uniqueness_of_network_custom_name,
|
||||
req, networks, network_meta)
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.api.add_network_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_networks_detail')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_cluster_metadata')
|
||||
def test_add_network_with_no_exist_custom_name(self,
|
||||
get_cluster,
|
||||
get_networks,
|
||||
add_network):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_meta = {'cluster_id': '1',
|
||||
'network_type': 'MANAGEMENT',
|
||||
'custom_name': 'management1',
|
||||
'name': 'MANAGEMENT1'}
|
||||
cluster = {'id': '1',
|
||||
'deleted': 0}
|
||||
networks = [{'name': 'PUBLICAPI',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'custom_name': None},
|
||||
{'name': 'physnet1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'custom_name': 'physnet2'}]
|
||||
return_network = {'name': 'MANAGEMENT1',
|
||||
'network_type': 'MANAGEMENT',
|
||||
'custom_name': 'management1'}
|
||||
get_cluster.return_value = cluster
|
||||
get_networks.return_value = networks
|
||||
add_network.return_value = return_network
|
||||
network = self.controller.add_network(req, network_meta)
|
||||
self.assertEqual('management1',
|
||||
network['network_meta']['custom_name'])
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.api.get_networks_detail')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_cluster_metadata')
|
||||
def test_add_network_with_exist_custom_name(self,
|
||||
get_cluster,
|
||||
get_networks):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_meta = {'cluster_id': '1',
|
||||
'network_type': 'MANAGEMENT',
|
||||
'custom_name': 'management1',
|
||||
'name': 'MANAGEMENT1'}
|
||||
cluster = {'id': '1',
|
||||
'deleted': 0}
|
||||
networks_with_same_custom_name = [{'name': 'PUBLICAPI',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'custom_name': None},
|
||||
{'name': 'physnet1',
|
||||
'network_type': 'DATAPLANE'},
|
||||
{'name': 'STORAGE',
|
||||
'network_type': 'STORAGE',
|
||||
'custom_name': 'management1'}]
|
||||
get_cluster.return_value = cluster
|
||||
get_networks.return_value = networks_with_same_custom_name
|
||||
self.assertRaises(webob.exc.HTTPConflict, self.controller.add_network,
|
||||
req, network_meta)
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.api.update_network_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_networks_detail')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_cluster_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_network_metadata')
|
||||
def test_update_network_with_no_exist_custom_name(self,
|
||||
get_network_meta,
|
||||
get_cluster_meta,
|
||||
get_networks_detail,
|
||||
update_network):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_id = '1'
|
||||
network_meta = {'custom_name': 'publicapi1'}
|
||||
orig_network_meta = {'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '1',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'publicapi',
|
||||
'gateway': None}
|
||||
cluster_meta = {'id': '1',
|
||||
'deleted': False}
|
||||
networks_detail = [{'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '1',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'publicapi'},
|
||||
{'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '2',
|
||||
'network_type': 'MANAGEMENT',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'management'},
|
||||
{'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '3',
|
||||
'network_type': 'DATAPLANE',
|
||||
'cidr': None,
|
||||
'vlan_id': None,
|
||||
'custom_name': 'physnet'}]
|
||||
update_network_meta = {'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '1',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'publicapi1'}
|
||||
get_network_meta.return_value = orig_network_meta
|
||||
get_cluster_meta.return_value = cluster_meta
|
||||
get_networks_detail.return_value = networks_detail
|
||||
update_network.return_value = update_network_meta
|
||||
network_meta = self.controller.update_network(req, network_id,
|
||||
network_meta)
|
||||
self.assertEqual('publicapi1',
|
||||
network_meta['network_meta']['custom_name'])
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.api.update_network_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_networks_detail')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_cluster_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_network_metadata')
|
||||
def test_update_network_with_original_custom_name(self,
|
||||
get_network_meta,
|
||||
get_cluster_meta,
|
||||
get_networks_detail,
|
||||
update_network):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_id = '1'
|
||||
network_meta = {'custom_name': 'publicapi'}
|
||||
orig_network_meta = {'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '1',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'publicapi',
|
||||
'gateway': None}
|
||||
cluster_meta = {'id': '1',
|
||||
'deleted': False}
|
||||
networks_detail = [{'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '1',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'publicapi'}]
|
||||
update_network_meta = {'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '1',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'publicapi'}
|
||||
get_network_meta.return_value = orig_network_meta
|
||||
get_cluster_meta.return_value = cluster_meta
|
||||
get_networks_detail.return_value = networks_detail
|
||||
update_network.return_value = update_network_meta
|
||||
network_meta = self.controller.update_network(req, network_id,
|
||||
network_meta)
|
||||
self.assertEqual('publicapi',
|
||||
network_meta['network_meta']['custom_name'])
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.api.get_networks_detail')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_cluster_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_network_metadata')
|
||||
def test_update_another_network_with_same_custom_name(self,
|
||||
get_network_meta,
|
||||
get_cluster_meta,
|
||||
get_networks_detail):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_id = '2'
|
||||
network_meta = {'custom_name': 'publicapi'}
|
||||
orig_network_meta = {'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '1',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'publicapi',
|
||||
'gateway': None}
|
||||
cluster_meta = {'id': '1',
|
||||
'deleted': False}
|
||||
networks_detail = [{'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '1',
|
||||
'network_type': 'PUBLICAPI',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'publicapi'},
|
||||
{'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'id': '2',
|
||||
'network_type': 'MANAGEMENT',
|
||||
'cidr': '192.168.1.1/24',
|
||||
'vlan_id': None,
|
||||
'custom_name': 'management'}]
|
||||
get_network_meta.return_value = orig_network_meta
|
||||
get_cluster_meta.return_value = cluster_meta
|
||||
get_networks_detail.return_value = networks_detail
|
||||
self.assertRaises(webob.exc.HTTPConflict,
|
||||
self.controller.update_network,
|
||||
req, network_id, network_meta)
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.api.'
|
||||
'get_assigned_networks_data_by_network_id')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_networks_detail')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_cluster_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_network_metadata')
|
||||
def test_update_network_with_forbidden_change_segment_type(
|
||||
self, get_network_meta, get_cluster_meta,
|
||||
get_networks_detail,
|
||||
get_assigned_networks_data_by_network_id):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_id = 'cf531581-a283-41dd-9e4e-4b98454d54e7'
|
||||
network_meta = {
|
||||
'cluster_id': '1',
|
||||
'custom_name': '',
|
||||
'description': '',
|
||||
'name': 'physnet1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'segmentation_type': 'vlan',
|
||||
'vlan_end': '4090',
|
||||
'vlan_start': '1'}
|
||||
orig_network_meta = {'cidr': '1.2.3.4/24',
|
||||
'vlan_id': None,
|
||||
'cluster_id': '1',
|
||||
'deleted': False,
|
||||
'id': 'cf531581-a283-41dd-9e4e-4b98454d54e7',
|
||||
'network_type': 'DATAPLANE',
|
||||
'segmentation_type': 'vxlan',
|
||||
'type': 'default'}
|
||||
cluster_meta = {'id': '1',
|
||||
'deleted': False}
|
||||
networks_detail = [
|
||||
{
|
||||
'alias': None,
|
||||
'capability': 'high',
|
||||
'cidr': '1.2.3.4/24',
|
||||
'cluster_id': '1',
|
||||
'custom_name': '',
|
||||
'deleted': False,
|
||||
'gateway': '1.2.3.4',
|
||||
'gre_id_end': None,
|
||||
'gre_id_start': None,
|
||||
'id': 'cf531581-a283-41dd-9e4e-4b98454d54e7',
|
||||
'ip': None,
|
||||
'ip_ranges': [
|
||||
{
|
||||
'end': '1.2.3.6',
|
||||
'start': '1.2.3.4'}],
|
||||
'ml2_type': 'ovs',
|
||||
'mt': 1500,
|
||||
'name': 'physnet1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'physnet_name': 'physnet_eth1',
|
||||
'segmentation_type': 'vxlan',
|
||||
'type': 'default',
|
||||
'updated_at': '2015-05-07T04:26:28.000000',
|
||||
'vlan_end': 4090,
|
||||
'vlan_id': None,
|
||||
'vlan_start': 1,
|
||||
'vni_end': 20,
|
||||
'vni_start': 1}]
|
||||
assigned_network = [
|
||||
{
|
||||
'deleted': False,
|
||||
'id': '658333cf-93d4-499b-8bff-e8bd6bcbb5f1',
|
||||
'interface_id': '4de86a45-af28-4362-b5f0-afeee235786f',
|
||||
'ip': '1.2.3.4',
|
||||
'mac': 'fa:16:3e:7b:1a:95',
|
||||
'network_id': 'cf531581-a283-41dd-9e4e-4b98454d54e7',
|
||||
'updated_at': '2015-05-07T04:01:59.000000',
|
||||
'vswitch_type': 'dvs'}]
|
||||
|
||||
get_network_meta.return_value = orig_network_meta
|
||||
get_cluster_meta.return_value = cluster_meta
|
||||
get_networks_detail.return_value = networks_detail
|
||||
get_assigned_networks_data_by_network_id.return_value = \
|
||||
assigned_network
|
||||
self.assertRaises(webob.exc.HTTPForbidden,
|
||||
self.controller.update_network,
|
||||
req, network_id, network_meta)
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.api.'
|
||||
'get_assigned_networks_data_by_network_id')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_networks_detail')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_cluster_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_network_metadata')
|
||||
def test_update_network_with_assigned_network_not_found(
|
||||
self, get_network_meta, get_cluster_meta,
|
||||
get_networks_detail,
|
||||
get_assigned_networks_data_by_network_id):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_id = 'cf531581-a283-41dd-9e4e-4b98454d54e7'
|
||||
network_meta = {'cluster_id': '1',
|
||||
'custom_name': '',
|
||||
'description': '',
|
||||
'name': 'physnet1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'segmentation_type': 'vlan',
|
||||
'vlan_end': '4090',
|
||||
'vlan_start': '1'}
|
||||
orig_network_meta = {'cidr': '1.2.3.4/24',
|
||||
'vlan_id': None,
|
||||
'cluster_id': '1',
|
||||
'deleted': False,
|
||||
'id': 'cf531581-a283-41dd-9e4e-4b98454d54e7',
|
||||
'network_type': 'DATAPLANE',
|
||||
'segmentation_type': 'vxlan',
|
||||
'type': 'default'}
|
||||
cluster_meta = {'id': '1',
|
||||
'deleted': False}
|
||||
networks_detail = [{'alias': None,
|
||||
'capability': 'high',
|
||||
'cidr': '1.2.3.4/24',
|
||||
'cluster_id': '1',
|
||||
'custom_name': '',
|
||||
'deleted': False,
|
||||
'gateway': '1.2.3.4',
|
||||
'gre_id_end': None,
|
||||
'gre_id_start': None,
|
||||
'id': 'cf531581-a283-41dd-9e4e-4b98454d54e7',
|
||||
'ip': None,
|
||||
'ip_ranges': [
|
||||
{
|
||||
'end': '1.2.3.6',
|
||||
'start': '1.2.3.4'}],
|
||||
'ml2_type': 'ovs',
|
||||
'mt': 1500,
|
||||
'name': 'physnet1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'physnet_name': 'physnet_eth1',
|
||||
'segmentation_type': 'vxlan',
|
||||
'type': 'default',
|
||||
'updated_at': '2015-05-07T04:26:28.000000',
|
||||
'vlan_end': 4090,
|
||||
'vlan_id': None,
|
||||
'vlan_start': 1,
|
||||
'vni_end': 20,
|
||||
'vni_start': 1}]
|
||||
assigned_network = [
|
||||
{'deleted': False,
|
||||
'id': '658333cf-93d4-499b-8bff-e8bd6bcbb5f1',
|
||||
'interface_id': '4de86a45-af28-4362-b5f0-afeee235786f',
|
||||
'ip': '1.2.3.4',
|
||||
'mac': 'fa:16:3e:7b:1a:95',
|
||||
'network_id': 'cf531581-a283-41dd-9e4e-4b98454d54e7',
|
||||
'updated_at': '2015-05-07T04:01:59.000000',
|
||||
'vswitch_type': 'dvs'}]
|
||||
|
||||
get_network_meta.return_value = orig_network_meta
|
||||
get_cluster_meta.return_value = cluster_meta
|
||||
get_networks_detail.return_value = networks_detail
|
||||
get_assigned_networks_data_by_network_id.side_effect = \
|
||||
exception.NotFound
|
||||
self.assertRaises(webob.exc.HTTPNotFound,
|
||||
self.controller.update_network,
|
||||
req, network_id, network_meta)
|
||||
|
||||
@mock.patch('daisy.registry.client.v1.client.RegistryClient.do_request')
|
||||
@mock.patch('daisy.registry.client.v1.api.update_network_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_networks_detail')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_cluster_metadata')
|
||||
@mock.patch('daisy.registry.client.v1.api.get_network_metadata')
|
||||
def test_update_network_with_custom_name(
|
||||
self, get_network_meta, get_cluster_meta,
|
||||
get_networks_detail,
|
||||
update_network_metadata,
|
||||
mock_do_request):
|
||||
req = webob.Request.blank('/')
|
||||
req.context = RequestContext(is_admin=True,
|
||||
user='fake user',
|
||||
tenant='fake tenamet')
|
||||
network_id = 'cf531581-a283-41dd-9e4e-4b98454d54e7'
|
||||
|
||||
def fake_do_request(method, path, **params):
|
||||
res = mock.Mock()
|
||||
if method == "GET":
|
||||
if path == "/assigned_networks/%s" % network_id:
|
||||
get_result = {'network': []}
|
||||
res.read.return_value = jsonutils.dumps(get_result)
|
||||
return res
|
||||
|
||||
network_meta = {
|
||||
'cluster_id': '1',
|
||||
'custom_name': 'phy1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'segmentation_type': 'vlan'}
|
||||
|
||||
orig_network_meta = {
|
||||
'cluster_id': '1',
|
||||
'custom_name': '',
|
||||
'id': 'cf531581-a283-41dd-9e4e-4b98454d54e7',
|
||||
'name': 'physnet1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'physnet_name': 'physnet_eth1',
|
||||
'segmentation_type': 'vlan',
|
||||
'type': 'default',
|
||||
'cidr': '',
|
||||
'gateway': '',
|
||||
'deleted': False,
|
||||
'vlan_end': 4090,
|
||||
'vlan_id': None,
|
||||
'vlan_start': 1,
|
||||
'vni_end': 20,
|
||||
'vni_start': 1}
|
||||
|
||||
cluster_meta = {'id': '1',
|
||||
'deleted': False}
|
||||
networks_detail = [
|
||||
{
|
||||
'cluster_id': '1',
|
||||
'custom_name': '',
|
||||
'id': 'cf531581-a283-41dd-9e4e-4b98454d54e7',
|
||||
'name': 'physnet1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'physnet_name': 'physnet_eth1',
|
||||
'segmentation_type': 'vlan',
|
||||
'type': 'default',
|
||||
'vlan_end': 4090,
|
||||
'vlan_id': None,
|
||||
'vlan_start': 1,
|
||||
'vni_end': 20,
|
||||
'vni_start': 1
|
||||
}]
|
||||
|
||||
update_network_meta = {'deleted': False,
|
||||
'cluster_id': '1',
|
||||
'network_type': 'DATAPLANE',
|
||||
'custom_name': 'phy1'}
|
||||
|
||||
get_network_meta.return_value = orig_network_meta
|
||||
get_cluster_meta.return_value = cluster_meta
|
||||
get_networks_detail.return_value = networks_detail
|
||||
mock_do_request.side_effect = fake_do_request
|
||||
update_network_metadata.return_value = update_network_meta
|
||||
update_network = self.controller.update_network(
|
||||
req, network_id, network_meta)
|
||||
self.assertEqual(network_meta['custom_name'],
|
||||
update_network['network_meta']['custom_name'])
|
||||
@@ -1,11 +1,11 @@
|
||||
import mock
|
||||
import webob
|
||||
from daisy.common import exception
|
||||
from oslo_db.sqlalchemy.session import Query
|
||||
from daisy.context import RequestContext
|
||||
from daisy.db.sqlalchemy import api
|
||||
from daisy import test
|
||||
from daisy.tests import test_utils
|
||||
import mock
|
||||
from oslo_db.sqlalchemy.session import Query
|
||||
import webob
|
||||
|
||||
|
||||
class FakeFetchoneValue(object):
|
||||
@@ -143,6 +143,7 @@ class FakeSession(object):
|
||||
|
||||
|
||||
class DottableDict(dict):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
dict.__init__(self, *args, **kwargs)
|
||||
self.__dict__ = self
|
||||
@@ -561,3 +562,9 @@ class TestSqlalchemyApi(test.TestCase):
|
||||
api.discover_host_get,
|
||||
self.req.context,
|
||||
discover_host_id)
|
||||
|
||||
def test_get_assigned_networks_by_network_id(self):
|
||||
network_id = u'1'
|
||||
assigned_networks = api.get_assigned_networks_by_network_id(
|
||||
self.req.context, network_id)
|
||||
self.assertEqual(assigned_networks, [])
|
||||
|
||||
66
code/daisy/daisy/tests/registry/api/test_network.py
Executable file
66
code/daisy/daisy/tests/registry/api/test_network.py
Executable file
@@ -0,0 +1,66 @@
|
||||
from daisy.common import exception
|
||||
from daisy.context import RequestContext
|
||||
import daisy.db
|
||||
from daisy.db.sqlalchemy import models
|
||||
from daisy.registry.api.v1 import networks as registry_networks
|
||||
from daisy import test
|
||||
import mock
|
||||
import webob
|
||||
|
||||
|
||||
def fake_network_id(network_id):
|
||||
if network_id == '2':
|
||||
return exception.NotFound
|
||||
if network_id == '3':
|
||||
return exception.Conflict
|
||||
|
||||
|
||||
class TestRegistryNetwork(test.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestRegistryNetwork, self).setUp()
|
||||
self.controller = registry_networks.Controller()
|
||||
|
||||
def test_get_assigned_networks_by_network_id(self):
|
||||
id = '1'
|
||||
self.req = webob.Request.blank('/')
|
||||
self.req.context = RequestContext(
|
||||
is_admin=True, user='fake user',
|
||||
tenant='fake tenant')
|
||||
self.db_api = daisy.db.get_api()
|
||||
assigned_network_ref = models.AssignedNetworks()
|
||||
self.db_api.get_assigned_networks_by_network_id = \
|
||||
mock.Mock(return_value=assigned_network_ref)
|
||||
assigned_network = \
|
||||
self.controller.get_assigned_networks_by_network_id(
|
||||
self.req, id)
|
||||
self.assertEqual(daisy.db.sqlalchemy.models.AssignedNetworks,
|
||||
type(assigned_network['network']))
|
||||
|
||||
@mock.patch('daisy.db.sqlalchemy.api.'
|
||||
'get_assigned_networks_by_network_id')
|
||||
def test_get_assigned_networks_by_network_id_notfound(
|
||||
self, mock_get_assigned_networks_by_network_id):
|
||||
id = '2'
|
||||
self.req = webob.Request.blank('/')
|
||||
self.req.context = RequestContext(is_admin=True, user='fake user',
|
||||
tenant='fake tenant')
|
||||
mock_get_assigned_networks_by_network_id.side_effect = \
|
||||
fake_network_id(id)
|
||||
self.assertRaises(webob.exc.HTTPNotFound,
|
||||
self.controller.get_assigned_networks_by_network_id,
|
||||
self.req, id)
|
||||
|
||||
@mock.patch('daisy.db.sqlalchemy.api.'
|
||||
'get_assigned_networks_by_network_id')
|
||||
def test_get_assigned_networks_by_network_id_exception(
|
||||
self, mock_get_assigned_networks_by_network_id):
|
||||
id = '3'
|
||||
self.req = webob.Request.blank('/')
|
||||
self.req.context = RequestContext(is_admin=True, user='fake user',
|
||||
tenant='fake tenant')
|
||||
mock_get_assigned_networks_by_network_id.side_effect = \
|
||||
fake_network_id(id)
|
||||
self.assertRaises(exception.Conflict,
|
||||
self.controller.get_assigned_networks_by_network_id,
|
||||
self.req, id)
|
||||
Reference in New Issue
Block a user