octavia 13.0.0.0rc1__py3-none-any.whl → 14.0.0__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 (135) hide show
  1. octavia/amphorae/backends/agent/api_server/lvs_listener_base.py +1 -1
  2. octavia/amphorae/backends/agent/api_server/osutils.py +5 -5
  3. octavia/amphorae/backends/agent/api_server/plug.py +3 -2
  4. octavia/amphorae/backends/agent/api_server/rules_schema.py +52 -0
  5. octavia/amphorae/backends/agent/api_server/server.py +28 -1
  6. octavia/amphorae/backends/utils/interface.py +45 -6
  7. octavia/amphorae/backends/utils/interface_file.py +9 -6
  8. octavia/amphorae/backends/utils/nftable_utils.py +125 -0
  9. octavia/amphorae/drivers/driver_base.py +27 -0
  10. octavia/amphorae/drivers/haproxy/rest_api_driver.py +42 -10
  11. octavia/amphorae/drivers/health/heartbeat_udp.py +2 -2
  12. octavia/amphorae/drivers/keepalived/vrrp_rest_driver.py +2 -1
  13. octavia/amphorae/drivers/noop_driver/driver.py +25 -0
  14. octavia/api/app.py +3 -0
  15. octavia/api/common/pagination.py +2 -2
  16. octavia/api/drivers/amphora_driver/flavor_schema.py +6 -1
  17. octavia/api/root_controller.py +4 -1
  18. octavia/api/v2/controllers/health_monitor.py +0 -1
  19. octavia/api/v2/controllers/l7policy.py +0 -1
  20. octavia/api/v2/controllers/l7rule.py +0 -1
  21. octavia/api/v2/controllers/listener.py +0 -1
  22. octavia/api/v2/controllers/load_balancer.py +13 -7
  23. octavia/api/v2/controllers/member.py +6 -3
  24. octavia/api/v2/controllers/pool.py +6 -7
  25. octavia/api/v2/types/load_balancer.py +5 -1
  26. octavia/api/v2/types/pool.py +1 -1
  27. octavia/certificates/common/pkcs12.py +9 -9
  28. octavia/certificates/manager/barbican.py +24 -16
  29. octavia/certificates/manager/castellan_mgr.py +12 -7
  30. octavia/certificates/manager/local.py +4 -4
  31. octavia/certificates/manager/noop.py +106 -0
  32. octavia/cmd/driver_agent.py +1 -1
  33. octavia/cmd/health_checker.py +0 -4
  34. octavia/cmd/health_manager.py +1 -5
  35. octavia/cmd/house_keeping.py +1 -1
  36. octavia/cmd/interface.py +0 -4
  37. octavia/cmd/octavia_worker.py +0 -4
  38. octavia/cmd/prometheus_proxy.py +0 -5
  39. octavia/cmd/status.py +0 -6
  40. octavia/common/base_taskflow.py +1 -1
  41. octavia/common/clients.py +15 -3
  42. octavia/common/config.py +24 -6
  43. octavia/common/constants.py +34 -0
  44. octavia/common/data_models.py +3 -1
  45. octavia/common/exceptions.py +11 -0
  46. octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +7 -5
  47. octavia/common/keystone.py +7 -7
  48. octavia/common/tls_utils/cert_parser.py +24 -10
  49. octavia/common/utils.py +6 -0
  50. octavia/common/validate.py +2 -2
  51. octavia/compute/drivers/nova_driver.py +23 -5
  52. octavia/controller/worker/task_utils.py +28 -6
  53. octavia/controller/worker/v2/controller_worker.py +49 -15
  54. octavia/controller/worker/v2/flows/amphora_flows.py +120 -21
  55. octavia/controller/worker/v2/flows/flow_utils.py +15 -13
  56. octavia/controller/worker/v2/flows/listener_flows.py +95 -5
  57. octavia/controller/worker/v2/flows/load_balancer_flows.py +74 -30
  58. octavia/controller/worker/v2/taskflow_jobboard_driver.py +17 -1
  59. octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +145 -24
  60. octavia/controller/worker/v2/tasks/compute_tasks.py +1 -1
  61. octavia/controller/worker/v2/tasks/database_tasks.py +72 -41
  62. octavia/controller/worker/v2/tasks/lifecycle_tasks.py +97 -41
  63. octavia/controller/worker/v2/tasks/network_tasks.py +57 -60
  64. octavia/controller/worker/v2/tasks/shim_tasks.py +28 -0
  65. octavia/db/migration/alembic_migrations/versions/55874a4ceed6_add_l7policy_action_redirect_prefix.py +1 -1
  66. octavia/db/migration/alembic_migrations/versions/5a3ee5472c31_add_cert_expiration__infor_in_amphora_table.py +1 -1
  67. octavia/db/migration/alembic_migrations/versions/6742ca1b27c2_add_l7policy_redirect_http_code.py +1 -1
  68. octavia/db/migration/alembic_migrations/versions/db2a73e82626_add_vnic_type_for_vip.py +36 -0
  69. octavia/db/models.py +1 -0
  70. octavia/db/prepare.py +1 -1
  71. octavia/db/repositories.py +53 -34
  72. octavia/distributor/drivers/driver_base.py +1 -1
  73. octavia/network/base.py +3 -16
  74. octavia/network/data_models.py +4 -1
  75. octavia/network/drivers/neutron/allowed_address_pairs.py +27 -26
  76. octavia/network/drivers/noop_driver/driver.py +10 -23
  77. octavia/tests/common/sample_certs.py +115 -0
  78. octavia/tests/common/sample_haproxy_prometheus +1 -1
  79. octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +37 -0
  80. octavia/tests/functional/api/test_healthcheck.py +2 -2
  81. octavia/tests/functional/api/v2/base.py +1 -1
  82. octavia/tests/functional/api/v2/test_listener.py +45 -0
  83. octavia/tests/functional/api/v2/test_load_balancer.py +17 -0
  84. octavia/tests/functional/db/base.py +9 -0
  85. octavia/tests/functional/db/test_models.py +2 -1
  86. octavia/tests/functional/db/test_repositories.py +55 -99
  87. octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +4 -2
  88. octavia/tests/unit/amphorae/backends/utils/test_interface.py +201 -1
  89. octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +1 -1
  90. octavia/tests/unit/amphorae/backends/utils/test_nftable_utils.py +194 -0
  91. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver.py +27 -5
  92. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +15 -2
  93. octavia/tests/unit/amphorae/drivers/keepalived/test_vrrp_rest_driver.py +17 -0
  94. octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +2 -1
  95. octavia/tests/unit/api/v2/types/test_pool.py +71 -0
  96. octavia/tests/unit/certificates/manager/test_barbican.py +3 -3
  97. octavia/tests/unit/certificates/manager/test_noop.py +53 -0
  98. octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +16 -17
  99. octavia/tests/unit/common/sample_configs/sample_configs_combined.py +5 -3
  100. octavia/tests/unit/common/test_config.py +35 -0
  101. octavia/tests/unit/common/test_keystone.py +32 -0
  102. octavia/tests/unit/common/test_utils.py +39 -0
  103. octavia/tests/unit/compute/drivers/test_nova_driver.py +22 -0
  104. octavia/tests/unit/controller/worker/test_task_utils.py +58 -2
  105. octavia/tests/unit/controller/worker/v2/flows/test_amphora_flows.py +28 -5
  106. octavia/tests/unit/controller/worker/v2/flows/test_listener_flows.py +64 -16
  107. octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +49 -9
  108. octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +265 -17
  109. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +101 -1
  110. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +19 -19
  111. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +105 -42
  112. octavia/tests/unit/controller/worker/v2/tasks/test_shim_tasks.py +33 -0
  113. octavia/tests/unit/controller/worker/v2/test_controller_worker.py +85 -42
  114. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +48 -51
  115. octavia/tests/unit/network/drivers/neutron/test_utils.py +2 -0
  116. octavia/tests/unit/network/drivers/noop_driver/test_driver.py +0 -7
  117. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/README.rst +6 -1
  118. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/diskimage-create.sh +10 -4
  119. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/requirements.txt +0 -2
  120. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/tox.ini +30 -13
  121. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/AUTHORS +5 -0
  122. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/METADATA +6 -6
  123. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/RECORD +134 -126
  124. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/entry_points.txt +1 -1
  125. octavia-14.0.0.dist-info/pbr.json +1 -0
  126. octavia-13.0.0.0rc1.dist-info/pbr.json +0 -1
  127. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/LICENSE +0 -0
  128. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/README.rst +0 -0
  129. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  130. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  131. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  132. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/scripts/octavia-wsgi +0 -0
  133. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/LICENSE +0 -0
  134. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/WHEEL +0 -0
  135. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/top_level.txt +0 -0
