octavia 13.0.0__py3-none-any.whl → 13.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 (92) hide show
  1. octavia/amphorae/backends/agent/api_server/keepalivedlvs.py +9 -0
  2. octavia/amphorae/backends/agent/api_server/osutils.py +1 -2
  3. octavia/amphorae/backends/agent/api_server/util.py +35 -2
  4. octavia/amphorae/backends/utils/interface.py +4 -5
  5. octavia/amphorae/drivers/driver_base.py +16 -0
  6. octavia/amphorae/drivers/haproxy/rest_api_driver.py +13 -8
  7. octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py +0 -1
  8. octavia/amphorae/drivers/keepalived/jinja/templates/keepalived_base.template +0 -1
  9. octavia/amphorae/drivers/keepalived/vrrp_rest_driver.py +2 -1
  10. octavia/amphorae/drivers/noop_driver/driver.py +3 -0
  11. octavia/api/common/pagination.py +1 -1
  12. octavia/api/v2/controllers/health_monitor.py +3 -2
  13. octavia/api/v2/controllers/l7policy.py +0 -1
  14. octavia/api/v2/controllers/l7rule.py +0 -1
  15. octavia/api/v2/controllers/listener.py +0 -1
  16. octavia/api/v2/controllers/load_balancer.py +13 -7
  17. octavia/api/v2/controllers/member.py +18 -5
  18. octavia/api/v2/controllers/pool.py +6 -7
  19. octavia/api/v2/types/pool.py +1 -1
  20. octavia/certificates/common/pkcs12.py +9 -9
  21. octavia/certificates/manager/barbican.py +24 -16
  22. octavia/certificates/manager/castellan_mgr.py +12 -7
  23. octavia/certificates/manager/noop.py +106 -0
  24. octavia/common/clients.py +22 -4
  25. octavia/common/config.py +21 -5
  26. octavia/common/constants.py +4 -0
  27. octavia/common/exceptions.py +6 -0
  28. octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +7 -5
  29. octavia/common/keystone.py +7 -7
  30. octavia/common/tls_utils/cert_parser.py +23 -9
  31. octavia/controller/worker/task_utils.py +28 -6
  32. octavia/controller/worker/v2/controller_worker.py +2 -2
  33. octavia/controller/worker/v2/flows/amphora_flows.py +41 -10
  34. octavia/controller/worker/v2/flows/flow_utils.py +6 -4
  35. octavia/controller/worker/v2/flows/load_balancer_flows.py +17 -3
  36. octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +114 -23
  37. octavia/controller/worker/v2/tasks/database_tasks.py +36 -47
  38. octavia/controller/worker/v2/tasks/lifecycle_tasks.py +96 -40
  39. octavia/controller/worker/v2/tasks/network_tasks.py +12 -13
  40. octavia/db/base_models.py +16 -4
  41. octavia/db/repositories.py +34 -33
  42. octavia/network/drivers/neutron/allowed_address_pairs.py +10 -8
  43. octavia/network/drivers/noop_driver/driver.py +1 -2
  44. octavia/tests/common/sample_certs.py +115 -0
  45. octavia/tests/functional/api/v2/base.py +1 -1
  46. octavia/tests/functional/api/v2/test_health_monitor.py +18 -0
  47. octavia/tests/functional/api/v2/test_listener.py +45 -0
  48. octavia/tests/functional/api/v2/test_member.py +32 -0
  49. octavia/tests/functional/db/base.py +9 -0
  50. octavia/tests/functional/db/test_repositories.py +45 -98
  51. octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +89 -1
  52. octavia/tests/unit/amphorae/backends/utils/test_interface.py +3 -1
  53. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver.py +3 -3
  54. octavia/tests/unit/amphorae/drivers/keepalived/jinja/test_jinja_cfg.py +0 -4
  55. octavia/tests/unit/amphorae/drivers/keepalived/test_vrrp_rest_driver.py +17 -0
  56. octavia/tests/unit/api/common/test_pagination.py +78 -1
  57. octavia/tests/unit/api/v2/types/test_pool.py +71 -0
  58. octavia/tests/unit/certificates/manager/test_barbican.py +3 -3
  59. octavia/tests/unit/certificates/manager/test_noop.py +53 -0
  60. octavia/tests/unit/cmd/test_prometheus_proxy.py +8 -1
  61. octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +16 -17
  62. octavia/tests/unit/common/test_config.py +35 -0
  63. octavia/tests/unit/common/test_keystone.py +32 -0
  64. octavia/tests/unit/controller/worker/test_task_utils.py +58 -2
  65. octavia/tests/unit/controller/worker/v2/flows/test_amphora_flows.py +28 -5
  66. octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +10 -5
  67. octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +234 -17
  68. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +28 -6
  69. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +19 -19
  70. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +57 -2
  71. octavia/tests/unit/controller/worker/v2/test_controller_worker.py +56 -1
  72. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +24 -1
  73. {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/AUTHORS +8 -0
  74. octavia-13.0.1.dist-info/METADATA +155 -0
  75. {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/RECORD +90 -88
  76. {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/WHEEL +1 -1
  77. {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/entry_points.txt +1 -1
  78. octavia-13.0.1.dist-info/pbr.json +1 -0
  79. octavia-13.0.0.dist-info/METADATA +0 -158
  80. octavia-13.0.0.dist-info/pbr.json +0 -1
  81. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/LICENSE +0 -0
  82. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/README.rst +0 -0
  83. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
  84. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
  85. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  86. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
  87. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  88. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
  89. {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  90. {octavia-13.0.0.data → octavia-13.0.1.data}/scripts/octavia-wsgi +0 -0
  91. {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/LICENSE +0 -0
  92. {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/top_level.txt +0 -0
@@ -134,7 +134,7 @@ class TestDatabaseTasksQuota(base.TestCase):
134
134
  task.revert(test_object, None)
135
135
 
136
136
  mock_check_quota_met.assert_called_once_with(
137
- mock_session, mock_session, data_model,
137
+ mock_session, data_model,
138
138
  project_id)
139
139
 
140
140
  mock_session.commit.assert_called_once_with()
@@ -238,13 +238,13 @@ class TestDatabaseTasksQuota(base.TestCase):
238
238
 
239
239
  task.revert(project_id, pool_child_count, None)
240
240
 
241
- calls = [mock.call(mock_session, mock_session,
241
+ calls = [mock.call(mock_session,
242
242
  data_models.Pool, project_id),
243
- mock.call(mock_session, mock_session,
243
+ mock.call(mock_session,
244
244
  data_models.HealthMonitor, project_id),
245
- mock.call(mock_session, mock_session,
245
+ mock.call(mock_session,
246
246
  data_models.Member, project_id),
247
- mock.call(mock_session, mock_session,
247
+ mock.call(mock_session,
248
248
  data_models.Member, project_id)]
249
249
 
250
250
  mock_check_quota_met.assert_has_calls(calls)
@@ -261,13 +261,13 @@ class TestDatabaseTasksQuota(base.TestCase):
261
261
 
262
262
  task.revert(project_id, pool_child_count, None)
263
263
 
264
- calls = [mock.call(mock_session, mock_session,
264
+ calls = [mock.call(mock_session,
265
265
  data_models.Pool, project_id),
266
- mock.call(mock_session, mock_session,
266
+ mock.call(mock_session,
267
267
  data_models.HealthMonitor, project_id),
268
- mock.call(mock_session, mock_session,
268
+ mock.call(mock_session,
269
269
  data_models.Member, project_id),
270
- mock.call(mock_session, mock_session,
270
+ mock.call(mock_session,
271
271
  data_models.Member, project_id)]
272
272
 
273
273
  mock_check_quota_met.assert_has_calls(calls)
@@ -285,13 +285,13 @@ class TestDatabaseTasksQuota(base.TestCase):
285
285
 
286
286
  task.revert(project_id, pool_child_count, None)
287
287
 
288
- calls = [mock.call(mock_session, mock_session,
288
+ calls = [mock.call(mock_session,
289
289
  data_models.Pool, project_id),
290
- mock.call(mock_session, mock_session,
290
+ mock.call(mock_session,
291
291
  data_models.HealthMonitor, project_id),
292
- mock.call(mock_session, mock_session,
292
+ mock.call(mock_session,
293
293
  data_models.Member, project_id),
294
- mock.call(mock_session, mock_session,
294
+ mock.call(mock_session,
295
295
  data_models.Member, project_id)]
296
296
 
297
297
  mock_check_quota_met.assert_has_calls(calls)
@@ -370,11 +370,11 @@ class TestDatabaseTasksQuota(base.TestCase):
370
370
 
371
371
  task.revert(test_object, None)
372
372
 
373
- calls = [mock.call(mock_session, mock_session,
373
+ calls = [mock.call(mock_session,
374
374
  data_models.L7Policy, project_id),
375
- mock.call(mock_session, mock_session,
375
+ mock.call(mock_session,
376
376
  data_models.L7Rule, project_id),
377
- mock.call(mock_session, mock_session,
377
+ mock.call(mock_session,
378
378
  data_models.L7Rule, project_id)]
379
379
 
380
380
  mock_check_quota_met.assert_has_calls(calls)
@@ -391,11 +391,11 @@ class TestDatabaseTasksQuota(base.TestCase):
391
391
 
392
392
  task.revert(test_object, None)
393
393
 
394
- calls = [mock.call(mock_session, mock_session,
394
+ calls = [mock.call(mock_session,
395
395
  data_models.L7Policy, project_id),
396
- mock.call(mock_session, mock_session,
396
+ mock.call(mock_session,
397
397
  data_models.L7Rule, project_id),
398
- mock.call(mock_session, mock_session,
398
+ mock.call(mock_session,
399
399
  data_models.L7Rule, project_id)]
400
400
 
401
401
  mock_check_quota_met.assert_has_calls(calls)
@@ -1568,6 +1568,57 @@ class TestNetworkTasks(base.TestCase):
1568
1568
  mock_driver.unplug_aap_port.assert_called_once_with(
1569
1569
  LB.vip, self.db_amphora_mock, mockSubnet)
1570
1570
 
1571
+ @mock.patch('octavia.db.repositories.AmphoraRepository.get')
1572
+ @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
1573
+ @mock.patch('octavia.db.api.get_session', return_value=_session_mock)
1574
+ def test_revert_plug_vip_amphora_subnet_not_found(
1575
+ self, mock_session, mock_lb_get, mock_get, mock_get_net_driver):
1576
+ mock_driver = mock.MagicMock()
1577
+ mock_lb_get.return_value = LB
1578
+ mock_get.return_value = self.db_amphora_mock
1579
+ mock_get_net_driver.return_value = mock_driver
1580
+ net = network_tasks.PlugVIPAmphora()
1581
+ amphora = {constants.ID: AMPHORA_ID,
1582
+ constants.LB_NETWORK_IP: IP_ADDRESS}
1583
+ subnet = {constants.ID: SUBNET_ID}
1584
+ err_msg = 'Subnet not found'
1585
+ mock_driver.get_subnet.side_effect = net_base.SubnetNotFound(err_msg)
1586
+ result = AMPS_DATA[0].to_dict()
1587
+ net.revert(result, self.load_balancer_mock, amphora, subnet)
1588
+ mock_driver.unplug_aap_port.assert_not_called()
1589
+ network_tasks.LOG.error.assert_called_once_with(
1590
+ 'Failed to unplug AAP port for load balancer: %s. '
1591
+ 'Resources may still be in use for VRRP port: %s. '
1592
+ 'Due to error: %s',
1593
+ self.load_balancer_mock[constants.LOADBALANCER_ID],
1594
+ result[constants.VRRP_PORT_ID], err_msg
1595
+ )
1596
+
1597
+ @mock.patch('octavia.db.repositories.AmphoraRepository.get')
1598
+ @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
1599
+ @mock.patch('octavia.db.api.get_session', return_value=_session_mock)
1600
+ def test_revert_plug_vip_amphora_raise_db_error(
1601
+ self, mock_session, mock_lb_get, mock_get, mock_get_net_driver):
1602
+ mock_driver = mock.MagicMock()
1603
+ mock_lb_get.return_value = LB
1604
+ err_msg = 'Some Error'
1605
+ mock_get.side_effect = Exception(err_msg)
1606
+ net = network_tasks.PlugVIPAmphora()
1607
+ amphora = {constants.ID: AMPHORA_ID,
1608
+ constants.LB_NETWORK_IP: IP_ADDRESS}
1609
+ subnet = {constants.ID: SUBNET_ID}
1610
+ result = AMPS_DATA[0].to_dict()
1611
+ net.revert(result, self.load_balancer_mock, amphora, subnet)
1612
+ mock_driver.unplug_aap_port.assert_not_called()
1613
+ mock_lb_get.assert_not_called()
1614
+ network_tasks.LOG.error.assert_called_once_with(
1615
+ 'Failed to unplug AAP port for load balancer: %s. '
1616
+ 'Resources may still be in use for VRRP port: %s. '
1617
+ 'Due to error: %s',
1618
+ self.load_balancer_mock[constants.LOADBALANCER_ID],
1619
+ result[constants.VRRP_PORT_ID], err_msg
1620
+ )
1621
+
1571
1622
  @mock.patch('octavia.controller.worker.v2.tasks.network_tasks.DeletePort.'
1572
1623
  'update_progress')
1573
1624
  def test_delete_port(self, mock_update_progress, mock_get_net_driver):
@@ -1712,7 +1763,11 @@ class TestNetworkTasks(base.TestCase):
1712
1763
  # Test revert
1713
1764
  mock_driver.reset_mock()
1714
1765
 
1715
- net_task.revert([port_mock], vip_dict, VIP_SG_ID, AMP_ID,
1766
+ # The execute path generates a port dict, so this will be the result
1767
+ # passed into the revert method by Taskflow
1768
+ port_dict = {constants.ID: PORT_ID}
1769
+
1770
+ net_task.revert(port_dict, vip_dict, VIP_SG_ID, AMP_ID,
1716
1771
  additional_vips)
1717
1772
 
1718
1773
  mock_driver.delete_port.assert_called_once_with(PORT_ID)
@@ -1720,7 +1775,7 @@ class TestNetworkTasks(base.TestCase):
1720
1775
  # Test revert exception
1721
1776
  mock_driver.reset_mock()
1722
1777
 
1723
- net_task.revert([port_mock], vip_dict, VIP_SG_ID, AMP_ID,
1778
+ net_task.revert(port_dict, vip_dict, VIP_SG_ID, AMP_ID,
1724
1779
  additional_vips)
1725
1780
 
1726
1781
  mock_driver.delete_port.assert_called_once_with(PORT_ID)
@@ -27,7 +27,7 @@ from octavia.controller.worker.v2 import controller_worker
27
27
  from octavia.controller.worker.v2.flows import flow_utils
28
28
  import octavia.tests.unit.base as base
29
29
 
30
-
30
+ TLS_CERT_ID = uuidutils.generate_uuid()
31
31
  AMP_ID = uuidutils.generate_uuid()
32
32
  LB_ID = uuidutils.generate_uuid()
33
33
  LISTENER_ID = uuidutils.generate_uuid()
@@ -771,6 +771,61 @@ class TestControllerWorker(base.TestCase):
771
771
  })
772
772
  )
773
773
 
774
+ @mock.patch(
775
+ "octavia.common.tls_utils.cert_parser.load_certificates_data",
776
+ side_effect=RuntimeError
777
+ )
778
+ def test_delete_load_balancer_with_cascade_tls_unavailable(
779
+ self,
780
+ mock_load_tls_cert,
781
+ mock_api_get_session,
782
+ mock_dyn_log_listener,
783
+ mock_taskflow_load,
784
+ mock_pool_repo_get,
785
+ mock_member_repo_get,
786
+ mock_l7rule_repo_get,
787
+ mock_l7policy_repo_get,
788
+ mock_listener_repo_get,
789
+ mock_lb_repo_get,
790
+ mock_health_mon_repo_get,
791
+ mock_amp_repo_get
792
+ ):
793
+ _flow_mock.reset_mock()
794
+
795
+ _listener_mock.tls_certificate_id = TLS_CERT_ID
796
+ _listener_mock.to_dict.return_value[
797
+ constants.TLS_CERTIFICATE_ID] = TLS_CERT_ID
798
+
799
+ cw = controller_worker.ControllerWorker()
800
+ cw.delete_load_balancer(_load_balancer_mock, cascade=True)
801
+
802
+ mock_lb_repo_get.assert_called_once_with(
803
+ _db_session,
804
+ id=LB_ID)
805
+
806
+ # Check load_certificates_data called and error is raised
807
+ # Error must be ignored because it is not critical for current flow
808
+ mock_load_tls_cert.assert_called_once()
809
+
810
+ listener_list = [{constants.LISTENER_ID: LISTENER_ID,
811
+ constants.LOADBALANCER_ID: LB_ID,
812
+ constants.PROJECT_ID: PROJECT_ID,
813
+ "default_tls_container_ref": TLS_CERT_ID}]
814
+
815
+ (cw.services_controller.run_poster.
816
+ assert_called_once_with(
817
+ flow_utils.get_cascade_delete_load_balancer_flow,
818
+ _load_balancer_mock, listener_list, [],
819
+ store={constants.LOADBALANCER: _load_balancer_mock,
820
+ constants.LOADBALANCER_ID: LB_ID,
821
+ constants.SERVER_GROUP_ID:
822
+ _db_load_balancer_mock.server_group_id,
823
+ constants.PROJECT_ID: _db_load_balancer_mock.project_id,
824
+ })
825
+ )
826
+
827
+ _listener_mock.reset_mock()
828
+
774
829
  @mock.patch('octavia.db.repositories.ListenerRepository.get_all',
775
830
  return_value=([_listener_mock], None))
776
831
  def test_update_load_balancer(self,
@@ -122,6 +122,28 @@ class TestAllowedAddressPairsDriver(base.TestCase):
122
122
  delete_port.assert_has_calls(calls, any_order=True)
123
123
  delete_sec_grp.assert_called_once_with(sec_grp_id)
124
124
 
125
+ def test_deallocate_vip_no_vrrp_port(self):
126
+ lb = dmh.generate_load_balancer_tree()
127
+ lb.vip.load_balancer = lb
128
+ # amphora 0 doesn't have a vrrp_port_id
129
+ lb.amphorae[0].vrrp_port_id = None
130
+ vip = lb.vip
131
+ sec_grp_id = 'lb-sec-grp1'
132
+ show_port = self.driver.network_proxy.get_port
133
+ show_port.return_value = Port(
134
+ device_owner=allowed_address_pairs.OCTAVIA_OWNER)
135
+ delete_port = self.driver.network_proxy.delete_port
136
+ delete_sec_grp = self.driver.network_proxy.delete_security_group
137
+ list_security_groups = self.driver.network_proxy.find_security_group
138
+ list_security_groups.return_value = SecurityGroup(id=sec_grp_id)
139
+ self.driver.deallocate_vip(vip)
140
+ # not called for lb.amphorae[0]
141
+ calls = [mock.call(vip.port_id),
142
+ mock.call(lb.amphorae[1].vrrp_port_id)]
143
+ delete_port.assert_has_calls(calls, any_order=True)
144
+ self.assertEqual(2, delete_port.call_count)
145
+ delete_sec_grp.assert_called_once_with(sec_grp_id)
146
+
125
147
  def test_deallocate_vip_no_port(self):
126
148
  lb = dmh.generate_load_balancer_tree()
127
149
  lb.vip.load_balancer = lb
@@ -1076,7 +1098,8 @@ class TestAllowedAddressPairsDriver(base.TestCase):
1076
1098
  fake_rules = [
1077
1099
  {'id': 'rule-80', 'port_range_max': 80, 'protocol': 'tcp',
1078
1100
  'remote_ip_prefix': '10.0.101.0/24'},
1079
- {'id': 'rule-22', 'port_range_max': 22, 'protocol': 'tcp'}
1101
+ {'id': 'rule-22', 'port_range_max': 22, 'protocol': 'tcp'},
1102
+ {'id': 'rule-None', 'port_range_max': 22},
1080
1103
  ]
1081
1104
  list_rules = self.driver.network_proxy.security_group_rules
1082
1105
  list_rules.return_value = fake_rules
@@ -69,6 +69,7 @@ Elena Ezhova <eezhova@mirantis.com>
69
69
  EranRaichstein <eranra@il.ibm.com>
70
70
  Erik Olof Gunnar Andersson <eandersson@blizzard.com>
71
71
  Evan Gray <evanscottgray@gmail.com>
72
+ Evgeniy Bykov <chypakabre@gmail.com>
72
73
  Evgeny Fedoruk <evgenyf@radware.com>
73
74
  Fei Long Wang <flwang@catalyst.net.nz>
74
75
  Fernando Royo <froyo@redhat.com>
@@ -101,6 +102,7 @@ Hongbin Lu <hongbin.lu@huawei.com>
101
102
  Ian Wienand <iwienand@redhat.com>
102
103
  Ihar Hrachyshka <ihrachys@redhat.com>
103
104
  Ildar Iskhakov <iiskhako@cisco.com>
105
+ Ilia Kerbs <ikerbs@protonmail.com>
104
106
  Itzik Brown <itzikb@redhat.com>
105
107
  Jacky Hu <hudayou@hotmail.com>
106
108
  James Arendt <james.arendt@hp.com>
@@ -159,6 +161,7 @@ Nakul Dahiwade <nakul.dahiwade@intel.com>
159
161
  Nam Nguyen Hoai <namnh@vn.fujitsu.com>
160
162
  Ngo Quoc Cuong <cuongnq@vn.fujitsu.com>
161
163
  Nguyen Hai <nguyentrihai93@gmail.com>
164
+ Nguyen Ngoc Hieu <hieunn23@fpt.com>
162
165
  Nguyen Van Trung <trungnv@vn.fujitsu.com>
163
166
  Nir Magnezi <nmagnezi@redhat.com>
164
167
  Noboru Iwamatsu <n_iwamatsu@jp.fujitsu.com>
@@ -185,6 +188,8 @@ Santhosh Fernandes <santhosh.fernandes@gmail.com>
185
188
  Sean McGinnis <sean.mcginnis@gmail.com>
186
189
  Selvakumar S <selvakumar.s2@hp.com>
187
190
  Sergey Belous <sbelous@mirantis.com>
191
+ Sergey Kraynev <sergejyit@gmail.com>
192
+ Seunghun Lee <seunghun@stackhpc.com>
188
193
  ShangXiao <shangxiaobj@inspur.com>
189
194
  Shashank Kumar Shankar <shashank.kumar.shankar@intel.com>
190
195
  Sherif Abdelwahab <sherif.abdelwahab@hp.com>
@@ -198,6 +203,7 @@ Stephen Balukoff <stephen@balukoff.com>
198
203
  Stephen Finucane <stephenfin@redhat.com>
199
204
  Susanne Balle <sleipnir012@gmail.com>
200
205
  Sven Wegener <sven.wegener@inovex.de>
206
+ Takashi Kajinami <kajinamit@oss.nttdata.com>
201
207
  Takashi Kajinami <tkajinam@redhat.com>
202
208
  Takashi Natsume <takanattie@gmail.com>
203
209
  Tatsuma Matsuki <matsuki.tatsuma@jp.fujitsu.com>
@@ -214,6 +220,7 @@ Tuan Do Anh <tuanda@vn.fujitsu.com>
214
220
  Vadim Ponomarev <velizarx@gmail.com>
215
221
  Valeria Perelman <perelman@il.ibm.com>
216
222
  Van Hung Pham <hungpv@vn.fujitsu.com>
223
+ Vasyl Saienko <vsaienko@mirantis.com>
217
224
  Vieri <15050873171@163.com>
218
225
  Vlad Gusev <vlad.esten@gmail.com>
219
226
  Vu Cong Tuan <tuanvc@vn.fujitsu.com>
@@ -276,6 +283,7 @@ ptoohill1 <phillip.toohill@rackspace.com>
276
283
  qinchunhua <qin.chunhua@zte.com.cn>
277
284
  rajat29 <rajat.sharma@nectechnologies.in>
278
285
  ramboman <lijie@unitedstack.com>
286
+ ricolin <rlin@vexxhost.com>
279
287
  root <liusu@chinac.com>
280
288
  root <sandyada@redhat.com>
281
289
  sapd <saphi070@gmail.com>
@@ -0,0 +1,155 @@
1
+ Metadata-Version: 2.1
2
+ Name: octavia
3
+ Version: 13.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.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Requires-Python: >=3.8
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 >=4.4.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: simplejson >=3.13.2
65
+ Requires-Dist: setproctitle >=1.1.10
66
+ Requires-Dist: python-dateutil >=2.7.0
67
+ Requires-Dist: Flask !=0.11,>=0.10
68
+ Requires-Dist: cryptography >=3.0
69
+ Requires-Dist: gunicorn >=19.9.0
70
+ Requires-Dist: Werkzeug >=0.14.1
71
+ Requires-Dist: pyroute2 >=0.5.14 ; (sys_platform!='win32')
72
+ Provides-Extra: redis
73
+ Requires-Dist: redis >=2.10.0 ; extra == 'redis'
74
+ Provides-Extra: test
75
+ Requires-Dist: hacking <6.1.0 ; extra == 'test'
76
+ Requires-Dist: requests-mock >=1.2.0 ; extra == 'test'
77
+ Requires-Dist: coverage !=4.4,>=4.0 ; extra == 'test'
78
+ Requires-Dist: fixtures >=3.0.0 ; extra == 'test'
79
+ Requires-Dist: flake8-import-order ==0.12 ; extra == 'test'
80
+ Requires-Dist: python-subunit >=1.0.0 ; extra == 'test'
81
+ Requires-Dist: oslotest >=3.2.0 ; extra == 'test'
82
+ Requires-Dist: pylint <=3.0.4,>=2.5.3 ; extra == 'test'
83
+ Requires-Dist: testrepository >=0.0.18 ; extra == 'test'
84
+ Requires-Dist: testtools >=2.2.0 ; extra == 'test'
85
+ Requires-Dist: testresources >=2.0.0 ; extra == 'test'
86
+ Requires-Dist: testscenarios >=0.4 ; extra == 'test'
87
+ Requires-Dist: doc8 >=0.6.0 ; extra == 'test'
88
+ Requires-Dist: bandit !=1.6.0,>=1.1.0 ; extra == 'test'
89
+ Requires-Dist: tempest >=23.0.0 ; extra == 'test'
90
+ Requires-Dist: sphinx !=2.1.0,>=2.0.0 ; extra == 'test'
91
+ Requires-Dist: bashate >=0.5.1 ; extra == 'test'
92
+ Requires-Dist: WebTest >=2.0.26 ; extra == 'test'
93
+ Provides-Extra: zookeeper
94
+ Requires-Dist: kazoo >=2.6.0 ; extra == 'zookeeper'
95
+ Requires-Dist: zake >=0.1.6 ; extra == 'zookeeper'
96
+
97
+ ========================
98
+ Team and repository tags
99
+ ========================
100
+
101
+ .. image:: https://governance.openstack.org/tc/badges/octavia.svg
102
+ :target: https://governance.openstack.org/tc/reference/tags/index.html
103
+
104
+ .. Change things from this point on
105
+
106
+ =======
107
+ Octavia
108
+ =======
109
+
110
+ .. image:: https://img.shields.io/pypi/v/octavia.svg
111
+ :target: https://pypi.org/project/octavia/
112
+ :alt: Latest Version
113
+
114
+ Octavia is an operator-grade open source scalable load balancer for use in
115
+ large OpenStack deployments.
116
+
117
+ Octavia provides the load balancing API for OpenStack. It supports multiple
118
+ "provider drivers" that implement load balancing, including the "amphora"
119
+ reference driver included with Octavia.
120
+
121
+ Octavia is distributed under the terms of the Apache License, Version 2.0.
122
+ The full terms and conditions of this license are detailed in the LICENSE
123
+ file.
124
+
125
+ Project resources
126
+ ~~~~~~~~~~~~~~~~~
127
+
128
+ Developer documentation for the Octavia project is available at
129
+ https://docs.openstack.org/octavia/latest/
130
+
131
+ Release notes for the Octavia project are available at
132
+ https://docs.openstack.org/releasenotes/octavia/
133
+
134
+ The project source code repository is located at
135
+ https://opendev.org/openstack/octavia
136
+
137
+ Project status, bugs, and requests for feature enhancements are tracked on
138
+ https://launchpad.net/octavia
139
+
140
+ For more information on project direction and guiding principles for
141
+ contributors, please see the CONSTITUTION.rst file in this directory, or
142
+ specifications in the specs/ sub-directory.
143
+
144
+ The project roadmap is available at
145
+ https://wiki.openstack.org/wiki/Octavia/Roadmap
146
+
147
+ External Resources
148
+ ~~~~~~~~~~~~~~~~~~
149
+
150
+ * Octavia Wiki: https://wiki.openstack.org/wiki/Octavia
151
+
152
+ * For help on usage and hacking of Octavia, please send an email to
153
+ OpenStack-dev Mailing List <mailto:openstack-discuss@lists.openstack.org>
154
+ with **[Octavia]** tag.
155
+