octavia 15.0.0.0rc1__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.
- octavia/amphorae/backends/agent/api_server/keepalivedlvs.py +9 -0
- octavia/amphorae/backends/agent/api_server/util.py +35 -2
- octavia/common/clients.py +7 -1
- octavia/controller/worker/v2/tasks/database_tasks.py +10 -6
- octavia/controller/worker/v2/tasks/network_tasks.py +24 -12
- octavia/network/drivers/neutron/allowed_address_pairs.py +3 -2
- octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +89 -1
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +28 -6
- octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +65 -0
- octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +2 -1
- {octavia-15.0.0.0rc1.dist-info → octavia-15.0.1.dist-info}/AUTHORS +2 -0
- octavia-15.0.1.dist-info/METADATA +154 -0
- {octavia-15.0.0.0rc1.dist-info → octavia-15.0.1.dist-info}/RECORD +28 -28
- {octavia-15.0.0.0rc1.dist-info → octavia-15.0.1.dist-info}/WHEEL +1 -1
- {octavia-15.0.0.0rc1.dist-info → octavia-15.0.1.dist-info}/entry_points.txt +0 -1
- octavia-15.0.1.dist-info/pbr.json +1 -0
- octavia-15.0.0.0rc1.dist-info/METADATA +0 -156
- octavia-15.0.0.0rc1.dist-info/pbr.json +0 -1
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/LICENSE +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/README.rst +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
- {octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/scripts/octavia-wsgi +0 -0
- {octavia-15.0.0.0rc1.dist-info → octavia-15.0.1.dist-info}/LICENSE +0 -0
- {octavia-15.0.0.0rc1.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
|
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
|
-
|
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
|
-
|
136
|
-
|
135
|
+
with db_apis.session().begin() as session:
|
136
|
+
try:
|
137
137
|
self.amphora_repo.delete(session, id=result)
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
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(
|
561
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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')
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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=
|
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
|
-
|
225
|
-
|
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=
|
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=
|
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=
|
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
|
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=
|
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=
|
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=
|
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
|
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=
|
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=
|
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=
|
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.
|
618
|
-
octavia-15.0.
|
619
|
-
octavia-15.0.
|
620
|
-
octavia-15.0.
|
621
|
-
octavia-15.0.
|
622
|
-
octavia-15.0.
|
623
|
-
octavia-15.0.
|
624
|
-
octavia-15.0.
|
625
|
-
octavia-15.0.
|
626
|
-
octavia-15.0.
|
627
|
-
octavia-15.0.
|
628
|
-
octavia-15.0.
|
629
|
-
octavia-15.0.
|
630
|
-
octavia-15.0.
|
631
|
-
octavia-15.0.
|
632
|
-
octavia-15.0.
|
633
|
-
octavia-15.0.
|
634
|
-
octavia-15.0.
|
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,,
|
@@ -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.0rc1
|
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}
|
File without changes
|
File without changes
|
{octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/README.rst
RENAMED
File without changes
|
File without changes
|
{octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/image-tests.sh
RENAMED
File without changes
|
File without changes
|
File without changes
|
{octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/tox.ini
RENAMED
File without changes
|
{octavia-15.0.0.0rc1.data → octavia-15.0.1.data}/data/share/octavia/diskimage-create/version.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|