@@ -24,6 +24,7 @@ from oslo_config import fixture as oslo_fixture
24
24
  from oslo_serialization import jsonutils
25
25
  from oslo_utils.secretutils import md5
26
26
  from oslo_utils import uuidutils
27
+ import webob
27
28
 
28
29
  from octavia.amphorae.backends.agent import api_server
29
30
  from octavia.amphorae.backends.agent.api_server import certificate_update
@@ -3055,3 +3056,39 @@ class TestServerTestCase(base.TestCase):
3055
3056
  self.assertEqual(200, rv.status_code)
3056
3057
  self.assertEqual(expected_dict,
3057
3058
  jsonutils.loads(rv.data.decode('utf-8')))
3059
+
3060
+ @mock.patch('octavia.amphorae.backends.utils.nftable_utils.'
3061
+ 'load_nftables_file')
3062
+ @mock.patch('octavia.amphorae.backends.utils.nftable_utils.'
3063
+ 'write_nftable_vip_rules_file')
3064
+ @mock.patch('octavia.amphorae.backends.agent.api_server.amphora_info.'
3065
+ 'AmphoraInfo.get_interface')
3066
+ def test_set_interface_rules(self, mock_get_int, mock_write_rules,
3067
+ mock_load_rules):
3068
+ mock_get_int.side_effect = [
3069
+ webob.Response(status=400),
3070
+ webob.Response(status=200, json={'interface': 'fake1'}),
3071
+ webob.Response(status=200, json={'interface': 'fake1'})]
3072
+
3073
+ # Test can't find interface
3074
+ rv = self.ubuntu_app.put('/' + api_server.VERSION +
3075
+ '/interface/192.0.2.10/rules', data='fake')
3076
+ self.assertEqual(400, rv.status_code)
3077
+ mock_write_rules.assert_not_called()
3078
+
3079
+ # Test schema validation failure
3080
+ rv = self.ubuntu_app.put('/' + api_server.VERSION +
3081
+ '/interface/192.0.2.10/rules', data='fake')
3082
+ self.assertEqual('400 Bad Request', rv.status)
3083
+
3084
+ # Test successful path
3085
+ rules_json = ('[{"protocol":"TCP","cidr":"192.0.2.0/24","port":8080},'
3086
+ '{"protocol":"UDP","cidr":null,"port":80}]')
3087
+ rv = self.ubuntu_app.put('/' + api_server.VERSION +
3088
+ '/interface/192.0.2.10/rules',
3089
+ data=rules_json,
3090
+ content_type='application/json')
3091
+ self.assertEqual('200 OK', rv.status)
3092
+ mock_write_rules.assert_called_once_with('fake1',
3093
+ jsonutils.loads(rules_json))
3094
+ mock_load_rules.assert_called_once()
@@ -111,7 +111,7 @@ class TestHealthCheck(base_db_test.OctaviaDBTestBase):
111
111
  self.assertEqual(200, response.status_code)
