Skip to content

Commit 0598a1d

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "[OVN] Retrieve the OVN agent extensions correctly" into stable/2023.1
2 parents 5033488 + a991b09 commit 0598a1d

File tree

7 files changed

+47
-17
lines changed

7 files changed

+47
-17
lines changed

neutron/agent/ovn/agent/ovn_neutron_agent.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ def __init__(self, conf):
6161
self.ext_manager = ext_mgr.OVNAgentExtensionManager(self._conf)
6262
self.ext_manager.initialize(None, 'ovn', self.ext_manager_api)
6363

64+
def __getitem__(self, name):
65+
"""Return the named extension objet from ``self.ext_manager``"""
66+
return self.ext_manager[name].obj
67+
6468
@property
6569
def ovs_idl(self):
6670
return self.ext_manager_api.ovs_idl

neutron/agent/ovn/extensions/extension_manager.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ def __init__(self):
4848
super().__init__()
4949
self.agent_api = None
5050

51+
@property
52+
@abc.abstractmethod
53+
def name(self):
54+
pass
55+
5156
def initialize(self, *args):
5257
"""Initialize agent extension."""
5358
self.agent_api = None

neutron/agent/ovn/extensions/noop.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818

1919
class NoopOVNAgentExtension(extension_manager.OVNAgentExtension):
2020

21+
@property
22+
def name(self):
23+
return 'Noop OVN agent extension'
24+
2125
@property
2226
def ovs_idl_events(self):
2327
return []

neutron/agent/ovn/extensions/qos_hwol.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828

2929
LOG = logging.getLogger(__name__)
30+
EXT_NAME = 'qos_hwol'
3031
# NOTE(ralonsoh): move these constants from ``eswitch_manager`` to ``pci_lib``.
3132
MAX_TX_RATE = eswitch_manager.IP_LINK_CAPABILITY_RATE
3233
MIN_TX_RATE = eswitch_manager.IP_LINK_CAPABILITY_MIN_TX_RATE
@@ -59,10 +60,10 @@ def match_fn(self, event, row, old):
5960

