octavia 15.0.0__py3-none-any.whl → 15.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. octavia/amphorae/backends/agent/api_server/keepalivedlvs.py +9 -0
  2. octavia/amphorae/backends/agent/api_server/util.py +35 -2
  3. octavia/common/clients.py +7 -1
  4. octavia/controller/worker/v2/tasks/database_tasks.py +10 -6
  5. octavia/controller/worker/v2/tasks/network_tasks.py +24 -12
  6. octavia/network/drivers/neutron/allowed_address_pairs.py +3 -2
  7. octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +89 -1
  8. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +28 -6
  9. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +65 -0
  10. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +2 -1
  11. {octavia-15.0.0.dist-info → octavia-15.0.1.dist-info}/AUTHORS +2 -0
  12. octavia-15.0.1.dist-info/METADATA +154 -0
  13. {octavia-15.0.0.dist-info → octavia-15.0.1.dist-info}/RECORD +28 -28
  14. {octavia-15.0.0.dist-info → octavia-15.0.1.dist-info}/WHEEL +1 -1
  15. {octavia-15.0.0.dist-info → octavia-15.0.1.dist-info}/entry_points.txt +0 -1
  16. octavia-15.0.1.dist-info/pbr.json +1 -0
  17. octavia-15.0.0.dist-info/METADATA +0 -156
  18. octavia-15.0.0.dist-info/pbr.json +0 -1
  19. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/LICENSE +0 -0
  20. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/README.rst +0 -0
  21. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
  22. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
  23. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  24. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
  25. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  26. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
  27. {octavia-15.0.0.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  28. {octavia-15.0.0.data → octavia-15.0.1.data}/scripts/octavia-wsgi +0 -0
  29. {octavia-15.0.0.dist-info → octavia-15.0.1.dist-info}/LICENSE +0 -0
  30. {octavia-15.0.0.dist-info → octavia-15.0.1.dist-info}/top_level.txt +0 -0
@@ -201,6 +201,15 @@ class KeepalivedLvs(lvs_listener_base.LvsListenerApiServerBase):
201
201
  f"{listener_id}"),
202
202
  'details': e.output}, status=500)
203
203
 