112
112
  self.assertEqual('OK', response.text)
113
113
 
114
- # Note: For whatever reason, detailed=True text has no additonal info
114
+ # Note: For whatever reason, detailed=True text has no additional info
115
115
  def test_healthcheck_get_text_detailed(self):
116
116
  self.conf.config(group='healthcheck', detailed=True)
117
117
  response = self._get(self._get_enabled_app(), '/healthcheck')
@@ -275,7 +275,7 @@ class TestHealthCheck(base_db_test.OctaviaDBTestBase):
275
275
  self.assertIn('boom', response.text)
276
276
  self.assertIn('Garbage collector', response.text)
277
277
 
278
- # Note: For whatever reason, detailed=True text has no additonal info
278
+ # Note: For whatever reason, detailed=True text has no additional info
279
279
  @mock.patch('octavia.db.api.get_session')
280
280
  def test_healthcheck_get_text_detailed_failed(self, mock_get_session):
281
281
  self.conf.config(group='healthcheck', detailed=True)
@@ -140,7 +140,7 @@ class BaseAPITest(base_db_test.OctaviaDBTestBase):
140
140
  self.addCleanup(reset_pecan)
141
141
 
142
142
  def start_quota_mock(self, object_type):
143
- def mock_quota(session, lock_session, _class, project_id, count=1):
143
+ def mock_quota(session, _class, project_id, count=1):
144
144
  return _class == object_type
