Fixed bug of deleting vm that is created with port

If resource group name is empty when the port is deleted,
get it from nwa_data.
The resource group name is corresponding with MAC address of the port.

Change-Id: I1fecef6dae0edf4484bc5d160b17d1e7a430b3bf
Closes-Bug: #1567139
This commit is contained in:
Shinji YANAGIDA 2016-04-07 08:47:18 +09:00 committed by Akihiro Motoki
parent cc4efc5ec3
commit 06a26a4c68
4 changed files with 118 additions and 0 deletions

View File

@ -20,6 +20,7 @@ from neutron.plugins.common import constants as plugin_const
from neutron.plugins.ml2 import driver_api as api
from oslo_log import helpers
from oslo_log import log as logging
import six
from networking_nec._i18n import _LE, _LI, _LW
from networking_nec.common import utils
@ -80,6 +81,25 @@ def check_segment_tfw(network_id, res_name, nwa_data):
nwa_const.NWA_DEVICE_TFW)
def get_resource_group_name(nwa_info, nwa_data, dev_type):
device_id = nwa_info['device']['id']
network_id = nwa_info['network']['id']
mac = nwa_info['port']['mac']
found_mac = None
found_dev_type = None
dev_prefix = 'DEV_%s_%s_' % (device_id, network_id)
for k, v in six.iteritems(nwa_data):
if not k.startswith(dev_prefix):
continue
if v == mac:
found_mac = k[len(dev_prefix):]
elif v == dev_type:
found_dev_type = k[len(dev_prefix):]
if found_mac and found_dev_type:
return found_dev_type
class AgentProxyL2(object):
def __init__(self, agent_top, client):
@ -398,6 +418,16 @@ class AgentProxyL2(object):
'nwa_tenant_id': nwa_tenant_id})
return {'result': 'FAILED'}
if not resource_group_name:
resource_group_name = get_resource_group_name(
nwa_info, nwa_data, nwa_const.NWA_DEVICE_GDV)
if not resource_group_name:
LOG.debug('skip delete_general_dev.'
' No nwa device is associated with'
' the port %s', nwa_info.get('port'))
return {'result': 'FAILED'}
nwa_info['resource_group_name'] = resource_group_name
gd_count = check_segment_gd(network_id, resource_group_name, nwa_data)
if 1 < gd_count:

View File

@ -0,0 +1,21 @@
{
"CreateTenant": true,
"CreateTenantNW": true,
"DEV_dhcpcea0d383-9268-577e-ba23-10e5e2d43886-315414a5-8d06-4d8e-8932-6f73665e5733": "device_id",
"DEV_dhcpcea0d383-9268-577e-ba23-10e5e2d43886-315414a5-8d06-4d8e-8932-6f73665e5733_315414a5-8d06-4d8e-8932-6f73665e5733": "LNetA",
"DEV_dhcpcea0d383-9268-577e-ba23-10e5e2d43886-315414a5-8d06-4d8e-8932-6f73665e5733_315414a5-8d06-4d8e-8932-6f73665e5733_OpenStack/DC/HA1": "GeneralDev",
"DEV_dhcpcea0d383-9268-577e-ba23-10e5e2d43886-315414a5-8d06-4d8e-8932-6f73665e5733_315414a5-8d06-4d8e-8932-6f73665e5733_ip_address": "192.168.1.1",
"DEV_dhcpcea0d383-9268-577e-ba23-10e5e2d43886-315414a5-8d06-4d8e-8932-6f73665e5733_315414a5-8d06-4d8e-8932-6f73665e5733_mac_address": "fa:16:3e:71:5c:2c",
"DEV_dhcpcea0d383-9268-577e-ba23-10e5e2d43886-315414a5-8d06-4d8e-8932-6f73665e5733_device_owner": "network:dhcp",
"NWA_tenant_id": "T01DC7483b391c2c647c59097240d59e705d4",
"NW_315414a5-8d06-4d8e-8932-6f73665e5733": "LNetA",
"NW_315414a5-8d06-4d8e-8932-6f73665e5733_network_id": "315414a5-8d06-4d8e-8932-6f73665e5733",
"NW_315414a5-8d06-4d8e-8932-6f73665e5733_nwa_network_name": "LNW_BusinessVLAN_448",
"NW_315414a5-8d06-4d8e-8932-6f73665e5733_subnet": "192.168.201.0",
"NW_315414a5-8d06-4d8e-8932-6f73665e5733_subnet_id": "44345c6f-f597-48c7-b97b-a0d8df39059b",
"VLAN_315414a5-8d06-4d8e-8932-6f73665e5733": "physical_network",
"VLAN_315414a5-8d06-4d8e-8932-6f73665e5733_CreateVlan": "",
"VLAN_315414a5-8d06-4d8e-8932-6f73665e5733_OpenStack/DC/HA1_GD": "physical_network",
"VLAN_315414a5-8d06-4d8e-8932-6f73665e5733_OpenStack/DC/HA1_GD_VlanID": "685",
"VLAN_315414a5-8d06-4d8e-8932-6f73665e5733_VlanID": ""
}

