Prevent multiple datanetworks to same interface
Since sriov-network-device-plugin upgrade to v3.5.1, assigning multiple datanetworks to the same interface is not possible anymore. This change restricts the system interface-datanetwork-assign command to prevent that from happening. Test Plan: PASS: assign datanetwork1 to sriov0 interface: ok PASS: assign datanetwork2 to same sriov0 interface: fails PASS: create new vf0 interface on top of sriov0: ok PASS: assign datanetwork1 to vf0: ok PASS: assign datanetwork2 to vf0: fails PASS: create new vf1 interface on top of sriov0: ok PASS: assign datanetwork2 to vf1: ok PASS: assign datanetwork1 to vf1: fails Closes-Bug: 2059960 Change-Id: If3ab95594917089f01475f9595c9059edeae85f5 Signed-off-by: Caio Bruchert <caio.bruchert@windriver.com>
This commit is contained in:
parent
15aefdc468
commit
f6158f5b02
|
@ -17,7 +17,7 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (c) 2019 Wind River Systems, Inc.
|
# Copyright (c) 2019-2024 Wind River Systems, Inc.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
@ -244,20 +244,20 @@ class InterfaceDataNetworkController(rest.RestController):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _query_interface_datanetwork(interface_datanetwork):
|
def _query_interface_datanetwork(interface_datanetwork):
|
||||||
try:
|
try:
|
||||||
result = pecan.request.dbapi.interface_datanetwork_query(
|
result = pecan.request.dbapi.interface_datanetwork_get_by_interface(
|
||||||
interface_datanetwork)
|
interface_datanetwork['interface_id'], 1)
|
||||||
except exception.InterfaceDataNetworkNotFoundByKeys:
|
except exception.InterfaceDataNetworkNotFoundByKeys:
|
||||||
return None
|
return None
|
||||||
return result
|
return result[0] if len(result) > 0 else None
|
||||||
|
|
||||||
def _check_duplicate_interface_datanetwork(self, interface_datanetwork):
|
def _check_duplicate_interface_datanetwork(self, interface_datanetwork):
|
||||||
ifdn = self._query_interface_datanetwork(interface_datanetwork)
|
ifdn = self._query_interface_datanetwork(interface_datanetwork)
|
||||||
if not ifdn:
|
if not ifdn:
|
||||||
return
|
return
|
||||||
msg = _("Interface '%s' assignment with Data Network '%s' "
|
msg = _("Interface '%s' can have only one Data Network assignment."
|
||||||
"already exists."
|
" Data Network '%s' already assigned."
|
||||||
% (ifdn['ifname'],
|
% (ifdn['ifname'],
|
||||||
ifdn['datanetwork_name']))
|
ifdn['datanetwork_name']))
|
||||||
raise wsme.exc.ClientSideError(msg)
|
raise wsme.exc.ClientSideError(msg)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# -*- encoding: utf-8 -*-
|
# -*- encoding: utf-8 -*-
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (c) 2021 Wind River Systems, Inc.
|
# Copyright (c) 2021-2024 Wind River Systems, Inc.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
@ -44,8 +44,13 @@ class InterfaceDataNetworkTestCase(base.FunctionalTest):
|
||||||
administrative=constants.ADMIN_UNLOCKED,
|
administrative=constants.ADMIN_UNLOCKED,
|
||||||
invprovision=constants.PROVISIONED,
|
invprovision=constants.PROVISIONED,
|
||||||
)
|
)
|
||||||
self.datanetwork = dbutils.create_test_datanetwork(
|
self.datanetwork0 = dbutils.create_test_datanetwork(
|
||||||
name='test1',
|
name='dn0',
|
||||||
|
uuid=str(uuid.uuid4()),
|
||||||
|
network_type=constants.DATANETWORK_TYPE_VLAN,
|
||||||
|
mtu=1500)
|
||||||
|
self.datanetwork1 = dbutils.create_test_datanetwork(
|
||||||
|
name='dn1',
|
||||||
uuid=str(uuid.uuid4()),
|
uuid=str(uuid.uuid4()),
|
||||||
network_type=constants.DATANETWORK_TYPE_VLAN,
|
network_type=constants.DATANETWORK_TYPE_VLAN,
|
||||||
mtu=1500)
|
mtu=1500)
|
||||||
|
@ -88,39 +93,48 @@ class InterfaceDataNetworkCreateTestCase(InterfaceDataNetworkTestCase):
|
||||||
super(InterfaceDataNetworkCreateTestCase, self).setUp()
|
super(InterfaceDataNetworkCreateTestCase, self).setUp()
|
||||||
|
|
||||||
def test_assign_interface_datanetwork(self):
|
def test_assign_interface_datanetwork(self):
|
||||||
# system interface-datanetwork-assign controller-0 sriov0 test1
|
# system interface-datanetwork-assign controller-0 sriov0 dn0
|
||||||
sriov0_assign_dn = dbutils.post_get_test_interface_datanetwork(
|
sriov0_assign_dn = dbutils.post_get_test_interface_datanetwork(
|
||||||
interface_uuid=self.if_sriov0.uuid,
|
interface_uuid=self.if_sriov0.uuid,
|
||||||
datanetwork_uuid=self.datanetwork.uuid)
|
datanetwork_uuid=self.datanetwork0.uuid)
|
||||||
self._post_and_check(sriov0_assign_dn, expect_errors=False)
|
self._post_and_check(sriov0_assign_dn, expect_errors=False)
|
||||||
|
|
||||||
# system interface-datanetwork-list controller-0
|
# system interface-datanetwork-list controller-0
|
||||||
if_dn_list = self.get_json('/ihosts/%s/interface_datanetworks'
|
if_dn_list = self.get_json('/ihosts/%s/interface_datanetworks'
|
||||||
% self.controller.uuid, expect_errors=False)
|
% self.controller.uuid, expect_errors=False)
|
||||||
self.assertEqual('test1', if_dn_list['interface_datanetworks'][0]['datanetwork_name'])
|
self.assertEqual('dn0', if_dn_list['interface_datanetworks'][0]['datanetwork_name'])
|
||||||
self.assertEqual('sriov0', if_dn_list['interface_datanetworks'][0]['ifname'])
|
self.assertEqual('sriov0', if_dn_list['interface_datanetworks'][0]['ifname'])
|
||||||
|
|
||||||
|
# Assign the same data network again
|
||||||
|
self._post_and_check(sriov0_assign_dn, expect_errors=True)
|
||||||
|
|
||||||
|
# Assign a different data network to the same interface
|
||||||
|
sriov0_assign_dn1 = dbutils.post_get_test_interface_datanetwork(
|
||||||
|
interface_uuid=self.if_sriov0.uuid,
|
||||||
|
datanetwork_uuid=self.datanetwork1.uuid)
|
||||||
|
self._post_and_check(sriov0_assign_dn1, expect_errors=True)
|
||||||
|
|
||||||
# system interface-datanetwork-remove {uuid}
|
# system interface-datanetwork-remove {uuid}
|
||||||
self.delete('/interface_datanetworks/%s'
|
self.delete('/interface_datanetworks/%s'
|
||||||
% if_dn_list['interface_datanetworks'][0]['uuid'],
|
% if_dn_list['interface_datanetworks'][0]['uuid'],
|
||||||
expect_errors=False)
|
expect_errors=False)
|
||||||
|
|
||||||
def test_assign_interface_datanetwork_error_non_sriov(self):
|
def test_assign_interface_datanetwork_error_non_sriov(self):
|
||||||
# system interface-datanetwork-assign controller-0 data0 test1
|
# system interface-datanetwork-assign controller-0 data0 dn0
|
||||||
# rejected because host is unlocked
|
# rejected because host is unlocked
|
||||||
data0_assign_dn = dbutils.post_get_test_interface_datanetwork(
|
data0_assign_dn = dbutils.post_get_test_interface_datanetwork(
|
||||||
interface_uuid=self.if_data0.uuid,
|
interface_uuid=self.if_data0.uuid,
|
||||||
datanetwork_uuid=self.datanetwork.uuid)
|
datanetwork_uuid=self.datanetwork0.uuid)
|
||||||
self._post_and_check(data0_assign_dn, expect_errors=True)
|
self._post_and_check(data0_assign_dn, expect_errors=True)
|
||||||
|
|
||||||
def test_assign_interface_datanetwork_error_non_aio_sx(self):
|
def test_assign_interface_datanetwork_error_non_aio_sx(self):
|
||||||
self.mock_utils_is_aio_simplex_system.return_value = False
|
self.mock_utils_is_aio_simplex_system.return_value = False
|
||||||
|
|
||||||
# system interface-datanetwork-assign controller-0 sriov1 test1
|
# system interface-datanetwork-assign controller-0 sriov1 dn0
|
||||||
# rejected because system is not AIO-SX
|
# rejected because system is not AIO-SX
|
||||||
sriov1_assign_dn = dbutils.post_get_test_interface_datanetwork(
|
sriov1_assign_dn = dbutils.post_get_test_interface_datanetwork(
|
||||||
interface_uuid=self.if_sriov1.uuid,
|
interface_uuid=self.if_sriov1.uuid,
|
||||||
datanetwork_uuid=self.datanetwork.uuid)
|
datanetwork_uuid=self.datanetwork0.uuid)
|
||||||
self._post_and_check(sriov1_assign_dn, expect_errors=True)
|
self._post_and_check(sriov1_assign_dn, expect_errors=True)
|
||||||
|
|
||||||
self.mock_utils_is_aio_simplex_system.return_value = True
|
self.mock_utils_is_aio_simplex_system.return_value = True
|
||||||
|
|
Loading…
Reference in New Issue