Fixes empty physical_network is not guarded
An empty physical_network can be set to port and make the port unusable. Change-Id: I58cf04839f40922cf0c7ddffc08b843cb3c50e06 Story: 2008279 Task: 41153
This commit is contained in:
parent
5e68f79102
commit
91d6426b06
@ -627,6 +627,11 @@ class PortsController(rest.RestController):
|
|||||||
"Smart NIC port must have port_id "
|
"Smart NIC port must have port_id "
|
||||||
"and hostname in local_link_connection")
|
"and hostname in local_link_connection")
|
||||||
|
|
||||||
|
physical_network = pdict.get('physical_network')
|
||||||
|
if physical_network is not None and not physical_network:
|
||||||
|
raise exception.Invalid('A non-empty value is required when '
|
||||||
|
'setting physical_network')
|
||||||
|
|
||||||
create_remotely = api.request.rpcapi.can_send_create_port()
|
create_remotely = api.request.rpcapi.can_send_create_port()
|
||||||
if (not create_remotely and pdict.get('portgroup_uuid')):
|
if (not create_remotely and pdict.get('portgroup_uuid')):
|
||||||
# NOTE(mgoddard): In RPC API v1.41, port creation was moved to the
|
# NOTE(mgoddard): In RPC API v1.41, port creation was moved to the
|
||||||
@ -749,6 +754,12 @@ class PortsController(rest.RestController):
|
|||||||
raise exception.ClientSideError(msg,
|
raise exception.ClientSideError(msg,
|
||||||
status_code=http_client.CONFLICT)
|
status_code=http_client.CONFLICT)
|
||||||
|
|
||||||
|
if (api_utils.is_path_updated(patch, '/physical_network')
|
||||||
|
and rpc_port['physical_network'] is not None
|
||||||
|
and not rpc_port['physical_network']):
|
||||||
|
raise exception.Invalid('A non-empty value is required when '
|
||||||
|
'setting physical_network')
|
||||||
|
|
||||||
notify_extra = {'node_uuid': rpc_node.uuid,
|
notify_extra = {'node_uuid': rpc_node.uuid,
|
||||||
'portgroup_uuid': port.portgroup_uuid}
|
'portgroup_uuid': port.portgroup_uuid}
|
||||||
notify.emit_start_notification(context, rpc_port, 'update',
|
notify.emit_start_notification(context, rpc_port, 'update',
|
||||||
|
@ -1779,6 +1779,19 @@ class TestPatch(test_api_base.BaseApiTest):
|
|||||||
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
|
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
|
||||||
self.assertIn('maximum character', response.json['error_message'])
|
self.assertIn('maximum character', response.json['error_message'])
|
||||||
|
|
||||||
|
def test_invalid_physnet_empty_string(self, mock_upd):
|
||||||
|
physnet = ''
|
||||||
|
headers = {api_base.Version.string: versions.max_version_string()}
|
||||||
|
response = self.patch_json('/ports/%s' % self.port.uuid,
|
||||||
|
[{'path': '/physical_network',
|
||||||
|
'value': physnet,
|
||||||
|
'op': 'replace'}],
|
||||||
|
expect_errors=True,
|
||||||
|
headers=headers)
|
||||||
|
self.assertEqual('application/json', response.content_type)
|
||||||
|
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
|
||||||
|
self.assertIn('non-empty value', response.json['error_message'])
|
||||||
|
|
||||||
def test_portgroups_subresource_patch(self, mock_upd):
|
def test_portgroups_subresource_patch(self, mock_upd):
|
||||||
portgroup = obj_utils.create_test_portgroup(self.context,
|
portgroup = obj_utils.create_test_portgroup(self.context,
|
||||||
node_id=self.node.id)
|
node_id=self.node.id)
|
||||||
@ -2600,6 +2613,16 @@ class TestPost(test_api_base.BaseApiTest):
|
|||||||
self.assertIn('maximum character', response.json['error_message'])
|
self.assertIn('maximum character', response.json['error_message'])
|
||||||
self.assertFalse(mock_create.called)
|
self.assertFalse(mock_create.called)
|
||||||
|
|
||||||
|
def test_create_port_invalid_physnet_empty_string(self, mock_create):
|
||||||
|
physnet = ''
|
||||||
|
pdict = post_get_test_port(physical_network=physnet)
|
||||||
|
response = self.post_json('/ports', pdict, expect_errors=True,
|
||||||
|
headers=self.headers)
|
||||||
|
self.assertEqual('application/json', response.content_type)
|
||||||
|
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
|
||||||
|
self.assertIn('non-empty value', response.json['error_message'])
|
||||||
|
self.assertFalse(mock_create.called)
|
||||||
|
|
||||||
def test_create_port_with_is_smartnic(self, mock_create):
|
def test_create_port_with_is_smartnic(self, mock_create):
|
||||||
llc = {'hostname': 'host1', 'port_id': 'rep0-0'}
|
llc = {'hostname': 'host1', 'port_id': 'rep0-0'}
|
||||||
pdict = post_get_test_port(is_smartnic=True, node_uuid=self.node.uuid,
|
pdict = post_get_test_port(is_smartnic=True, node_uuid=self.node.uuid,
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
fixes an issue that physical_network could be set to an empty string,
|
||||||
|
which makes the port unusable.
|
Loading…
Reference in New Issue
Block a user