Skip to content

Commit

Permalink
Fix missing subnetpool_id in neutron subnet
Browse files Browse the repository at this point in the history
If there is no subnetpool name option in libnetwork request, new
subnet created with missing subnetpool.

This patch fetching subnetpool by pool_cidr params.

Change-Id: Ifecb7a70b838b20aa1f1e93550c9fcef119135a5
Closes-bug: #1634379
  • Loading branch information
Liping Mao authored and hellochosen committed Dec 5, 2016
1 parent 56d288f commit 93db824
Show file tree
Hide file tree
Showing 4 changed files with 213 additions and 103 deletions.
3 changes: 3 additions & 0 deletions kuryr_libnetwork/controllers.py
Expand Up @@ -569,6 +569,9 @@ def network_driver_create_network():
neutron_name = generic_options.get(const.NEUTRON_NAME_OPTION)
pool_name = generic_options.get(const.NEUTRON_POOL_NAME_OPTION)

if not pool_name:
pool_name = lib_utils.get_neutron_subnetpool_name(pool_cidr)

if pool_name:
pools = _get_subnetpools_by_attrs(name=pool_name)
if pools:
Expand Down
204 changes: 135 additions & 69 deletions kuryr_libnetwork/tests/unit/test_kuryr.py
Expand Up @@ -67,6 +67,31 @@ def test_network_driver_create_network(self):
"admin_state_up": True
}
}

network_request = {
'NetworkID': docker_network_id,
'IPv4Data': [{
'AddressSpace': 'foo',
'Pool': '192.168.42.0/24',
'Gateway': '192.168.42.1/24',
}],
'IPv6Data': [{
'AddressSpace': 'bar',
'Pool': 'fe80::/64',
'Gateway': 'fe80::f816:3eff:fe20:57c3/64',
}],
'Options': {}
}

self.mox.StubOutWithMock(app.neutron, "list_subnetpools")
fake_kuryr_subnetpool_id = uuidutils.generate_uuid()
fake_name = lib_utils.get_neutron_subnetpool_name(
network_request['IPv4Data'][0]['Pool'])
kuryr_subnetpools = self._get_fake_v4_subnetpools(
fake_kuryr_subnetpool_id, name=fake_name)
app.neutron.list_subnetpools(name=fake_name).AndReturn(
{'subnetpools': kuryr_subnetpools['subnetpools']})