145
145
  check_quota_met_true_mock = mock.patch(
146
146
  'octavia.db.repositories.Repositories.check_quota_met',
@@ -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)
@@ -2829,6 +2829,7 @@ class TestLoadBalancerGraph(base.BaseAPITest):
2829
2829
  'flavor_id': None,
2830
2830
  'provider': 'noop_driver',
2831
2831
  'tags': [],
2832
+ 'vip_vnic_type': constants.VNIC_TYPE_NORMAL,
2832
2833
  }
2833
2834
  expected_lb.update(create_lb)
2834
2835
  expected_lb['listeners'] = expected_listeners
@@ -3194,6 +3195,22 @@ class TestLoadBalancerGraph(base.BaseAPITest):
3194
3195
  self.assertIn('All VIP subnets must belong to the same network.',
3195
3196
  error_text)
3196
3197
 
3198
+ @mock.patch('octavia.api.v2.controllers.load_balancer.'
3199
+ 'LoadBalancersController._apply_flavor_to_lb_dict',
3200
+ return_value={constants.SRIOV_VIP: True})
3201
+ def test_with_vip_vnic_type_direct(self, mock_flavor_dict):
3202
+ create_lb, expected_lb = self._get_lb_bodies(
3203
+ [], [])
3204
+ expected_lb[constants.VIP_VNIC_TYPE] = constants.VNIC_TYPE_DIRECT
3205
+
3206
+ body = self._build_body(create_lb)
3207
+
3208
+ response = self.post(self.LBS_PATH, body)
3209
+ self._assert_graphs_equal(expected_lb, response.json['loadbalancer'])
3210
+
3211
+ api_lb = response.json.get(self.root_tag)
3212
+ self._assert_graphs_equal(expected_lb, api_lb)
3213
+
3197
3214
  def test_with_one_listener(self):
3198
3215
  create_listener, expected_listener = self._get_listener_bodies()
3199
3216
  create_lb, expected_lb = self._get_lb_bodies([create_listener],
@@ -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,
@@ -622,7 +622,8 @@ class VipModelTest(base.OctaviaDBTestBase, ModelTestMixin):
622
622
  self.assertEqual(f"Vip(ip_address=None, "
623
623
  f"load_balancer_id={obj.load_balancer_id!r}, "
624
624
  f"network_id=None, octavia_owned=None, port_id=None, "
625
- f"qos_policy_id=None, subnet_id=None)", str(obj))
625
+ f"qos_policy_id=None, subnet_id=None, "
626
+ f"vnic_type=None)", str(obj))
626
627
 
627
628
  def test_update(self):
628
629
  vip = self.create_vip(self.session, self.load_balancer.id)