Merge "Always call port_update in allocate_for_instance"

This commit is contained in:
Jenkins 2016-06-30 15:38:10 +00:00 committed by Gerrit Code Review
commit 222a88a54c
2 changed files with 100 additions and 165 deletions

View File

@ -180,15 +180,13 @@ class API(base_api.NetworkAPI):
return nets return nets
def _create_port(self, port_client, instance, network_id, port_req_body, def _create_port_minimal(self, port_client, instance, network_id,
fixed_ip=None, security_group_ids=None): fixed_ip=None, security_group_ids=None):
"""Attempts to create a port for the instance on the given network. """Attempts to create a port for the instance on the given network.
:param port_client: The client to use to create the port. :param port_client: The client to use to create the port.
:param instance: Create the port for the given instance. :param instance: Create the port for the given instance.
:param network_id: Create the port on the given network. :param network_id: Create the port on the given network.
:param port_req_body: Pre-populated port request. Should have the
device_id, device_owner, and any required neutron extension values.
:param fixed_ip: Optional fixed IP to use from the given network. :param fixed_ip: Optional fixed IP to use from the given network.
:param security_group_ids: Optional list of security group IDs to :param security_group_ids: Optional list of security group IDs to
apply to the port. apply to the port.
@ -198,6 +196,7 @@ class API(base_api.NetworkAPI):
IpAddressGenerationFailure error. IpAddressGenerationFailure error.
:raises: PortBindingFailed: If port binding failed. :raises: PortBindingFailed: If port binding failed.
""" """
port_req_body = {'port': {}}
try: try:
if fixed_ip: if fixed_ip:
port_req_body['port']['fixed_ips'] = [ port_req_body['port']['fixed_ips'] = [
@ -244,13 +243,6 @@ class API(base_api.NetworkAPI):
LOG.warning(_LW('Neutron error: No more fixed IPs in network: %s'), LOG.warning(_LW('Neutron error: No more fixed IPs in network: %s'),
network_id, instance=instance) network_id, instance=instance)
raise exception.NoMoreFixedIps(net=network_id) raise exception.NoMoreFixedIps(net=network_id)
except neutron_client_exc.MacAddressInUseClient:
mac_address = port_req_body['port']['mac_address']
LOG.warning(_LW('Neutron error: MAC address %(mac)s is already '
'in use on network %(network)s.'),
{'mac': mac_address, 'network': network_id},
instance=instance)
raise exception.PortInUse(port_id=mac_address)
except neutron_client_exc.NeutronClientException: except neutron_client_exc.NeutronClientException:
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
LOG.exception(_LE('Neutron error creating port on network %s'), LOG.exception(_LE('Neutron error creating port on network %s'),
@ -264,6 +256,7 @@ class API(base_api.NetworkAPI):
_ensure_no_port_binding_failure(port) _ensure_no_port_binding_failure(port)
LOG.debug('Successfully updated port: %s', port_id, LOG.debug('Successfully updated port: %s', port_id,
instance=instance) instance=instance)
return port
except neutron_client_exc.MacAddressInUseClient: except neutron_client_exc.MacAddressInUseClient:
mac_address = port_req_body['port']['mac_address'] mac_address = port_req_body['port']['mac_address']
network_id = port_req_body['port']['network_id'] network_id = port_req_body['port']['network_id']
@ -669,32 +662,38 @@ class API(base_api.NetworkAPI):
bind_host_id=bind_host_id) bind_host_id=bind_host_id)
self._populate_pci_mac_address(instance, self._populate_pci_mac_address(instance,
request.pci_request_id, port_req_body) request.pci_request_id, port_req_body)
updated_mac = self._populate_mac_address( self._populate_mac_address(
instance, port_req_body, available_macs) instance, port_req_body, available_macs)
if dhcp_opts is not None: if dhcp_opts is not None:
port_req_body['port']['extra_dhcp_opts'] = dhcp_opts port_req_body['port']['extra_dhcp_opts'] = dhcp_opts
if not request.port_id: if not request.port_id:
created_port = self._create_port( # create minimal port, if port not already created by user
# NOTE(johngarbutt) doing this extra hop so we can extract
# this step later on
created_port = self._create_port_minimal(
port_client, instance, request.network_id, port_client, instance, request.network_id,
port_req_body, request.address, request.address, security_group_ids)
security_group_ids)
created_port_id = created_port['id'] created_port_id = created_port['id']
created_port_ids.append(created_port_id) created_port_ids.append(created_port_id)
ports_in_requested_order.append(created_port_id) ports_in_requested_order.append(created_port_id)
vifobj.uuid = created_port_id vifobj.uuid = created_port_id
vifobj.address = created_port['mac_address']
else: else:
self._update_port(
port_client, instance, request.port_id, port_req_body)
preexisting_port_ids.append(request.port_id)
ports_in_requested_order.append(request.port_id) ports_in_requested_order.append(request.port_id)
vifobj.uuid = request.port_id vifobj.uuid = request.port_id
vifobj.address = (updated_mac or
ports[request.port_id]['mac_address'])
# After port is created, update other bits
updated_port = self._update_port(
port_client, instance, vifobj.uuid, port_req_body)
vifobj.address = updated_port['mac_address']
vifobj.create() vifobj.create()
# only add to preexisting_port_ids after update success
# we use request.port_id to check if is preexisting
if request.port_id:
preexisting_port_ids.append(request.port_id)
self._update_port_dns_name(context, instance, network, self._update_port_dns_name(context, instance, network,
ports_in_requested_order[-1], ports_in_requested_order[-1],
neutron) neutron)

View File

@ -563,34 +563,40 @@ class TestNeutronv2Base(test.TestCase):
port_req_body['port']['mac_address'] = macs.pop() port_req_body['port']['mac_address'] = macs.pop()
if has_extra_dhcp_opts: if has_extra_dhcp_opts:
port_req_body['port']['extra_dhcp_opts'] = dhcp_options port_req_body['port']['extra_dhcp_opts'] = dhcp_options
if request.port_id:
port = ports[request.port_id] if not request.port_id:
self.moxed_client.update_port(request.port_id, port_req_body_create = {'port': {}}
MyComparator(port_req_body)
).AndReturn(
{'port': port})
ports_in_requested_net_order.append(request.port_id)
preexisting_port_ids.append(request.port_id)
else:
request.address = fixed_ips.get(request.network_id) request.address = fixed_ips.get(request.network_id)
if request.address: if request.address:
port_req_body['port']['fixed_ips'] = [ port_req_body_create['port']['fixed_ips'] = [
{'ip_address': str(request.address)}] {'ip_address': str(request.address)}]
port_req_body['port']['network_id'] = request.network_id port_req_body_create['port']['network_id'] = \
port_req_body['port']['admin_state_up'] = True request.network_id
port_req_body['port']['tenant_id'] = \ port_req_body_create['port']['admin_state_up'] = True
port_req_body_create['port']['tenant_id'] = \
self.instance.project_id self.instance.project_id
if has_portbinding:
port_req_body['port']['binding:host_id'] = (
self.instance.get('host'))
res_port = {'port': {'id': 'fake',
'mac_address': 'fakemac%i' % index}}
if kwargs.get('_break') == 'mac' + request.network_id: if kwargs.get('_break') == 'mac' + request.network_id:
self.mox.ReplayAll() self.mox.ReplayAll()
return api return api
res_port = {'port': {'id': 'fake',
'mac_address': 'fakemac%i' % index}}
self.moxed_client.create_port( self.moxed_client.create_port(
MyComparator(port_req_body)).AndReturn(res_port) MyComparator(port_req_body_create)).AndReturn(res_port)
ports_in_requested_net_order.append(res_port['port']['id']) ports_in_requested_net_order.append(res_port['port']['id'])
port_id = "fake"
update_port_res = res_port
else:
ports_in_requested_net_order.append(request.port_id)
preexisting_port_ids.append(request.port_id)
port_id = request.port_id
update_port_res = {'port': ports[port_id]}
new_mac = port_req_body['port'].get('mac_address')
if new_mac:
update_port_res['port']['mac_address'] = new_mac
self.moxed_client.update_port(port_id,
MyComparator(port_req_body)
).AndReturn(update_port_res)
if has_portbinding and has_dns_extension: if has_portbinding and has_dns_extension:
api._has_port_binding_extension(mox.IgnoreArg()).\ api._has_port_binding_extension(mox.IgnoreArg()).\
@ -1231,20 +1237,25 @@ class TestNeutronv2(TestNeutronv2Base):
'tenant_id': self.instance.project_id, 'tenant_id': self.instance.project_id,
}, },
} }
port_create_body = copy.deepcopy(port_req_body)
port_req_body['port'].update(binding_port_req_body['port']) port_req_body['port'].update(binding_port_req_body['port'])
port = {'id': 'portid_' + network['id'], port_id = 'portid_' + network['id']
'mac_address': 'foo'} port = {'id': port_id, 'mac_address': 'foo'}
api._populate_neutron_extension_values(self.context, api._populate_neutron_extension_values(self.context,
self.instance, None, binding_port_req_body, network=network, self.instance, None, binding_port_req_body, network=network,
neutron=self.moxed_client, bind_host_id=None).AndReturn(None) neutron=self.moxed_client, bind_host_id=None).AndReturn(None)
if index == 0: if index == 0:
self.moxed_client.create_port( self.moxed_client.create_port(
MyComparator(port_req_body)).AndReturn({'port': port}) MyComparator(port_create_body)).AndReturn({'port': port})
self.moxed_client.update_port(port_id,
MyComparator(binding_port_req_body)).AndReturn(
{'port': port})
else: else:
NeutronOverQuota = exceptions.OverQuotaClient() NeutronOverQuota = exceptions.OverQuotaClient()
self.moxed_client.create_port( self.moxed_client.create_port(
MyComparator(port_req_body)).AndRaise(NeutronOverQuota) MyComparator(port_create_body)).AndRaise(
NeutronOverQuota)
index += 1 index += 1
self.moxed_client.delete_port('portid_' + self.nets2[0]['id']) self.moxed_client.delete_port('portid_' + self.nets2[0]['id'])
self.mox.ReplayAll() self.mox.ReplayAll()
@ -3267,46 +3278,16 @@ class TestNeutronv2WithMock(test.TestCase):
api.allocate_floating_ip, self.context, api.allocate_floating_ip, self.context,
'ext_net') 'ext_net')
def test_create_port_for_instance_no_more_ip(self): @mock.patch.object(client.Client, 'create_port')
def test_create_port_minimal_raise_no_more_ip(self, create_port_mock):
instance = fake_instance.fake_instance_obj(self.context) instance = fake_instance.fake_instance_obj(self.context)
net = {'id': 'my_netid1', create_port_mock.side_effect = \
'name': 'my_netname1', exceptions.IpAddressGenerationFailureClient()
'subnets': ['mysubnid1'], self.assertRaises(exception.NoMoreFixedIps,
'tenant_id': instance['project_id']} self.api._create_port_minimal,
with mock.patch.object(client.Client, 'create_port',
side_effect=exceptions.IpAddressGenerationFailureClient()) as (
create_port_mock):
zone = 'compute:%s' % instance['availability_zone']
port_req_body = {'port': {'device_id': instance['uuid'],
'device_owner': zone}}
self.assertRaises(exception.NoMoreFixedIps,
self.api._create_port,
neutronapi.get_client(self.context),
instance, net['id'], port_req_body)
create_port_mock.assert_called_once_with(port_req_body)
@mock.patch.object(client.Client, 'create_port',
side_effect=exceptions.MacAddressInUseClient())
def test_create_port_for_instance_mac_address_in_use(self,
create_port_mock):
# Create fake data.
instance = fake_instance.fake_instance_obj(self.context)
net = {'id': 'my_netid1',
'name': 'my_netname1',
'subnets': ['mysubnid1'],
'tenant_id': instance['project_id']}
zone = 'compute:%s' % instance['availability_zone']
port_req_body = {'port': {'device_id': instance['uuid'],
'device_owner': zone,
'mac_address': 'XX:XX:XX:XX:XX:XX'}}
# Run the code.
self.assertRaises(exception.PortInUse,
self.api._create_port,
neutronapi.get_client(self.context), neutronapi.get_client(self.context),
instance, net['id'], port_req_body) instance, 'my_netid1')
# Assert the calls. self.assertTrue(create_port_mock.called)
create_port_mock.assert_called_once_with(port_req_body)
@mock.patch.object(client.Client, 'update_port', @mock.patch.object(client.Client, 'update_port',
side_effect=exceptions.MacAddressInUseClient()) side_effect=exceptions.MacAddressInUseClient())
@ -3346,57 +3327,33 @@ class TestNeutronv2WithMock(test.TestCase):
@mock.patch.object(client.Client, 'create_port', @mock.patch.object(client.Client, 'create_port',
side_effect=exceptions.IpAddressInUseClient()) side_effect=exceptions.IpAddressInUseClient())
def test_create_port_for_fixed_ip_in_use(self, create_port_mock): def test_create_port_minimal_raise_ip_in_use(self, create_port_mock):
# Create fake data.
instance = fake_instance.fake_instance_obj(self.context) instance = fake_instance.fake_instance_obj(self.context)
net = {'id': 'my_netid1',
'name': 'my_netname1',
'subnets': ['mysubnid1'],
'tenant_id': instance['project_id']}
zone = 'compute:%s' % instance['availability_zone']
port_req_body = {'port': {'device_id': instance['uuid'],
'device_owner': zone,
'mac_address': 'XX:XX:XX:XX:XX:XX'}}
fake_ip = '1.1.1.1' fake_ip = '1.1.1.1'
# Run the code.
self.assertRaises(exception.FixedIpAlreadyInUse, self.assertRaises(exception.FixedIpAlreadyInUse,
self.api._create_port, self.api._create_port_minimal,
neutronapi.get_client(self.context), neutronapi.get_client(self.context),
instance, net['id'], port_req_body, instance, 'my_netid1', fixed_ip=fake_ip)
fixed_ip=fake_ip) self.assertTrue(create_port_mock.called)
# Assert the calls.
create_port_mock.assert_called_once_with(port_req_body)
@mock.patch.object(client.Client, 'create_port', @mock.patch.object(client.Client, 'create_port',
side_effect=exceptions.InvalidIpForNetworkClient()) side_effect=exceptions.InvalidIpForNetworkClient())
def test_create_port_with_invalid_ip_for_network(self, create_port_mock): def test_create_port_minimal_raise_invalid_ip(self, create_port_mock):
# Create fake data.
instance = fake_instance.fake_instance_obj(self.context) instance = fake_instance.fake_instance_obj(self.context)
net = {'id': 'my_netid1',
'name': 'my_netname1',
'subnets': ['mysubnid1'],
'tenant_id': instance['project_id']}
zone = 'compute:%s' % instance['availability_zone']
port_req_body = {'port': {'device_id': instance['uuid'],
'device_owner': zone,
'mac_address': 'XX:XX:XX:XX:XX:XX'}}
fake_ip = '1.1.1.1' fake_ip = '1.1.1.1'
# Run the code.
exc = self.assertRaises(exception.InvalidInput,
self.api._create_port,
neutronapi.get_client(self.context),
instance, net['id'], port_req_body,
fixed_ip=fake_ip)
# Assert the exception message exc = self.assertRaises(exception.InvalidInput,
self.api._create_port_minimal,
neutronapi.get_client(self.context),
instance, 'my_netid1', fixed_ip=fake_ip)
expected_exception_msg = ('Invalid input received: Fixed IP %(ip)s is ' expected_exception_msg = ('Invalid input received: Fixed IP %(ip)s is '
'not a valid ip address for network ' 'not a valid ip address for network '
'%(net_id)s.' % '%(net_id)s.' %
{'ip': fake_ip, 'net_id': net['id']}) {'ip': fake_ip, 'net_id': 'my_netid1'})
self.assertEqual(expected_exception_msg, str(exc)) self.assertEqual(expected_exception_msg, str(exc))
self.assertTrue(create_port_mock.called)
# Assert the calls.
create_port_mock.assert_called_once_with(port_req_body)
def test_get_network_detail_not_found(self): def test_get_network_detail_not_found(self):
api = neutronapi.API() api = neutronapi.API()
@ -3696,7 +3653,7 @@ class TestNeutronv2WithMock(test.TestCase):
mock_nc.show_port = show_port mock_nc.show_port = show_port
mock_ntrn.return_value = mock_nc mock_ntrn.return_value = mock_nc
up_return = {"port": {}} up_return = {"port": {'mac_address': 'fakemac'}}
mock_nc.update_port.side_effect = [up_return, up_return, Exception] mock_nc.update_port.side_effect = [up_return, up_return, Exception]
mock_inst = mock.Mock(project_id="proj-1", mock_inst = mock.Mock(project_id="proj-1",
availability_zone='zone-1', availability_zone='zone-1',
@ -3828,9 +3785,11 @@ class TestNeutronv2WithMock(test.TestCase):
uuid='inst-1') uuid='inst-1')
mock_avail_nets.return_value = [{'id': 'net-1', mock_avail_nets.return_value = [{'id': 'net-1',
'subnets': ['subnet1']}] 'subnets': ['subnet1']}]
mock_nc.create_port.return_value = {'port': {'id': uuids.portid_1, mock_nc.create_port.return_value = {'port': {'id': uuids.portid_1}}
port_response = {'port': {'id': uuids.portid_1,
'tenant_id': mock_inst.project_id, 'tenant_id': mock_inst.project_id,
'binding:vif_type': 'binding_failed'}} 'binding:vif_type': 'binding_failed'}}
mock_nc.update_port.return_value = port_response
self.assertRaises(exception.PortBindingFailed, self.assertRaises(exception.PortBindingFailed,
self.api.allocate_for_instance, self.api.allocate_for_instance,
@ -4519,7 +4478,7 @@ class TestNeutronPortSecurity(test.NoDBTestCase):
@mock.patch.object(neutronapi.API, 'get_instance_nw_info') @mock.patch.object(neutronapi.API, 'get_instance_nw_info')
@mock.patch.object(neutronapi.API, '_update_port_dns_name') @mock.patch.object(neutronapi.API, '_update_port_dns_name')
@mock.patch.object(neutronapi.API, '_create_port') @mock.patch.object(neutronapi.API, '_create_port_minimal')
@mock.patch.object(neutronapi.API, '_populate_neutron_extension_values') @mock.patch.object(neutronapi.API, '_populate_neutron_extension_values')
@mock.patch.object(neutronapi.API, '_check_external_network_attach') @mock.patch.object(neutronapi.API, '_check_external_network_attach')
@mock.patch.object(neutronapi.API, '_process_security_groups') @mock.patch.object(neutronapi.API, '_process_security_groups')
@ -4565,22 +4524,13 @@ class TestNeutronPortSecurity(test.NoDBTestCase):
mock_process_security_groups.assert_called_once_with( mock_process_security_groups.assert_called_once_with(
instance, mock.ANY, []) instance, mock.ANY, [])
mock_create_port.assert_has_calls([ mock_create_port.assert_has_calls([
mock.call( mock.call(mock.ANY, instance, u'net1', None, []),
mock.ANY, instance, mock.call(mock.ANY, instance, u'net2', None, [])],
u'net1', {'port': any_order=True)
{'device_owner': u'compute:nova',
'device_id': uuids.instance}},
None, []),
mock.call(
mock.ANY, instance,
u'net2', {'port':
{'device_owner': u'compute:nova',
'device_id': uuids.instance}},
None, [])])
@mock.patch.object(neutronapi.API, 'get_instance_nw_info') @mock.patch.object(neutronapi.API, 'get_instance_nw_info')
@mock.patch.object(neutronapi.API, '_update_port_dns_name') @mock.patch.object(neutronapi.API, '_update_port_dns_name')
@mock.patch.object(neutronapi.API, '_create_port') @mock.patch.object(neutronapi.API, '_create_port_minimal')
@mock.patch.object(neutronapi.API, '_populate_neutron_extension_values') @mock.patch.object(neutronapi.API, '_populate_neutron_extension_values')
@mock.patch.object(neutronapi.API, '_check_external_network_attach') @mock.patch.object(neutronapi.API, '_check_external_network_attach')
@mock.patch.object(neutronapi.API, '_process_security_groups') @mock.patch.object(neutronapi.API, '_process_security_groups')
@ -4625,25 +4575,16 @@ class TestNeutronPortSecurity(test.NoDBTestCase):
'context', instance, requested_networks=onets, 'context', instance, requested_networks=onets,
security_groups=secgroups) security_groups=secgroups)
mock_process_security_groups.assert_called_once_with(
instance, mock.ANY, ['default', 'secgrp1', 'secgrp2'])
mock_create_port.assert_has_calls([ mock_create_port.assert_has_calls([
mock.call( mock.call(mock.ANY, instance, u'net1', None,
mock.ANY, instance, ['default-uuid', 'secgrp-uuid1', 'secgrp-uuid2']),
u'net1', {'port': mock.call(mock.ANY, instance, u'net2', None,
{'device_owner': u'compute:nova', ['default-uuid', 'secgrp-uuid1', 'secgrp-uuid2'])],
'device_id': uuids.instance}}, any_order=True)
None, ['default-uuid', 'secgrp-uuid1', 'secgrp-uuid2']),
mock.call(
mock.ANY, instance,
u'net2', {'port':
{'device_owner': u'compute:nova',
'device_id': uuids.instance}},
None, ['default-uuid', 'secgrp-uuid1', 'secgrp-uuid2'])])
@mock.patch.object(neutronapi.API, 'get_instance_nw_info') @mock.patch.object(neutronapi.API, 'get_instance_nw_info')
@mock.patch.object(neutronapi.API, '_update_port_dns_name') @mock.patch.object(neutronapi.API, '_update_port_dns_name')
@mock.patch.object(neutronapi.API, '_create_port') @mock.patch.object(neutronapi.API, '_create_port_minimal')
@mock.patch.object(neutronapi.API, '_populate_neutron_extension_values') @mock.patch.object(neutronapi.API, '_populate_neutron_extension_values')
@mock.patch.object(neutronapi.API, '_check_external_network_attach') @mock.patch.object(neutronapi.API, '_check_external_network_attach')
@mock.patch.object(neutronapi.API, '_process_security_groups') @mock.patch.object(neutronapi.API, '_process_security_groups')
@ -4689,22 +4630,13 @@ class TestNeutronPortSecurity(test.NoDBTestCase):
mock_process_security_groups.assert_called_once_with( mock_process_security_groups.assert_called_once_with(
instance, mock.ANY, []) instance, mock.ANY, [])
mock_create_port.assert_has_calls([ mock_create_port.assert_has_calls([
mock.call( mock.call(mock.ANY, instance, u'net1', None, []),
mock.ANY, instance, mock.call(mock.ANY, instance, u'net2', None, [])],
u'net1', {'port': any_order=True)
{'device_owner': u'compute:nova',
'device_id': uuids.instance}},
None, []),
mock.call(
mock.ANY, instance,
u'net2', {'port':
{'device_owner': u'compute:nova',
'device_id': uuids.instance}},
None, [])])
@mock.patch.object(neutronapi.API, 'get_instance_nw_info') @mock.patch.object(neutronapi.API, 'get_instance_nw_info')
@mock.patch.object(neutronapi.API, '_update_port_dns_name') @mock.patch.object(neutronapi.API, '_update_port_dns_name')
@mock.patch.object(neutronapi.API, '_create_port') @mock.patch.object(neutronapi.API, '_create_port_minimal')
@mock.patch.object(neutronapi.API, '_populate_neutron_extension_values') @mock.patch.object(neutronapi.API, '_populate_neutron_extension_values')
@mock.patch.object(neutronapi.API, '_check_external_network_attach') @mock.patch.object(neutronapi.API, '_check_external_network_attach')
@mock.patch.object(neutronapi.API, '_process_security_groups') @mock.patch.object(neutronapi.API, '_process_security_groups')
@ -4960,9 +4892,10 @@ class TestNeutronv2AutoAllocateNetwork(test.NoDBTestCase):
@mock.patch.object(self.api, '_check_external_network_attach') @mock.patch.object(self.api, '_check_external_network_attach')
@mock.patch.object(self.api, '_populate_neutron_extension_values') @mock.patch.object(self.api, '_populate_neutron_extension_values')
@mock.patch.object(self.api, '_populate_mac_address') @mock.patch.object(self.api, '_populate_mac_address')
@mock.patch.object(self.api, '_create_port', spec=True, @mock.patch.object(self.api, '_create_port_minimal', spec=True,
return_value={'id': uuids.port_id, return_value={'id': uuids.port_id,
'mac_address': 'foo'}) 'mac_address': 'foo'})
@mock.patch.object(self.api, '_update_port')
@mock.patch.object(self.api, '_update_port_dns_name') @mock.patch.object(self.api, '_update_port_dns_name')
@mock.patch.object(self.api, 'get_instance_nw_info', @mock.patch.object(self.api, 'get_instance_nw_info',
fake_get_instance_nw_info) fake_get_instance_nw_info)
@ -4970,6 +4903,7 @@ class TestNeutronv2AutoAllocateNetwork(test.NoDBTestCase):
def do_test(self, def do_test(self,
mock_vif, mock_vif,
update_port_dsn_name_mock, update_port_dsn_name_mock,
update_port_mock,
create_port_mock, create_port_mock,
populate_mac_addr_mock, populate_mac_addr_mock,
populate_ext_values_mock, populate_ext_values_mock,
@ -4996,9 +4930,11 @@ class TestNeutronv2AutoAllocateNetwork(test.NoDBTestCase):
# was auto-allocated # was auto-allocated
port_req_body = mock.ANY port_req_body = mock.ANY
create_port_mock.assert_called_once_with( create_port_mock.assert_called_once_with(
ntrn, instance, uuids.network_id, port_req_body, ntrn, instance, uuids.network_id,
None, # request.address (fixed IP) None, # request.address (fixed IP)
[], # security_group_ids - we didn't request any [], # security_group_ids - we didn't request any
) )
update_port_mock.assert_called_once_with(
ntrn, instance, uuids.port_id, port_req_body)
do_test(self) do_test(self)