octavia 12.0.0.0rc2__py3-none-any.whl → 13.0.0.0rc1__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 (193) hide show
  1. octavia/amphorae/backends/agent/api_server/osutils.py +1 -0
  2. octavia/amphorae/backends/agent/api_server/plug.py +21 -7
  3. octavia/amphorae/backends/agent/api_server/templates/amphora-netns.systemd.j2 +2 -2
  4. octavia/amphorae/backends/agent/api_server/util.py +21 -0
  5. octavia/amphorae/backends/health_daemon/health_daemon.py +9 -3
  6. octavia/amphorae/backends/health_daemon/health_sender.py +2 -0
  7. octavia/amphorae/backends/utils/interface.py +14 -6
  8. octavia/amphorae/backends/utils/interface_file.py +6 -3
  9. octavia/amphorae/backends/utils/keepalivedlvs_query.py +8 -9
  10. octavia/amphorae/drivers/driver_base.py +1 -2
  11. octavia/amphorae/drivers/haproxy/rest_api_driver.py +11 -25
  12. octavia/amphorae/drivers/health/heartbeat_udp.py +34 -24
  13. octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py +3 -12
  14. octavia/amphorae/drivers/noop_driver/driver.py +3 -5
  15. octavia/api/common/pagination.py +4 -4
  16. octavia/api/drivers/amphora_driver/v2/driver.py +11 -5
  17. octavia/api/drivers/driver_agent/driver_get.py +22 -14
  18. octavia/api/drivers/driver_agent/driver_updater.py +8 -4
  19. octavia/api/drivers/utils.py +4 -2
  20. octavia/api/healthcheck/healthcheck_plugins.py +4 -2
  21. octavia/api/root_controller.py +4 -1
  22. octavia/api/v2/controllers/amphora.py +35 -38
  23. octavia/api/v2/controllers/availability_zone_profiles.py +43 -33
  24. octavia/api/v2/controllers/availability_zones.py +22 -18
  25. octavia/api/v2/controllers/flavor_profiles.py +37 -28
  26. octavia/api/v2/controllers/flavors.py +19 -15
  27. octavia/api/v2/controllers/health_monitor.py +44 -33
  28. octavia/api/v2/controllers/l7policy.py +52 -40
  29. octavia/api/v2/controllers/l7rule.py +68 -55
  30. octavia/api/v2/controllers/listener.py +88 -61
  31. octavia/api/v2/controllers/load_balancer.py +52 -34
  32. octavia/api/v2/controllers/member.py +63 -52
  33. octavia/api/v2/controllers/pool.py +55 -42
  34. octavia/api/v2/controllers/quotas.py +5 -3
  35. octavia/api/v2/types/listener.py +15 -0
  36. octavia/cmd/octavia_worker.py +0 -3
  37. octavia/cmd/status.py +1 -4
  38. octavia/common/clients.py +25 -45
  39. octavia/common/config.py +64 -22
  40. octavia/common/constants.py +3 -2
  41. octavia/common/data_models.py +7 -1
  42. octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py +12 -1
  43. octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +5 -2
  44. octavia/common/jinja/lvs/jinja_cfg.py +4 -2
  45. octavia/common/keystone.py +58 -5
  46. octavia/common/validate.py +35 -0
  47. octavia/compute/drivers/noop_driver/driver.py +6 -0
  48. octavia/controller/healthmanager/health_manager.py +3 -6
  49. octavia/controller/housekeeping/house_keeping.py +36 -37
  50. octavia/controller/worker/amphora_rate_limit.py +5 -4
  51. octavia/controller/worker/task_utils.py +57 -41
  52. octavia/controller/worker/v2/controller_worker.py +160 -103
  53. octavia/controller/worker/v2/flows/listener_flows.py +3 -0
  54. octavia/controller/worker/v2/flows/load_balancer_flows.py +9 -14
  55. octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +152 -91
  56. octavia/controller/worker/v2/tasks/compute_tasks.py +4 -2
  57. octavia/controller/worker/v2/tasks/database_tasks.py +542 -400
  58. octavia/controller/worker/v2/tasks/network_tasks.py +119 -79
  59. octavia/db/api.py +26 -23
  60. octavia/db/base_models.py +2 -2
  61. octavia/db/healthcheck.py +2 -1
  62. octavia/db/migration/alembic_migrations/versions/632152d2d32e_add_http_strict_transport_security_.py +42 -0
  63. octavia/db/models.py +12 -2
  64. octavia/db/prepare.py +2 -0
  65. octavia/db/repositories.py +462 -482
  66. octavia/hacking/checks.py +1 -1
  67. octavia/network/base.py +0 -14
  68. octavia/network/drivers/neutron/allowed_address_pairs.py +92 -135
  69. octavia/network/drivers/neutron/base.py +65 -77
  70. octavia/network/drivers/neutron/utils.py +69 -85
  71. octavia/network/drivers/noop_driver/driver.py +0 -7
  72. octavia/statistics/drivers/update_db.py +10 -10
  73. octavia/tests/common/constants.py +91 -84
  74. octavia/tests/common/sample_data_models.py +13 -1
  75. octavia/tests/fixtures.py +32 -0
  76. octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +9 -10
  77. octavia/tests/functional/api/drivers/driver_agent/test_driver_agent.py +260 -15
  78. octavia/tests/functional/api/test_root_controller.py +3 -28
  79. octavia/tests/functional/api/v2/base.py +5 -3
  80. octavia/tests/functional/api/v2/test_amphora.py +18 -5
  81. octavia/tests/functional/api/v2/test_availability_zone_profiles.py +1 -0
  82. octavia/tests/functional/api/v2/test_listener.py +51 -19
  83. octavia/tests/functional/api/v2/test_load_balancer.py +10 -1
  84. octavia/tests/functional/db/base.py +31 -16
  85. octavia/tests/functional/db/test_models.py +27 -28
  86. octavia/tests/functional/db/test_repositories.py +407 -50
  87. octavia/tests/unit/amphorae/backends/agent/api_server/test_amphora_info.py +2 -0
  88. octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +1 -1
  89. octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py +54 -6
  90. octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +35 -0
  91. octavia/tests/unit/amphorae/backends/health_daemon/test_health_daemon.py +8 -0
  92. octavia/tests/unit/amphorae/backends/health_daemon/test_health_sender.py +18 -0
  93. octavia/tests/unit/amphorae/backends/utils/test_interface.py +81 -0
  94. octavia/tests/unit/amphorae/backends/utils/test_interface_file.py +2 -0
  95. octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +129 -5
  96. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +42 -20
  97. octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py +18 -20
  98. octavia/tests/unit/amphorae/drivers/keepalived/jinja/test_jinja_cfg.py +4 -4
  99. octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +4 -1
  100. octavia/tests/unit/api/drivers/driver_agent/test_driver_get.py +3 -3
  101. octavia/tests/unit/api/drivers/driver_agent/test_driver_updater.py +11 -13
  102. octavia/tests/unit/base.py +6 -0
  103. octavia/tests/unit/cmd/test_interface.py +2 -2
  104. octavia/tests/unit/cmd/test_status.py +2 -2
  105. octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +152 -1
  106. octavia/tests/unit/common/sample_configs/sample_configs_combined.py +10 -3
  107. octavia/tests/unit/common/test_clients.py +0 -39
  108. octavia/tests/unit/common/test_keystone.py +54 -0
  109. octavia/tests/unit/common/test_validate.py +67 -0
  110. octavia/tests/unit/controller/healthmanager/test_health_manager.py +8 -22
  111. octavia/tests/unit/controller/housekeeping/test_house_keeping.py +3 -64
  112. octavia/tests/unit/controller/worker/test_amphora_rate_limit.py +1 -1
  113. octavia/tests/unit/controller/worker/test_task_utils.py +44 -24
  114. octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +0 -1
  115. octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +49 -26
  116. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +399 -196
  117. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +37 -64
  118. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +3 -14
  119. octavia/tests/unit/controller/worker/v2/test_controller_worker.py +2 -2
  120. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +456 -561
  121. octavia/tests/unit/network/drivers/neutron/test_base.py +181 -194
  122. octavia/tests/unit/network/drivers/neutron/test_utils.py +14 -30
  123. octavia/tests/unit/statistics/drivers/test_update_db.py +7 -5
  124. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/README.rst +1 -1
  125. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/AUTHORS +4 -0
  126. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/METADATA +4 -4
  127. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/RECORD +141 -189
  128. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/entry_points.txt +1 -2
  129. octavia-13.0.0.0rc1.dist-info/pbr.json +1 -0
  130. octavia/api/drivers/amphora_driver/v1/__init__.py +0 -11
  131. octavia/api/drivers/amphora_driver/v1/driver.py +0 -547
  132. octavia/controller/queue/v1/__init__.py +0 -11
  133. octavia/controller/queue/v1/consumer.py +0 -64
  134. octavia/controller/queue/v1/endpoints.py +0 -160
  135. octavia/controller/worker/v1/__init__.py +0 -11
  136. octavia/controller/worker/v1/controller_worker.py +0 -1157
  137. octavia/controller/worker/v1/flows/__init__.py +0 -11
  138. octavia/controller/worker/v1/flows/amphora_flows.py +0 -610
  139. octavia/controller/worker/v1/flows/health_monitor_flows.py +0 -105
  140. octavia/controller/worker/v1/flows/l7policy_flows.py +0 -94
  141. octavia/controller/worker/v1/flows/l7rule_flows.py +0 -100
  142. octavia/controller/worker/v1/flows/listener_flows.py +0 -128
  143. octavia/controller/worker/v1/flows/load_balancer_flows.py +0 -692
  144. octavia/controller/worker/v1/flows/member_flows.py +0 -230
  145. octavia/controller/worker/v1/flows/pool_flows.py +0 -127
  146. octavia/controller/worker/v1/tasks/__init__.py +0 -11
  147. octavia/controller/worker/v1/tasks/amphora_driver_tasks.py +0 -453
  148. octavia/controller/worker/v1/tasks/cert_task.py +0 -51
  149. octavia/controller/worker/v1/tasks/compute_tasks.py +0 -335
  150. octavia/controller/worker/v1/tasks/database_tasks.py +0 -2756
  151. octavia/controller/worker/v1/tasks/lifecycle_tasks.py +0 -173
  152. octavia/controller/worker/v1/tasks/model_tasks.py +0 -41
  153. octavia/controller/worker/v1/tasks/network_tasks.py +0 -970
  154. octavia/controller/worker/v1/tasks/retry_tasks.py +0 -74
  155. octavia/tests/unit/api/drivers/amphora_driver/v1/__init__.py +0 -11
  156. octavia/tests/unit/api/drivers/amphora_driver/v1/test_driver.py +0 -824
  157. octavia/tests/unit/controller/queue/v1/__init__.py +0 -11
  158. octavia/tests/unit/controller/queue/v1/test_consumer.py +0 -61
  159. octavia/tests/unit/controller/queue/v1/test_endpoints.py +0 -189
  160. octavia/tests/unit/controller/worker/v1/__init__.py +0 -11
  161. octavia/tests/unit/controller/worker/v1/flows/__init__.py +0 -11
  162. octavia/tests/unit/controller/worker/v1/flows/test_amphora_flows.py +0 -474
  163. octavia/tests/unit/controller/worker/v1/flows/test_health_monitor_flows.py +0 -72
  164. octavia/tests/unit/controller/worker/v1/flows/test_l7policy_flows.py +0 -67
  165. octavia/tests/unit/controller/worker/v1/flows/test_l7rule_flows.py +0 -67
  166. octavia/tests/unit/controller/worker/v1/flows/test_listener_flows.py +0 -91
  167. octavia/tests/unit/controller/worker/v1/flows/test_load_balancer_flows.py +0 -431
  168. octavia/tests/unit/controller/worker/v1/flows/test_member_flows.py +0 -106
  169. octavia/tests/unit/controller/worker/v1/flows/test_pool_flows.py +0 -77
  170. octavia/tests/unit/controller/worker/v1/tasks/__init__.py +0 -11
  171. octavia/tests/unit/controller/worker/v1/tasks/test_amphora_driver_tasks.py +0 -792
  172. octavia/tests/unit/controller/worker/v1/tasks/test_cert_task.py +0 -46
  173. octavia/tests/unit/controller/worker/v1/tasks/test_compute_tasks.py +0 -634
  174. octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks.py +0 -2615
  175. octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks_quota.py +0 -415
  176. octavia/tests/unit/controller/worker/v1/tasks/test_lifecycle_tasks.py +0 -401
  177. octavia/tests/unit/controller/worker/v1/tasks/test_model_tasks.py +0 -44
  178. octavia/tests/unit/controller/worker/v1/tasks/test_network_tasks.py +0 -1788
  179. octavia/tests/unit/controller/worker/v1/tasks/test_retry_tasks.py +0 -47
  180. octavia/tests/unit/controller/worker/v1/test_controller_worker.py +0 -2096
  181. octavia-12.0.0.0rc2.dist-info/pbr.json +0 -1
  182. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/LICENSE +0 -0
  183. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
  184. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
  185. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  186. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
  187. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  188. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
  189. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  190. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/scripts/octavia-wsgi +0 -0
  191. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/LICENSE +0 -0
  192. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/WHEEL +0 -0
  193. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,46 +0,0 @@