6061
def run(self, event, row, old):
6162
if event in (self.ROW_CREATE, self.ROW_UPDATE):
62-
self.ovn_agent.qos_hwol_ext.add_port(
63+
self.ovn_agent[EXT_NAME].add_port(
6364
row.external_ids['iface-id'], row.name)
6465
elif event == self.ROW_DELETE:
65-
self.ovn_agent.qos_hwol_ext.remove_egress(
66+
self.ovn_agent[EXT_NAME].remove_egress(
6667
row.external_ids['iface-id'])
6768
LOG.debug(self.LOG_MSG, row.external_ids['iface-id'], row.name, event)
6869

@@ -82,7 +83,7 @@ def match_fn(self, event, row, old):
8283

8384
# Check if the port has a Port ID and if this ID is bound to this host.
8485
port_id = row.external_ids.get(ovn_const.OVN_PORT_EXT_ID_KEY)
85-
if not port_id or not self.ovn_agent.qos_hwol_ext.get_port(port_id):
86+
if not port_id or not self.ovn_agent[EXT_NAME].get_port(port_id):
8687
return False
8788

8889
if event in (self.ROW_CREATE, self.ROW_DELETE):
@@ -104,7 +105,7 @@ def run(self, event, row, old):
104105
max_kbps, min_kbps = agent_ovsdb.get_port_qos(self.ovn_agent.nb_idl,
105106
port_id)
106107
LOG.debug(self.LOG_MSG, str(row.uuid), port_id, max_kbps, event)
107-
self.ovn_agent.qos_hwol_ext.update_egress(port_id, max_kbps, min_kbps)
108+
self.ovn_agent[EXT_NAME].update_egress(port_id, max_kbps, min_kbps)
108109

109110

110111
class QoSMinimumBandwidthEvent(row_event.RowEvent):
@@ -129,7 +130,7 @@ def match_fn(self, event, row, old):
129130
except (KeyError, AttributeError):
130131
return False
131132

132-
if not self.ovn_agent.qos_hwol_ext.get_port(row.name):
133+
if not self.ovn_agent[EXT_NAME].get_port(row.name):
133134
return False
134135

135136
return True
@@ -138,7 +139,7 @@ def run(self, event, row, old):
138139
max_kbps, min_kbps = agent_ovsdb.get_port_qos(self.ovn_agent.nb_idl,
139140
row.name)
140141
LOG.debug(self.LOG_MSG, row.name, min_kbps, event)
141-
self.ovn_agent.qos_hwol_ext.update_egress(row.name, max_kbps, min_kbps)
142+
self.ovn_agent[EXT_NAME].update_egress(row.name, max_kbps, min_kbps)
142143

143144

144145
class _PortBindingChassisEvent(row_event.RowEvent):
@@ -176,8 +177,8 @@ def run(self, event, row, old):
176177
event)
177178
max_kbps, min_kbps = agent_ovsdb.get_port_qos(self.ovn_agent.nb_idl,
178179
row.logical_port)
179-
self.ovn_agent.qos_hwol_ext.update_egress(row.logical_port, max_kbps,
180-
min_kbps)
180+
self.ovn_agent[EXT_NAME].update_egress(row.logical_port, max_kbps,
181+
min_kbps)
181182

182183

183184
class QoSHardwareOffloadExtension(extension_manager.OVNAgentExtension):
@@ -187,6 +188,10 @@ def __init__(self):
187188
# _ovs_ports = {Neutron port ID: OVS port name}
188189
self._ovs_ports = {}
189190

191+
@property
192+
def name(self):
193+
return 'QoS hardware offloaded extension'
194+
190195
@property
191196
def ovs_idl_events(self):
192197
return [OVSInterfaceEvent,

neutron/tests/functional/agent/ovn/agent/fake_ovn_agent_extension.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ def run(self, event, row, old):
5454

5555
class FakeOVNAgentExtension(ext_mgr.OVNAgentExtension):
5656

57+
@property
58+
def name(self):
59+
return 'Fake OVN agent extension'
60+
5761
@property
5862
def ovs_idl_events(self):
5963
return [OVSInterfaceEvent]

neutron/tests/functional/agent/ovn/agent/test_ovn_neutron_agent.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
from neutron.tests.functional import base
2626

2727

28+
TEST_EXTENSION = 'testing'
29+
30+
2831
class TestOVNNeutronAgent(base.TestOVNFunctionalBase):
2932

3033
OVN_BRIDGE = 'br-int'
@@ -36,9 +39,13 @@ def setUp(self, **kwargs):
3639
agent_ovsdb, 'get_own_chassis_name').start()
3740
self.ovn_agent = self._start_ovn_neutron_agent()
3841

42+
def _check_loaded_extensions(self, ovn_agent):
43+
loaded_ext = ovn_agent[TEST_EXTENSION]
44+
self.assertEqual('Fake OVN agent extension', loaded_ext.name)
45+
3946
def _start_ovn_neutron_agent(self):
4047
conf = self.useFixture(fixture_config.Config()).conf
41-
conf.set_override('extensions', 'testing', group='agent')
48+
conf.set_override('extensions', TEST_EXTENSION, group='agent')
4249
ovn_nb_db = self.ovsdb_server_mgr.get_ovsdb_connection_path('nb')
4350
conf.set_override('ovn_nb_connection', ovn_nb_db, group='ovn')
4451
ovn_sb_db = self.ovsdb_server_mgr.get_ovsdb_connection_path('sb')
@@ -52,6 +59,7 @@ def _start_ovn_neutron_agent(self):
5259
agt.test_ovn_sb_idl = []
5360
agt.test_ovn_nb_idl = []
5461
agt.start()
62+
self._check_loaded_extensions(agt)
5563

5664
self.add_fake_chassis(self.FAKE_CHASSIS_HOST, name=self.chassis_name)
5765

neutron/tests/functional/agent/ovn/extensions/test_qos_hwol.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def _cleanup(self):
3737
def test_port_creation_and_deletion(self):
3838
def check_add_port_called():
3939
try:
40-
mock_agent.qos_hwol_ext.add_port.assert_has_calls(
40+
mock_agent[qos_hwol.EXT_NAME].add_port.assert_has_calls(
4141
[mock.call(port_iface_id, self.port_name)])
4242
return True
4343
except AssertionError:
@@ -52,7 +52,7 @@ def check_remove_egress_called():
5252
return False
5353

5454
port_iface_id = 'port_iface-id'
55-
mock_agent = mock.Mock()
55+
mock_agent = mock.MagicMock()
5656
events = [qos_hwol.OVSInterfaceEvent(mock_agent)]
5757
self.ovs_idl = agent_ovsdb.MonitorAgentOvsIdl(events=events).start()
5858
self.br_name = ('brtest-' + uuidutils.generate_uuid())[:13]
@@ -91,13 +91,13 @@ def setUp(self, **kwargs):
9191
def test_qos_bw_limit_created_and_updated(self):
9292
def check_update_egress_called(rate):
9393
try:
94-
mock_agent.qos_hwol_ext.update_egress.assert_has_calls(
94+
mock_agent[qos_hwol.EXT_NAME].update_egress.assert_has_calls(
9595
[mock.call(port_id, rate, 0)])
9696
return True
9797
except AssertionError:
9898
return False
9999

100-
mock_agent = mock.Mock(nb_idl=self.nb_api)
100+
mock_agent = mock.MagicMock(nb_idl=self.nb_api)
101101
events = [qos_hwol.QoSBandwidthLimitEvent(mock_agent)]
102102
agent_ovsdb.MonitorAgentOvnNbIdl(qos_hwol.NB_IDL_TABLES,
103103
events).start()
@@ -133,13 +133,13 @@ def setUp(self, **kwargs):
133133
def test_qos_min_bw_created_and_updated(self):
134134
def check_update_egress_called(max_kbps, min_kbps):
135135
try:
136-
mock_agent.qos_hwol_ext.update_egress.assert_has_calls(
136+
mock_agent[qos_hwol.EXT_NAME].update_egress.assert_has_calls(
137137
[mock.call(port_id, max_kbps, min_kbps)])
138138
return True
139139
except AssertionError:
140140
return False
141141

142-
mock_agent = mock.Mock(nb_idl=self.nb_api)
142+
mock_agent = mock.MagicMock(nb_idl=self.nb_api)
143143
events = [qos_hwol.QoSMinimumBandwidthEvent(mock_agent)]
144144
agent_ovsdb.MonitorAgentOvnNbIdl(qos_hwol.NB_IDL_TABLES,
145145
events).start()
@@ -169,15 +169,15 @@ def test_port_binding_chassis_create_event(self, mock_get_port_qos,
169169
*args):
170170
def check_update_egress_called(max_kbps, min_kbps):
171171
try:
172-
mock_agent.qos_hwol_ext.update_egress.assert_has_calls(
172+
mock_agent[qos_hwol.EXT_NAME].update_egress.assert_has_calls(
173173
[mock.call(self.port['id'], max_kbps, min_kbps)])
174174
return True
175175
except AssertionError:
176176
return False
177177

178178
max_kbps, min_kbps = 1000, 800
179179
mock_get_port_qos.return_value = max_kbps, min_kbps
180-
mock_agent = mock.Mock(nb_idl=self.nb_api)
180+
mock_agent = mock.MagicMock(nb_idl=self.nb_api)
181181
events = [qos_hwol.PortBindingChassisCreatedEvent(mock_agent)]
182182
chassis_name = self.add_fake_chassis('ovn-host-fake')
183183
mock_agent.chassis = chassis_name

0 commit comments

Comments
 (0)