Remove extra/vif_port_id

Removes API translation layer into port/portgroup internal_info
Removes internal logic to support use of VIFs stored in the extra
field, which effectively means all vif binding must now utilize
vif attachment and detachment.

This is a change that we likely should have pushed forward a couple
years back, but I didn't want to break compatability with very old
of ironic or standalone users which were deploying instances using
very old instructions. That being said, it is necessary to remove
the legacy vif support so new access controls can properly wrap
vif API endpoints.

Depends-On: https://review.opendev.org/c/openstack/ironic-tempest-plugin/+/769204
Change-Id: I588b3a64475656542389ff83786189e2dc16d35c
This commit is contained in:
Julia Kreger 2020-12-16 15:06:55 -08:00
parent 043de26884
commit f4ff15938c
17 changed files with 158 additions and 748 deletions

View File

@ -13,7 +13,6 @@
# License for the specific language governing permissions and limitations
# under the License.
import copy
from http import client as http_client
from ironic_lib import metrics_utils
@ -58,10 +57,7 @@ PORT_SCHEMA = {
}
PORT_PATCH_SCHEMA = copy.deepcopy(PORT_SCHEMA)
# patching /extra/vif_port_id has the side-effect of modifying
# internal_info values, so include it in the patch schema
PORT_PATCH_SCHEMA['properties']['internal_info'] = {'type': ['null', 'object']}
PORT_PATCH_SCHEMA = PORT_SCHEMA
PATCH_ALLOWED_FIELDS = [
'address',
@ -576,14 +572,12 @@ class PortsController(rest.RestController):
raise exception.Invalid('A non-empty value is required when '
'setting physical_network')
vif = api_utils.handle_post_port_like_extra_vif(port)
if (portgroup and (port.get('pxe_enabled') or vif)):
if (portgroup and (port.get('pxe_enabled'))):
if not portgroup.standalone_ports_supported:
msg = _("Port group %s doesn't support standalone ports. "
"This port cannot be created as a member of that "
"port group because either 'extra/vif_port_id' "
"was specified or 'pxe_enabled' was set to True.")
"portgroup as the port's 'pxe_enabled' field was "
"set to True.")
raise exception.Conflict(
msg % portgroup.uuid)
@ -659,9 +653,6 @@ class PortsController(rest.RestController):
port_dict = api_utils.apply_jsonpatch(port_dict, patch)
api_utils.handle_patch_port_like_extra_vif(
rpc_port, port_dict['internal_info'], patch)
try:
if api_utils.is_path_updated(patch, '/portgroup_uuid'):
if port_dict.get('portgroup_uuid'):

View File