1
- # Copyright 2015 Hewlett-Packard Development Company, L.P.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License"); you may
4
- # not use this file except in compliance with the License. You may obtain
5
- # a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
- # License for the specific language governing permissions and limitations
13
- # under the License.
14
- #
15
- from unittest import mock
16
-
17
- from cryptography import fernet
18
- from oslo_config import cfg
19
-
20
- from octavia.certificates.common import local
21
- from octavia.common import utils
22
- from octavia.controller.worker.v1.tasks import cert_task
23
- import octavia.tests.unit.base as base
24
-
25
- CONF = cfg.CONF
26
-
27
-
28
- class TestCertTasks(base.TestCase):
29
-
30
- @mock.patch('stevedore.driver.DriverManager.driver')
31
- def test_execute(self, mock_driver):
32
- key = utils.get_compatible_server_certs_key_passphrase()
33
- fer = fernet.Fernet(key)
34
- dummy_cert = local.LocalCert(
35
- utils.get_compatible_value('test_cert'),
36
- utils.get_compatible_value('test_key'))
37
- mock_driver.generate_cert_key_pair.side_effect = [dummy_cert]
38
- c = cert_task.GenerateServerPEMTask()
39
- pem = c.execute('123')
40
- self.assertEqual(
41
- fer.decrypt(pem),
42
- dummy_cert.get_certificate() +
43
- dummy_cert.get_private_key()
44
- )
45
- mock_driver.generate_cert_key_pair.assert_called_once_with(
46
- cn='123', validity=CONF.certificates.cert_validity_time)
@@ -1,634 +0,0 @@
1
- # Copyright 2015 Hewlett-Packard Development Company, L.P.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License"); you may
4
- # not use this file except in compliance with the License. You may obtain
5
- # a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
- # License for the specific language governing permissions and limitations
13
- # under the License.
14
- #
15
- from unittest import mock
16
-
17
- from cryptography import fernet
18
- from oslo_config import cfg
19
- from oslo_config import fixture as oslo_fixture
20
- from oslo_utils import uuidutils
21
- import tenacity
22
-
23
- from octavia.common import constants
24
- from octavia.common import exceptions
25
- from octavia.common import utils
26
- from octavia.controller.worker.v1.tasks import compute_tasks
27
- from octavia.tests.common import utils as test_utils
28
- import octavia.tests.unit.base as base
29
-
30
-
31
- AMP_FLAVOR_ID = '10'
32
- AMP_IMAGE_TAG = 'glance_tag'
33
- AMP_SSH_KEY_NAME = None
34
- AMP_NET = [uuidutils.generate_uuid()]
35
- AMP_SEC_GROUPS = []
36
- AMP_WAIT = 12
37
- AMPHORA_ID = uuidutils.generate_uuid()
38
- COMPUTE_ID = uuidutils.generate_uuid()
39
- LB_NET_IP = '192.0.2.1'
40
- PORT_ID = uuidutils.generate_uuid()
41
- SERVER_GRPOUP_ID = uuidutils.generate_uuid()
42
-
43
-
44
- class TestException(Exception):
45
-
46
- def __init__(self, value):
47
- self.value = value
48
-
49
- def __str__(self):
50
- return repr(self.value)
51
-
52
-
53
- _amphora_mock = mock.MagicMock()
54
- _amphora_mock.id = AMPHORA_ID
55
- _amphora_mock.compute_id = COMPUTE_ID
56
- _load_balancer_mock = mock.MagicMock()
57
- _load_balancer_mock.amphorae = [_amphora_mock]
58
- _port = mock.MagicMock()
59
- _port.id = PORT_ID
60
-
61
-
62
- class TestComputeTasks(base.TestCase):
63
-
64
- def setUp(self):
65
- self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
66
- self.conf.config(
67
- group="controller_worker", amp_flavor_id=AMP_FLAVOR_ID)
68
- self.conf.config(
69
- group="controller_worker", amp_image_tag=AMP_IMAGE_TAG)
70
- self.conf.config(
71
- group="controller_worker", amp_ssh_key_name=AMP_SSH_KEY_NAME)
72
- self.conf.config(
73
- group="controller_worker", amp_boot_network_list=AMP_NET)
74
- self.conf.config(
75
- group="controller_worker", amp_active_wait_sec=AMP_WAIT)
76
- self.conf.config(
77
- group="controller_worker", amp_secgroup_list=AMP_SEC_GROUPS)
78
- self.conf.config(group="controller_worker", amp_image_owner_id='')
79
-
80
- _amphora_mock.id = AMPHORA_ID
81
- _amphora_mock.status = constants.AMPHORA_ALLOCATED
82
-
83
- logging_mock = mock.MagicMock()
84
- compute_tasks.LOG = logging_mock
85
-
86
- super().setUp()
87
-
88
- @mock.patch('octavia.common.jinja.logging.logging_jinja_cfg.'
89
- 'LoggingJinjaTemplater.build_logging_config')
90
- @mock.patch('jinja2.Environment.get_template')
91
- @mock.patch('octavia.amphorae.backends.agent.'
92
- 'agent_jinja_cfg.AgentJinjaTemplater.'
93
- 'build_agent_config', return_value='test_conf')
94
- @mock.patch('octavia.common.jinja.'
95
- 'user_data_jinja_cfg.UserDataJinjaCfg.'
96
- 'build_user_data_config', return_value='user_data_conf')
97
- @mock.patch('stevedore.driver.DriverManager.driver')
98
- def test_compute_create(self, mock_driver, mock_ud_conf,
99
- mock_conf, mock_jinja, mock_log_cfg):
100
-
101
- image_owner_id = uuidutils.generate_uuid()
102
- self.conf.config(
103
- group="controller_worker", amp_image_owner_id=image_owner_id)
104
- mock_log_cfg.return_value = 'FAKE CFG'
105
-
106
- createcompute = compute_tasks.ComputeCreate()
107
-
108
- mock_driver.build.return_value = COMPUTE_ID
109
- # Test execute()
110
- compute_id = createcompute.execute(_amphora_mock.id, ports=[_port],
111
- server_group_id=SERVER_GRPOUP_ID)
112
-
113
- # Validate that the build method was called properly
114
- mock_driver.build.assert_called_once_with(
115
- name="amphora-" + _amphora_mock.id,
116
- amphora_flavor=AMP_FLAVOR_ID,
117
- image_tag=AMP_IMAGE_TAG,
118
- image_owner=image_owner_id,
119
- key_name=AMP_SSH_KEY_NAME,
120
- sec_groups=AMP_SEC_GROUPS,
121
- network_ids=AMP_NET,
122
- port_ids=[PORT_ID],
123
- config_drive_files={'/etc/octavia/'
124
- 'amphora-agent.conf': 'test_conf',
125
- '/etc/rsyslog.d/10-rsyslog.conf': 'FAKE CFG'},
126
- user_data='user_data_conf',
127
- server_group_id=SERVER_GRPOUP_ID,
128
- availability_zone=None)
129
-
130
- # Make sure it returns the expected compute_id
131
- self.assertEqual(COMPUTE_ID, compute_id)
132
-
133
- # Test that a build exception is raised
134
- createcompute = compute_tasks.ComputeCreate()
135
-
136
- self.assertRaises(TypeError,
137
- createcompute.execute,
138
- _amphora_mock, config_drive_files='test_cert')
139
-
140
- # Test revert()
141
-
142
- _amphora_mock.compute_id = COMPUTE_ID
143
-
144
- createcompute = compute_tasks.ComputeCreate()
145
- createcompute.revert(compute_id, _amphora_mock.id)
146
-
147
- # Validate that the delete method was called properly
148
- mock_driver.delete.assert_called_once_with(
149
- COMPUTE_ID)
150
-
151
- # Test that a delete exception is not raised
152
-
153
- createcompute.revert(COMPUTE_ID, _amphora_mock.id)
154
-
155
- @mock.patch('jinja2.Environment.get_template')
156
- @mock.patch('octavia.amphorae.backends.agent.'
157
- 'agent_jinja_cfg.AgentJinjaTemplater.'
158
- 'build_agent_config', return_value='test_conf')
159
- @mock.patch('octavia.common.jinja.'
160
- 'user_data_jinja_cfg.UserDataJinjaCfg.'
161
- 'build_user_data_config', return_value='user_data_conf')
162
- @mock.patch('stevedore.driver.DriverManager.driver')
163
- def test_compute_create_user_data(self, mock_driver,
164
- mock_ud_conf, mock_conf, mock_jinja):
165
-
166
- self.conf.config(
167
- group="controller_worker", user_data_config_drive=True)
168
- createcompute = compute_tasks.ComputeCreate()
169
-
170
- mock_driver.build.return_value = COMPUTE_ID
171
- # Test execute()
172
- compute_id = createcompute.execute(_amphora_mock.id, ports=[_port],
173
- server_group_id=None)
174
-
175
- # Validate that the build method was called properly
176
- mock_driver.build.assert_called_once_with(
177
- name="amphora-" + _amphora_mock.id,
178
- amphora_flavor=AMP_FLAVOR_ID,
179
- image_tag=AMP_IMAGE_TAG,
180
- image_owner='',
181
- key_name=AMP_SSH_KEY_NAME,
182
- sec_groups=AMP_SEC_GROUPS,
183
- network_ids=AMP_NET,
184
- port_ids=[PORT_ID],
185
- config_drive_files=None,
186
- user_data='user_data_conf',
187
- server_group_id=None,
188
- availability_zone=None)
189
-
190
- # Make sure it returns the expected compute_id
191
- self.assertEqual(COMPUTE_ID, compute_id)
192
-
193
- # Test that a build exception is raised
194
- createcompute = compute_tasks.ComputeCreate()
195
-
196
- self.assertRaises(TypeError,
197
- createcompute.execute,
198
- _amphora_mock, config_drive_files='test_cert')
199
-
200
- # Test revert()
201
-
202
- _amphora_mock.compute_id = COMPUTE_ID
203
-
204
- createcompute = compute_tasks.ComputeCreate()
205
- createcompute.revert(compute_id, _amphora_mock.id)
206
-
207
- # Validate that the delete method was called properly
208
- mock_driver.delete.assert_called_once_with(
209
- COMPUTE_ID)
210
-
211
- # Test that a delete exception is not raised
212
-
213
- createcompute.revert(COMPUTE_ID, _amphora_mock.id)
214
-
215
- @mock.patch('octavia.common.jinja.logging.logging_jinja_cfg.'
216
- 'LoggingJinjaTemplater.build_logging_config')
217
- @mock.patch('jinja2.Environment.get_template')
218
- @mock.patch('octavia.amphorae.backends.agent.'
219
- 'agent_jinja_cfg.AgentJinjaTemplater.'
220
- 'build_agent_config', return_value='test_conf')
221
- @mock.patch('octavia.common.jinja.'
222
- 'user_data_jinja_cfg.UserDataJinjaCfg.'
223
- 'build_user_data_config', return_value='user_data_conf')
224
- @mock.patch('stevedore.driver.DriverManager.driver')
225
- def test_compute_create_availability_zone(self, mock_driver, mock_ud_conf,
226
- mock_conf, mock_jinja,
227
- mock_log_cfg):
228
-
229
- image_owner_id = uuidutils.generate_uuid()
230
- compute_zone = uuidutils.generate_uuid()
231
- az_dict = {constants.COMPUTE_ZONE: compute_zone}
232
-
233
- self.conf.config(
234
- group="controller_worker", amp_image_owner_id=image_owner_id)
235
- mock_log_cfg.return_value = 'FAKE CFG'
236
-
237
- createcompute = compute_tasks.ComputeCreate()
238
-
239
- mock_driver.build.return_value = COMPUTE_ID
240
- # Test execute()
241
- compute_id = createcompute.execute(_amphora_mock.id, ports=[_port],
242
- server_group_id=SERVER_GRPOUP_ID,
243
- availability_zone=az_dict)
244
-
245
- # Validate that the build method was called properly
246
- mock_driver.build.assert_called_once_with(
247
- name="amphora-" + _amphora_mock.id,
248
- amphora_flavor=AMP_FLAVOR_ID,
249
- image_tag=AMP_IMAGE_TAG,
250
- image_owner=image_owner_id,
251
- key_name=AMP_SSH_KEY_NAME,
252
- sec_groups=AMP_SEC_GROUPS,
253
- network_ids=AMP_NET,
254
- port_ids=[PORT_ID],
255
- config_drive_files={'/etc/octavia/'
256
- 'amphora-agent.conf': 'test_conf',
257
- '/etc/rsyslog.d/10-rsyslog.conf': 'FAKE CFG'},
258
- user_data='user_data_conf',
259
- server_group_id=SERVER_GRPOUP_ID,
260
- availability_zone=compute_zone)
261
-
262
- # Make sure it returns the expected compute_id
263
- self.assertEqual(COMPUTE_ID, compute_id)
264
-
265
- # Test that a build exception is raised
266
- createcompute = compute_tasks.ComputeCreate()
267
-
268
- self.assertRaises(TypeError,
269
- createcompute.execute,
270
- _amphora_mock, config_drive_files='test_cert')
271
-
272
- # Test revert()
273
-
274
- _amphora_mock.compute_id = COMPUTE_ID
275
-
276
- createcompute = compute_tasks.ComputeCreate()
277
- createcompute.revert(compute_id, _amphora_mock.id)
278
-
279
- # Validate that the delete method was called properly
280
- mock_driver.delete.assert_called_once_with(
281
- COMPUTE_ID)
282
-
283
- # Test that a delete exception is not raised
284
-
285
- createcompute.revert(COMPUTE_ID, _amphora_mock.id)
286
-
287
- @mock.patch('octavia.common.jinja.logging.logging_jinja_cfg.'
288
- 'LoggingJinjaTemplater.build_logging_config')
289
- @mock.patch('jinja2.Environment.get_template')
290
- @mock.patch('octavia.amphorae.backends.agent.'
291
- 'agent_jinja_cfg.AgentJinjaTemplater.'
292
- 'build_agent_config', return_value='test_conf')
293
- @mock.patch('octavia.common.jinja.'
294
- 'user_data_jinja_cfg.UserDataJinjaCfg.'
295
- 'build_user_data_config', return_value='user_data_conf')
296
- @mock.patch('stevedore.driver.DriverManager.driver')
297
- def test_compute_create_without_ssh_access(
298
- self, mock_driver, mock_user_data_config,
299
- mock_conf, mock_jinja, mock_log_cfg):
300
-
301
- createcompute = compute_tasks.ComputeCreate()
302
-
303
- mock_driver.build.return_value = COMPUTE_ID
304
- self.conf.config(
305
- group="controller_worker", user_data_config_drive=False)
306
- mock_log_cfg.return_value = 'FAKE CFG'
307
-
308
- # Test execute()
309
- compute_id = createcompute.execute(_amphora_mock.id, ports=[_port],
310
- server_group_id=SERVER_GRPOUP_ID)
311
-
312
- # Validate that the build method was called properly
313
- mock_driver.build.assert_called_once_with(
314
- name="amphora-" + _amphora_mock.id,
315
- amphora_flavor=AMP_FLAVOR_ID,
316
- image_tag=AMP_IMAGE_TAG,
317
- image_owner='',
318
- key_name=None,
319
- sec_groups=AMP_SEC_GROUPS,
320
- network_ids=AMP_NET,
321
- port_ids=[PORT_ID],
322
- config_drive_files={'/etc/octavia/'
323
- 'amphora-agent.conf': 'test_conf',
324
- '/etc/rsyslog.d/10-rsyslog.conf': 'FAKE CFG'},
325
- user_data='user_data_conf',
326
- server_group_id=SERVER_GRPOUP_ID,
327
- availability_zone=None)
328
-
329
- self.assertEqual(COMPUTE_ID, compute_id)
330
-
331
- # Test that a build exception is raised
332
- createcompute = compute_tasks.ComputeCreate()
333
-
334
- self.assertRaises(TypeError,
335
- createcompute.execute,
336
- _amphora_mock, config_drive_files='test_cert')
337
-
338
- # Test revert()
339
-
340
- _amphora_mock.compute_id = COMPUTE_ID
341
-
342
- createcompute = compute_tasks.ComputeCreate()
343
- createcompute.revert(compute_id, _amphora_mock.id)
344
-
345
- # Validate that the delete method was called properly
346
- mock_driver.delete.assert_called_once_with(
347
- COMPUTE_ID)
348
-
349
- # Test that a delete exception is not raised
350
-
351
- createcompute.revert(COMPUTE_ID, _amphora_mock.id)
352
-
353
- @mock.patch('octavia.common.jinja.logging.logging_jinja_cfg.'
354
- 'LoggingJinjaTemplater.build_logging_config')
355
- @mock.patch('jinja2.Environment.get_template')
356
- @mock.patch('octavia.amphorae.backends.agent.'
357
- 'agent_jinja_cfg.AgentJinjaTemplater.'
358
- 'build_agent_config', return_value='test_conf')
359
- @mock.patch('octavia.common.jinja.'
360
- 'user_data_jinja_cfg.UserDataJinjaCfg.'
361
- 'build_user_data_config', return_value='user_data_conf')
362
- @mock.patch('stevedore.driver.DriverManager.driver')
363
- def test_compute_create_cert(self, mock_driver, mock_ud_conf,
364
- mock_conf, mock_jinja, mock_log_cfg):
365
- createcompute = compute_tasks.CertComputeCreate()
366
- key = utils.get_compatible_server_certs_key_passphrase()
367
- fer = fernet.Fernet(key)
368
- mock_log_cfg.return_value = 'FAKE CFG'
369
-
370
- mock_driver.build.return_value = COMPUTE_ID
371
- path = '/etc/octavia/certs/ca_01.pem'
372
- self.useFixture(test_utils.OpenFixture(path, 'test'))
373
- # Test execute()
374
- test_cert = fer.encrypt(
375
- utils.get_compatible_value('test_cert')
376
- )
377
- compute_id = createcompute.execute(_amphora_mock.id, test_cert,
378
- server_group_id=SERVER_GRPOUP_ID
379
- )
380
-
381
- # Validate that the build method was called properly
382
- mock_driver.build.assert_called_once_with(
383
- name="amphora-" + _amphora_mock.id,
384
- amphora_flavor=AMP_FLAVOR_ID,
385
- image_tag=AMP_IMAGE_TAG,
386
- image_owner='',
387
- key_name=AMP_SSH_KEY_NAME,
388
- sec_groups=AMP_SEC_GROUPS,
389
- network_ids=AMP_NET,
390
- port_ids=[],
391
- user_data='user_data_conf',
392
- config_drive_files={
393
- '/etc/rsyslog.d/10-rsyslog.conf': 'FAKE CFG',
394
- '/etc/octavia/certs/server.pem': fer.decrypt(
395
- test_cert).decode('utf-8'),
396
- '/etc/octavia/certs/client_ca.pem': 'test',
397
- '/etc/octavia/amphora-agent.conf': 'test_conf'},
398
- server_group_id=SERVER_GRPOUP_ID,
399
- availability_zone=None)
400
-
401
- self.assertEqual(COMPUTE_ID, compute_id)
402
-
403
- # Test that a build exception is raised
404
- self.useFixture(test_utils.OpenFixture(path, 'test'))
405
-
406
- createcompute = compute_tasks.ComputeCreate()
407
- self.assertRaises(TypeError,
408
- createcompute.execute,
409
- _amphora_mock,
410
- config_drive_files=test_cert)
411
-
412
- # Test revert()
413
-
414
- _amphora_mock.compute_id = COMPUTE_ID
415
-
416
- createcompute = compute_tasks.ComputeCreate()
417
- createcompute.revert(compute_id, _amphora_mock.id)
418
-
419
- # Validate that the delete method was called properly
420
- mock_driver.delete.assert_called_once_with(COMPUTE_ID)
421
-
422
- # Test that a delete exception is not raised
423
-
424
- createcompute.revert(COMPUTE_ID, _amphora_mock.id)
425
-
426
- @mock.patch('octavia.controller.worker.amphora_rate_limit'
427
- '.AmphoraBuildRateLimit.remove_from_build_req_queue')
428
- @mock.patch('stevedore.driver.DriverManager.driver')
429
- @mock.patch('time.sleep')
430
- def test_compute_wait(self,
431
- mock_time_sleep,
432
- mock_driver,
433
- mock_remove_from_build_queue):
434
-
435
- self.conf.config(group='haproxy_amphora', build_rate_limit=5)
436
- _amphora_mock.compute_id = COMPUTE_ID
437
- _amphora_mock.status = constants.ACTIVE
438
- _amphora_mock.lb_network_ip = LB_NET_IP
439
-
440
- mock_driver.get_amphora.return_value = _amphora_mock, None
441
-
442
- computewait = compute_tasks.ComputeActiveWait()
443
-
444
- # Test with no AZ
445
- computewait.execute(COMPUTE_ID, AMPHORA_ID, None)
446
- mock_driver.get_amphora.assert_called_once_with(COMPUTE_ID, None)
447
-
448
- # Test with AZ
449
- mock_driver.reset_mock()
450
- az = {constants.MANAGEMENT_NETWORK: uuidutils.generate_uuid()}
451
- computewait.execute(COMPUTE_ID, AMPHORA_ID, az)
452
- mock_driver.get_amphora.assert_called_once_with(
453
- COMPUTE_ID, az[constants.MANAGEMENT_NETWORK])
454
-
455
- # Test with deleted amp
456
- _amphora_mock.status = constants.DELETED
457
- self.assertRaises(exceptions.ComputeWaitTimeoutException,
458
- computewait.execute,
459
- _amphora_mock, AMPHORA_ID, None)
460
-
461
- @mock.patch('octavia.controller.worker.amphora_rate_limit'
462
- '.AmphoraBuildRateLimit.remove_from_build_req_queue')
463
- @mock.patch('stevedore.driver.DriverManager.driver')
464
- @mock.patch('time.sleep')
465
- def test_compute_wait_error_status(self,
466
- mock_time_sleep,
467
- mock_driver,
468
- mock_remove_from_build_queue):
469
-
470
- self.conf.config(group='haproxy_amphora', build_rate_limit=5)
471
- _amphora_mock.compute_id = COMPUTE_ID
472
- _amphora_mock.status = constants.ACTIVE
473
- _amphora_mock.lb_network_ip = LB_NET_IP
474
-
475
- mock_driver.get_amphora.return_value = _amphora_mock, None
476
-
477
- computewait = compute_tasks.ComputeActiveWait()
478
- computewait.execute(COMPUTE_ID, AMPHORA_ID, None)
479
-
480
- mock_driver.get_amphora.assert_called_once_with(COMPUTE_ID, None)
481
-
482
- _amphora_mock.status = constants.ERROR
483
-
484
- self.assertRaises(exceptions.ComputeBuildException,
485
- computewait.execute,
486
- _amphora_mock, AMPHORA_ID, None)
487
-
488
- @mock.patch('octavia.controller.worker.amphora_rate_limit'
489
- '.AmphoraBuildRateLimit.remove_from_build_req_queue')
490
- @mock.patch('stevedore.driver.DriverManager.driver')
491
- @mock.patch('time.sleep')
492
- def test_compute_wait_skipped(self,
493
- mock_time_sleep,
494
- mock_driver,
495
- mock_remove_from_build_queue):
496
- _amphora_mock.compute_id = COMPUTE_ID
497
- _amphora_mock.status = constants.ACTIVE
498
- _amphora_mock.lb_network_ip = LB_NET_IP
499
-
500
- mock_driver.get_amphora.return_value = _amphora_mock, None
501
-
502
- computewait = compute_tasks.ComputeActiveWait()
503
- computewait.execute(COMPUTE_ID, AMPHORA_ID, None)
504
-
505
- mock_driver.get_amphora.assert_called_once_with(COMPUTE_ID, None)
506
- mock_remove_from_build_queue.assert_not_called()
507
-
508
- @mock.patch('stevedore.driver.DriverManager.driver')
509
- def test_delete_amphorae_on_load_balancer(self, mock_driver):
510
-
511
- mock_driver.delete.side_effect = [mock.DEFAULT,
512
- exceptions.OctaviaException('boom')]
513
-
514
- delete_amps = compute_tasks.DeleteAmphoraeOnLoadBalancer()
515
-
516
- delete_amps.execute(_load_balancer_mock)
517
-
518
- mock_driver.delete.assert_called_once_with(COMPUTE_ID)
519
-
520
- # Test compute driver exception is raised
521
- self.assertRaises(exceptions.OctaviaException, delete_amps.execute,
522
- _load_balancer_mock)
523
-
524
- @mock.patch('stevedore.driver.DriverManager.driver')
525
- def test_compute_delete(self, mock_driver):
526
- mock_driver.delete.side_effect = [
527
- mock.DEFAULT, exceptions.OctaviaException('boom'),
528
- mock.DEFAULT, exceptions.OctaviaException('boom'),
529
- exceptions.OctaviaException('boom'),
530
- exceptions.OctaviaException('boom'),
531
- exceptions.OctaviaException('boom')]
532
-
533
- delete_compute = compute_tasks.ComputeDelete()
534
-
535
- # Limit the retry attempts for the test run to save time
536
- delete_compute.execute.retry.stop = tenacity.stop_after_attempt(2)
537
-
538
- delete_compute.execute(_amphora_mock)
539
-
540
- mock_driver.delete.assert_called_once_with(COMPUTE_ID)
541
-
542
- # Test retry after a compute exception
543
- mock_driver.reset_mock()
544
- delete_compute.execute(_amphora_mock)
545
- mock_driver.delete.assert_has_calls([mock.call(COMPUTE_ID),
546
- mock.call(COMPUTE_ID)])
547
-
548
- # Test passive failure
549
- mock_driver.reset_mock()
550
- delete_compute.execute(_amphora_mock, passive_failure=True)
551
- mock_driver.delete.assert_has_calls([mock.call(COMPUTE_ID),
552
- mock.call(COMPUTE_ID)])
553
-
554
- # Test non-passive failure
555
- mock_driver.reset_mock()
556
- self.assertRaises(exceptions.OctaviaException, delete_compute.execute,
557
- _amphora_mock, passive_failure=False)
558
-
559
- @mock.patch('stevedore.driver.DriverManager.driver')
560
- def test_nova_server_group_create(self, mock_driver):
561
- nova_sever_group_obj = compute_tasks.NovaServerGroupCreate()
562
-
563
- server_group_test_id = '6789'
564
- fake_server_group = mock.MagicMock()
565
- fake_server_group.id = server_group_test_id
566
- fake_server_group.policy = 'anti-affinity'
567
- mock_driver.create_server_group.return_value = fake_server_group
568
-
569
- # Test execute()
570
- sg_id = nova_sever_group_obj.execute('123')
571
-
572
- # Validate that the build method was called properly
573
- mock_driver.create_server_group.assert_called_once_with(
574
- 'octavia-lb-123', 'anti-affinity')
575
-
576
- # Make sure it returns the expected server group_id
577
- self.assertEqual(server_group_test_id, sg_id)
578
-
579
- # Test revert()
580
- nova_sever_group_obj.revert(sg_id)
581
-
582
- # Validate that the delete_server_group method was called properly
583
- mock_driver.delete_server_group.assert_called_once_with(sg_id)
584
-
585
- # Test revert with exception
586
- mock_driver.reset_mock()
587
- mock_driver.delete_server_group.side_effect = Exception('DelSGExcept')
588
- nova_sever_group_obj.revert(sg_id)
589
- mock_driver.delete_server_group.assert_called_once_with(sg_id)
590
-
591
- @mock.patch('stevedore.driver.DriverManager.driver')
592
- def test_nova_server_group_delete_with_sever_group_id(self, mock_driver):
593
- nova_sever_group_obj = compute_tasks.NovaServerGroupDelete()
594
- sg_id = '6789'
595
- nova_sever_group_obj.execute(sg_id)
596
- mock_driver.delete_server_group.assert_called_once_with(sg_id)
597
-
598
- @mock.patch('stevedore.driver.DriverManager.driver')
599
- def test_nova_server_group_delete_with_None(self, mock_driver):
600
- nova_sever_group_obj = compute_tasks.NovaServerGroupDelete()
601
- sg_id = None
602
- nova_sever_group_obj.execute(sg_id)
603
- self.assertFalse(mock_driver.delete_server_group.called, sg_id)
604
-
605
- @mock.patch('stevedore.driver.DriverManager.driver')
606
- def test_attach_port(self, mock_driver):
607
- COMPUTE_ID = uuidutils.generate_uuid()
608
- PORT_ID = uuidutils.generate_uuid()
609
- amphora_mock = mock.MagicMock()
610
- port_mock = mock.MagicMock()
611
- amphora_mock.compute_id = COMPUTE_ID
612
- port_mock.id = PORT_ID
613
-
614
- attach_port_obj = compute_tasks.AttachPort()
615
-
616
- # Test execute
617
- attach_port_obj.execute(amphora_mock, port_mock)
618
-
619
- mock_driver.attach_network_or_port.assert_called_once_with(
620
- COMPUTE_ID, port_id=PORT_ID)
621
-
622
- # Test revert
623
- mock_driver.reset_mock()
624
-
625
- attach_port_obj.revert(amphora_mock, port_mock)
626
-
627
- mock_driver.detach_port.assert_called_once_with(COMPUTE_ID, PORT_ID)
628
-
629
- # Test rever exception
630
- mock_driver.reset_mock()
631
- mock_driver.detach_port.side_effect = [Exception('boom')]
632
-
633
- # should not raise
634
- attach_port_obj.revert(amphora_mock, port_mock)