204
+ is_vrrp = (CONF.controller_worker.loadbalancer_topology ==
205
+ consts.TOPOLOGY_ACTIVE_STANDBY)
206
+ # TODO(gthiemonge) remove RESTART from the list (same as previous todo
207
+ # in this function)
208
+ if not is_vrrp and action in [consts.AMP_ACTION_START,
209
+ consts.AMP_ACTION_RESTART,
210
+ consts.AMP_ACTION_RELOAD]:
211
+ util.send_vip_advertisements(listener_id=listener_id)
212
+
204
213
  return webob.Response(
205
214
  json={'message': 'OK',
206
215
  'details': (f'keepalivedlvs listener {listener_id} '
@@ -347,7 +347,37 @@ def get_haproxy_vip_addresses(lb_id):
347
347
  return vips
348
348
 
349
349
 
350
- def send_vip_advertisements(lb_id):
350
+ def get_lvs_vip_addresses(listener_id: str) -> list[str]:
351
+ """Get the VIP addresses for a LVS load balancer.
352
+
353
+ :param listener_id: The listener ID to get VIP addresses from.
354
+ :returns: List of VIP addresses (IPv4 and IPv6)
355
+ """
356
+ vips = []
357
+ # Extract the VIP addresses from keepalived configuration
358
+ # Format is
359
+ # virtual_server_group ipv<n>-group {
360
+ # vip_address1 port1
361
+ # vip_address2 port2
362
+ # }
363
+ # it can be repeated in case of dual-stack LBs
364
+ with open(keepalived_lvs_cfg_path(listener_id), encoding='utf-8') as file:
365
+ vsg_section = False
366
+ for line in file:
367
+ current_line = line.strip()
368
+ if vsg_section:
369
+ if current_line.startswith('}'):
370
+ vsg_section = False
371
+ else:
372
+ vip_address = current_line.split(' ')[0]
373
+ vips.append(vip_address)
374
+ elif line.startswith('virtual_server_group '):
375
+ vsg_section = True
376
+ return vips
377
+
378
+
379
+ def send_vip_advertisements(lb_id: tp.Optional[str] = None,
380
+ listener_id: tp.Optional[str] = None):
351
381
  """Sends address advertisements for each load balancer VIP.
352
382
 
353
383
  This method will send either GARP (IPv4) or neighbor advertisements (IPv6)
@@ -357,7 +387,10 @@ def send_vip_advertisements(lb_id):
357
387
  :returns: None
358
388
  """
359
389
  try:
360
- vips = get_haproxy_vip_addresses(lb_id)
390
+ if lb_id:
391
+ vips = get_haproxy_vip_addresses(lb_id)
392
+ else:
393
+ vips = get_lvs_vip_addresses(listener_id)
361
394
 
362
395
  for vip in vips:
363
396
  interface = network_utils.get_interface_name(
octavia/common/clients.py CHANGED
@@ -111,6 +111,7 @@ class NeutronAuth:
111
111
  client.
112
112
  """
113
113
  sess = keystone.KeystoneSession('neutron').get_session()
114
+ kwargs = {}
114
115
  neutron_endpoint = CONF.neutron.endpoint_override
115
116
  if neutron_endpoint is None:
116
117
  endpoint_data = sess.get_endpoint_data(
@@ -119,8 +120,13 @@ class NeutronAuth:
119
120
  region_name=CONF.neutron.region_name)
120
121
  neutron_endpoint = endpoint_data.catalog_url
121
122
 
123
+ neutron_cafile = getattr(CONF.neutron, "cafile", None)
124
+ insecure = getattr(CONF.neutron, "insecure", False)
125
+ kwargs['verify'] = not insecure
126
+ if neutron_cafile is not None and not insecure:
127
+ kwargs['verify'] = neutron_cafile
122
128
  user_auth = token_endpoint.Token(neutron_endpoint, context.auth_token)
123
- user_sess = session.Session(auth=user_auth)
129
+ user_sess = session.Session(auth=user_auth, **kwargs)
124
130
 
125
131
  conn = openstack.connection.Connection(
126
132
  session=user_sess, oslo_conf=CONF)
@@ -132,13 +132,17 @@ class CreateAmphoraInDB(BaseDatabaseTask):
132
132
  LOG.warning("Reverting create amphora in DB for amp id %s ", result)
133
133
 
134
134
  # Delete the amphora for now. May want to just update status later
135
- try:
136
- with db_apis.session().begin() as session:
135
+ with db_apis.session().begin() as session:
136
+ try:
137
137
  self.amphora_repo.delete(session, id=result)
138
- except Exception as e:
139
- LOG.error("Failed to delete amphora %(amp)s "
140
- "in the database due to: "
141
- "%(except)s", {'amp': result, 'except': str(e)})
138
+ except Exception as e:
139
+ LOG.error("Failed to delete amphora %(amp)s "
140
+ "in the database due to: "
141
+ "%(except)s", {'amp': result, 'except': str(e)})
142
+ try:
143
+ self.amp_health_repo.delete(session, amphora_id=result)
144
+ except Exception:
145
+ pass
142
146
 
143
147
 
144
148
  class MarkLBAmphoraeDeletedInDB(BaseDatabaseTask):
@@ -536,11 +536,10 @@ class PlugVIPAmphora(BaseNetworkTask):
536
536
  """Handle a failure to plumb a vip."""
537
537
  if isinstance(result, failure.Failure):
538
538
  return
539
+ lb_id = loadbalancer[constants.LOADBALANCER_ID]
539
540
  LOG.warning("Unable to plug VIP for amphora id %s "
540
541
  "load balancer id %s",
541
- amphora.get(constants.ID),
542
- loadbalancer[constants.LOADBALANCER_ID])
543
-
542
+ amphora.get(constants.ID), lb_id)
544
543
  try:
545
544
  session = db_apis.get_session()
546
545
  with session.begin():
@@ -550,15 +549,16 @@ class PlugVIPAmphora(BaseNetworkTask):
550
549
  db_amp.ha_port_id = result[constants.HA_PORT_ID]
551
550
  db_subnet = self.network_driver.get_subnet(
552
551
  subnet[constants.ID])
553
- db_lb = self.loadbalancer_repo.get(
554
- session,
555
- id=loadbalancer[constants.LOADBALANCER_ID])
556
-
552
+ db_lb = self.loadbalancer_repo.get(session, id=lb_id)
557
553
  self.network_driver.unplug_aap_port(db_lb.vip,
558
554
  db_amp, db_subnet)
559
555
  except Exception as e:
560
- LOG.error('Failed to unplug AAP port. Resources may still be in '
561
- 'use for VIP: %s due to error: %s', db_lb.vip, str(e))
556
+ LOG.error(
557
+ 'Failed to unplug AAP port for load balancer: %s. '
558
+ 'Resources may still be in use for VRRP port: %s. '
559
+ 'Due to error: %s',
560
+ lb_id, result[constants.VRRP_PORT_ID], str(e)
561
+ )
562
562
 
563
563
 
564
564
  class UnplugVIP(BaseNetworkTask):
@@ -706,7 +706,11 @@ class GetAmphoraNetworkConfigs(BaseNetworkTask):
706
706
  db_lb, amphora=db_amp)
707
707
  provider_dict = {}
708
708
  for amp_id, amp_conf in db_configs.items():
709
- provider_dict[amp_id] = amp_conf.to_dict(recurse=True)
709
+ # Do not serialize loadbalancer class. It's unused later and
710
+ # could be ignored for storing in results of task in persistence DB
711
+ provider_dict[amp_id] = amp_conf.to_dict(
712
+ recurse=True, calling_classes=[data_models.LoadBalancer]
713
+ )
710
714
  return provider_dict
711
715
 
712
716
 
@@ -724,7 +728,11 @@ class GetAmphoraNetworkConfigsByID(BaseNetworkTask):
724
728
  amphora=amphora)
725
729
  provider_dict = {}
726
730
  for amp_id, amp_conf in db_configs.items():
727
- provider_dict[amp_id] = amp_conf.to_dict(recurse=True)
731
+ # Do not serialize loadbalancer class. It's unused later and
732
+ # could be ignored for storing in results of task in persistence DB
733
+ provider_dict[amp_id] = amp_conf.to_dict(
734
+ recurse=True, calling_classes=[data_models.LoadBalancer]
735
+ )
728
736
  return provider_dict
729
737
 
730
738
 
@@ -740,7 +748,11 @@ class GetAmphoraeNetworkConfigs(BaseNetworkTask):
740
748
  db_configs = self.network_driver.get_network_configs(db_lb)
741
749
  provider_dict = {}
742
750
  for amp_id, amp_conf in db_configs.items():
743
- provider_dict[amp_id] = amp_conf.to_dict(recurse=True)
751
+ # Do not serialize loadbalancer class. It's unused later and
752
+ # could be ignored for storing in results of task in persistence DB
753
+ provider_dict[amp_id] = amp_conf.to_dict(
754
+ recurse=True, calling_classes=[data_models.LoadBalancer]
755
+ )
744
756
  return provider_dict
745
757
 
746
758
 
@@ -194,12 +194,13 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
194
194
  # Don't remove egress rules and don't confuse other protocols with
195
195
  # None ports with the egress rules. VRRP uses protocol 51 and 112
196
196
  if (rule.get('direction') == 'egress' or
197
- rule.get('protocol').upper() not in
197
+ rule.get('protocol') is None or
198
+ rule['protocol'].upper() not in
198
199
  [constants.PROTOCOL_TCP, constants.PROTOCOL_UDP,
199
200
  lib_consts.PROTOCOL_SCTP]):
200
201
  continue
201
202
  old_ports.append((rule.get('port_range_max'),
202
- rule.get('protocol').lower(),
203
+ rule['protocol'].lower(),
203
204
  rule.get('remote_ip_prefix')))
204
205
 
205
206
  add_ports = set(updated_ports) - set(old_ports)
@@ -356,13 +356,57 @@ class TestUtil(base.TestCase):
356
356
  self.assertEqual([], util.get_haproxy_vip_addresses(LB_ID1))
357
357
  mock_cfg_path.assert_called_once_with(LB_ID1)
358
358
 
359
+ @mock.patch('octavia.amphorae.backends.agent.api_server.util.'
360
+ 'keepalived_lvs_cfg_path')
361
+ def test_get_lvs_vip_addresses(self, mock_cfg_path):
362
+ FAKE_PATH = 'fake_path'
363
+ mock_cfg_path.return_value = FAKE_PATH
364
+ self.useFixture(
365
+ test_utils.OpenFixture(FAKE_PATH, 'no match')).mock_open()
366
+
367
+ # Test with no matching lines in the config file
368
+ self.assertEqual([], util.get_lvs_vip_addresses(LB_ID1))
369
+ mock_cfg_path.assert_called_once_with(LB_ID1)
370
+
371
+ # Test with 2 matching lines
372
+ mock_cfg_path.reset_mock()
373
+ test_data = ('virtual_server_group ipv4-group {\n'
374
+ ' 203.0.113.43 1\n'
375
+ ' 203.0.113.44 1\n'
376
+ '}\n')
377
+ self.useFixture(
378
+ test_utils.OpenFixture(FAKE_PATH, test_data)).mock_open()
379
+ expected_result = ['203.0.113.43', '203.0.113.44']
380
+ self.assertEqual(expected_result,
381
+ util.get_lvs_vip_addresses(LB_ID1))
382
+ mock_cfg_path.assert_called_once_with(LB_ID1)
383
+
384
+ # Test with 2 groups
385
+ mock_cfg_path.reset_mock()
386
+ test_data = ('virtual_server_group ipv4-group {\n'
387
+ ' 203.0.113.43 1\n'
388
+ '}\n'
389
+ 'virtual_server_group ipv6-group {\n'
390
+ ' 2d01:27::1 2\n'
391
+ ' 2d01:27::2 2\n'
392
+ '}\n')
393
+ self.useFixture(
394
+ test_utils.OpenFixture(FAKE_PATH, test_data)).mock_open()
395
+ expected_result = ['203.0.113.43', '2d01:27::1', '2d01:27::2']
396
+ self.assertEqual(expected_result,
397
+ util.get_lvs_vip_addresses(LB_ID1))
398
+ mock_cfg_path.assert_called_once_with(LB_ID1)
399
+
359
400
  @mock.patch('octavia.amphorae.backends.utils.ip_advertisement.'
360
401
  'send_ip_advertisement')
361
402
  @mock.patch('octavia.amphorae.backends.utils.network_utils.'
362
403
  'get_interface_name')
363
404
  @mock.patch('octavia.amphorae.backends.agent.api_server.util.'
364
405
  'get_haproxy_vip_addresses')
365
- def test_send_vip_advertisements(self, mock_get_vip_addrs,
406
+ @mock.patch('octavia.amphorae.backends.agent.api_server.util.'
407
+ 'get_lvs_vip_addresses')
408
+ def test_send_vip_advertisements(self, mock_get_lvs_vip_addrs,
409
+ mock_get_vip_addrs,
366
410
  mock_get_int_name, mock_send_advert):
367
411
  mock_get_vip_addrs.side_effect = [[], ['203.0.113.46'],
368
412
  Exception('boom')]
@@ -371,6 +415,7 @@ class TestUtil(base.TestCase):
371
415
  # Test no VIPs
372
416
  util.send_vip_advertisements(LB_ID1)
373
417
  mock_get_vip_addrs.assert_called_once_with(LB_ID1)
418
+ mock_get_lvs_vip_addrs.assert_not_called()
374
419
  mock_get_int_name.assert_not_called()
375
420
  mock_send_advert.assert_not_called()
376
421
 
@@ -380,6 +425,7 @@ class TestUtil(base.TestCase):
380
425
  mock_send_advert.reset_mock()
381
426
  util.send_vip_advertisements(LB_ID1)
382
427
  mock_get_vip_addrs.assert_called_once_with(LB_ID1)
428
+ mock_get_lvs_vip_addrs.assert_not_called()
383
429
  mock_get_int_name.assert_called_once_with(
384
430
  '203.0.113.46', net_ns=consts.AMPHORA_NAMESPACE)
385
431
  mock_send_advert.assert_called_once_with(
@@ -393,6 +439,48 @@ class TestUtil(base.TestCase):
393
439
  mock_get_int_name.assert_not_called()
394
440
  mock_send_advert.assert_not_called()
395
441
 
442
+ @mock.patch('octavia.amphorae.backends.utils.ip_advertisement.'
443
+ 'send_ip_advertisement')
444
+ @mock.patch('octavia.amphorae.backends.utils.network_utils.'
445
+ 'get_interface_name')
446
+ @mock.patch('octavia.amphorae.backends.agent.api_server.util.'
447
+ 'get_haproxy_vip_addresses')
448
+ @mock.patch('octavia.amphorae.backends.agent.api_server.util.'
449
+ 'get_lvs_vip_addresses')
450
+ def test_send_vip_advertisements_udp(self, mock_get_lvs_vip_addrs,
451
+ mock_get_vip_addrs,
452
+ mock_get_int_name, mock_send_advert):
453
+ mock_get_lvs_vip_addrs.side_effect = [[], ['203.0.113.46'],
454
+ Exception('boom')]
455
+ mock_get_int_name.return_value = 'fake0'
456
+
457
+ # Test no VIPs
458
+ util.send_vip_advertisements(listener_id=LISTENER_ID1)
459
+ mock_get_lvs_vip_addrs.assert_called_once_with(LISTENER_ID1)
460
+ mock_get_vip_addrs.assert_not_called()
461
+ mock_get_int_name.assert_not_called()
462
+ mock_send_advert.assert_not_called()
463
+
464
+ # Test with a VIP
465
+ mock_get_lvs_vip_addrs.reset_mock()
466
+ mock_get_int_name.reset_mock()
467
+ mock_send_advert.reset_mock()
468
+ util.send_vip_advertisements(listener_id=LISTENER_ID1)
469
+ mock_get_lvs_vip_addrs.assert_called_once_with(LISTENER_ID1)
470
+ mock_get_vip_addrs.assert_not_called()
471
+ mock_get_int_name.assert_called_once_with(
472
+ '203.0.113.46', net_ns=consts.AMPHORA_NAMESPACE)
473
+ mock_send_advert.assert_called_once_with(
474
+ 'fake0', '203.0.113.46', net_ns=consts.AMPHORA_NAMESPACE)
475
+
476
+ # Test with an exception (should not raise)
477
+ mock_get_lvs_vip_addrs.reset_mock()
478
+ mock_get_int_name.reset_mock()
479
+ mock_send_advert.reset_mock()
480
+ util.send_vip_advertisements(listener_id=LISTENER_ID1)
481
+ mock_get_int_name.assert_not_called()
482
+ mock_send_advert.assert_not_called()
483
+
396
484
  @mock.patch('octavia.amphorae.backends.utils.ip_advertisement.'
397
485
  'send_ip_advertisement')
398
486
  @mock.patch('octavia.amphorae.backends.utils.network_utils.'
@@ -184,7 +184,9 @@ class TestDatabaseTasks(base.TestCase):
184
184
 
185
185
  @mock.patch('octavia.db.repositories.AmphoraRepository.create',
186
186
  return_value=_db_amphora_mock)
187
+ @mock.patch('octavia.db.repositories.AmphoraHealthRepository.delete')
187
188
  def test_create_amphora_in_db(self,
189
+ mock_amphora_health_repo_delete,
188
190
  mock_create,
189
191
  mock_generate_uuid,
190
192
  mock_LOG,
@@ -210,23 +212,43 @@ class TestDatabaseTasks(base.TestCase):
210
212
 
211
213
  # Test the revert
212
214
  create_amp_in_db.revert(_tf_failure_mock)
213
- self.assertFalse(mock_amphora_repo_delete.called)
215
+ mock_amphora_repo_delete.assert_not_called()
216
+ mock_amphora_health_repo_delete.assert_not_called()
214
217
 
218
+ amp_id = 'AMP'
215
219
  mock_amphora_repo_delete.reset_mock()
216
- create_amp_in_db.revert(result='AMP')
220
+ mock_amphora_health_repo_delete.reset_mock()
221
+ create_amp_in_db.revert(result=amp_id)
217
222
  self.assertTrue(mock_amphora_repo_delete.called)
223
+ self.assertTrue(mock_amphora_health_repo_delete.called)
218
224
  mock_amphora_repo_delete.assert_called_once_with(
219
225
  mock_session,
220
- id='AMP')
226
+ id=amp_id)
227
+ mock_amphora_health_repo_delete.assert_called_once_with(
228
+ mock_session,
229
+ amphora_id=amp_id)
230
+ mock_LOG.error.assert_not_called()
231
+ mock_LOG.debug.assert_not_called()
221
232
 
222
233
  # Test revert with exception
223
234
  mock_amphora_repo_delete.reset_mock()
224
- mock_amphora_repo_delete.side_effect = Exception('fail')
225
- create_amp_in_db.revert(result='AMP')
235
+ mock_amphora_health_repo_delete.reset_mock()
236
+ err1_msg, err2_msg = ('fail', 'fail2')
237
+ mock_amphora_repo_delete.side_effect = Exception(err1_msg)
238
+ mock_amphora_health_repo_delete.side_effect = Exception(err2_msg)
239
+ create_amp_in_db.revert(result=amp_id)
226
240
  self.assertTrue(mock_amphora_repo_delete.called)
241
+ self.assertTrue(mock_amphora_health_repo_delete.called)
227
242
  mock_amphora_repo_delete.assert_called_once_with(
228
243
  mock_session,
229
- id='AMP')
244
+ id=amp_id)
245
+ mock_amphora_health_repo_delete.assert_called_once_with(
246
+ mock_session,
247
+ amphora_id=amp_id)
248
+ mock_LOG.error.assert_called_once_with(
249
+ "Failed to delete amphora %(amp)s "
250
+ "in the database due to: "
251
+ "%(except)s", {'amp': amp_id, 'except': err1_msg})
230
252
 
231
253
  @mock.patch('octavia.db.repositories.ListenerRepository.delete')
232
254
  def test_delete_listener_in_db(self,
@@ -1380,6 +1380,10 @@ class TestNetworkTasks(base.TestCase):
1380
1380
  AMP_ID = uuidutils.generate_uuid()
1381
1381
  mock_driver = mock.MagicMock()
1382
1382
  mock_get_net_driver.return_value = mock_driver
1383
+ amphora_config_mock = mock.MagicMock()
1384
+ mock_driver.get_network_configs.return_value = {
1385
+ "amphora_uuid1": amphora_config_mock
1386
+ }
1383
1387
  mock_amp_get.return_value = 'mock amphora'
1384
1388
  mock_lb_get.return_value = 'mock load balancer'
1385
1389
 
@@ -1391,6 +1395,9 @@ class TestNetworkTasks(base.TestCase):
1391
1395
  'mock load balancer', amphora='mock amphora')
1392
1396
  mock_amp_get.assert_called_once_with(mock_get_session(), id=AMP_ID)
1393
1397
  mock_lb_get.assert_called_once_with(mock_get_session(), id=LB_ID)
1398
+ amphora_config_mock.to_dict.assert_called_once_with(
1399
+ recurse=True, calling_classes=[o_data_models.LoadBalancer]
1400
+ )
1394
1401
 
1395
1402
  @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
1396
1403
  @mock.patch('octavia.db.api.get_session', return_value=_session_mock)
@@ -1399,10 +1406,17 @@ class TestNetworkTasks(base.TestCase):
1399
1406
  mock_driver = mock.MagicMock()
1400
1407
  mock_lb_get.return_value = LB
1401
1408
  mock_get_net_driver.return_value = mock_driver
1409
+ amphora_config_mock = mock.MagicMock()
1410
+ mock_driver.get_network_configs.return_value = {
1411
+ "amphora_uuid1": amphora_config_mock
1412
+ }
1402
1413
  lb = o_data_models.LoadBalancer()
1403
1414
  net_task = network_tasks.GetAmphoraeNetworkConfigs()
1404
1415
  net_task.execute(self.load_balancer_mock)
1405
1416
  mock_driver.get_network_configs.assert_called_once_with(lb)
1417
+ amphora_config_mock.to_dict.assert_called_once_with(
1418
+ recurse=True, calling_classes=[o_data_models.LoadBalancer]
1419
+ )
1406
1420
 
1407
1421
  def test_retrieve_portids_on_amphora_except_lb_network(
1408
1422
  self, mock_get_net_driver):
@@ -1526,6 +1540,57 @@ class TestNetworkTasks(base.TestCase):
1526
1540
  mock_driver.unplug_aap_port.assert_called_once_with(
1527
1541
  LB.vip, self.db_amphora_mock, mockSubnet)
1528
1542
 
1543
+ @mock.patch('octavia.db.repositories.AmphoraRepository.get')
1544
+ @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
1545
+ @mock.patch('octavia.db.api.get_session', return_value=_session_mock)
1546
+ def test_revert_plug_vip_amphora_subnet_not_found(
1547
+ self, mock_session, mock_lb_get, mock_get, mock_get_net_driver):
1548
+ mock_driver = mock.MagicMock()
1549
+ mock_lb_get.return_value = LB
1550
+ mock_get.return_value = self.db_amphora_mock
1551
+ mock_get_net_driver.return_value = mock_driver
1552
+ net = network_tasks.PlugVIPAmphora()
1553
+ amphora = {constants.ID: AMPHORA_ID,
1554
+ constants.LB_NETWORK_IP: IP_ADDRESS}
1555
+ subnet = {constants.ID: SUBNET_ID}
1556
+ err_msg = 'Subnet not found'
1557
+ mock_driver.get_subnet.side_effect = net_base.SubnetNotFound(err_msg)
1558
+ result = AMPS_DATA[0].to_dict()
1559
+ net.revert(result, self.load_balancer_mock, amphora, subnet)
1560
+ mock_driver.unplug_aap_port.assert_not_called()
1561
+ network_tasks.LOG.error.assert_called_once_with(
1562
+ 'Failed to unplug AAP port for load balancer: %s. '
1563
+ 'Resources may still be in use for VRRP port: %s. '
1564
+ 'Due to error: %s',
1565
+ self.load_balancer_mock[constants.LOADBALANCER_ID],
1566
+ result[constants.VRRP_PORT_ID], err_msg
1567
+ )
1568
+
1569
+ @mock.patch('octavia.db.repositories.AmphoraRepository.get')
1570
+ @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
1571
+ @mock.patch('octavia.db.api.get_session', return_value=_session_mock)
1572
+ def test_revert_plug_vip_amphora_raise_db_error(
1573
+ self, mock_session, mock_lb_get, mock_get, mock_get_net_driver):
1574
+ mock_driver = mock.MagicMock()
1575
+ mock_lb_get.return_value = LB
1576
+ err_msg = 'Some Error'
1577
+ mock_get.side_effect = Exception(err_msg)
1578
+ net = network_tasks.PlugVIPAmphora()
1579
+ amphora = {constants.ID: AMPHORA_ID,
1580
+ constants.LB_NETWORK_IP: IP_ADDRESS}
1581
+ subnet = {constants.ID: SUBNET_ID}
1582
+ result = AMPS_DATA[0].to_dict()
1583
+ net.revert(result, self.load_balancer_mock, amphora, subnet)
1584
+ mock_driver.unplug_aap_port.assert_not_called()
1585
+ mock_lb_get.assert_not_called()
1586
+ network_tasks.LOG.error.assert_called_once_with(
1587
+ 'Failed to unplug AAP port for load balancer: %s. '
1588
+ 'Resources may still be in use for VRRP port: %s. '
1589
+ 'Due to error: %s',
1590
+ self.load_balancer_mock[constants.LOADBALANCER_ID],
1591
+ result[constants.VRRP_PORT_ID], err_msg
1592
+ )
1593
+
1529
1594
  @mock.patch('octavia.controller.worker.v2.tasks.network_tasks.DeletePort.'
1530
1595
  'update_progress')
1531
1596
  def test_delete_port(self, mock_update_progress, mock_get_net_driver):
@@ -1071,7 +1071,8 @@ class TestAllowedAddressPairsDriver(base.TestCase):
1071
1071
  fake_rules = [
1072
1072
  {'id': 'rule-80', 'port_range_max': 80, 'protocol': 'tcp',
1073
1073
  'remote_ip_prefix': '10.0.101.0/24'},
1074
- {'id': 'rule-22', 'port_range_max': 22, 'protocol': 'tcp'}
1074
+ {'id': 'rule-22', 'port_range_max': 22, 'protocol': 'tcp'},
1075
+ {'id': 'rule-None', 'port_range_max': 22},
1075
1076
  ]
1076
1077
  list_rules = self.driver.network_proxy.security_group_rules
1077
1078
  list_rules.return_value = fake_rules
@@ -102,6 +102,7 @@ Hongbin Lu <hongbin.lu@huawei.com>
102
102
  Ian Wienand <iwienand@redhat.com>
103
103
  Ihar Hrachyshka <ihrachys@redhat.com>
104
104
  Ildar Iskhakov <iiskhako@cisco.com>
105
+ Ilia Kerbs <ikerbs@protonmail.com>
105
106
  Itzik Brown <itzikb@redhat.com>
106
107
  Jacky Hu <hudayou@hotmail.com>
107
108
  James Arendt <james.arendt@hp.com>
@@ -192,6 +193,7 @@ Sean McGinnis <sean.mcginnis@gmail.com>
192
193
  Selvakumar S <selvakumar.s2@hp.com>
193
194
  Sergey Belous <sbelous@mirantis.com>
194
195
  Sergey Kraynev <sergejyit@gmail.com>
196
+ Seunghun Lee <seunghun@stackhpc.com>
195
197
  ShangXiao <shangxiaobj@inspur.com>
196
198
  Shashank Kumar Shankar <shashank.kumar.shankar@intel.com>
197
199
  Sherif Abdelwahab <sherif.abdelwahab@hp.com>
@@ -0,0 +1,154 @@
1
+ Metadata-Version: 2.1
2
+ Name: octavia
3
+ Version: 15.0.1
4
+ Summary: OpenStack Octavia Scalable Load Balancer as a Service
5
+ Home-page: https://docs.openstack.org/octavia/latest/
6
+ Author: OpenStack
7
+ Author-email: openstack-discuss@lists.openstack.org
8
+ Classifier: Development Status :: 5 - Production/Stable
9
+ Classifier: Environment :: OpenStack
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Intended Audience :: Information Technology
12
+ Classifier: Intended Audience :: System Administrators
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.9
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Requires-Python: >=3.9
21
+ License-File: LICENSE
22
+ License-File: AUTHORS
23
+ Requires-Dist: alembic >=0.9.6
24
+ Requires-Dist: cotyledon >=1.3.0
25
+ Requires-Dist: pecan >=1.3.2
26
+ Requires-Dist: pbr >=3.1.1
27
+ Requires-Dist: SQLAlchemy >=1.2.19
28
+ Requires-Dist: SQLAlchemy-Utils >=0.30.11
29
+ Requires-Dist: futurist >=1.2.0
30
+ Requires-Dist: requests >=2.23.0
31
+ Requires-Dist: rfc3986 >=1.2.0
32
+ Requires-Dist: keystoneauth1 >=3.4.0
33
+ Requires-Dist: keystonemiddleware >=9.5.0
34
+ Requires-Dist: WebOb >=1.8.2
35
+ Requires-Dist: stevedore >=1.20.0
36
+ Requires-Dist: openstacksdk >=0.103.0
37
+ Requires-Dist: oslo.config >=6.8.0
38
+ Requires-Dist: oslo.context >=2.22.0
39
+ Requires-Dist: oslo.db[mysql] >=8.4.0
40
+ Requires-Dist: oslo.i18n >=3.20.0
41
+ Requires-Dist: oslo.log >=4.3.0
42
+ Requires-Dist: oslo.messaging >=14.1.0
43
+ Requires-Dist: oslo.middleware >=4.0.1
44
+ Requires-Dist: oslo.policy >=3.7.0
45
+ Requires-Dist: oslo.reports >=1.18.0
46
+ Requires-Dist: oslo.serialization >=2.28.1
47
+ Requires-Dist: oslo.upgradecheck >=1.3.0
48
+ Requires-Dist: oslo.utils >=4.7.0
49
+ Requires-Dist: psutil >=5.7.1
50
+ Requires-Dist: pyasn1 !=0.2.3,>=0.1.8
51
+ Requires-Dist: pyasn1-modules >=0.0.6
52
+ Requires-Dist: python-barbicanclient >=4.5.2
53
+ Requires-Dist: python-glanceclient >=2.8.0
54
+ Requires-Dist: python-novaclient >=9.1.0
55
+ Requires-Dist: python-cinderclient >=3.3.0
56
+ Requires-Dist: WSME >=0.8.0
57
+ Requires-Dist: Jinja2 >=2.10
58
+ Requires-Dist: taskflow >=5.5.0
59
+ Requires-Dist: castellan >=0.16.0
60
+ Requires-Dist: tenacity >=5.0.4
61
+ Requires-Dist: distro >=1.2.0
62
+ Requires-Dist: jsonschema >=3.2.0
63
+ Requires-Dist: octavia-lib >=3.3.0
64
+ Requires-Dist: setproctitle >=1.1.10
65
+ Requires-Dist: python-dateutil >=2.7.0
66
+ Requires-Dist: Flask !=0.11,>=0.10
67
+ Requires-Dist: cryptography >=42.0.0
68
+ Requires-Dist: gunicorn >=19.9.0
69
+ Requires-Dist: Werkzeug >=0.14.1
70
+ Requires-Dist: pyroute2 >=0.5.14 ; (sys_platform!='win32')
71
+ Provides-Extra: redis
72
+ Requires-Dist: redis >=3.4.0 ; extra == 'redis'
73
+ Provides-Extra: test
74
+ Requires-Dist: hacking <6.2.0,>=6.1.0 ; extra == 'test'
75
+ Requires-Dist: requests-mock >=1.2.0 ; extra == 'test'
76
+ Requires-Dist: coverage !=4.4,>=4.0 ; extra == 'test'
77
+ Requires-Dist: fixtures >=3.0.0 ; extra == 'test'
78
+ Requires-Dist: flake8-import-order <0.19.0,>=0.18.0 ; extra == 'test'
79
+ Requires-Dist: python-subunit >=1.0.0 ; extra == 'test'
80
+ Requires-Dist: oslotest >=3.2.0 ; extra == 'test'
81
+ Requires-Dist: pylint <3.2.0,>=2.5.3 ; extra == 'test'
82
+ Requires-Dist: testrepository >=0.0.18 ; extra == 'test'
83
+ Requires-Dist: testtools >=2.2.0 ; extra == 'test'
84
+ Requires-Dist: testresources >=2.0.0 ; extra == 'test'
85
+ Requires-Dist: testscenarios >=0.4 ; extra == 'test'
86
+ Requires-Dist: doc8 >=0.6.0 ; extra == 'test'
87
+ Requires-Dist: bandit !=1.6.0,>=1.1.0 ; extra == 'test'
88
+ Requires-Dist: tempest >=23.0.0 ; extra == 'test'
89
+ Requires-Dist: sphinx !=2.1.0,>=2.0.0 ; extra == 'test'
90
+ Requires-Dist: bashate >=0.5.1 ; extra == 'test'
91
+ Requires-Dist: WebTest >=2.0.26 ; extra == 'test'
92
+ Provides-Extra: zookeeper
93
+ Requires-Dist: kazoo >=2.6.0 ; extra == 'zookeeper'
94
+ Requires-Dist: zake >=0.1.6 ; extra == 'zookeeper'
95
+
96
+ ========================
97
+ Team and repository tags
98
+ ========================
99
+
100
+ .. image:: https://governance.openstack.org/tc/badges/octavia.svg
101
+ :target: https://governance.openstack.org/tc/reference/tags/index.html
102
+
103
+ .. Change things from this point on
104
+
105
+ =======
106
+ Octavia
107
+ =======
108
+
109
+ .. image:: https://img.shields.io/pypi/v/octavia.svg
110
+ :target: https://pypi.org/project/octavia/
111
+ :alt: Latest Version
112
+
113
+ Octavia is an operator-grade open source scalable load balancer for use in
114
+ large OpenStack deployments.
115
+
116
+ Octavia provides the load balancing API for OpenStack. It supports multiple
117
+ "provider drivers" that implement load balancing, including the "amphora"
118
+ reference driver included with Octavia.
119
+
120
+ Octavia is distributed under the terms of the Apache License, Version 2.0.
121
+ The full terms and conditions of this license are detailed in the LICENSE
122
+ file.
123
+
124
+ Project resources
125
+ ~~~~~~~~~~~~~~~~~
126
+
127
+ Developer documentation for the Octavia project is available at
128
+ https://docs.openstack.org/octavia/latest/
129
+
130
+ Release notes for the Octavia project are available at
131
+ https://docs.openstack.org/releasenotes/octavia/
132
+
133
+ The project source code repository is located at
134
+ https://opendev.org/openstack/octavia
135
+
136
+ Project status, bugs, and requests for feature enhancements are tracked on
137
+ https://launchpad.net/octavia
138
+
139
+ For more information on project direction and guiding principles for
140
+ contributors, please see the CONSTITUTION.rst file in this directory, or
141
+ specifications in the specs/ sub-directory.
142
+
143
+ The project roadmap is available at
144
+ https://wiki.openstack.org/wiki/Octavia/Roadmap
145
+
146
+ External Resources
147
+ ~~~~~~~~~~~~~~~~~~
148
+
149
+ * Octavia Wiki: https://wiki.openstack.org/wiki/Octavia
150
+
151
+ * For help on usage and hacking of Octavia, please send an email to
152
+ OpenStack-dev Mailing List <mailto:openstack-discuss@lists.openstack.org>
153
+ with **[Octavia]** tag.
154
+
@@ -11,14 +11,14 @@ octavia/amphorae/backends/agent/api_server/amphora_info.py,sha256=wi_73ADK2zPtsG
11
11
  octavia/amphorae/backends/agent/api_server/certificate_update.py,sha256=YaHHG4NRQZrW-D7Qc4_KuFrnPFMobglyNyoDZqGYaCA,1184
12
12
  octavia/amphorae/backends/agent/api_server/haproxy_compatibility.py,sha256=HDUINr7t-rYBfZvmwepemV2HZFPbFQbuTw4LBxg2LZE,1807
13
13
  octavia/amphorae/backends/agent/api_server/keepalived.py,sha256=SNyL-aMaRsNemoLRJR08Gix_8vlz-N_w1SRVFpVW8LM,5828
14
- octavia/amphorae/backends/agent/api_server/keepalivedlvs.py,sha256=EzVT4KTFM7CeeBrGGkuaOdl1JpZnOnigUVwozUC_D_s,12627
14
+ octavia/amphorae/backends/agent/api_server/keepalivedlvs.py,sha256=LShmTRFslr4kKg5uHnue6DiiXq6QbfP74vRg0uBWqZE,13112
15
15
  octavia/amphorae/backends/agent/api_server/loadbalancer.py,sha256=mKOyY-DtKJcKLejiKoTQgeAlKTx_zLsdcBY3kTt6M8c,18108
16
16
  octavia/amphorae/backends/agent/api_server/lvs_listener_base.py,sha256=CCYeoUEVewye4ded5azORd34my-DaIf2t4buwsreqcI,2622
17
17
  octavia/amphorae/backends/agent/api_server/osutils.py,sha256=YAXfr9z49RJg3CUwBdVBB-_Cs07z6RxL49ROgdJB0io,4522
18
18
  octavia/amphorae/backends/agent/api_server/plug.py,sha256=fq4d5N59beyD-eSmFxGALZjzgNHNddDQLj48AQs_hTI,12393
19
19
  octavia/amphorae/backends/agent/api_server/rules_schema.py,sha256=HWxZaTUnk2nuzqUTIZNyfAmG2pIvFLGg2UZe2qZIMdg,2015
20
20
  octavia/amphorae/backends/agent/api_server/server.py,sha256=9urHPfA7umCUdFIIWTdDQ9r_dVJ62mceCkyhgp7owDE,12694
21
- octavia/amphorae/backends/agent/api_server/util.py,sha256=ZMHsjJpm1kNYfFfSqOsnmmBkBfcFfCUPubA5h5vIPT4,13266
21
+ octavia/amphorae/backends/agent/api_server/util.py,sha256=TPeNSwZQoPTGiskNY-l45AF2medc7LlzWm73KGNnRaE,14468
22
22
  octavia/amphorae/backends/agent/api_server/templates/amphora-netns.systemd.j2,sha256=cOQQh2ZGAnpL0zexzG9bO2xdS8aNRkEYM6aGzu9jZCc,1933
23
23
  octavia/amphorae/backends/agent/api_server/templates/keepalived.systemd.j2,sha256=CdgLnnTwvJEEZQLtNVnr9EoQXBX0vscuXYJzceycl5k,855
24
24
  octavia/amphorae/backends/agent/api_server/templates/keepalived_check_script.conf.j2,sha256=FXDW_Q6j1RKbezMrvlsnFJS74XgPqYOCu-Y-nNQSLcc,872
@@ -145,7 +145,7 @@ octavia/cmd/prometheus_proxy.py,sha256=180eOEAFA8_9oMqQzkVLO6TDk30fOleYZx98nje3i
145
145
  octavia/cmd/status.py,sha256=rUmazAatEjQ8To2fV-VkABdKJ2g1LfMonMkn9sAM4ZU,5438
146
146
  octavia/common/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
147
147
  octavia/common/base_taskflow.py,sha256=KRUPA3lRHr5JNfHok-k8APIe77vUQeTbALQ91FkM8m4,9495
148
- octavia/common/clients.py,sha256=-tf9fmG-k3mGYsu_ZErAI5PV8J8QtAbLZCmUG2qBCj4,8129
148
+ octavia/common/clients.py,sha256=wX2XAHhKd9KvEuXDKtYBjqclDO-2wnXRqL9koPFq7bg,8424
149
149
  octavia/common/config.py,sha256=8Xflduock4TV_BbY_rHJwef0ji0htLGgaPw5TOKESGs,51562
150
150
  octavia/common/constants.py,sha256=TY-WJXIwSCWbsc7yNklieJZ3qljV6g-SjgVMAeyKzLQ,33972
151
151
  octavia/common/context.py,sha256=sZCCSAccJsJJuSoJBbX6ve1qV35bvrawBdcdLbGwcE8,1269
@@ -213,9 +213,9 @@ octavia/controller/worker/v2/tasks/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gv
213
213
  octavia/controller/worker/v2/tasks/amphora_driver_tasks.py,sha256=oIPZLTp2ijvoYJ2x0-zw8U4fFdH0N-4ZOeqdDmXWtKU,33818
214
214
  octavia/controller/worker/v2/tasks/cert_task.py,sha256=6BoMIyeNQeiV-Jsi2XWuxzU3xHBxlV4G1dWXjj1YM3A,1752
215
215
  octavia/controller/worker/v2/tasks/compute_tasks.py,sha256=PkQIzMzSHId_vpQtWYDnrrJlBzeC6acu-DpDAaaCU48,15416
216
- octavia/controller/worker/v2/tasks/database_tasks.py,sha256=hsi7zeoXjZgd8ko83RNpqHXRSzKgW5PKijDntwdHCoQ,116376
216
+ octavia/controller/worker/v2/tasks/database_tasks.py,sha256=7e4I87iUBJI5mvhXu9A9TNSLFXOOnabJj__0mH75hTk,116532
217
217
  octavia/controller/worker/v2/tasks/lifecycle_tasks.py,sha256=wQe30D_yI1i3bb3r6pC_eD1F8fo-8Jh1oJN4TC_PHSI,9803
218
- octavia/controller/worker/v2/tasks/network_tasks.py,sha256=5ddIvZU39oPIHlrDgMhURHVELrAXLmn01lxfICo6d_4,44462
218
+ octavia/controller/worker/v2/tasks/network_tasks.py,sha256=s7XWDtrjdt3pg8yvHA9iOd46kEe_b_2v1C5Y0xiTZsQ,45187
219
219
  octavia/controller/worker/v2/tasks/notification_tasks.py,sha256=I2J6qNf1L7rRB0gpjy9OS7ZM4REB91-ty8xiy1WsjfQ,1631
220
220
  octavia/controller/worker/v2/tasks/retry_tasks.py,sha256=z8ZX47TKH84wzSjDOZuOtPEOjOj6DpCh4hU3_Nd1SRI,3359
221
221
  octavia/controller/worker/v2/tasks/shim_tasks.py,sha256=v8y_OYcyYJZ4cMjuY7oob6c74Y6k_56vj13AqYpPsRU,1095
@@ -342,7 +342,7 @@ octavia/network/base.py,sha256=psPz6hXP-59suQtws4_S-LFmu7oFyL3fpTswSz4RsfA,12642
342
342
  octavia/network/data_models.py,sha256=zo9U-lrUurjm-LF48onnIOLMErLQlLYaXiE_ekzihNU,6922
343
343
  octavia/network/drivers/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
344
344
  octavia/network/drivers/neutron/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
345
- octavia/network/drivers/neutron/allowed_address_pairs.py,sha256=EpocWuNNYCD2Jldj57FV-5BZAkgBMqcn5ActFCGjgPo,40173
345
+ octavia/network/drivers/neutron/allowed_address_pairs.py,sha256=DEkaXPeHBEsGFFh9QVPBE0_d-wj8UEGw-Ur5-611m7Q,40217
346
346
  octavia/network/drivers/neutron/base.py,sha256=RQGMZA7i0dimHm9JdR0PBeLn-7XoYbwJl3dQb6NHhew,13461
347
347
  octavia/network/drivers/neutron/utils.py,sha256=vplIypvz1UxoWCSKVtba3tevt2d2jfE4McW8m2mAP1I,3862
348
348
  octavia/network/drivers/noop_driver/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
@@ -431,7 +431,7 @@ octavia/tests/unit/amphorae/backends/agent/api_server/test_keepalivedlvs.py,sha2
431
431
  octavia/tests/unit/amphorae/backends/agent/api_server/test_loadbalancer.py,sha256=ZlAEXH8nLGwPjgP42lWef3whLe491AtCD2vgv_LMvig,14076
432
432
  octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py,sha256=j5px13Bsyyw4g51rLult3N66jw5cDmq-W7KdGzxgFMM,8755
433
433
  octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py,sha256=1j1Txvyg_iXBrgp2kdquTPbCBcUgQlDg4HC7zEZkYrs,19623
434
- octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py,sha256=-BnveBiYPi-DPsMbvA0ZZi9yVpc4Uod4WG9bErJlgEk,18586
434
+ octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py,sha256=52QYuD3Bn9MUwtwU3BhK2152ChXWvIfI08I4fNb1NH8,22632
435
435
  octavia/tests/unit/amphorae/backends/health_daemon/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
436
436
  octavia/tests/unit/amphorae/backends/health_daemon/test_health_daemon.py,sha256=u6uXn9DSUGfF_uoRkB1r0xFilXHxFoi3KCuH8ngvb1A,22228
437
437
  octavia/tests/unit/amphorae/backends/health_daemon/test_health_sender.py,sha256=TTfdkrLW2K_tQHLQ8LVQIodbnJNeDpMkljEq_ZOhvYc,7533
@@ -577,10 +577,10 @@ octavia/tests/unit/controller/worker/v2/tasks/__init__.py,sha256=TzUH4t3i6YSFemC
577
577
  octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py,sha256=mJ5SSGZIl7EGQ95ToO2VV3Nqz-VKXKbKZNB0V2FP5QI,59020
578
578
  octavia/tests/unit/controller/worker/v2/tasks/test_cert_task.py,sha256=f26k05ma8qPQSXRLQpn9U6l0vpJSizF5CTOjMHVJ5E8,1711
579
579
  octavia/tests/unit/controller/worker/v2/tasks/test_compute_tasks.py,sha256=mhYzRzMW0giGsv5aldydwI8PQ9NHKpgy-j5fztqXUVM,25667
580
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py,sha256=pE2vpQZZc2iFx0m0ZBdCT7JfpdCJmJ4vNuw-IXHQ_hs,132015
580
+ octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py,sha256=bhcaCnmCjXF479ZNKsHil8VlNwciSjtxJrBggGvrhYE,133123
581
581
  octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py,sha256=SYofCx3JG07ytORwyqw2Kt7upgmxAE282Olk9JNsB74,17095
582
582
  octavia/tests/unit/controller/worker/v2/tasks/test_lifecycle_tasks.py,sha256=GZ0tkCu3zAqPVoWOiNaboAsL_V7Eksj1oXqED8QOuZE,16944
583
- octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py,sha256=ylsphRlEhTvYPF0wErMjkbDlA2nfNLP48pCT3xo8JoY,84121
583
+ octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py,sha256=rH2lAD-oPr22pOYLoZHPZqbawo9OWgcC5W3ZGf1TE9M,87305
584
584
  octavia/tests/unit/controller/worker/v2/tasks/test_notification_tasks.py,sha256=zW-zwrwaMFp7hAvayMSWzT0rAi_Z3KI_gdi1t6BA7aM,2566
585
585
  octavia/tests/unit/controller/worker/v2/tasks/test_retry_tasks.py,sha256=WimPAN6HpaGVXyMbdlHY6rv1McIj81Oo7tRpWc08lCs,1481
586
586
  octavia/tests/unit/controller/worker/v2/tasks/test_shim_tasks.py,sha256=T1ud61oLOjzQ1NPeUImqe6l4-6w7CrHNyygmbFtDmDo,1232
@@ -593,7 +593,7 @@ octavia/tests/unit/image/drivers/noop_driver/test_driver.py,sha256=5zm0RToQ97ThX
593
593
  octavia/tests/unit/network/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
594
594
  octavia/tests/unit/network/drivers/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
595
595
  octavia/tests/unit/network/drivers/neutron/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
596
- octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py,sha256=GLrwZPv6ICXRDnY1qvl1OQcQoER2I_1J5LPSUXEerTg,78904
596
+ octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py,sha256=YhQ-fIrufmeR7GvQkIheD7It09JVVzpwXuiUO6NfdCY,78960
597
597
  octavia/tests/unit/network/drivers/neutron/test_base.py,sha256=bDl7LehyP7nimXt8lCY4uqBQZfds7ZIbIyeY5k72Hoc,32170
598
598
  octavia/tests/unit/network/drivers/neutron/test_utils.py,sha256=a4pvyYSD_wk2PBZHCD2084smIWPo8Up39nhZ2d-FgTA,5170
599
599
  octavia/tests/unit/network/drivers/noop_driver/__init__.py,sha256=TzUH4t3i6YSFemC4714xlG51gvXxXp8zwhdkh2Yut58,572
@@ -614,21 +614,21 @@ octavia/volume/drivers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
614
614
  octavia/volume/drivers/cinder_driver.py,sha256=t170XOvJ_-eTdYUpLir7ttd2vNcLuDKiqr6wx4t19Ug,4694
615
615
  octavia/volume/drivers/noop_driver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
616
616
  octavia/volume/drivers/noop_driver/driver.py,sha256=RqXnutQA-5k5ywkYaQefa_rv8JSfKZUHUyC1gQp9Tkw,2114
617
- octavia-15.0.0.data/data/share/octavia/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
618
- octavia-15.0.0.data/data/share/octavia/README.rst,sha256=1OBh9sollCLeB_vRE7cuHKOyYqkdNNToDnBkm8Zql2E,1840
619
- octavia-15.0.0.data/data/share/octavia/diskimage-create/README.rst,sha256=YfMT25v5GKZzL9BUHAtFpxrf7WkTb0SsP7JnARfPNeo,13582
620
- octavia-15.0.0.data/data/share/octavia/diskimage-create/diskimage-create.sh,sha256=PAO-CC5cK4jHse3IsuIePOFnraqvWLqXAuL4Nc0G4rY,19540
621
- octavia-15.0.0.data/data/share/octavia/diskimage-create/image-tests.sh,sha256=Pf2t_3ecm0aPnZhMZXBthFRNf6g0IR_JjtiWiq39VK4,3307
622
- octavia-15.0.0.data/data/share/octavia/diskimage-create/requirements.txt,sha256=eFwjt74uwuZ0tHJ6gr5NFJVkNC4Rhj3Rq3E3yNRc0S0,26
623
- octavia-15.0.0.data/data/share/octavia/diskimage-create/test-requirements.txt,sha256=1LHXsGOnVbwN8R077Bsig0g-n6egb5JGsBb6pluZkAU,22
624
- octavia-15.0.0.data/data/share/octavia/diskimage-create/tox.ini,sha256=xlRZdKoVgDcLG40yx_Bgl9m5plpxO_3lzPcVaZ1KAPk,1346
625
- octavia-15.0.0.data/data/share/octavia/diskimage-create/version.txt,sha256=pjEQCcbDIsqKwuYgz_UgTww68jEV1AMpOgy1vjZ5Zog,4
626
- octavia-15.0.0.data/scripts/octavia-wsgi,sha256=WW8-WIzotMi67uLd6UzD45ZCZZkpJ-eQZZ3w37Dle7U,1777
627
- octavia-15.0.0.dist-info/AUTHORS,sha256=2NJERRPVE2Y4m3RdGLrH2IH3Lqiskf5Ila0qGYz1miU,11967
628
- octavia-15.0.0.dist-info/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
629
- octavia-15.0.0.dist-info/METADATA,sha256=fIf2QcqpZTlZER8esVpWmUxz88XEPg3wJuNFgh9hAMA,5784
630
- octavia-15.0.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
631
- octavia-15.0.0.dist-info/entry_points.txt,sha256=NSsxlpfN6wT7sZpFC6myIZ_n3uni65vFd8yr9paP7mw,3965
632
- octavia-15.0.0.dist-info/pbr.json,sha256=r9LX7sC9CfIL-dJEzae_oZzFcSesWq5n26z2VA346Jw,47
633
- octavia-15.0.0.dist-info/top_level.txt,sha256=3fR7BRuzN3OSlXpG8VH75_hi6tCwlNUs2JePIxiRPUA,8
634
- octavia-15.0.0.dist-info/RECORD,,
617
+ octavia-15.0.1.data/data/share/octavia/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
618
+ octavia-15.0.1.data/data/share/octavia/README.rst,sha256=1OBh9sollCLeB_vRE7cuHKOyYqkdNNToDnBkm8Zql2E,1840
619
+ octavia-15.0.1.data/data/share/octavia/diskimage-create/README.rst,sha256=YfMT25v5GKZzL9BUHAtFpxrf7WkTb0SsP7JnARfPNeo,13582
620
+ octavia-15.0.1.data/data/share/octavia/diskimage-create/diskimage-create.sh,sha256=PAO-CC5cK4jHse3IsuIePOFnraqvWLqXAuL4Nc0G4rY,19540
621
+ octavia-15.0.1.data/data/share/octavia/diskimage-create/image-tests.sh,sha256=Pf2t_3ecm0aPnZhMZXBthFRNf6g0IR_JjtiWiq39VK4,3307
622
+ octavia-15.0.1.data/data/share/octavia/diskimage-create/requirements.txt,sha256=eFwjt74uwuZ0tHJ6gr5NFJVkNC4Rhj3Rq3E3yNRc0S0,26
623
+ octavia-15.0.1.data/data/share/octavia/diskimage-create/test-requirements.txt,sha256=1LHXsGOnVbwN8R077Bsig0g-n6egb5JGsBb6pluZkAU,22
624
+ octavia-15.0.1.data/data/share/octavia/diskimage-create/tox.ini,sha256=xlRZdKoVgDcLG40yx_Bgl9m5plpxO_3lzPcVaZ1KAPk,1346
625
+ octavia-15.0.1.data/data/share/octavia/diskimage-create/version.txt,sha256=pjEQCcbDIsqKwuYgz_UgTww68jEV1AMpOgy1vjZ5Zog,4
626
+ octavia-15.0.1.data/scripts/octavia-wsgi,sha256=WW8-WIzotMi67uLd6UzD45ZCZZkpJ-eQZZ3w37Dle7U,1777
627
+ octavia-15.0.1.dist-info/AUTHORS,sha256=gCBdeXoI45KCkP5z0qACGqcpY01oh-k-2kaENGEirEs,12039
628
+ octavia-15.0.1.dist-info/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
629
+ octavia-15.0.1.dist-info/METADATA,sha256=-_Nz8mCqiPug65qNDXud0OzApL8rwUp2_V0Mw_9qpPg,5660
630
+ octavia-15.0.1.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
631
+ octavia-15.0.1.dist-info/entry_points.txt,sha256=Nl_dCK_l32Jy2IKdSNAMH10xJq7HXLpAEy9fVK3M7KA,3964
632
+ octavia-15.0.1.dist-info/pbr.json,sha256=ZKREeTSfmHHJ47jan7ODnU546zIBctqyQsmW4GmoPkM,48
633
+ octavia-15.0.1.dist-info/top_level.txt,sha256=3fR7BRuzN3OSlXpG8VH75_hi6tCwlNUs2JePIxiRPUA,8
634
+ octavia-15.0.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.34.2)
2
+ Generator: setuptools (75.3.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -89,4 +89,3 @@ octavia = octavia.policies:list_rules
89
89
 
90
90
  [wsgi_scripts]
91
91
  octavia-wsgi = octavia.api.app:setup_app
92
-
@@ -0,0 +1 @@
1
+ {"git_version": "8e02055af", "is_release": true}
@@ -1,156 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: octavia
3
- Version: 15.0.0
4
- Summary: OpenStack Octavia Scalable Load Balancer as a Service
5
- Home-page: https://docs.openstack.org/octavia/latest/
6
- Author: OpenStack
7
- Author-email: openstack-discuss@lists.openstack.org
8
- License: UNKNOWN
9
- Platform: UNKNOWN
10
- Classifier: Development Status :: 5 - Production/Stable
11
- Classifier: Environment :: OpenStack
12
- Classifier: Intended Audience :: Developers
13
- Classifier: Intended Audience :: Information Technology
14
- Classifier: Intended Audience :: System Administrators
15
- Classifier: License :: OSI Approved :: Apache Software License
16
- Classifier: Operating System :: POSIX :: Linux
17
- Classifier: Programming Language :: Python
18
- Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.9
20
- Classifier: Programming Language :: Python :: 3.10
21
- Classifier: Programming Language :: Python :: 3.11
22
- Requires-Python: >=3.9
23
- Requires-Dist: Flask (!=0.11,>=0.10)
24
- Requires-Dist: Jinja2 (>=2.10)
25
- Requires-Dist: SQLAlchemy-Utils (>=0.30.11)
26
- Requires-Dist: SQLAlchemy (>=1.2.19)
27
- Requires-Dist: WSME (>=0.8.0)
28
- Requires-Dist: WebOb (>=1.8.2)
29
- Requires-Dist: Werkzeug (>=0.14.1)
30
- Requires-Dist: alembic (>=0.9.6)
31
- Requires-Dist: castellan (>=0.16.0)
32
- Requires-Dist: cotyledon (>=1.3.0)
33
- Requires-Dist: cryptography (>=42.0.0)
34
- Requires-Dist: distro (>=1.2.0)
35
- Requires-Dist: futurist (>=1.2.0)
36
- Requires-Dist: gunicorn (>=19.9.0)
37
- Requires-Dist: jsonschema (>=3.2.0)
38
- Requires-Dist: keystoneauth1 (>=3.4.0)
39
- Requires-Dist: keystonemiddleware (>=9.5.0)
40
- Requires-Dist: octavia-lib (>=3.3.0)
41
- Requires-Dist: openstacksdk (>=0.103.0)
42
- Requires-Dist: oslo.config (>=6.8.0)
43
- Requires-Dist: oslo.context (>=2.22.0)
44
- Requires-Dist: oslo.db[mysql] (>=8.4.0)
45
- Requires-Dist: oslo.i18n (>=3.20.0)
46
- Requires-Dist: oslo.log (>=4.3.0)
47
- Requires-Dist: oslo.messaging (>=14.1.0)
48
- Requires-Dist: oslo.middleware (>=4.0.1)
49
- Requires-Dist: oslo.policy (>=3.7.0)
50
- Requires-Dist: oslo.reports (>=1.18.0)
51
- Requires-Dist: oslo.serialization (>=2.28.1)
52
- Requires-Dist: oslo.upgradecheck (>=1.3.0)
53
- Requires-Dist: oslo.utils (>=4.7.0)
54
- Requires-Dist: pbr (>=3.1.1)
55
- Requires-Dist: pecan (>=1.3.2)
56
- Requires-Dist: psutil (>=5.7.1)
57
- Requires-Dist: pyasn1 (!=0.2.3,>=0.1.8)
58
- Requires-Dist: pyasn1-modules (>=0.0.6)
59
- Requires-Dist: python-barbicanclient (>=4.5.2)
60
- Requires-Dist: python-cinderclient (>=3.3.0)
61
- Requires-Dist: python-dateutil (>=2.7.0)
62
- Requires-Dist: python-glanceclient (>=2.8.0)
63
- Requires-Dist: python-novaclient (>=9.1.0)
64
- Requires-Dist: requests (>=2.23.0)
65
- Requires-Dist: rfc3986 (>=1.2.0)
66
- Requires-Dist: setproctitle (>=1.1.10)
67
- Requires-Dist: stevedore (>=1.20.0)
68
- Requires-Dist: taskflow (>=5.5.0)
69
- Requires-Dist: tenacity (>=5.0.4)
70
- Requires-Dist: pyroute2 (>=0.5.14) ; (sys_platform!='win32')
71
- Provides-Extra: redis
72
- Requires-Dist: redis (>=3.4.0) ; extra == 'redis'
73
- Provides-Extra: test
74
- Requires-Dist: WebTest (>=2.0.26) ; extra == 'test'
75
- Requires-Dist: bandit (!=1.6.0,>=1.1.0) ; extra == 'test'
76
- Requires-Dist: bashate (>=0.5.1) ; extra == 'test'
77
- Requires-Dist: coverage (!=4.4,>=4.0) ; extra == 'test'
78
- Requires-Dist: doc8 (>=0.6.0) ; extra == 'test'
79
- Requires-Dist: fixtures (>=3.0.0) ; extra == 'test'
80
- Requires-Dist: flake8-import-order (<0.19.0,>=0.18.0) ; extra == 'test'
81
- Requires-Dist: hacking (<6.2.0,>=6.1.0) ; extra == 'test'
82
- Requires-Dist: oslotest (>=3.2.0) ; extra == 'test'
83
- Requires-Dist: pylint (>=2.5.3) ; extra == 'test'
84
- Requires-Dist: python-subunit (>=1.0.0) ; extra == 'test'
85
- Requires-Dist: requests-mock (>=1.2.0) ; extra == 'test'
86
- Requires-Dist: sphinx (!=2.1.0,>=2.0.0) ; extra == 'test'
87
- Requires-Dist: tempest (>=23.0.0) ; extra == 'test'
88
- Requires-Dist: testrepository (>=0.0.18) ; extra == 'test'
89
- Requires-Dist: testresources (>=2.0.0) ; extra == 'test'
90
- Requires-Dist: testscenarios (>=0.4) ; extra == 'test'
91
- Requires-Dist: testtools (>=2.2.0) ; extra == 'test'
92
- Provides-Extra: zookeeper
93
- Requires-Dist: kazoo (>=2.6.0) ; extra == 'zookeeper'
94
- Requires-Dist: zake (>=0.1.6) ; extra == 'zookeeper'
95
-
96
- ========================
97
- Team and repository tags
98
- ========================
99
-
100
- .. image:: https://governance.openstack.org/tc/badges/octavia.svg
101
- :target: https://governance.openstack.org/tc/reference/tags/index.html
102
-
103
- .. Change things from this point on
104
-
105
- =======
106
- Octavia
107
- =======
108
-
109
- .. image:: https://img.shields.io/pypi/v/octavia.svg
110
- :target: https://pypi.org/project/octavia/
111
- :alt: Latest Version
112
-
113
- Octavia is an operator-grade open source scalable load balancer for use in
114
- large OpenStack deployments.
115
-
116
- Octavia provides the load balancing API for OpenStack. It supports multiple
117
- "provider drivers" that implement load balancing, including the "amphora"
118
- reference driver included with Octavia.
119
-
120
- Octavia is distributed under the terms of the Apache License, Version 2.0.
121
- The full terms and conditions of this license are detailed in the LICENSE
122
- file.
123
-
124
- Project resources
125
- ~~~~~~~~~~~~~~~~~
126
-
127
- Developer documentation for the Octavia project is available at
128
- https://docs.openstack.org/octavia/latest/
129
-
130
- Release notes for the Octavia project are available at
131
- https://docs.openstack.org/releasenotes/octavia/
132
-
133
- The project source code repository is located at
134
- https://opendev.org/openstack/octavia
135
-
136
- Project status, bugs, and requests for feature enhancements are tracked on
137
- https://launchpad.net/octavia
138
-
139
- For more information on project direction and guiding principles for
140
- contributors, please see the CONSTITUTION.rst file in this directory, or
141
- specifications in the specs/ sub-directory.
142
-
143
- The project roadmap is available at
144
- https://wiki.openstack.org/wiki/Octavia/Roadmap
145
-
146
- External Resources
147
- ~~~~~~~~~~~~~~~~~~
148
-
149
- * Octavia Wiki: https://wiki.openstack.org/wiki/Octavia
150
-
151
- * For help on usage and hacking of Octavia, please send an email to
152
- OpenStack-dev Mailing List <mailto:openstack-discuss@lists.openstack.org>
153
- with **[Octavia]** tag.
154
-
155
-
156
-
@@ -1 +0,0 @@
1
- {"git_version": "dda68b1c", "is_release": true}