# The following fake response is retrieved from the Neutron doc:
# http://developer.openstack.org/api-ref-networking-v2.html#createNetwork # noqa
fake_neutron_net_id = "4e8e5957-649f-477b-9e5b-f1f75b21c03c"
Expand Down Expand Up @@ -108,11 +133,13 @@ def test_network_driver_create_network(self):
'cidr': fake_cidr_v4,
'enable_dhcp': app.enable_dhcp,
'gateway_ip': '192.168.42.1',
'subnetpool_id': fake_kuryr_subnetpool_id
}]
}
subnet_v4_id = uuidutils.generate_uuid()
fake_v4_subnet = self._get_fake_v4_subnet(
fake_neutron_net_id, subnet_v4_id,
fake_kuryr_subnetpool_id,
name=fake_cidr_v4, cidr=fake_cidr_v4)
fake_subnet_response = {
'subnets': [
Expand All @@ -124,6 +151,16 @@ def test_network_driver_create_network(self):

self.mox.ReplayAll()

response = self.app.post('/NetworkDriver.CreateNetwork',
content_type='application/json',
data=jsonutils.dumps(network_request))

self.assertEqual(200, response.status_code)
decoded_json = jsonutils.loads(response.data)
self.assertEqual(constants.SCHEMA['SUCCESS'], decoded_json)

def test_network_driver_create_network_with_net_name_option(self):
docker_network_id = lib_utils.get_hash()
network_request = {
'NetworkID': docker_network_id,
'IPv4Data': [{
Expand All @@ -136,18 +173,23 @@ def test_network_driver_create_network(self):
'Pool': 'fe80::/64',
'Gateway': 'fe80::f816:3eff:fe20:57c3/64',
}],
'Options': {}
'Options': {
'com.docker.network.enable_ipv6': False,
'com.docker.network.generic': {
'neutron.net.name': 'my_network_name'
}
}
}
response = self.app.post('/NetworkDriver.CreateNetwork',
content_type='application/json',
data=jsonutils.dumps(network_request))

self.assertEqual(200, response.status_code)
decoded_json = jsonutils.loads(response.data)
self.assertEqual(constants.SCHEMA['SUCCESS'], decoded_json)
self.mox.StubOutWithMock(app.neutron, "list_subnetpools")
fake_kuryr_subnetpool_id = uuidutils.generate_uuid()
fake_name = lib_utils.get_neutron_subnetpool_name(
network_request['IPv4Data'][0]['Pool'])
kuryr_subnetpools = self._get_fake_v4_subnetpools(
fake_kuryr_subnetpool_id, name=fake_name)
app.neutron.list_subnetpools(name=fake_name).AndReturn(
{'subnetpools': kuryr_subnetpools['subnetpools']})

def test_network_driver_create_network_with_net_name_option(self):
docker_network_id = lib_utils.get_hash()
fake_neutron_net_id = "4e8e5957-649f-477b-9e5b-f1f75b21c03c"
self.mox.StubOutWithMock(app.neutron, "list_networks")
fake_neutron_net_name = 'my_network_name'
Expand Down Expand Up @@ -193,11 +235,13 @@ def test_network_driver_create_network_with_net_name_option(self):
'cidr': fake_cidr_v4,
'enable_dhcp': app.enable_dhcp,
'gateway_ip': '192.168.42.1',
'subnetpool_id': fake_kuryr_subnetpool_id
}]
}
subnet_v4_id = uuidutils.generate_uuid()
fake_v4_subnet = self._get_fake_v4_subnet(
fake_neutron_net_id, subnet_v4_id,
fake_kuryr_subnetpool_id,
name=fake_cidr_v4, cidr=fake_cidr_v4)
fake_subnet_response = {
'subnets': [
Expand All @@ -209,6 +253,17 @@ def test_network_driver_create_network_with_net_name_option(self):

self.mox.ReplayAll()

response = self.app.post('/NetworkDriver.CreateNetwork',
content_type='application/json',
data=jsonutils.dumps(network_request))

self.assertEqual(200, response.status_code)
decoded_json = jsonutils.loads(response.data)
self.assertEqual(constants.SCHEMA['SUCCESS'], decoded_json)

def test_network_driver_create_network_with_netid_option(self):
docker_network_id = lib_utils.get_hash()
fake_neutron_net_id = "4e8e5957-649f-477b-9e5b-f1f75b21c03c"
network_request = {
'NetworkID': docker_network_id,
'IPv4Data': [{
Expand All @@ -224,21 +279,20 @@ def test_network_driver_create_network_with_net_name_option(self):
'Options': {
'com.docker.network.enable_ipv6': False,
'com.docker.network.generic': {
'neutron.net.name': 'my_network_name'
'neutron.net.uuid': fake_neutron_net_id
}
}
}
response = self.app.post('/NetworkDriver.CreateNetwork',
content_type='application/json',
data=jsonutils.dumps(network_request))

self.assertEqual(200, response.status_code)
decoded_json = jsonutils.loads(response.data)
self.assertEqual(constants.SCHEMA['SUCCESS'], decoded_json)
self.mox.StubOutWithMock(app.neutron, "list_subnetpools")
fake_kuryr_subnetpool_id = uuidutils.generate_uuid()
fake_name = lib_utils.get_neutron_subnetpool_name(
network_request['IPv4Data'][0]['Pool'])
kuryr_subnetpools = self._get_fake_v4_subnetpools(
fake_kuryr_subnetpool_id, name=fake_name)
app.neutron.list_subnetpools(name=fake_name).AndReturn(
{'subnetpools': kuryr_subnetpools['subnetpools']})

def test_network_driver_create_network_with_netid_option(self):
docker_network_id = lib_utils.get_hash()
fake_neutron_net_id = "4e8e5957-649f-477b-9e5b-f1f75b21c03c"
self.mox.StubOutWithMock(app.neutron, "list_networks")
fake_existing_networks_response = {
"networks": [{
Expand Down Expand Up @@ -281,11 +335,13 @@ def test_network_driver_create_network_with_netid_option(self):
'cidr': fake_cidr_v4,
'enable_dhcp': app.enable_dhcp,
'gateway_ip': '192.168.42.1',
'subnetpool_id': fake_kuryr_subnetpool_id
}]
}
subnet_v4_id = uuidutils.generate_uuid()
fake_v4_subnet = self._get_fake_v4_subnet(
fake_neutron_net_id, subnet_v4_id,
fake_kuryr_subnetpool_id,
name=fake_cidr_v4, cidr=fake_cidr_v4)
fake_subnet_response = {
'subnets': [
Expand All @@ -297,25 +353,6 @@ def test_network_driver_create_network_with_netid_option(self):

self.mox.ReplayAll()

network_request = {
'NetworkID': docker_network_id,
'IPv4Data': [{
'AddressSpace': 'foo',
'Pool': '192.168.42.0/24',
'Gateway': '192.168.42.1/24',
}],
'IPv6Data': [{
'AddressSpace': 'bar',
'Pool': 'fe80::/64',
'Gateway': 'fe80::f816:3eff:fe20:57c3/64',
}],
'Options': {
'com.docker.network.enable_ipv6': False,
'com.docker.network.generic': {
'neutron.net.uuid': '4e8e5957-649f-477b-9e5b-f1f75b21c03c'
}
}
}
response = self.app.post('/NetworkDriver.CreateNetwork',
content_type='application/json',
data=jsonutils.dumps(network_request))
Expand Down Expand Up @@ -428,6 +465,29 @@ def test_network_driver_create_network_with_pool_name_option(self):

def test_network_driver_create_network_wo_gw(self):
docker_network_id = lib_utils.get_hash()
network_request = {
'NetworkID': docker_network_id,
'IPv4Data': [{
'AddressSpace': 'foo',
'Pool': '192.168.42.0/24',
}],
'IPv6Data': [{
'AddressSpace': 'bar',
'Pool': 'fe80::/64',
'Gateway': 'fe80::f816:3eff:fe20:57c3/64',
}],
'Options': {}
}

self.mox.StubOutWithMock(app.neutron, "list_subnetpools")
fake_kuryr_subnetpool_id = uuidutils.generate_uuid()
fake_name = lib_utils.get_neutron_subnetpool_name(
network_request['IPv4Data'][0]['Pool'])
kuryr_subnetpools = self._get_fake_v4_subnetpools(
fake_kuryr_subnetpool_id, name=fake_name)
app.neutron.list_subnetpools(name=fake_name).AndReturn(
{'subnetpools': kuryr_subnetpools['subnetpools']})

self.mox.StubOutWithMock(app.neutron, "create_network")
fake_request = {
"network": {
Expand Down Expand Up @@ -475,11 +535,13 @@ def test_network_driver_create_network_wo_gw(self):
'ip_version': 4,
'cidr': fake_cidr_v4,
'enable_dhcp': app.enable_dhcp,
'subnetpool_id': fake_kuryr_subnetpool_id
}]
}
subnet_v4_id = uuidutils.generate_uuid()
fake_v4_subnet = self._get_fake_v4_subnet(
fake_neutron_net_id, subnet_v4_id,
fake_kuryr_subnetpool_id,
name=fake_cidr_v4, cidr=fake_cidr_v4)
fake_subnet_response = {
'subnets': [
Expand All @@ -491,19 +553,6 @@ def test_network_driver_create_network_wo_gw(self):

self.mox.ReplayAll()

network_request = {
'NetworkID': docker_network_id,
'IPv4Data': [{
'AddressSpace': 'foo',
'Pool': '192.168.42.0/24',
}],
'IPv6Data': [{
'AddressSpace': 'bar',
'Pool': 'fe80::/64',
'Gateway': 'fe80::f816:3eff:fe20:57c3/64',
}],
'Options': {}
}
response = self.app.post('/NetworkDriver.CreateNetwork',
content_type='application/json',
data=jsonutils.dumps(network_request))
Expand All @@ -514,16 +563,7 @@ def test_network_driver_create_network_wo_gw(self):

def test_network_driver_create_network_with_network_id_not_exist(self):
docker_network_id = lib_utils.get_hash()

self.mox.StubOutWithMock(app.neutron, "list_networks")
fake_neutron_net_id = uuidutils.generate_uuid()
fake_existing_networks_response = {
"networks": []
}
app.neutron.list_networks(
id=fake_neutron_net_id).AndReturn(
fake_existing_networks_response)
self.mox.ReplayAll()
network_request = {
'NetworkID': docker_network_id,
'IPv4Data': [{
Expand All @@ -541,6 +581,24 @@ def test_network_driver_create_network_with_network_id_not_exist(self):
}
}
}

self.mox.StubOutWithMock(app.neutron, "list_subnetpools")
fake_kuryr_subnetpool_id = uuidutils.generate_uuid()
fake_name = lib_utils.get_neutron_subnetpool_name(
network_request['IPv4Data'][0]['Pool'])
kuryr_subnetpools = self._get_fake_v4_subnetpools(
fake_kuryr_subnetpool_id, name=fake_name)
app.neutron.list_subnetpools(name=fake_name).AndReturn(
{'subnetpools': kuryr_subnetpools['subnetpools']})

self.mox.StubOutWithMock(app.neutron, "list_networks")
fake_existing_networks_response = {
"networks": []
}
app.neutron.list_networks(
id=fake_neutron_net_id).AndReturn(
fake_existing_networks_response)
self.mox.ReplayAll()
response = self.app.post('/NetworkDriver.CreateNetwork',
content_type='application/json',
data=jsonutils.dumps(network_request))
Expand All @@ -553,16 +611,7 @@ def test_network_driver_create_network_with_network_id_not_exist(self):

def test_network_driver_create_network_with_network_name_not_exist(self):
docker_network_id = lib_utils.get_hash()

self.mox.StubOutWithMock(app.neutron, "list_networks")
fake_neutron_network_name = "fake_network"
fake_existing_networks_response = {
"networks": []
}
app.neutron.list_networks(
name=fake_neutron_network_name).AndReturn(
fake_existing_networks_response)
self.mox.ReplayAll()
network_request = {
'NetworkID': docker_network_id,
'IPv4Data': [{
Expand All @@ -580,6 +629,23 @@ def test_network_driver_create_network_with_network_name_not_exist(self):
}
}
}
self.mox.StubOutWithMock(app.neutron, "list_subnetpools")
fake_kuryr_subnetpool_id = uuidutils.generate_uuid()
fake_name = lib_utils.get_neutron_subnetpool_name(
network_request['IPv4Data'][0]['Pool'])
kuryr_subnetpools = self._get_fake_v4_subnetpools(
fake_kuryr_subnetpool_id, name=fake_name)
app.neutron.list_subnetpools(name=fake_name).AndReturn(
{'subnetpools': kuryr_subnetpools['subnetpools']})

self.mox.StubOutWithMock(app.neutron, "list_networks")
fake_existing_networks_response = {
"networks": []
}
app.neutron.list_networks(
name=fake_neutron_network_name).AndReturn(
fake_existing_networks_response)
self.mox.ReplayAll()
response = self.app.post('/NetworkDriver.CreateNetwork',
content_type='application/json',
data=jsonutils.dumps(network_request))
Expand Down

0 comments on commit 93db824

Please sign in to comment.