@ -10,7 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
import copy
from http import client as http_client
from ironic_lib import metrics_utils
@ -50,11 +49,7 @@ PORTGROUP_SCHEMA = {
'additionalProperties': False,
}
PORTGROUP_PATCH_SCHEMA = copy.deepcopy(PORTGROUP_SCHEMA)
# patching /extra/vif_port_id has the side-effect of modifying
# internal_info values, so include it in the patch schema
PORTGROUP_PATCH_SCHEMA['properties']['internal_info'] = {
'type': ['null', 'object']}
PORTGROUP_PATCH_SCHEMA = PORTGROUP_SCHEMA
PORTGROUP_VALIDATOR_EXTRA = args.dict_valid(
address=args.mac_address,
@ -417,8 +412,6 @@ class PortgroupsController(pecan.rest.RestController):
raise exception.ClientSideError(
error_msg, status_code=http_client.BAD_REQUEST)
api_utils.handle_post_port_like_extra_vif(portgroup)
# NOTE(yuriyz): UUID is mandatory for notifications payload
if not portgroup.get('uuid'):
portgroup['uuid'] = uuidutils.generate_uuid()
@ -501,9 +494,6 @@ class PortgroupsController(pecan.rest.RestController):
e.code = http_client.BAD_REQUEST # BadRequest
raise
api_utils.handle_patch_port_like_extra_vif(
rpc_portgroup, portgroup_dict.get('internal_info'), patch)
api_utils.patched_validate_with_schema(
portgroup_dict, PORTGROUP_PATCH_SCHEMA, PORTGROUP_PATCH_VALIDATOR)

View File

@ -1310,89 +1310,6 @@ def allow_inspect_abort():
return api.request.version.minor >= versions.MINOR_41_INSPECTION_ABORT
def handle_post_port_like_extra_vif(p_dict):
"""Handle a Post request that sets .extra['vif_port_id'].
This handles attach of VIFs via specifying the VIF port ID
in a port or port group's extra['vif_port_id'] field.
:param p_dict: a dictionary with field names/values for the port or
port group
:return: VIF or None
"""
vif = p_dict.get('extra', {}).get('vif_port_id')
if vif:
# TODO(rloo): in Stein cycle: if API version >= 1.28, remove
# warning and support for extra[]; else (< 1.28)
# still support it; continue copying to internal_info
# (see bug 1722850). i.e., change the 7 lines of code
# below to something like:
# if not api_utils.allow_vifs_subcontroller():
# internal_info = {'tenant_vif_port_id': vif}
# pg_dict['internal_info'] = internal_info
if allow_vifs_subcontroller():
utils.warn_about_deprecated_extra_vif_port_id()
# NOTE(rloo): this value should really be in .internal_info[..]
# which is what would happen if they had used the
# POST /v1/nodes/<node>/vifs API.
internal_info = {'tenant_vif_port_id': vif}
p_dict['internal_info'] = internal_info
return vif
def handle_patch_port_like_extra_vif(rpc_object, internal_info, patch):
"""Handle a Patch request that modifies .extra['vif_port_id'].
This handles attach/detach of VIFs via the VIF port ID
in a port or port group's extra['vif_port_id'] field.
:param rpc_object: a Port or Portgroup RPC object
:param internal_info: Dict of port or portgroup internal info
:param patch: the JSON patch in the API request
"""
vif_list = get_patch_values(patch, '/extra/vif_port_id')
vif = None
if vif_list:
# if specified more than once, use the last value
vif = vif_list[-1]
# TODO(rloo): in Stein cycle: if API version >= 1.28, remove this
# warning and don't copy to internal_info; else (<1.28) still
# support it; continue copying to internal_info (see bug 1722850).
# i.e., change the 8 lines of code below to something like:
# if not allow_vifs_subcontroller():
# int_info = rpc_object.internal_info.get('tenant_vif_port_id')
# if (not int_info or
# int_info == rpc_object.extra.get('vif_port_id')):
# internal_info['tenant_vif_port_id'] = vif
if allow_vifs_subcontroller():
utils.warn_about_deprecated_extra_vif_port_id()
# NOTE(rloo): if the user isn't also using the REST API
# 'POST nodes/<node>/vifs', we are safe to copy the
# .extra[] value to the .internal_info location
int_info = rpc_object.internal_info.get('tenant_vif_port_id')
if (not int_info or int_info == rpc_object.extra.get('vif_port_id')):
internal_info['tenant_vif_port_id'] = vif
elif is_path_removed(patch, '/extra/vif_port_id'):
# TODO(rloo): in Stein cycle: if API version >= 1.28, remove this
# warning and don't remove from internal_info; else (<1.28) still
# support it; remove from internal_info (see bug 1722850).
# i.e., change the 8 lines of code below to something like:
# if not allow_vifs_subcontroller():
# int_info = rpc_object.internal_info.get('tenant_vif...')
# if (int_info and int_info==rpc_object.extra.get('vif_port_id')):
# internal_info['tenant_vif_port_id'] = None
if allow_vifs_subcontroller():
utils.warn_about_deprecated_extra_vif_port_id()
# NOTE(rloo): if the user isn't also using the REST API
# 'POST nodes/<node>/vifs', we are safe to remove the
# .extra[] value from the .internal_info location
int_info = rpc_object.internal_info.get('tenant_vif_port_id')
if (int_info and int_info == rpc_object.extra.get('vif_port_id')):
internal_info.pop('tenant_vif_port_id')
def allow_detail_query():
"""Check if passing a detail=True query string is allowed.

View File

@ -54,8 +54,6 @@ TZ_RE = r'((?P<tz_sign>[+-])(?P<tz_hour>\d{2}):(?P<tz_min>\d{2}))' + \
DATETIME_RE = re.compile(
'%sT%s(%s)?' % (DATE_RE, TIME_RE, TZ_RE))
warn_deprecated_extra_vif_port_id = False
def _get_root_helper():
# NOTE(jlvillal): This function has been moved to ironic-lib. And is
@ -494,17 +492,6 @@ def render_template(template, params, is_file=True):
return tmpl.render(params, enumerate=enumerate)
def warn_about_deprecated_extra_vif_port_id():
global warn_deprecated_extra_vif_port_id
if not warn_deprecated_extra_vif_port_id:
warn_deprecated_extra_vif_port_id = True
LOG.warning("Starting with API version 1.28, attaching/detaching VIF "
"to/from a port or port group via extra['vif_port_id'] is "
"deprecated and will not be supported starting in the "
"Stein release. API endpoint v1/nodes/<node>/vifs should "
"be used instead.")
def parse_instance_info_capabilities(node):
"""Parse the instance_info capabilities.

View File

@ -46,8 +46,7 @@ def _vif_attached(port_like_obj, vif_id):
False otherwise.
:raises: VifAlreadyAttached, if vif_id is attached to port_like_obj.
"""
attached_vif_id = port_like_obj.internal_info.get(
TENANT_VIF_KEY, port_like_obj.extra.get('vif_port_id'))
attached_vif_id = port_like_obj.internal_info.get(TENANT_VIF_KEY)
if attached_vif_id == vif_id:
raise exception.VifAlreadyAttached(
object_type=port_like_obj.__class__.__name__,
@ -233,9 +232,7 @@ def plug_port_to_tenant_network(task, port_like_obj, client=None):
local_group_info = None
client_id_opt = None
vif_id = (
port_like_obj.internal_info.get(TENANT_VIF_KEY)
or port_like_obj.extra.get('vif_port_id'))
vif_id = port_like_obj.internal_info.get(TENANT_VIF_KEY)
if not vif_id:
obj_name = port_like_obj.__class__.__name__.lower()
@ -365,10 +362,7 @@ class VIFPortIDMixin(object):
:param port_like_obj: A port or portgroup to check.
:returns: The ID of the attached VIF, or None.
"""
# FIXME(sambetts) Remove this when we no longer support a nova
# driver that uses port.extra
return (port_like_obj.internal_info.get(TENANT_VIF_KEY)
or port_like_obj.extra.get('vif_port_id'))
return port_like_obj.internal_info.get(TENANT_VIF_KEY)
def vif_list(self, task):
"""List attached VIF IDs for a node

View File

@ -59,7 +59,6 @@ class FlatNetwork(common.NeutronVIFPortIDMixin,
for port_like_obj in task.ports + task.portgroups:
vif_port_id = (
port_like_obj.internal_info.get(common.TENANT_VIF_KEY)
or port_like_obj.extra.get('vif_port_id')
)
if not vif_port_id:
continue
@ -88,7 +87,7 @@ class FlatNetwork(common.NeutronVIFPortIDMixin,
for port_like_obj in ports + portgroups:
vif_port_id = (
port_like_obj.internal_info.get(common.TENANT_VIF_KEY)
or port_like_obj.extra.get('vif_port_id'))
)
if not vif_port_id:
continue
neutron.unbind_neutron_port(vif_port_id, context=task.context)

View File

@ -225,7 +225,7 @@ class NeutronNetwork(common.NeutronVIFPortIDMixin,
for port_like_obj in ports + portgroups:
vif_port_id = (
port_like_obj.internal_info.get(common.TENANT_VIF_KEY)
or port_like_obj.extra.get('vif_port_id'))
)
if not vif_port_id:
continue

View File

@ -34,7 +34,6 @@ from ironic.api.controllers.v1 import versions
from ironic.common import exception
from ironic.common import policy
from ironic.common import states
from ironic.common import utils as common_utils
from ironic.conductor import rpcapi
from ironic import objects
from ironic.objects import fields as obj_fields
@ -1804,155 +1803,6 @@ class TestPatch(test_api_base.BaseApiTest):
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual('application/json', response.content_type)
def _test_add_extra_vif_port_id(self, port, headers, mock_warn, mock_upd):
response = self.patch_json(
'/ports/%s' % port.uuid,
[{'path': '/extra/vif_port_id', 'value': 'foo', 'op': 'add'},
{'path': '/extra/vif_port_id', 'value': 'bar', 'op': 'add'}],
headers=headers)
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.OK, response.status_code)
self.assertEqual({'vif_port_id': 'bar'},
response.json['extra'])
self.assertTrue(mock_upd.called)
return response
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_add_extra_vif_port_id(self, mock_warn, mock_upd):
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address='52:55:00:cf:2d:31')
expected_intern_info = port.internal_info
expected_intern_info.update({'tenant_vif_port_id': 'bar'})
headers = {api_base.Version.string: '1.27'}
response = self._test_add_extra_vif_port_id(port, headers,
mock_warn, mock_upd)
self.assertEqual(expected_intern_info, response.json['internal_info'])
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_add_extra_vif_port_id_no_internal(self, mock_warn, mock_upd):
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address='52:55:00:cf:2d:31')
expected_intern_info = port.internal_info
expected_intern_info.update({'tenant_vif_port_id': 'bar'})
headers = {api_base.Version.string: '1.27'}
response = self._test_add_extra_vif_port_id(port, headers,
mock_warn, mock_upd)
self.assertEqual(expected_intern_info, response.json['internal_info'])
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_add_extra_vif_port_id_deprecated(self, mock_warn, mock_upd):
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address='52:55:00:cf:2d:31')
expected_intern_info = port.internal_info
expected_intern_info.update({'tenant_vif_port_id': 'bar'})
headers = {api_base.Version.string: '1.34'}
response = self._test_add_extra_vif_port_id(port, headers,
mock_warn, mock_upd)
self.assertEqual(expected_intern_info, response.json['internal_info'])
self.assertTrue(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_replace_extra_vif_port_id(self, mock_warn, mock_upd):
extra = {'vif_port_id': 'original'}
internal_info = {'tenant_vif_port_id': 'original'}
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address='52:55:00:cf:2d:31',
extra=extra,
internal_info=internal_info)
expected_intern_info = port.internal_info
expected_intern_info.update({'tenant_vif_port_id': 'bar'})
headers = {api_base.Version.string: '1.27'}
response = self._test_add_extra_vif_port_id(port, headers,
mock_warn, mock_upd)
self.assertEqual(expected_intern_info, response.json['internal_info'])
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_add_extra_vif_port_id_diff_internal(self, mock_warn, mock_upd):
internal_info = {'tenant_vif_port_id': 'original'}
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address='52:55:00:cf:2d:31',
internal_info=internal_info)
headers = {api_base.Version.string: '1.27'}
response = self._test_add_extra_vif_port_id(port, headers,
mock_warn, mock_upd)
self.assertEqual(internal_info, response.json['internal_info'])
self.assertFalse(mock_warn.called)
def _test_remove_extra_vif_port_id(self, port, headers, mock_warn,
mock_upd):
response = self.patch_json(
'/ports/%s' % port.uuid,
[{'path': '/extra/vif_port_id', 'op': 'remove'}],
headers=headers)
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.OK, response.status_code)
self.assertEqual({}, response.json['extra'])
self.assertTrue(mock_upd.called)
return response
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_remove_extra_vif_port_id(self, mock_warn, mock_upd):
internal_info = {'tenant_vif_port_id': 'bar'}
extra = {'vif_port_id': 'bar'}
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address='52:55:00:cf:2d:31',
internal_info=internal_info,
extra=extra)
headers = {api_base.Version.string: '1.27'}
response = self._test_remove_extra_vif_port_id(port, headers,
mock_warn, mock_upd)
self.assertEqual({}, response.json['internal_info'])
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_remove_extra_vif_port_id_not_same(self, mock_warn, mock_upd):
# .internal_info['tenant_vif_port_id'] != .extra['vif_port_id']
internal_info = {'tenant_vif_port_id': 'bar'}
extra = {'vif_port_id': 'foo'}
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address='52:55:00:cf:2d:31',
internal_info=internal_info,
extra=extra)
headers = {api_base.Version.string: '1.28'}
response = self._test_remove_extra_vif_port_id(port, headers,
mock_warn, mock_upd)
self.assertEqual(internal_info, response.json['internal_info'])
self.assertTrue(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_remove_extra_vif_port_id_not_internal(self, mock_warn, mock_upd):
# no .internal_info['tenant_vif_port_id']
internal_info = {'foo': 'bar'}
extra = {'vif_port_id': 'bar'}
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address='52:55:00:cf:2d:31',
internal_info=internal_info,
extra=extra)
headers = {api_base.Version.string: '1.28'}
response = self._test_remove_extra_vif_port_id(port, headers,
mock_warn, mock_upd)
self.assertEqual(internal_info, response.json['internal_info'])
self.assertTrue(mock_warn.called)
def test_update_in_inspecting_not_allowed(self, mock_upd):
self.node.provision_state = states.INSPECTING
self.node.save()
@ -1997,13 +1847,10 @@ class TestPost(test_api_base.BaseApiTest):
self.mock_gtf.return_value = 'test-topic'
self.addCleanup(p.stop)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
@mock.patch.object(notification_utils, '_emit_api_notification',
autospec=True)
@mock.patch.object(timeutils, 'utcnow', autospec=True)
def test_create_port(self, mock_utcnow, mock_notify, mock_warn,
mock_create):
def test_create_port(self, mock_utcnow, mock_notify, mock_create):
pdict = post_get_test_port()
test_time = datetime.datetime(2000, 1, 1, 0, 0)
mock_utcnow.return_value = test_time
@ -2033,7 +1880,6 @@ class TestPost(test_api_base.BaseApiTest):
obj_fields.NotificationStatus.END,
node_uuid=self.node.uuid,
portgroup_uuid=self.portgroup.uuid)])
self.assertEqual(0, mock_warn.call_count)
def test_create_port_min_api_version(self, mock_create):
pdict = post_get_test_port(
@ -2424,43 +2270,10 @@ class TestPost(test_api_base.BaseApiTest):
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertFalse(mock_create.called)
def _test_create_port_with_extra_vif_port_id(self, headers, mock_warn,
mock_create):
pdict = post_get_test_port(pxe_enabled=False,
extra={'vif_port_id': 'foo'})
pdict.pop('physical_network')
pdict.pop('is_smartnic')
response = self.post_json('/ports', pdict, headers=headers)
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.CREATED, response.status_int)
self.assertEqual({'vif_port_id': 'foo'}, response.json['extra'])
self.assertEqual({'tenant_vif_port_id': 'foo'},
response.json['internal_info'])
mock_create.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY,
'test-topic')
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_create_port_with_extra_vif_port_id(self, mock_warn, mock_create):
headers = {api_base.Version.string: '1.27'}
self._test_create_port_with_extra_vif_port_id(headers, mock_warn,
mock_create)
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_create_port_with_extra_vif_port_id_deprecated(self, mock_warn,
mock_create):
self._test_create_port_with_extra_vif_port_id(self.headers, mock_warn,
mock_create)
self.assertTrue(mock_warn.called)
def _test_create_port(self, mock_create, has_vif=False, in_portgroup=False,
def _test_create_port(self, mock_create, in_portgroup=False,
pxe_enabled=True, standalone_ports=True,
http_status=http_client.CREATED):
extra = {}
if has_vif:
extra = {'vif_port_id': uuidutils.generate_uuid()}
pdict = post_get_test_port(
node_uuid=self.node.uuid,
pxe_enabled=pxe_enabled,
@ -2483,89 +2296,79 @@ class TestPost(test_api_base.BaseApiTest):
self.assertEqual(expected_portgroup_uuid,
response.json['portgroup_uuid'])
self.assertEqual(extra, response.json['extra'])
if has_vif:
expected = {'tenant_vif_port_id': extra['vif_port_id']}
self.assertEqual(expected, response.json['internal_info'])
mock_create.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY,
'test-topic')
else:
self.assertFalse(mock_create.called)
def test_create_port_novif_pxe_noportgroup(self, mock_create):
self._test_create_port(mock_create, has_vif=False, in_portgroup=False,
self._test_create_port(mock_create, in_portgroup=False,
pxe_enabled=True,
http_status=http_client.CREATED)
def test_create_port_novif_nopxe_noportgroup(self, mock_create):
self._test_create_port(mock_create, has_vif=False, in_portgroup=False,
self._test_create_port(mock_create, in_portgroup=False,
pxe_enabled=False,
http_status=http_client.CREATED)
def test_create_port_vif_pxe_noportgroup(self, mock_create):
self._test_create_port(mock_create, has_vif=True, in_portgroup=False,
self._test_create_port(mock_create, in_portgroup=False,
pxe_enabled=True,
http_status=http_client.CREATED)
def test_create_port_vif_nopxe_noportgroup(self, mock_create):
self._test_create_port(mock_create, has_vif=True, in_portgroup=False,
self._test_create_port(mock_create, in_portgroup=False,
pxe_enabled=False,
http_status=http_client.CREATED)
def test_create_port_novif_pxe_portgroup_standalone_ports(self,
mock_create):
self._test_create_port(mock_create, has_vif=False, in_portgroup=True,
self._test_create_port(mock_create, in_portgroup=True,
pxe_enabled=True,
standalone_ports=True,
http_status=http_client.CREATED)
def test_create_port_novif_pxe_portgroup_nostandalone_ports(self,
mock_create):
self._test_create_port(mock_create, has_vif=False, in_portgroup=True,
self._test_create_port(mock_create, in_portgroup=True,
pxe_enabled=True,
standalone_ports=False,
http_status=http_client.CONFLICT)
def test_create_port_novif_nopxe_portgroup_standalone_ports(self,
mock_create):
self._test_create_port(mock_create, has_vif=False, in_portgroup=True,
self._test_create_port(mock_create, in_portgroup=True,
pxe_enabled=False,
standalone_ports=True,
http_status=http_client.CREATED)
def test_create_port_novif_nopxe_portgroup_nostandalone_ports(self,
mock_create):
self._test_create_port(mock_create, has_vif=False, in_portgroup=True,
self._test_create_port(mock_create, in_portgroup=True,
pxe_enabled=False,
standalone_ports=False,
http_status=http_client.CREATED)
def test_create_port_vif_pxe_portgroup_standalone_ports(self, mock_create):
self._test_create_port(mock_create, has_vif=True, in_portgroup=True,
self._test_create_port(mock_create, in_portgroup=True,
pxe_enabled=True,
standalone_ports=True,
http_status=http_client.CREATED)
def test_create_port_vif_pxe_portgroup_nostandalone_ports(self,
mock_create):
self._test_create_port(mock_create, has_vif=True, in_portgroup=True,
self._test_create_port(mock_create, in_portgroup=True,
pxe_enabled=True,
standalone_ports=False,
http_status=http_client.CONFLICT)
def test_create_port_vif_nopxe_portgroup_standalone_ports(self,
mock_create):
self._test_create_port(mock_create, has_vif=True, in_portgroup=True,
self._test_create_port(mock_create, in_portgroup=True,
pxe_enabled=False,
standalone_ports=True,
http_status=http_client.CREATED)
def test_create_port_vif_nopxe_portgroup_nostandalone_ports(self,
mock_create):
self._test_create_port(mock_create, has_vif=True, in_portgroup=True,
pxe_enabled=False,
standalone_ports=False,
http_status=http_client.CONFLICT)
def test_create_port_invalid_physnet_non_text(self, mock_create):
physnet = 1234
pdict = post_get_test_port(physical_network=physnet)

View File

@ -29,7 +29,6 @@ from ironic.api.controllers.v1 import notification_utils
from ironic.api.controllers.v1 import utils as api_utils
from ironic.common import exception
from ironic.common import states
from ironic.common import utils as common_utils
from ironic.conductor import rpcapi
from ironic import objects
from ironic.objects import fields as obj_fields
@ -1087,137 +1086,6 @@ class TestPatch(test_api_base.BaseApiTest):
self.assertEqual(address.lower(), kargs.address)
@mock.patch.object(rpcapi.ConductorAPI, 'update_portgroup', autospec=True,
side_effect=_rpcapi_update_portgroup)
class TestPatchExtraVifPortId(test_api_base.BaseApiTest):
headers = {api_base.Version.string: str(api_v1.max_version())}
def setUp(self):
super(TestPatchExtraVifPortId, self).setUp()
self.node = obj_utils.create_test_node(self.context)
self.portgroup = obj_utils.create_test_portgroup(self.context,
node_id=self.node.id)
p = mock.patch.object(rpcapi.ConductorAPI, 'get_topic_for',
autospec=True)
self.mock_gtf = p.start()
self.mock_gtf.return_value = 'test-topic'
self.addCleanup(p.stop)
def _test_add_extra_vif_port_id(self, headers, mock_warn, mock_upd):
extra = {'vif_port_id': 'bar'}
response = self.patch_json(
'/portgroups/%s' % self.portgroup.uuid,
[{'path': '/extra/vif_port_id', 'value': 'foo', 'op': 'add'},
{'path': '/extra/vif_port_id', 'value': 'bar', 'op': 'add'}],
headers=headers)
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.OK, response.status_code)
self.assertEqual(extra, response.json['extra'])
return response
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_add_extra_vif_port_id(self, mock_warn, mock_upd):
expected_intern_info = self.portgroup.internal_info
expected_intern_info.update({'tenant_vif_port_id': 'bar'})
headers = {api_base.Version.string: '1.27'}
response = self._test_add_extra_vif_port_id(headers, mock_warn,
mock_upd)
self.assertEqual(expected_intern_info, response.json['internal_info'])
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_add_extra_vif_port_id_deprecated(self, mock_warn, mock_upd):
expected_intern_info = self.portgroup.internal_info
expected_intern_info.update({'tenant_vif_port_id': 'bar'})
response = self._test_add_extra_vif_port_id(self.headers, mock_warn,
mock_upd)
self.assertEqual(expected_intern_info, response.json['internal_info'])
self.assertTrue(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_replace_extra_vif_port_id(self, mock_warn, mock_upd):
self.portgroup.extra = {'vif_port_id': 'original'}
self.portgroup.internal_info = {'tenant_vif_port_id': 'original'}
self.portgroup.save()
expected_intern_info = self.portgroup.internal_info
expected_intern_info.update({'tenant_vif_port_id': 'bar'})
headers = {api_base.Version.string: '1.27'}
response = self._test_add_extra_vif_port_id(headers, mock_warn,
mock_upd)
self.assertEqual(expected_intern_info, response.json['internal_info'])
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_add_extra_vif_port_id_diff_internal(self, mock_warn, mock_upd):
internal_info = {'tenant_vif_port_id': 'original'}
self.portgroup.internal_info = internal_info
self.portgroup.save()
headers = {api_base.Version.string: '1.27'}
response = self._test_add_extra_vif_port_id(headers, mock_warn,
mock_upd)
# not changed
self.assertEqual(internal_info, response.json['internal_info'])
self.assertFalse(mock_warn.called)
def _test_remove_extra_vif_port_id(self, headers, mock_warn, mock_upd):
response = self.patch_json(
'/portgroups/%s' % self.portgroup.uuid,
[{'path': '/extra/vif_port_id', 'op': 'remove'}],
headers=headers)
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.OK, response.status_code)
self.assertEqual({}, response.json['extra'])
self.assertTrue(mock_upd.called)
return response
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_remove_extra_vif_port_id(self, mock_warn, mock_upd):
self.portgroup.extra = {'vif_port_id': 'bar'}
orig_info = self.portgroup.internal_info.copy()
intern_info = self.portgroup.internal_info
intern_info.update({'tenant_vif_port_id': 'bar'})
self.portgroup.internal_info = intern_info
self.portgroup.save()
headers = {api_base.Version.string: '1.27'}
response = self._test_remove_extra_vif_port_id(headers, mock_warn,
mock_upd)
self.assertEqual(orig_info, response.json['internal_info'])
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_remove_extra_vif_port_id_not_same(self, mock_warn, mock_upd):
# .internal_info['tenant_vif_port_id'] != .extra['vif_port_id']
self.portgroup.extra = {'vif_port_id': 'foo'}
intern_info = self.portgroup.internal_info
intern_info.update({'tenant_vif_port_id': 'bar'})
self.portgroup.internal_info = intern_info
self.portgroup.save()
headers = {api_base.Version.string: '1.28'}
response = self._test_remove_extra_vif_port_id(headers, mock_warn,
mock_upd)
self.assertEqual(intern_info, response.json['internal_info'])
self.assertTrue(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_remove_extra_vif_port_id_not_internal(self, mock_warn, mock_upd):
# no portgroup.internal_info['tenant_vif_port_id']
self.portgroup.extra = {'vif_port_id': 'foo'}
self.portgroup.save()
intern_info = self.portgroup.internal_info
headers = {api_base.Version.string: '1.28'}
response = self._test_remove_extra_vif_port_id(headers, mock_warn,
mock_upd)
self.assertEqual(intern_info, response.json['internal_info'])
self.assertTrue(mock_warn.called)
class TestPost(test_api_base.BaseApiTest):
headers = {api_base.Version.string: str(api_v1.max_version())}
@ -1227,10 +1095,8 @@ class TestPost(test_api_base.BaseApiTest):
@mock.patch.object(notification_utils, '_emit_api_notification',
autospec=True)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
@mock.patch.object(timeutils, 'utcnow', autospec=True)
def test_create_portgroup(self, mock_utcnow, mock_warn, mock_notify):
def test_create_portgroup(self, mock_utcnow, mock_notify):
pdict = apiutils.post_get_test_portgroup()
test_time = datetime.datetime(2000, 1, 1, 0, 0)
mock_utcnow.return_value = test_time
@ -1249,7 +1115,6 @@ class TestPost(test_api_base.BaseApiTest):
expected_location = '/v1/portgroups/%s' % pdict['uuid']
self.assertEqual(urlparse.urlparse(response.location).path,
expected_location)
self.assertEqual(0, mock_warn.call_count)
mock_notify.assert_has_calls([mock.call(mock.ANY, mock.ANY, 'create',
obj_fields.NotificationLevel.INFO,
obj_fields.NotificationStatus.START,
@ -1340,41 +1205,6 @@ class TestPost(test_api_base.BaseApiTest):
headers=self.headers)
self.assertEqual(pdict['extra'], result['extra'])
def _test_create_portgroup_with_extra_vif_port_id(self, headers,
mock_warn):
pgdict = apiutils.post_get_test_portgroup(extra={'vif_port_id': 'foo'})
response = self.post_json('/portgroups', pgdict, headers=headers)
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.CREATED, response.status_int)
self.assertEqual({'vif_port_id': 'foo'}, response.json['extra'])
self.assertEqual({'tenant_vif_port_id': 'foo'},
response.json['internal_info'])
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_create_portgroup_with_extra_vif_port_id(self, mock_warn):
headers = {api_base.Version.string: '1.27'}
self._test_create_portgroup_with_extra_vif_port_id(headers, mock_warn)
self.assertFalse(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_create_portgroup_with_extra_vif_port_id_deprecated(
self, mock_warn):
self._test_create_portgroup_with_extra_vif_port_id(
self.headers, mock_warn)
self.assertTrue(mock_warn.called)
@mock.patch.object(common_utils, 'warn_about_deprecated_extra_vif_port_id',
autospec=True)
def test_create_portgroup_with_no_extra(self, mock_warn):
pgdict = apiutils.post_get_test_portgroup()
del pgdict['extra']
response = self.post_json('/portgroups', pgdict, headers=self.headers)
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.CREATED, response.status_int)
self.assertEqual(0, mock_warn.call_count)
def test_create_portgroup_no_address(self):
pdict = apiutils.post_get_test_portgroup()
del pdict['address']

View File

@ -41,11 +41,8 @@ class TestNetwork(db_base.DbTestCase):
result = network.get_node_vif_ids(task)
self.assertEqual(expected, result)
def _test_get_node_vif_ids_one_port(self, key):
if key == "extra":
kwargs1 = {key: {'vif_port_id': 'test-vif-A'}}
else:
kwargs1 = {key: {'tenant_vif_port_id': 'test-vif-A'}}
def test_get_node_vif_ids_one_port_int_info(self):
kwargs1 = {'internal_info': {'tenant_vif_port_id': 'test-vif-A'}}
port1 = db_utils.create_test_port(node_id=self.node.id,
address='aa:bb:cc:dd:ee:ff',
uuid=uuidutils.generate_uuid(),
@ -56,17 +53,8 @@ class TestNetwork(db_base.DbTestCase):
result = network.get_node_vif_ids(task)
self.assertEqual(expected, result)
def test_get_node_vif_ids_one_port_extra(self):
self._test_get_node_vif_ids_one_port("extra")
def test_get_node_vif_ids_one_port_int_info(self):
self._test_get_node_vif_ids_one_port("internal_info")
def _test_get_node_vif_ids_one_portgroup(self, key):
if key == "extra":
kwargs1 = {key: {'vif_port_id': 'test-vif-A'}}
else:
kwargs1 = {key: {'tenant_vif_port_id': 'test-vif-A'}}
def test_get_node_vif_ids_one_portgroup_int_info(self):
kwargs1 = {'internal_info': {'tenant_vif_port_id': 'test-vif-A'}}
pg1 = db_utils.create_test_portgroup(
node_id=self.node.id, **kwargs1)
@ -76,19 +64,9 @@ class TestNetwork(db_base.DbTestCase):
result = network.get_node_vif_ids(task)
self.assertEqual(expected, result)
def test_get_node_vif_ids_one_portgroup_extra(self):
self._test_get_node_vif_ids_one_portgroup("extra")
def test_get_node_vif_ids_one_portgroup_int_info(self):
self._test_get_node_vif_ids_one_portgroup("internal_info")
def _test_get_node_vif_ids_two_ports(self, key):
if key == "extra":
kwargs1 = {key: {'vif_port_id': 'test-vif-A'}}
kwargs2 = {key: {'vif_port_id': 'test-vif-B'}}
else:
kwargs1 = {key: {'tenant_vif_port_id': 'test-vif-A'}}
kwargs2 = {key: {'tenant_vif_port_id': 'test-vif-B'}}
def test_get_node_vif_ids_two_ports_int_info(self):
kwargs1 = {'internal_info': {'tenant_vif_port_id': 'test-vif-A'}}
kwargs2 = {'internal_info': {'tenant_vif_port_id': 'test-vif-B'}}
port1 = db_utils.create_test_port(node_id=self.node.id,
address='aa:bb:cc:dd:ee:ff',
uuid=uuidutils.generate_uuid(),
@ -104,19 +82,9 @@ class TestNetwork(db_base.DbTestCase):
result = network.get_node_vif_ids(task)
self.assertEqual(expected, result)
def test_get_node_vif_ids_two_ports_extra(self):
self._test_get_node_vif_ids_two_ports('extra')
def test_get_node_vif_ids_two_ports_int_info(self):
self._test_get_node_vif_ids_two_ports('internal_info')
def _test_get_node_vif_ids_two_portgroups(self, key):
if key == "extra":
kwargs1 = {key: {'vif_port_id': 'test-vif-A'}}
kwargs2 = {key: {'vif_port_id': 'test-vif-B'}}
else:
kwargs1 = {key: {'tenant_vif_port_id': 'test-vif-A'}}
kwargs2 = {key: {'tenant_vif_port_id': 'test-vif-B'}}
def test_get_node_vif_ids_two_portgroups_int_info(self):
kwargs1 = {'internal_info': {'tenant_vif_port_id': 'test-vif-A'}}
kwargs2 = {'internal_info': {'tenant_vif_port_id': 'test-vif-B'}}
pg1 = db_utils.create_test_portgroup(
node_id=self.node.id, **kwargs1)
pg2 = db_utils.create_test_portgroup(
@ -131,12 +99,6 @@ class TestNetwork(db_base.DbTestCase):
result = network.get_node_vif_ids(task)
self.assertEqual(expected, result)
def test_get_node_vif_ids_two_portgroups_extra(self):
self._test_get_node_vif_ids_two_portgroups('extra')
def test_get_node_vif_ids_two_portgroups_int_info(self):
self._test_get_node_vif_ids_two_portgroups('internal_info')
def _test_get_node_vif_ids_multitenancy(self, int_info_key):
port = db_utils.create_test_port(
node_id=self.node.id, address='aa:bb:cc:dd:ee:ff',

View File

@ -306,16 +306,6 @@ class GenericUtilsTestCase(base.TestCase):
utils.is_valid_no_proxy(no_proxy),
msg="'no_proxy' value should be invalid: {}".format(no_proxy))
@mock.patch.object(utils, 'LOG', autospec=True)
def test_warn_about_deprecated_extra_vif_port_id(self, mock_log):
# Set variable to default value
utils.warn_deprecated_extra_vif_port_id = False
utils.warn_about_deprecated_extra_vif_port_id()
utils.warn_about_deprecated_extra_vif_port_id()
self.assertEqual(1, mock_log.warning.call_count)
self.assertIn("extra['vif_port_id'] is deprecated and will not",
mock_log.warning.call_args[0][0])
class TempFilesTestCase(base.TestCase):

View File

@ -477,11 +477,8 @@ class TestNeutron(db_base.DbTestCase):
@mock.patch('ironic.dhcp.neutron.NeutronDHCPApi._get_fixed_ip_address',
autospec=True)
def _test__get_ip_addresses_ports(self, key, mock_gfia):
if key == "extra":
kwargs1 = {key: {'vif_port_id': 'test-vif-A'}}
else:
kwargs1 = {key: {'tenant_vif_port_id': 'test-vif-A'}}
def test__get_ip_addresses_ports_int_info(self, mock_gfia):
kwargs1 = {'internal_info': {'tenant_vif_port_id': 'test-vif-A'}}
ip_address = '10.10.0.1'
expected = [ip_address]
port = object_utils.create_test_port(self.context,
@ -496,19 +493,10 @@ class TestNeutron(db_base.DbTestCase):
mock.sentinel.client)
self.assertEqual(expected, result)
def test__get_ip_addresses_ports_extra(self):
self._test__get_ip_addresses_ports('extra')
def test__get_ip_addresses_ports_int_info(self):
self._test__get_ip_addresses_ports('internal_info')
@mock.patch('ironic.dhcp.neutron.NeutronDHCPApi._get_fixed_ip_address',
autospec=True)
def _test__get_ip_addresses_portgroup(self, key, mock_gfia):
if key == "extra":
kwargs1 = {key: {'vif_port_id': 'test-vif-A'}}
else:
kwargs1 = {key: {'tenant_vif_port_id': 'test-vif-A'}}
def test__get_ip_addresses_portgroup_int_info(self, mock_gfia):
kwargs1 = {'internal_info': {'tenant_vif_port_id': 'test-vif-A'}}
ip_address = '10.10.0.1'
expected = [ip_address]
pg = object_utils.create_test_portgroup(
@ -521,12 +509,6 @@ class TestNeutron(db_base.DbTestCase):
result = api._get_ip_addresses(task, [pg], mock.sentinel.client)
self.assertEqual(expected, result)
def test__get_ip_addresses_portgroup_extra(self):
self._test__get_ip_addresses_portgroup('extra')
def test__get_ip_addresses_portgroup_int_info(self):
self._test__get_ip_addresses_portgroup('internal_info')
@mock.patch('ironic.common.neutron.get_client', autospec=True)
@mock.patch('ironic.dhcp.neutron.NeutronDHCPApi._get_port_ip_address',
autospec=True)

View File

@ -70,7 +70,7 @@ class TestCommonFunctions(db_base.DbTestCase):
self.context, node_id=self.node.id,
address='52:54:00:cf:2d:04',
physical_network=physical_network,
extra={'vif_port_id': 'some-vif'},
internal_info={'tenant_vif_port_id': 'some-vif'},
uuid=uuidutils.generate_uuid(), portgroup_id=pg2.id))
# This portgroup has 'some-vif-2' attached to it and contains one port,
# so neither portgroup nor port can be considered free. The ports are
@ -368,7 +368,7 @@ class TestCommonFunctions(db_base.DbTestCase):
obj_utils.create_test_port(
self.context, node_id=self.node.id, address='52:54:00:cf:2d:01',
uuid=uuidutils.generate_uuid(), portgroup_id=pg.id,
extra={'vif_port_id': 'some-vif'})
internal_info={'tenant_vif_port_id': 'some-vif'})
free_port = obj_utils.create_test_port(
self.context, node_id=self.node.id, address='52:54:00:cf:2d:02',
uuid=uuidutils.generate_uuid(), portgroup_id=pg.id)
@ -394,23 +394,6 @@ class TestCommonFunctions(db_base.DbTestCase):
common.get_free_port_like_object,
task, self.vif_id, {'anyphysnet'})
@mock.patch.object(neutron_common, 'validate_port_info', autospec=True,
return_value=True)
def test_get_free_port_like_object_vif_attached_to_portgroup_extra(
self, vpi_mock):
pg = obj_utils.create_test_portgroup(
self.context, node_id=self.node.id,
extra={'vif_port_id': self.vif_id})
obj_utils.create_test_port(
self.context, node_id=self.node.id, address='52:54:00:cf:2d:01',
uuid=uuidutils.generate_uuid(), portgroup_id=pg.id)
with task_manager.acquire(self.context, self.node.id) as task:
self.assertRaisesRegex(
exception.VifAlreadyAttached,
r"already attached to Ironic Portgroup",
common.get_free_port_like_object,
task, self.vif_id, {'anyphysnet'})
@mock.patch.object(neutron_common, 'validate_port_info', autospec=True,
return_value=True)
def test_get_free_port_like_object_vif_attached_to_port(self, vpi_mock):
@ -423,23 +406,10 @@ class TestCommonFunctions(db_base.DbTestCase):
common.get_free_port_like_object,
task, self.vif_id, {'anyphysnet'})
@mock.patch.object(neutron_common, 'validate_port_info', autospec=True,
return_value=True)
def test_get_free_port_like_object_vif_attached_to_port_extra(
self, vpi_mock):
self.port.extra = {'vif_port_id': self.vif_id}
self.port.save()
with task_manager.acquire(self.context, self.node.id) as task:
self.assertRaisesRegex(
exception.VifAlreadyAttached,
r"already attached to Ironic Port\b",
common.get_free_port_like_object,
task, self.vif_id, {'anyphysnet'})
@mock.patch.object(neutron_common, 'validate_port_info', autospec=True,
return_value=True)
def test_get_free_port_like_object_nothing_free(self, vpi_mock):
self.port.extra = {'vif_port_id': 'another-vif'}
self.port.internal_info = {'tenant_vif_port_id': 'another-vif'}
self.port.save()
with task_manager.acquire(self.context, self.node.id) as task:
self.assertRaises(exception.NoFreePhysicalPorts,
@ -523,8 +493,8 @@ class TestVifPortIDMixin(db_base.DbTestCase):
self.port = obj_utils.create_test_port(
self.context, node_id=self.node.id,
address='52:54:00:cf:2d:32',
extra={'vif_port_id': uuidutils.generate_uuid(),
'client-id': 'fake1'})
internal_info={'tenant_vif_port_id': uuidutils.generate_uuid()},
extra={'client-id': 'fake1'})
network_data_file = os.path.join(
os.path.dirname(__file__), 'json_samples', 'network_data.json')
with open(network_data_file, 'rb') as fl:
@ -564,7 +534,10 @@ class TestVifPortIDMixin(db_base.DbTestCase):
def test__clear_vif_from_port_like_obj_in_internal_info_port(self):
self.port.internal_info = {
common.TENANT_VIF_KEY: self.port.extra['vif_port_id']}
common.TENANT_VIF_KEY: self.port.internal_info[
'tenant_vif_port_id'
]
}
self.port.extra = {}
self.port.save()
@ -601,14 +574,8 @@ class TestVifPortIDMixin(db_base.DbTestCase):
self.assertNotIn('vif_port_id', pg.extra)
self.assertNotIn(common.TENANT_VIF_KEY, pg.internal_info)
def test__get_port_like_obj_by_vif_id_in_extra(self):
vif_id = self.port.extra["vif_port_id"]
with task_manager.acquire(self.context, self.node.id) as task:
result = self.interface._get_port_like_obj_by_vif_id(task, vif_id)
self.assertEqual(self.port.id, result.id)
def test__get_port_like_obj_by_vif_id_in_internal_info(self):
vif_id = self.port.extra["vif_port_id"]
vif_id = self.port.internal_info["tenant_vif_port_id"]
self.port.internal_info = {common.TENANT_VIF_KEY: vif_id}
self.port.extra = {}
self.port.save()
@ -617,8 +584,8 @@ class TestVifPortIDMixin(db_base.DbTestCase):
self.assertEqual(self.port.id, result.id)
def test__get_port_like_obj_by_vif_id_not_attached(self):
vif_id = self.port.extra["vif_port_id"]
self.port.extra = {}
vif_id = self.port.internal_info["tenant_vif_port_id"]
self.port.internal_info = {}
self.port.save()
with task_manager.acquire(self.context, self.node.id) as task:
self.assertRaisesRegex(exception.VifNotAttached,
@ -626,13 +593,8 @@ class TestVifPortIDMixin(db_base.DbTestCase):
self.interface._get_port_like_obj_by_vif_id,
task, vif_id)
def test__get_vif_id_by_port_like_obj_in_extra(self):
vif_id = self.port.extra["vif_port_id"]
result = self.interface._get_vif_id_by_port_like_obj(self.port)
self.assertEqual(vif_id, result)
def test__get_vif_id_by_port_like_obj_in_internal_info(self):
vif_id = self.port.extra["vif_port_id"]
vif_id = self.port.internal_info["tenant_vif_port_id"]
self.port.internal_info = {common.TENANT_VIF_KEY: vif_id}
self.port.extra = {}
self.port.save()
@ -640,14 +602,14 @@ class TestVifPortIDMixin(db_base.DbTestCase):
self.assertEqual(vif_id, result)
def test__get_vif_id_by_port_like_obj_not_attached(self):
self.port.extra = {}
self.port.internal_info = {}
self.port.save()
result = self.interface._get_vif_id_by_port_like_obj(self.port)
self.assertIsNone(result)
def test_vif_list_extra(self):
def test_vif_list_port_and_portgroup(self):
vif_id = uuidutils.generate_uuid()
self.port.extra = {'vif_port_id': vif_id}
self.port.internal_info = {'tenant_vif_port_id': vif_id}
self.port.save()
pg_vif_id = uuidutils.generate_uuid()
portgroup = obj_utils.create_test_portgroup(
@ -678,6 +640,7 @@ class TestVifPortIDMixin(db_base.DbTestCase):
self.assertCountEqual([{'id': pg_vif_id}, {'id': vif_id}], vifs)
def test_vif_list_extra_and_internal_priority(self):
# TODO(TheJulia): Remove in Xena?
vif_id = uuidutils.generate_uuid()
vif_id2 = uuidutils.generate_uuid()
self.port.extra = {'vif_port_id': vif_id2}
@ -687,14 +650,6 @@ class TestVifPortIDMixin(db_base.DbTestCase):
vifs = self.interface.vif_list(task)
self.assertEqual([{'id': vif_id}], vifs)
def test_get_current_vif_extra_vif_port_id(self):
extra = {'vif_port_id': 'foo'}
self.port.extra = extra
self.port.save()
with task_manager.acquire(self.context, self.node.id) as task:
vif = self.interface.get_current_vif(task, self.port)
self.assertEqual('foo', vif)
def test_get_current_vif_internal_info_cleaning(self):
internal_info = {'cleaning_vif_port_id': 'foo',
'tenant_vif_port_id': 'bar'}
@ -750,8 +705,8 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
self.port = obj_utils.create_test_port(
self.context, node_id=self.node.id,
address='52:54:00:cf:2d:32',
extra={'vif_port_id': uuidutils.generate_uuid(),
'client-id': 'fake1'})
internal_info={'tenant_vif_port_id': uuidutils.generate_uuid()},
extra={'client-id': 'fake1'})
self.neutron_port = {'id': '132f871f-eaec-4fed-9475-0d54465e0f00',
'mac_address': '52:54:00:cf:2d:32'}
@ -903,7 +858,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
autospec=True)
def test_vif_attach_update_port_exception(self, mock_gpbpi, mock_upa,
mock_client, mock_save):
self.port.extra = {}
self.port.internal_info = {}
self.port.physical_network = 'physnet1'
self.port.save()
vif = {'id': "fake_vif_id"}
@ -1075,7 +1030,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.port_changed(task, self.port)
mac_update_mock.assert_called_once_with(
self.port.extra['vif_port_id'],
self.port.internal_info['tenant_vif_port_id'],
new_address,
context=task.context)
@ -1090,12 +1045,12 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
self.interface.port_changed,
task, self.port)
mac_update_mock.assert_called_once_with(
self.port.extra['vif_port_id'], new_address,
self.port.internal_info['tenant_vif_port_id'], new_address,
context=task.context)
@mock.patch.object(neutron_common, 'update_port_address', autospec=True)
def test_port_changed_address_no_vif_id(self, mac_update_mock):
self.port.extra = {}
self.port.internal_info = {}
self.port.save()
self.port.address = '11:22:33:44:55:bb'
with task_manager.acquire(self.context, self.node.id) as task:
@ -1105,9 +1060,11 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
@mock.patch('ironic.dhcp.neutron.NeutronDHCPApi.update_port_dhcp_opts',
autospec=True)
def test_port_changed_client_id(self, dhcp_update_mock):
expected_extra = {'vif_port_id': 'fake-id', 'client-id': 'fake2'}
expected_ii = {'tenant_vif_port_id': 'fake-id'}
expected_extra = {'client-id': 'fake2'}
expected_dhcp_opts = [{'opt_name': '61', 'opt_value': 'fake2'}]
self.port.extra = expected_extra
self.port.internal_info = expected_ii
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.port_changed(task, self.port)
dhcp_update_mock.assert_called_once_with(
@ -1116,7 +1073,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
@mock.patch('ironic.dhcp.neutron.NeutronDHCPApi.update_port_dhcp_opts',
autospec=True)
def test_port_changed_extra_add_new_key(self, dhcp_update_mock):
self.port.extra = {'vif_port_id': 'fake-id'}
self.port.internal_info = {'tenant_vif_port_id': 'fake-id'}
self.port.save()
expected_extra = self.port.extra
expected_extra['foo'] = 'bar'
@ -1128,7 +1085,8 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
@mock.patch('ironic.dhcp.neutron.NeutronDHCPApi.update_port_dhcp_opts',
autospec=True)
def test_port_changed_client_id_fail(self, dhcp_update_mock):
self.port.extra = {'vif_port_id': 'fake-id', 'client-id': 'fake2'}
self.port.internal_info = {'tenant_vif_port_id': 'fake-id'}
self.port.extra = {'client-id': 'fake2'}
dhcp_update_mock.side_effect = (
exception.FailedToUpdateDHCPOptOnPort(port_id=self.port.uuid))
with task_manager.acquire(self.context, self.node.id) as task:
@ -1139,6 +1097,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
@mock.patch('ironic.dhcp.neutron.NeutronDHCPApi.update_port_dhcp_opts',
autospec=True)
def test_port_changed_client_id_no_vif_id(self, dhcp_update_mock):
self.port.internal_info = {}
self.port.extra = {'client-id': 'fake1'}
self.port.save()
self.port.extra = {'client-id': 'fake2'}
@ -1153,11 +1112,12 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
self.context, node_id=self.node.id,
standalone_ports_supported=False)
port = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address="aa:bb:cc:dd:ee:01",
extra={'vif_port_id': 'blah'},
pxe_enabled=False)
port = obj_utils.create_test_port(
self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address="aa:bb:cc:dd:ee:01",
internal_info={'tenant_vif_port_id': 'blah'},
pxe_enabled=False)
port.portgroup_id = pg.id
with task_manager.acquire(self.context, self.node.id) as task:
@ -1173,12 +1133,12 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
self.context, node_id=self.node.id,
standalone_ports_supported=standalone_ports)
extra_vif = {'vif_port_id': uuidutils.generate_uuid()}
extra_vif = {'tenant_vif_port_id': uuidutils.generate_uuid()}
if has_vif:
extra = extra_vif
internal_info = extra_vif
opposite_extra = {}
else:
extra = {}
internal_info = {}
opposite_extra = extra_vif
opposite_pxe_enabled = not pxe_enabled
@ -1193,7 +1153,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
p1 = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address="aa:bb:cc:dd:ee:01",
extra=extra,
internal_info=internal_info,
pxe_enabled=pxe_enabled)
p1.portgroup_id = pg_id
ports.append(p1)
@ -1202,9 +1162,9 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
p2 = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address="aa:bb:cc:dd:ee:02",
extra=opposite_extra,
internal_info=opposite_extra,
pxe_enabled=opposite_pxe_enabled)
p2.extra = extra
p2.internal_info = internal_info
p2.pxe_enabled = pxe_enabled
p2.portgroup_id = pg_id
ports.append(p2)
@ -1213,7 +1173,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
p3 = obj_utils.create_test_port(self.context, node_id=self.node.id,
uuid=uuidutils.generate_uuid(),
address="aa:bb:cc:dd:ee:03",
extra=extra,
internal_info=internal_info,
pxe_enabled=opposite_pxe_enabled)
p3.pxe_enabled = pxe_enabled
p3.portgroup_id = pg_id
@ -1224,8 +1184,8 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
uuid=uuidutils.generate_uuid(),
address="aa:bb:cc:dd:ee:04",
pxe_enabled=pxe_enabled,
extra=opposite_extra)
p4.extra = extra
internal_info=opposite_extra)
p4.internal_info = internal_info
p4.portgroup_id = pg_id
ports.append(p4)
@ -1302,7 +1262,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
def test_update_portgroup_address(self, mac_update_mock):
pg = obj_utils.create_test_portgroup(
self.context, node_id=self.node.id,
extra={'vif_port_id': 'fake-id'})
internal_info={'tenant_vif_port_id': 'fake-id'})
new_address = '11:22:33:44:55:bb'
pg.address = new_address
with task_manager.acquire(self.context, self.node.id) as task:
@ -1314,7 +1274,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
def test_update_portgroup_remove_address(self, mac_update_mock):
pg = obj_utils.create_test_portgroup(
self.context, node_id=self.node.id,
extra={'vif_port_id': 'fake-id'})
internal_info={'tenant_vif_port_id': 'fake-id'})
pg.address = None
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.portgroup_changed(task, pg)
@ -1324,7 +1284,7 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
def test_update_portgroup_address_fail(self, mac_update_mock):
pg = obj_utils.create_test_portgroup(
self.context, node_id=self.node.id,
extra={'vif_port_id': 'fake-id'})
internal_info={'tenant_vif_port_id': 'fake-id'})
new_address = '11:22:33:44:55:bb'
pg.address = new_address
mac_update_mock.side_effect = (
@ -1352,9 +1312,10 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
self, mac_update_mock):
pg = obj_utils.create_test_portgroup(
self.context, node_id=self.node.id)
extra = {'vif_port_id': 'foo'}
internal_info = {'tenant_vif_port_id': 'foo'}
obj_utils.create_test_port(
self.context, node_id=self.node.id, extra=extra,
self.context, node_id=self.node.id,
internal_info=internal_info,
pxe_enabled=True, portgroup_id=pg.id,
address="aa:bb:cc:dd:ee:01",
uuid=uuidutils.generate_uuid())
@ -1378,12 +1339,15 @@ class TestNeutronVifPortIDMixin(db_base.DbTestCase):
standalone_ports_supported=old_standalone_ports_supported)
if with_ports:
extra = {}
internal_info = {}
if has_vif:
extra = {'vif_port_id': uuidutils.generate_uuid()}
internal_info = {
'tenant_vif_port_id': uuidutils.generate_uuid()
}
obj_utils.create_test_port(
self.context, node_id=self.node.id, extra=extra,
self.context, node_id=self.node.id,
internal_info=internal_info,
pxe_enabled=pxe_enabled, portgroup_id=pg.id,
address="aa:bb:cc:dd:ee:01",
uuid=uuidutils.generate_uuid())

View File

@ -174,9 +174,10 @@ class TestFlatInterface(db_base.DbTestCase):
@mock.patch.object(neutron, 'update_neutron_port', autospec=True)
def test__bind_flat_ports_set_binding_host_id(self, update_mock):
extra = {'vif_port_id': 'foo'}
internal_info = {'tenant_vif_port_id': 'foo'}
utils.create_test_port(self.context, node_id=self.node.id,
address='52:54:00:cf:2d:33', extra=extra,
address='52:54:00:cf:2d:33',
internal_info=internal_info,
uuid=uuidutils.generate_uuid())
exp_body = {'binding:host_id': self.node.uuid,
'binding:vnic_type': neutron.VNIC_BAREMETAL,
@ -193,7 +194,8 @@ class TestFlatInterface(db_base.DbTestCase):
uuid=uuidutils.generate_uuid())
utils.create_test_port(
self.context, node_id=self.node.id, address='52:54:00:cf:2d:33',
extra={'vif_port_id': 'bar'}, uuid=uuidutils.generate_uuid())
internal_info={'tenant_vif_port_id': 'bar'},
uuid=uuidutils.generate_uuid())
exp_body1 = {'binding:host_id': self.node.uuid,
'binding:vnic_type': neutron.VNIC_BAREMETAL,
'mac_address': '52:54:00:cf:2d:33'}
@ -208,9 +210,10 @@ class TestFlatInterface(db_base.DbTestCase):
@mock.patch.object(neutron, 'unbind_neutron_port', autospec=True)
def test__unbind_flat_ports(self, unbind_neutron_port_mock):
extra = {'vif_port_id': 'foo'}
internal_info = {'tenant_vif_port_id': 'foo'}
utils.create_test_port(self.context, node_id=self.node.id,
address='52:54:00:cf:2d:33', extra=extra,
address='52:54:00:cf:2d:33',
internal_info=internal_info,
uuid=uuidutils.generate_uuid())
with task_manager.acquire(self.context, self.node.id) as task:
self.interface._unbind_flat_ports(task)
@ -223,9 +226,10 @@ class TestFlatInterface(db_base.DbTestCase):
utils.create_test_portgroup(self.context, node_id=self.node.id,
internal_info=internal_info,
uuid=uuidutils.generate_uuid())
extra = {'vif_port_id': 'bar'}
internal_info = {'tenant_vif_port_id': 'bar'}
utils.create_test_port(self.context, node_id=self.node.id,
address='52:54:00:cf:2d:33', extra=extra,
address='52:54:00:cf:2d:33',
internal_info=internal_info,
uuid=uuidutils.generate_uuid())
with task_manager.acquire(self.context, self.node.id) as task:
self.interface._unbind_flat_ports(task)
@ -236,9 +240,10 @@ class TestFlatInterface(db_base.DbTestCase):
@mock.patch.object(neutron, 'update_neutron_port', autospec=True)
def test__bind_flat_ports_set_binding_host_id_raise(self, update_mock):
update_mock.side_effect = openstack_exc.OpenStackCloudException()
extra = {'vif_port_id': 'foo'}
internal_info = {'tenant_vif_port_id': 'foo'}
utils.create_test_port(self.context, node_id=self.node.id,
address='52:54:00:cf:2d:33', extra=extra,
address='52:54:00:cf:2d:33',
internal_info=internal_info,
uuid=uuidutils.generate_uuid())
with task_manager.acquire(self.context, self.node.id) as task:
self.assertRaises(exception.NetworkError,

View File

@ -53,7 +53,7 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
self.port = utils.create_test_port(
self.context, node_id=self.node.id,
address='52:54:00:cf:2d:32',
extra={'vif_port_id': uuidutils.generate_uuid()})
internal_info={'tenant_vif_port_id': uuidutils.generate_uuid()})
self.neutron_port = stubs.FakeNeutronPort(
id='132f871f-eaec-4fed-9475-0d54465e0f00',
mac_address='52:54:00:cf:2d:32')
@ -425,7 +425,7 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
self.context, node_id=self.node.id,
address='52:54:00:cf:2d:33',
uuid=uuidutils.generate_uuid(),
extra={'vif_port_id': uuidutils.generate_uuid()})
internal_info={'tenant_vif_port_id': uuidutils.generate_uuid()})
neutron_other_port = {'id': uuidutils.generate_uuid(),
'mac_address': '52:54:00:cf:2d:33'}
add_ports_mock.return_value = {
@ -456,7 +456,7 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
self.context, node_id=self.node.id,
address='52:54:00:cf:2d:33',
uuid=uuidutils.generate_uuid(),
extra={'vif_port_id': uuidutils.generate_uuid()})
internal_info={'tenant_vif_port_id': uuidutils.generate_uuid()})
neutron_other_port = {'id': uuidutils.generate_uuid(),
'mac_address': '52:54:00:cf:2d:33'}
add_ports_mock.return_value = {
@ -514,7 +514,7 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
self.context, node_id=self.node.id,
address='52:54:00:cf:2d:33',
uuid=uuidutils.generate_uuid(),
extra={'vif_port_id': uuidutils.generate_uuid()})
internal_info={'tenant_vif_port_id': uuidutils.generate_uuid()})
other_port.internal_info = {'rescuing_vif_port_id': 'vif-port-id'}
other_port.save()
with task_manager.acquire(self.context, self.node.id) as task:
@ -533,7 +533,8 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.unconfigure_tenant_networks(task)
mock_unbind_port.assert_called_once_with(
self.port.extra['vif_port_id'], context=task.context,
self.port.internal_info['tenant_vif_port_id'],
context=task.context,
reset_mac=True)
@mock.patch.object(neutron_common, 'get_client', autospec=True)
@ -551,7 +552,8 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.unconfigure_tenant_networks(task)
mock_unbind_port.assert_called_once_with(
self.port.extra['vif_port_id'], context=task.context,
self.port.internal_info['tenant_vif_port_id'],
context=task.context,
reset_mac=True)
wait_agent_mock.assert_called_once_with(nclient, 'hostname')
@ -563,7 +565,8 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.unconfigure_tenant_networks(task)
mock_unbind_port.assert_has_calls([
mock.call(self.port.extra['vif_port_id'], context=task.context,
mock.call(self.port.internal_info['tenant_vif_port_id'],
context=task.context,
reset_mac=True),
mock.call(pg.internal_info['tenant_vif_port_id'],
context=task.context, reset_mac=True)])
@ -576,7 +579,8 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.unconfigure_tenant_networks(task)
mock_unbind_port.assert_has_calls([
mock.call(self.port.extra['vif_port_id'], context=task.context,
mock.call(self.port.internal_info['tenant_vif_port_id'],
context=task.context,
reset_mac=True),
mock.call(pg.internal_info['tenant_vif_port_id'],
context=task.context, reset_mac=False)])
@ -592,7 +596,7 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
@mock.patch.object(neutron_common, 'get_client', autospec=True)
@mock.patch.object(neutron, 'LOG', autospec=True)
def test_configure_tenant_networks_no_vif_id(self, log_mock, client_mock):
self.port.extra = {}
self.port.internal_info = {}
self.port.save()
upd_mock = mock.Mock()
client_mock.return_value.update_port = upd_mock
@ -624,9 +628,10 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.configure_tenant_networks(task)
client_mock.assert_called_once_with(context=task.context)
update_mock.assert_called_once_with(self.context,
self.port.extra['vif_port_id'],
expected_attrs)
update_mock.assert_called_once_with(
self.context,
self.port.internal_info['tenant_vif_port_id'],
expected_attrs)
@mock.patch.object(neutron_common, 'wait_for_host_agent', autospec=True)
@mock.patch.object(neutron_common, 'update_neutron_port', autospec=True)
@ -647,16 +652,18 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
@mock.patch.object(neutron_common, 'get_client', autospec=True)
def _test_configure_tenant_networks(self, client_mock, update_mock,
wait_agent_mock,
is_client_id=False,
vif_int_info=False):
if vif_int_info:
kwargs = {'internal_info': {
is_client_id=False):
# NOTE(TheJulia): Until we have a replacement for infiniband client-id
# storage, extra has to stay put. On a plus side, this would be
# pointless/difficult to abuse other than just break dhcp for the node.
extra = {}
tenant_vif = self.port.internal_info['tenant_vif_port_id']
kwargs = {
'internal_info': {
'tenant_vif_port_id': uuidutils.generate_uuid()}}
self.port.internal_info = {
'tenant_vif_port_id': self.port.extra['vif_port_id']}
self.port.extra = {}
else:
kwargs = {'extra': {'vif_port_id': uuidutils.generate_uuid()}}
self.port.internal_info = {
'tenant_vif_port_id': tenant_vif}
self.port.extra = {}
second_port = utils.create_test_port(
self.context, node_id=self.node.id, address='52:54:00:cf:2d:33',
uuid=uuidutils.generate_uuid(),
@ -669,7 +676,6 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
client_ids = (CLIENT_ID1, CLIENT_ID2)
ports = (self.port, second_port)
for port, client_id in zip(ports, client_ids):
extra = port.extra
extra['client-id'] = client_id
port.extra = extra
port.save()
@ -694,31 +700,19 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
with task_manager.acquire(self.context, self.node.id) as task:
self.interface.configure_tenant_networks(task)
client_mock.assert_called_once_with(context=task.context)
if vif_int_info:
portid1 = self.port.internal_info['tenant_vif_port_id']
portid2 = second_port.internal_info['tenant_vif_port_id']
else:
portid1 = self.port.extra['vif_port_id']
portid2 = second_port.extra['vif_port_id']
portid1 = self.port.internal_info['tenant_vif_port_id']
portid2 = second_port.internal_info['tenant_vif_port_id']
update_mock.assert_has_calls(
[mock.call(self.context, portid1, port1_attrs),
mock.call(self.context, portid2, port2_attrs)],
any_order=True
)
def test_configure_tenant_networks_vif_extra(self):
def test_configure_tenant_networks(self):
self.node.instance_uuid = uuidutils.generate_uuid()
self.node.save()
self._test_configure_tenant_networks()
def test_configure_tenant_networks_vif_int_info(self):
self.node.instance_uuid = uuidutils.generate_uuid()
self.node.save()
self._test_configure_tenant_networks(vif_int_info=True)
def test_configure_tenant_networks_no_instance_uuid(self):
self._test_configure_tenant_networks()
def test_configure_tenant_networks_with_client_id(self):
self.node.instance_uuid = uuidutils.generate_uuid()
self.node.save()
@ -735,7 +729,7 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
port_data_mock):
pg = utils.create_test_portgroup(
self.context, node_id=self.node.id, address='ff:54:00:cf:2d:32',
extra={'vif_port_id': uuidutils.generate_uuid()})
internal_info={'tenant_vif_port_id': uuidutils.generate_uuid()})
port1 = utils.create_test_port(
self.context, node_id=self.node.id, address='ff:54:00:cf:2d:33',
uuid=uuidutils.generate_uuid(),
@ -777,9 +771,11 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
client_mock.assert_called_once_with(context=task.context)
glgi_mock.assert_called_once_with(task, pg)
update_mock.assert_has_calls(
[mock.call(self.context, self.port.extra['vif_port_id'],
[mock.call(self.context,
self.port.internal_info['tenant_vif_port_id'],
call1_attrs),
mock.call(self.context, pg.extra['vif_port_id'],
mock.call(self.context,
pg.internal_info['tenant_vif_port_id'],
call2_attrs)]
)
@ -794,7 +790,7 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
port_data_mock):
pg = utils.create_test_portgroup(
self.context, node_id=self.node.id, address=None,
extra={'vif_port_id': uuidutils.generate_uuid()})
internal_info={'tenant_vif_port_id': uuidutils.generate_uuid()})
port1 = utils.create_test_port(
self.context, node_id=self.node.id, address='ff:54:00:cf:2d:33',
uuid=uuidutils.generate_uuid(),
@ -835,9 +831,11 @@ class NeutronInterfaceTestCase(db_base.DbTestCase):
client_mock.assert_called_once_with(context=task.context)
glgi_mock.assert_called_once_with(task, pg)
update_mock.assert_has_calls(
[mock.call(self.context, self.port.extra['vif_port_id'],
[mock.call(self.context,
self.port.internal_info['tenant_vif_port_id'],
call1_attrs),
mock.call(self.context, pg.extra['vif_port_id'],
mock.call(self.context,
pg.internal_info['tenant_vif_port_id'],
call2_attrs)]
)

View File

@ -875,16 +875,6 @@ class GetSingleNicTestCase(db_base.DbTestCase):
address = utils.get_single_nic_with_vif_port_id(task)
self.assertEqual('aa:bb:cc:dd:ee:ff', address)
def test_get_single_nic_with_vif_port_id_extra(self):
obj_utils.create_test_port(
self.context, node_id=self.node.id, address='aa:bb:cc:dd:ee:ff',
uuid=uuidutils.generate_uuid(),
extra={'vif_port_id': 'test-vif-A'})
with task_manager.acquire(self.context, self.node.uuid,
shared=False) as task:
address = utils.get_single_nic_with_vif_port_id(task)
self.assertEqual('aa:bb:cc:dd:ee:ff', address)
def test_get_single_nic_with_cleaning_vif_port_id(self):
obj_utils.create_test_port(
self.context, node_id=self.node.id, address='aa:bb:cc:dd:ee:ff',

View File

@ -0,0 +1,8 @@
---
upgrade:
- |
The functionality of using a port.extra ``vif_port_id``
value to signal and control a VIF attachment has been removed
to support changing the permission model and access control policy.
Use of ``vif_port_id`` outside of the VIF attachment/detachment workflow
has been deprecated since the Ocata development cycle.