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
@@ -1044,6 +1044,51 @@ class TestListener(base.BaseAPITest):
1044
1044
  self.assertEqual(constants.CLIENT_AUTH_NONE,
1045
1045
  listener_api.get('client_authentication'))
1046
1046
 
1047
+ def test_create_tls_with_no_subject_no_alt_names(self):
1048
+ tls_cert_mock = mock.MagicMock()
1049
+ tls_cert_mock.get_certificate.return_value = (
1050
+ sample_certs.NOCN_NOSUBALT_CRT)
1051
+ self.cert_manager_mock().get_cert.return_value = tls_cert_mock
1052
+
1053
+ lb_listener = {'name': 'listener1-no-subject-no-alt-names',
1054
+ 'default_pool_id': None,
1055
+ 'description': 'desc1',
1056
+ 'admin_state_up': False,
1057
+ 'protocol': constants.PROTOCOL_TERMINATED_HTTPS,
1058
+ 'protocol_port': 80, 'connection_limit': 10,
1059
+ 'default_tls_container_ref': uuidutils.generate_uuid(),
1060
+ 'insert_headers': {},
1061
+ 'project_id': self.project_id,
1062
+ 'loadbalancer_id': self.lb_id,
1063
+ 'tags': ['test_tag']}
1064
+ body = self._build_body(lb_listener)
1065
+ response = self.post(self.LISTENERS_PATH, body, status=400)
1066
+ self.assertIn("No CN or DNSName", response)
1067
+
1068
+ def test_create_tls_with_no_subject_with_alt_names(self):
1069
+ tls_cert_mock = mock.MagicMock()
1070
+ tls_cert_mock.get_certificate.return_value = (
1071
+ sample_certs.NOCN_SUBALT_CRT)
1072
+ tls_cert_mock.get_private_key.return_value = (
1073
+ sample_certs.NOCN_SUBALT_KEY)
1074
+ tls_cert_mock.get_private_key_passphrase.return_value = None
1075
+ self.cert_manager_mock().get_cert.return_value = tls_cert_mock
1076
+
1077
+ lb_listener = {'name': 'listener1-no-subject',
1078
+ 'default_pool_id': None,
1079
+ 'description': 'desc1',
1080
+ 'admin_state_up': False,
1081
+ 'protocol': constants.PROTOCOL_TERMINATED_HTTPS,
1082
+ 'protocol_port': 80, 'connection_limit': 10,
1083
+ 'default_tls_container_ref': uuidutils.generate_uuid(),
1084
+ 'insert_headers': {},
1085
+ 'project_id': self.project_id,
1086
+ 'loadbalancer_id': self.lb_id,
1087
+ 'tags': ['test_tag']}
1088
+ body = self._build_body(lb_listener)
1089
+ response = self.post(self.LISTENERS_PATH, body, status=201)
1090
+ self.assertIn("PENDING_CREATE", response)
1091
+
1047
1092
  def test_create_with_ca_cert_and_option(self):
1048
1093
  self.cert_manager_mock().get_secret.return_value = (
1049
1094
  sample_certs.X509_CA_CERT)
@@ -913,6 +913,38 @@ class TestMember(base.BaseAPITest):
913
913
  m_subnet_exists.assert_called_once_with(
914
914
  member1['subnet_id'], context=mock.ANY)
915
915
 
916
+ @mock.patch('octavia.api.drivers.driver_factory.get_driver')
917
+ @mock.patch('octavia.api.drivers.utils.call_provider')
918
+ def test_update_members_member_duplicate(
919
+ self, mock_provider, mock_get_driver):
920
+ mock_driver = mock.MagicMock()
921
+ mock_driver.name = 'noop_driver'
922
+ mock_get_driver.return_value = mock_driver
923
+ subnet_id = uuidutils.generate_uuid()
924
+
925
+ member1 = {'address': '192.0.2.1', 'protocol_port': 80,
926
+ 'project_id': self.project_id, 'subnet_id': subnet_id}
927
+
928
+ req_dict = [member1]
929
+ body = {self.root_tag_list: req_dict}
930
+ path = self.MEMBERS_PATH.format(pool_id=self.pool_id)
931
+ self.put(path, body, status=202)
932
+
933
+ self.set_lb_status(self.lb_id)
934
+
935
+ # Same member (same address and protocol_port) updated twice in the
936
+ # same PUT request
937
+ member1 = {'address': '192.0.2.1', 'protocol_port': 80,
938
+ 'project_id': self.project_id, 'subnet_id': subnet_id,
939
+ 'name': 'member1'}
940
+ member2 = {'address': '192.0.2.1', 'protocol_port': 80,
941
+ 'project_id': self.project_id, 'subnet_id': subnet_id,
942
+ 'name': 'member2'}
943
+
944
+ req_dict = [member1, member2]
945
+ body = {self.root_tag_list: req_dict}
946
+ self.put(path, body, status=400)
947
+
916
948
  @mock.patch('octavia.api.drivers.driver_factory.get_driver')
917
949
  @mock.patch('octavia.api.drivers.utils.call_provider')
918
950
  def test_update_members_subnet_not_found(
@@ -30,6 +30,8 @@ from octavia.tests import fixtures as oc_fixtures
30
30
 
31
31
  class OctaviaDBTestBase(test_base.BaseTestCase):
32
32
 
33
+ facade = None
34
+
33
35
  def setUp(self, connection_string='sqlite://'):
34
36
  super().setUp()
35
37
 
@@ -73,11 +75,18 @@ class OctaviaDBTestBase(test_base.BaseTestCase):
73
75
  sqlite_fk=True)
74
76
  engine = facade.get_engine()
75
77
  session = facade.get_session(expire_on_commit=True)
78
+ self.facade = facade
76
79
  else:
77
80
  engine = db_api.get_engine()
78
81
  session = db_api.get_session()
79
82
  return engine, session
80
83
 
84
+ def get_session(self):
85
+ if 'sqlite:///' in self.connection_string:
86
+ return self.facade.get_session(expire_on_commit=True)
87
+ else:
88
+ return db_api.get_session()
89
+
81
90
  def _seed_lookup_tables(self, session):
82
91
  self._seed_lookup_table(
83
92
  session, constants.SUPPORTED_PROVISIONING_STATUSES,