Delete kuryr-subnet in existing Neutron network
When we create docker network using existing Neutron network, we should delete the subnet created by kuryr. Otherwise, there will leave the subnet and subnetpool undeleted. Change-Id: Ieb93bb935e52fb5cd3043a1c5c60656b93a37298 Closes-Bug: #1650130
This commit is contained in:
parent
401eb3744b
commit
678dafbad8
@ -30,6 +30,7 @@ PROTOCOLS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NET_NAME_PREFIX = 'kuryr-net-'
|
NET_NAME_PREFIX = 'kuryr-net-'
|
||||||
|
SUBNET_NAME_PREFIX = 'kuryr-subnet-'
|
||||||
NEUTRON_ID_LH_OPTION = 'kuryr.net.uuid.lh'
|
NEUTRON_ID_LH_OPTION = 'kuryr.net.uuid.lh'
|
||||||
NEUTRON_ID_UH_OPTION = 'kuryr.net.uuid.uh'
|
NEUTRON_ID_UH_OPTION = 'kuryr.net.uuid.uh'
|
||||||
|
|
||||||
|
@ -640,7 +640,7 @@ def network_driver_create_network():
|
|||||||
|
|
||||||
if not subnets:
|
if not subnets:
|
||||||
new_subnets = [{
|
new_subnets = [{
|
||||||
'name': pool_cidr,
|
'name': utils.make_subnet_name(pool_cidr),
|
||||||
'network_id': network_id,
|
'network_id': network_id,
|
||||||
'ip_version': cidr.version,
|
'ip_version': cidr.version,
|
||||||
'cidr': six.text_type(cidr),
|
'cidr': six.text_type(cidr),
|
||||||
@ -699,6 +699,20 @@ def network_driver_delete_network():
|
|||||||
_neutron_net_remove_tags(neutron_net_id, container_net_id)
|
_neutron_net_remove_tags(neutron_net_id, container_net_id)
|
||||||
_neutron_net_remove_tag(neutron_net_id,
|
_neutron_net_remove_tag(neutron_net_id,
|
||||||
const.KURYR_EXISTING_NEUTRON_NET)
|
const.KURYR_EXISTING_NEUTRON_NET)
|
||||||
|
# Delete subnets created by kuryr
|
||||||
|
filtered_subnets = _get_subnets_by_attrs(
|
||||||
|
network_id=neutron_net_id)
|
||||||
|
for subnet in filtered_subnets:
|
||||||
|
try:
|
||||||
|
subnet_name = subnet.get('name')
|
||||||
|
if str(subnet_name).startswith(const.SUBNET_NAME_PREFIX):
|
||||||
|
app.neutron.delete_subnet(subnet['id'])
|
||||||
|
except n_exceptions.Conflict as ex:
|
||||||
|
app.logger.error(_LE("Subnet %s is in use, "
|
||||||
|
"can't be deleted."), subnet['id'])
|
||||||
|
except n_exceptions.NeutronClientException as ex:
|
||||||
|
app.logger.error(_LE("Error happened during deleting a "
|
||||||
|
"subnet created by kuryr: %s"), ex)
|
||||||
return flask.jsonify(const.SCHEMA['SUCCESS'])
|
return flask.jsonify(const.SCHEMA['SUCCESS'])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -127,7 +127,7 @@ class TestKuryr(base.TestKuryrBase):
|
|||||||
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
||||||
fake_subnet_request = {
|
fake_subnet_request = {
|
||||||
"subnets": [{
|
"subnets": [{
|
||||||
'name': fake_cidr_v4,
|
'name': utils.make_subnet_name(fake_cidr_v4),
|
||||||
'network_id': fake_neutron_net_id,
|
'network_id': fake_neutron_net_id,
|
||||||
'ip_version': 4,
|
'ip_version': 4,
|
||||||
'cidr': fake_cidr_v4,
|
'cidr': fake_cidr_v4,
|
||||||
@ -229,7 +229,7 @@ class TestKuryr(base.TestKuryrBase):
|
|||||||
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
||||||
fake_subnet_request = {
|
fake_subnet_request = {
|
||||||
"subnets": [{
|
"subnets": [{
|
||||||
'name': fake_cidr_v4,
|
'name': utils.make_subnet_name(fake_cidr_v4),
|
||||||
'network_id': fake_neutron_net_id,
|
'network_id': fake_neutron_net_id,
|
||||||
'ip_version': 4,
|
'ip_version': 4,
|
||||||
'cidr': fake_cidr_v4,
|
'cidr': fake_cidr_v4,
|
||||||
@ -329,7 +329,7 @@ class TestKuryr(base.TestKuryrBase):
|
|||||||
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
||||||
fake_subnet_request = {
|
fake_subnet_request = {
|
||||||
"subnets": [{
|
"subnets": [{
|
||||||
'name': fake_cidr_v4,
|
'name': utils.make_subnet_name(fake_cidr_v4),
|
||||||
'network_id': fake_neutron_net_id,
|
'network_id': fake_neutron_net_id,
|
||||||
'ip_version': 4,
|
'ip_version': 4,
|
||||||
'cidr': fake_cidr_v4,
|
'cidr': fake_cidr_v4,
|
||||||
@ -413,7 +413,7 @@ class TestKuryr(base.TestKuryrBase):
|
|||||||
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
||||||
fake_subnet_request = {
|
fake_subnet_request = {
|
||||||
"subnets": [{
|
"subnets": [{
|
||||||
'name': fake_cidr_v4,
|
'name': utils.make_subnet_name(fake_cidr_v4),
|
||||||
'network_id': fake_neutron_net_id,
|
'network_id': fake_neutron_net_id,
|
||||||
'ip_version': 4,
|
'ip_version': 4,
|
||||||
'cidr': fake_cidr_v4,
|
'cidr': fake_cidr_v4,
|
||||||
@ -530,7 +530,7 @@ class TestKuryr(base.TestKuryrBase):
|
|||||||
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
self.mox.StubOutWithMock(app.neutron, 'create_subnet')
|
||||||
fake_subnet_request = {
|
fake_subnet_request = {
|
||||||
"subnets": [{
|
"subnets": [{
|
||||||
'name': fake_cidr_v4,
|
'name': utils.make_subnet_name(fake_cidr_v4),
|
||||||
'network_id': fake_neutron_net_id,
|
'network_id': fake_neutron_net_id,
|
||||||
'ip_version': 4,
|
'ip_version': 4,
|
||||||
'cidr': fake_cidr_v4,
|
'cidr': fake_cidr_v4,
|
||||||
|
@ -99,7 +99,7 @@ class TestKuryrNetworkPreExisting(base.TestKuryrBase):
|
|||||||
|
|
||||||
fake_subnet_request = {
|
fake_subnet_request = {
|
||||||
"subnets": [{
|
"subnets": [{
|
||||||
'name': fake_cidr_v4,
|
'name': utils.make_subnet_name(fake_cidr_v4),
|
||||||
'network_id': fake_neutron_net_id,
|
'network_id': fake_neutron_net_id,
|
||||||
'ip_version': 4,
|
'ip_version': 4,
|
||||||
'cidr': fake_cidr_v4,
|
'cidr': fake_cidr_v4,
|
||||||
@ -148,19 +148,41 @@ class TestKuryrNetworkPreExisting(base.TestKuryrBase):
|
|||||||
|
|
||||||
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_subnets')
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_subnets')
|
||||||
@mock.patch('kuryr_libnetwork.controllers.app.neutron.delete_network')
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.delete_network')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.delete_subnet')
|
||||||
@mock.patch('kuryr_libnetwork.controllers.app.neutron.remove_tag')
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.remove_tag')
|
||||||
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_networks')
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_networks')
|
||||||
@mock.patch('kuryr_libnetwork.controllers.app')
|
@mock.patch('kuryr_libnetwork.controllers.app')
|
||||||
@ddt.data(
|
@ddt.data(
|
||||||
(True), (False))
|
(True), (False))
|
||||||
def test_delete_network_pre_existing(self, use_tags,
|
def test_delete_network_pre_existing_neutron_kuryr_subnets_pre_created(
|
||||||
|
self, use_tags,
|
||||||
mock_tag, mock_list_networks, mock_remove_tag,
|
mock_tag, mock_list_networks, mock_remove_tag,
|
||||||
mock_delete_network, mock_list_subnets):
|
mock_delete_subnet, mock_delete_network, mock_list_subnets):
|
||||||
if not use_tags:
|
if not use_tags:
|
||||||
mock_tag.tag = use_tags
|
mock_tag.tag = use_tags
|
||||||
|
|
||||||
docker_network_id, fake_neutron_net_id, fake_response = self._ids()
|
docker_network_id, fake_neutron_net_id, _ = self._ids()
|
||||||
mock_list_networks.return_value = fake_response
|
# fake pre-existed kuryr subnet
|
||||||
|
kuryr_subnet_v4_id = uuidutils.generate_uuid()
|
||||||
|
kuryr_fake_cidr_v4 = '192.168.4.0/24'
|
||||||
|
kuryr_fake_v4_subnet = self._get_fake_v4_subnet(
|
||||||
|
fake_neutron_net_id, subnet_v4_id=kuryr_subnet_v4_id,
|
||||||
|
subnetpool_id=uuidutils.generate_uuid(),
|
||||||
|
cidr=kuryr_fake_cidr_v4,
|
||||||
|
name=utils.make_subnet_name(kuryr_fake_cidr_v4))
|
||||||
|
|
||||||
|
# fake pre-existed neutron subnet
|
||||||
|
neutron_subnet_v4_id = uuidutils.generate_uuid()
|
||||||
|
neutron_fake_v4_subnet = self._get_fake_v4_subnet(
|
||||||
|
fake_neutron_net_id, subnet_v4_id=neutron_subnet_v4_id,
|
||||||
|
name='fake_name')
|
||||||
|
|
||||||
|
fake_existing_subnets_response = {
|
||||||
|
"subnets": [
|
||||||
|
kuryr_fake_v4_subnet['subnet'],
|
||||||
|
neutron_fake_v4_subnet['subnet']
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
if mock_tag.tag:
|
if mock_tag.tag:
|
||||||
t = utils.make_net_tags(docker_network_id)
|
t = utils.make_net_tags(docker_network_id)
|
||||||
@ -170,9 +192,28 @@ class TestKuryrNetworkPreExisting(base.TestKuryrBase):
|
|||||||
fake_existing_subnets_response = {
|
fake_existing_subnets_response = {
|
||||||
"subnets": []
|
"subnets": []
|
||||||
}
|
}
|
||||||
mock_list_subnets.return_value = fake_existing_subnets_response
|
|
||||||
mock_delete_network.return_value = None
|
mock_delete_network.return_value = None
|
||||||
|
|
||||||
|
fake_neutron_existing_network_response = {
|
||||||
|
'networks':
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"subnets": fake_existing_subnets_response["subnets"],
|
||||||
|
"admin_state_up": True,
|
||||||
|
"tenant_id": "9bacb3c5d39d41a79512987f338cf177",
|
||||||
|
"router:external": False,
|
||||||
|
"segments": [],
|
||||||
|
"shared": False,
|
||||||
|
"id": fake_neutron_net_id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
mock_list_networks.return_value = (
|
||||||
|
fake_neutron_existing_network_response)
|
||||||
|
mock_list_subnets.return_value = fake_existing_subnets_response
|
||||||
|
|
||||||
data = {'NetworkID': docker_network_id}
|
data = {'NetworkID': docker_network_id}
|
||||||
response = self.app.post('/NetworkDriver.DeleteNetwork',
|
response = self.app.post('/NetworkDriver.DeleteNetwork',
|
||||||
content_type='application/json',
|
content_type='application/json',
|
||||||
@ -186,6 +227,178 @@ class TestKuryrNetworkPreExisting(base.TestKuryrBase):
|
|||||||
fake_neutron_net_id, tag)
|
fake_neutron_net_id, tag)
|
||||||
mock_remove_tag.assert_any_call('networks',
|
mock_remove_tag.assert_any_call('networks',
|
||||||
fake_neutron_net_id, const.KURYR_EXISTING_NEUTRON_NET)
|
fake_neutron_net_id, const.KURYR_EXISTING_NEUTRON_NET)
|
||||||
|
mock_list_subnets.assert_called_with(
|
||||||
|
network_id=fake_neutron_net_id)
|
||||||
|
mock_delete_subnet.assert_called_once_with(kuryr_subnet_v4_id)
|
||||||
|
self.assertEqual(1, mock_delete_subnet.call_count)
|
||||||
|
else:
|
||||||
|
mock_list_networks.assert_any_call(name=docker_network_id)
|
||||||
|
mock_list_subnets.assert_called_with(
|
||||||
|
network_id=fake_neutron_net_id)
|
||||||
|
mock_delete_network.assert_called_with(fake_neutron_net_id)
|
||||||
|
|
||||||
|
decoded_json = jsonutils.loads(response.data)
|
||||||
|
self.assertEqual(const.SCHEMA['SUCCESS'], decoded_json)
|
||||||
|
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_subnets')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.delete_network')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.remove_tag')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_networks')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app')
|
||||||
|
@ddt.data(
|
||||||
|
(True), (False))
|
||||||
|
def test_delete_network_pre_existing_neutron_subnets_pre_created(
|
||||||
|
self, use_tags,
|
||||||
|
mock_tag, mock_list_networks, mock_remove_tag,
|
||||||
|
mock_delete_network, mock_list_subnets):
|
||||||
|
if not use_tags:
|
||||||
|
mock_tag.tag = use_tags
|
||||||
|
|
||||||
|
docker_network_id, fake_neutron_net_id, _ = self._ids()
|
||||||
|
|
||||||
|
# fake pre-existed neutron subnet
|
||||||
|
neutron_subnet_v4_id = uuidutils.generate_uuid()
|
||||||
|
neutron_fake_v4_subnet = self._get_fake_v4_subnet(
|
||||||
|
fake_neutron_net_id, subnet_v4_id=neutron_subnet_v4_id,
|
||||||
|
name='fake_name')
|
||||||
|
|
||||||
|
fake_existing_subnets_response = {
|
||||||
|
"subnets": [
|
||||||
|
neutron_fake_v4_subnet['subnet']
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
if mock_tag.tag:
|
||||||
|
t = utils.make_net_tags(docker_network_id)
|
||||||
|
te = t + ',' + const.KURYR_EXISTING_NEUTRON_NET
|
||||||
|
tags = utils.create_net_tags(docker_network_id)
|
||||||
|
else:
|
||||||
|
fake_existing_subnets_response = {
|
||||||
|
"subnets": []
|
||||||
|
}
|
||||||
|
mock_delete_network.return_value = None
|
||||||
|
|
||||||
|
fake_neutron_existing_network_response = {
|
||||||
|
'networks':
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"subnets": fake_existing_subnets_response["subnets"],
|
||||||
|
"admin_state_up": True,
|
||||||
|
"tenant_id": "9bacb3c5d39d41a79512987f338cf177",
|
||||||
|
"router:external": False,
|
||||||
|
"segments": [],
|
||||||
|
"shared": False,
|
||||||
|
"id": fake_neutron_net_id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
mock_list_networks.return_value = (
|
||||||
|
fake_neutron_existing_network_response)
|
||||||
|
mock_list_subnets.return_value = fake_existing_subnets_response
|
||||||
|
|
||||||
|
data = {'NetworkID': docker_network_id}
|
||||||
|
response = self.app.post('/NetworkDriver.DeleteNetwork',
|
||||||
|
content_type='application/json',
|
||||||
|
data=jsonutils.dumps(data))
|
||||||
|
|
||||||
|
self.assertEqual(200, response.status_code)
|
||||||
|
if mock_tag.tag:
|
||||||
|
mock_list_networks.assert_any_call(tags=te)
|
||||||
|
for tag in tags:
|
||||||
|
mock_remove_tag.assert_any_call('networks',
|
||||||
|
fake_neutron_net_id, tag)
|
||||||
|
mock_remove_tag.assert_any_call('networks',
|
||||||
|
fake_neutron_net_id, const.KURYR_EXISTING_NEUTRON_NET)
|
||||||
|
mock_list_subnets.assert_called_with(
|
||||||
|
network_id=fake_neutron_net_id)
|
||||||
|
else:
|
||||||
|
mock_list_networks.assert_any_call(name=docker_network_id)
|
||||||
|
mock_list_subnets.assert_called_with(
|
||||||
|
network_id=fake_neutron_net_id)
|
||||||
|
mock_delete_network.assert_called_with(fake_neutron_net_id)
|
||||||
|
|
||||||
|
decoded_json = jsonutils.loads(response.data)
|
||||||
|
self.assertEqual(const.SCHEMA['SUCCESS'], decoded_json)
|
||||||
|
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_subnets')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.delete_network')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.delete_subnet')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.remove_tag')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app.neutron.list_networks')
|
||||||
|
@mock.patch('kuryr_libnetwork.controllers.app')
|
||||||
|
@ddt.data(
|
||||||
|
(True), (False))
|
||||||
|
def test_delete_network_pre_existing_kuryr_subnets_pre_created(
|
||||||
|
self, use_tags,
|
||||||
|
mock_tag, mock_list_networks, mock_remove_tag,
|
||||||
|
mock_delete_subnet, mock_delete_network, mock_list_subnets):
|
||||||
|
if not use_tags:
|
||||||
|
mock_tag.tag = use_tags
|
||||||
|
|
||||||
|
docker_network_id, fake_neutron_net_id, _ = self._ids()
|
||||||
|
# fake pre-existed kuryr subnet
|
||||||
|
kuryr_subnet_v4_id = uuidutils.generate_uuid()
|
||||||
|
kuryr_fake_cidr_v4 = '192.168.4.0/24'
|
||||||
|
kuryr_fake_v4_subnet = self._get_fake_v4_subnet(
|
||||||
|
fake_neutron_net_id, subnet_v4_id=kuryr_subnet_v4_id,
|
||||||
|
subnetpool_id=uuidutils.generate_uuid(),
|
||||||
|
cidr=kuryr_fake_cidr_v4,
|
||||||
|
name=utils.make_subnet_name(kuryr_fake_cidr_v4))
|
||||||
|
|
||||||
|
fake_existing_subnets_response = {
|
||||||
|
"subnets": [
|
||||||
|
kuryr_fake_v4_subnet['subnet']
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
if mock_tag.tag:
|
||||||
|
t = utils.make_net_tags(docker_network_id)
|
||||||
|
te = t + ',' + const.KURYR_EXISTING_NEUTRON_NET
|
||||||
|
tags = utils.create_net_tags(docker_network_id)
|
||||||
|
else:
|
||||||
|
fake_existing_subnets_response = {
|
||||||
|
"subnets": []
|
||||||
|
}
|
||||||
|
mock_delete_network.return_value = None
|
||||||
|
|
||||||
|
fake_neutron_existing_network_response = {
|
||||||
|
'networks':
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"subnets": fake_existing_subnets_response["subnets"],
|
||||||
|
"admin_state_up": True,
|
||||||
|
"tenant_id": "9bacb3c5d39d41a79512987f338cf177",
|
||||||
|
"router:external": False,
|
||||||
|
"segments": [],
|
||||||
|
"shared": False,
|
||||||
|
"id": fake_neutron_net_id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
mock_list_networks.return_value = (
|
||||||
|
fake_neutron_existing_network_response)
|
||||||
|
mock_list_subnets.return_value = fake_existing_subnets_response
|
||||||
|
|
||||||
|
data = {'NetworkID': docker_network_id}
|
||||||
|
response = self.app.post('/NetworkDriver.DeleteNetwork',
|
||||||
|
content_type='application/json',
|
||||||
|
data=jsonutils.dumps(data))
|
||||||
|
|
||||||
|
self.assertEqual(200, response.status_code)
|
||||||
|
if mock_tag.tag:
|
||||||
|
mock_list_networks.assert_any_call(tags=te)
|
||||||
|
for tag in tags:
|
||||||
|
mock_remove_tag.assert_any_call('networks',
|
||||||
|
fake_neutron_net_id, tag)
|
||||||
|
mock_remove_tag.assert_any_call('networks',
|
||||||
|
fake_neutron_net_id, const.KURYR_EXISTING_NEUTRON_NET)
|
||||||
|
mock_list_subnets.assert_called_with(
|
||||||
|
network_id=fake_neutron_net_id)
|
||||||
|
mock_delete_subnet.assert_called_once_with(kuryr_subnet_v4_id)
|
||||||
else:
|
else:
|
||||||
mock_list_networks.assert_any_call(name=docker_network_id)
|
mock_list_networks.assert_any_call(name=docker_network_id)
|
||||||
mock_list_subnets.assert_called_with(
|
mock_list_subnets.assert_called_with(
|
||||||
|
@ -117,3 +117,7 @@ def make_net_name(netid, tags=True):
|
|||||||
if tags:
|
if tags:
|
||||||
return const.NET_NAME_PREFIX + netid[:8]
|
return const.NET_NAME_PREFIX + netid[:8]
|
||||||
return netid
|
return netid
|
||||||
|
|
||||||
|
|
||||||
|
def make_subnet_name(pool_cidr):
|
||||||
|
return const.SUBNET_NAME_PREFIX + pool_cidr
|
||||||
|
Loading…
Reference in New Issue
Block a user