View File

@ -0,0 +1,26 @@
{
"device": {
"id": "dhcpcea0d383-9268-577e-ba23-10e5e2d43886-315414a5-8d06-4d8e-8932-6f73665e5733",
"owner": "compute:DC01_KVM01_ZONE01"
},
"network": {
"id": "315414a5-8d06-4d8e-8932-6f73665e5733",
"name": "LNetA",
"vlan_type": "BusinessVLAN"
},
"nwa_tenant_id": "T01DC7483b391c2c647c59097240d59e705d4",
"physical_network": "OpenStack/DC/HA1",
"port": {
"id": "4693c521-280c-4052-a95d-f2fd53052824",
"ip": "192.168.1.3",
"mac": "fa:16:3e:71:5c:2c"
},
"resource_group_name": null,
"resource_group_name_nw": "OpenStack/DC/APP",
"subnet": {
"id": "85fcc2a6-a121-4635-814d-04df134090ab",
"mask": "24",
"netaddr": "192.168.1.0"
},
"tenant_id": "7483b391c2c647c59097240d59e705d4"
}

View File

@ -343,6 +343,47 @@ def test_check_segment():
proxy_l2.check_segment(network_id, nwa_data)
class TestGetResourceGroupName(base.TestNWAAgentBase):
def setUp(self):
super(TestGetResourceGroupName, self).setUp()
self.nwa_info = load_data_file('nwa_info_get_resource_group_name.json')
self.nwa_data = load_data_file('nwa_data_get_resource_group_name.json')
self.dev_type = 'GeneralDev'
self.resource_group_name = 'OpenStack/DC/HA1'
def test_resource_group_name_found(self):
self.assertEqual(
proxy_l2.get_resource_group_name(self.nwa_info, self.nwa_data,
self.dev_type),
self.resource_group_name
)
def test_mac_not_found(self):
self.nwa_info['port']['mac'] = 'X'
self.assertIsNone(
proxy_l2.get_resource_group_name(self.nwa_info, self.nwa_data,
self.dev_type))
def test_network_id_not_found(self):
self.nwa_info['network']['id'] = 'X'
self.assertIsNone(
proxy_l2.get_resource_group_name(self.nwa_info, self.nwa_data,
self.dev_type))
def test_device_id_not_found(self):
self.nwa_info['device']['id'] = 'X'
self.assertIsNone(
proxy_l2.get_resource_group_name(self.nwa_info, self.nwa_data,
self.dev_type))
def test_dev_type_not_found(self):
dev_type = 'X'
self.assertIsNone(
proxy_l2.get_resource_group_name(self.nwa_info, self.nwa_data,
dev_type))
class TestNECNWANeutronAgentRpc(testscenarios.WithScenarios,
base.TestNWAAgentBase):