Skip to content

Commit e1768a4

Browse files
authored
Merge pull request #44 from stackhpc/upstream/2024.1-2025-04-21
Synchronise 2024.1 with upstream
2 parents 9a793cd + 13b2853 commit e1768a4

File tree

11 files changed

+63
-17
lines changed

11 files changed

+63
-17
lines changed

octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ def build_keepalived_config(self, loadbalancer, amphora, amp_net_config):
123123
peers_ips.append(amp.vrrp_ip)
124124
return self.get_template(self.keepalived_template).render(
125125
{'vrrp_group_name': loadbalancer.vrrp_group.vrrp_group_name,
126-
'amp_role': amphora.role,
127126
'amp_intf': amphora.vrrp_interface,
128127
'amp_vrrp_id': amphora.vrrp_id,
129128
'amp_priority': amphora.vrrp_priority,

octavia/amphorae/drivers/keepalived/jinja/templates/keepalived_base.template

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ vrrp_script check_script {
2121
}
2222

2323
vrrp_instance {{ vrrp_group_name }} {
24-
state {{ amp_role }}
2524
interface {{ amp_intf }}
2625
virtual_router_id {{ amp_vrrp_id }}
2726
priority {{ amp_priority }}

octavia/controller/worker/v2/tasks/network_tasks.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -984,10 +984,9 @@ def revert(self, result, vip, vip_sg_id, amphora_id, additional_vips,
984984
return
985985
try:
986986
port_name = constants.AMP_BASE_PORT_PREFIX + amphora_id
987-
for port in result:
988-
self.network_driver.delete_port(port.id)
989-
LOG.info('Deleted port %s with ID %s for amphora %s due to a '
990-
'revert.', port_name, port.id, amphora_id)
987+
self.network_driver.delete_port(result[constants.ID])
988+
LOG.info('Deleted port %s with ID %s for amphora %s due to a '
989+
'revert.', port_name, result[constants.ID], amphora_id)
991990
except Exception as e:
992991
LOG.error('Failed to delete port %s. Resources may still be in '
993992
'use for a port intended for amphora %s due to error '

octavia/db/base_models.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@
1212
# License for the specific language governing permissions and limitations
1313
# under the License.
1414

15+
from wsme import types as wtypes
16+
1517
from oslo_db.sqlalchemy import models
1618
from oslo_utils import strutils
1719
from oslo_utils import uuidutils
1820
import sqlalchemy as sa
1921
from sqlalchemy.orm import collections
2022
from sqlalchemy.orm import declarative_base
2123

24+
from octavia.common import constants
25+
2226

2327
class OctaviaBase(models.ModelBase):
2428

@@ -112,12 +116,20 @@ def to_data_model(self, _graph_nodes=None):
112116

113117
@staticmethod
114118
def apply_filter(query, model, filters):
119+
# Convert boolean filters to proper type
120+
for key in filters:
121+
attr = getattr(model.__v2_wsme__, key, None)
122+
if isinstance(attr, wtypes.wsattr) and attr.datatype == bool:
123+
filters[key] = strutils.bool_from_string(filters[key])
124+
# Special case for 'enabled', it's 'admin_state_up' in the WSME class
125+
# definition and the attribute has already been renamed to 'enabled' by
126+
# a previous pagination filter
127+
if constants.ENABLED in filters:
128+
filters[constants.ENABLED] = strutils.bool_from_string(
129+
filters[constants.ENABLED])
130+
115131
translated_filters = {}
116132
child_map = {}
117-
# Convert enabled to proper type
118-
if 'enabled' in filters:
119-
filters['enabled'] = strutils.bool_from_string(
120-
filters['enabled'])
121133
for attr, name_map in model.__v2_wsme__._child_map.items():
122134
for k, v in name_map.items():
123135
if attr in filters and k in filters[attr]:

octavia/tests/unit/amphorae/drivers/keepalived/jinja/test_jinja_cfg.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ def setUp(self):
7171
"}\n"
7272
"\n"
7373
"vrrp_instance TESTGROUP {\n"
74-
" state MASTER\n"
7574
" interface eth1\n"
7675
" virtual_router_id 1\n"
7776
" priority 100\n"
@@ -124,7 +123,6 @@ def setUp(self):
124123
"}\n"
125124
"\n"
126125
"vrrp_instance TESTGROUP {\n"
127-
" state MASTER\n"
128126
" interface eth1\n"
129127
" virtual_router_id 1\n"
130128
" priority 100\n"
@@ -170,7 +168,6 @@ def setUp(self):
170168
"}\n"
171169
"\n"
172170
"vrrp_instance TESTGROUP {\n"
173-
" state MASTER\n"
174171
" interface eth1\n"
175172
" virtual_router_id 1\n"
176173
" priority 100\n"
@@ -220,7 +217,6 @@ def setUp(self):
220217
"}\n"
221218
"\n"
222219
"vrrp_instance TESTGROUP {\n"
223-
" state MASTER\n"
224220
" interface eth1\n"
225221
" virtual_router_id 1\n"
226222
" priority 100\n"

octavia/tests/unit/api/common/test_pagination.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,16 @@ def test_filter_correct_params(self, request_mock):
103103
helper.apply(query_mock, models.LoadBalancer)
104104
self.assertEqual(params, helper.filters)
105105

106+
@mock.patch('octavia.api.common.pagination.request')
107+
def test_filter_with_booleans(self, request_mock):
108+
params = {'backup': 'True', 'admin_state_up': 'false'}
109+
expected_params = {'backup': True, 'enabled': False}
110+
helper = pagination.PaginationHelper(params)
111+
query_mock = mock.MagicMock()
112+
113+
helper.apply(query_mock, models.Member)
114+
self.assertEqual(expected_params, helper.filters)
115+
106116
@mock.patch('octavia.api.common.pagination.request')
107117
def test_filter_mismatched_params(self, request_mock):
108118
params = {

octavia/tests/unit/cmd/test_prometheus_proxy.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ def test_shutdown_thread(self, mock_signal, mock_exit_event):
147147
mock_http.shutdown.assert_called_once()
148148

149149
@mock.patch('threading.Thread')
150+
@mock.patch('http.server.ThreadingHTTPServer.__init__')
150151
@mock.patch('http.server.ThreadingHTTPServer.serve_forever')
151152
@mock.patch('octavia.amphorae.backends.utils.network_namespace.'
152153
'NetworkNamespace.__exit__')
@@ -155,12 +156,18 @@ def test_shutdown_thread(self, mock_signal, mock_exit_event):
155156
@mock.patch('octavia.cmd.prometheus_proxy.EXIT_EVENT')
156157
@mock.patch('octavia.cmd.prometheus_proxy.SignalHandler')
157158
def test_main(self, mock_signal_handler, mock_exit_event, mock_netns_enter,
158-
mock_netns_exit, mock_serve_forever, mock_thread):
159+
mock_netns_exit, mock_serve_forever, mock_server_init,
160+
mock_thread):
159161

160162
mock_exit_event.is_set.side_effect = [False, False, True]
161163
mock_netns_enter.side_effect = [Exception('boom'), True]
162164

165+
mock_server_init.return_value = None
166+
163167
prometheus_proxy.main()
164168

165169
mock_signal_handler.assert_called_once()
170+
mock_server_init.assert_called_once_with(
171+
('127.0.0.1', 9102),
172+
prometheus_proxy.PrometheusProxy)
166173
mock_serve_forever.assert_called_once()

octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,15 +1721,19 @@ def test_create_vip_base_port(self, mock_get_net_driver):
17211721
# Test revert
17221722
mock_driver.reset_mock()
17231723

1724-
net_task.revert([port_mock], vip_dict, VIP_SG_ID, AMP_ID,
1724+
# The execute path generates a port dict, so this will be the result
1725+
# passed into the revert method by Taskflow
1726+
port_dict = {constants.ID: PORT_ID}
1727+
1728+
net_task.revert(port_dict, vip_dict, VIP_SG_ID, AMP_ID,
17251729
additional_vips)
17261730

17271731
mock_driver.delete_port.assert_called_once_with(PORT_ID)
17281732

17291733
# Test revert exception
17301734
mock_driver.reset_mock()
17311735

1732-
net_task.revert([port_mock], vip_dict, VIP_SG_ID, AMP_ID,
1736+
net_task.revert(port_dict, vip_dict, VIP_SG_ID, AMP_ID,
17331737
additional_vips)
17341738

17351739
mock_driver.delete_port.assert_called_once_with(PORT_ID)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed an issue when a failover reverts, a neutron port may get abandoned.
5+
The issue was logged with "Failed to delete port",
6+
"Resources may still be in use for a port intended for amphora", and
7+
"Search for a port named octavia-lb-vrrp-<uuid>".
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed an issue when filtering resources with a boolean attribute in the GET
5+
calls in the Octavia API.

0 commit comments

Comments
 (0)