Merge "Remove extra/vif_port_id"
This commit is contained in:
commit
4028b5907b
@ -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'):
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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']
|
||||
|
@ -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',
|
||||
|
@ -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):
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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())
|
||||
|
@ -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,
|
||||
|
@ -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)]
|
||||
)
|
||||
|
||||
|
@ -890,16 +890,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',
|
||||
|
@ -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.
|
Loading…
x
Reference in New Issue
Block a user