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,1788 +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
- from unittest import mock
15
-
16
- from oslo_config import cfg
17
- from oslo_config import fixture as oslo_fixture
18
- from oslo_utils import uuidutils
19
- from taskflow.types import failure
20
- import tenacity
21
-
22
- from octavia.common import constants
23
- from octavia.common import data_models as o_data_models
24
- from octavia.common import exceptions
25
- from octavia.controller.worker.v1.tasks import network_tasks
26
- from octavia.network import base as net_base
27
- from octavia.network import data_models
28
- from octavia.tests.common import constants as t_constants
29
- import octavia.tests.unit.base as base
30
-
31
-
32
- AMPHORA_ID = 7
33
- COMPUTE_ID = uuidutils.generate_uuid()
34
- PORT_ID = uuidutils.generate_uuid()
35
- SUBNET_ID = uuidutils.generate_uuid()
36
- NETWORK_ID = uuidutils.generate_uuid()
37
- MGMT_NETWORK_ID = uuidutils.generate_uuid()
38
- MGMT_SUBNET_ID = uuidutils.generate_uuid()
39
- SG_ID = uuidutils.generate_uuid()
40
- IP_ADDRESS = "172.24.41.1"
41
- VIP = o_data_models.Vip(port_id=t_constants.MOCK_PORT_ID,
42
- subnet_id=t_constants.MOCK_SUBNET_ID,
43
- qos_policy_id=t_constants.MOCK_QOS_POLICY_ID1)
44
- VIP2 = o_data_models.Vip(port_id=t_constants.MOCK_PORT_ID2,
45
- subnet_id=t_constants.MOCK_SUBNET_ID2,
46
- qos_policy_id=t_constants.MOCK_QOS_POLICY_ID2)
47
- LB = o_data_models.LoadBalancer(vip=VIP)
48
- LB2 = o_data_models.LoadBalancer(vip=VIP2)
49
- FIRST_IP = {"ip_address": IP_ADDRESS, "subnet_id": SUBNET_ID}
50
- FIXED_IPS = [FIRST_IP]
51
- INTERFACE = data_models.Interface(id=uuidutils.generate_uuid(),
52
- compute_id=COMPUTE_ID, fixed_ips=FIXED_IPS,
53
- port_id=PORT_ID)
54
- AMPS_DATA = [o_data_models.Amphora(id=t_constants.MOCK_AMP_ID1,
55
- status=constants.AMPHORA_ALLOCATED,
56
- vrrp_port_id=t_constants.MOCK_VRRP_PORT_ID1,
57
- vrrp_ip=t_constants.MOCK_VRRP_IP1),
58
- o_data_models.Amphora(id=t_constants.MOCK_AMP_ID2,
59
- status=constants.AMPHORA_ALLOCATED,
60
- vrrp_port_id=t_constants.MOCK_VRRP_PORT_ID2,
61
- vrrp_ip=t_constants.MOCK_VRRP_IP2),
62
- o_data_models.Amphora(id=t_constants.MOCK_AMP_ID3,
63
- status=constants.DELETED,
64
- vrrp_port_id=t_constants.MOCK_VRRP_PORT_ID3,
65
- vrrp_ip=t_constants.MOCK_VRRP_IP3)
66
- ]
67
- UPDATE_DICT = {constants.TOPOLOGY: None}
68
-
69
-
70
- class TestException(Exception):
71
-
72
- def __init__(self, value):
73
- self.value = value
74
-
75
- def __str__(self):
76
- return repr(self.value)
77
-
78
-
79
- @mock.patch('octavia.common.utils.get_network_driver')
80
- class TestNetworkTasks(base.TestCase):
81
- def setUp(self):
82
- network_tasks.LOG = mock.MagicMock()
83
- self.amphora_mock = mock.MagicMock()
84
- self.load_balancer_mock = mock.MagicMock()
85
- self.vip_mock = mock.MagicMock()
86
- self.vip_mock.subnet_id = SUBNET_ID
87
- self.vip_mock.network_id = NETWORK_ID
88
- self.load_balancer_mock.vip = self.vip_mock
89
- self.load_balancer_mock.amphorae = []
90
- self.amphora_mock.id = AMPHORA_ID
91
- self.amphora_mock.compute_id = COMPUTE_ID
92
- self.amphora_mock.status = constants.AMPHORA_ALLOCATED
93
- self.mgmt_net_id = MGMT_NETWORK_ID
94
- self.mgmt_subnet_id = MGMT_SUBNET_ID
95
- conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
96
- conf.config(group="controller_worker",
97
- amp_boot_network_list=[MGMT_NETWORK_ID])
98
- conf.config(group="networking", max_retries=1)
99
- super().setUp()
100
-
101
- def test_calculate_amphora_delta(self, mock_get_net_driver):
102
- VRRP_PORT_ID = uuidutils.generate_uuid()
103
- VIP_NETWORK_ID = uuidutils.generate_uuid()
104
- VIP_SUBNET_ID = uuidutils.generate_uuid()
105
- DELETE_NETWORK_ID = uuidutils.generate_uuid()
106
- MEMBER_NETWORK_ID = uuidutils.generate_uuid()
107
- MEMBER_SUBNET_ID = uuidutils.generate_uuid()
108
- mock_driver = mock.MagicMock()
109
- mock_get_net_driver.return_value = mock_driver
110
- member_mock = mock.MagicMock()
111
- member_mock.subnet_id = MEMBER_SUBNET_ID
112
- pool_mock = mock.MagicMock()
113
- pool_mock.members = [member_mock]
114
- lb_mock = mock.MagicMock()
115
- lb_mock.pools = [pool_mock]
116
- lb_mock.vip = mock.MagicMock()
117
- lb_mock.vip.subnet_id = VIP_SUBNET_ID
118
- lb_mock.vip.network_id = VIP_NETWORK_ID
119
- amphora_mock = mock.MagicMock()
120
- amphora_mock.id = AMPHORA_ID
121
- amphora_mock.compute_id = COMPUTE_ID
122
- amphora_mock.vrrp_port_id = VRRP_PORT_ID
123
-
124
- mgmt_subnet = data_models.Subnet(
125
- id=MGMT_SUBNET_ID,
126
- network_id=MGMT_NETWORK_ID)
127
- mgmt_net = data_models.Network(
128
- id=MGMT_NETWORK_ID,
129
- subnets=[mgmt_subnet.id])
130
- mgmt_interface = data_models.Interface(
131
- network_id=mgmt_net.id,
132
- fixed_ips=[
133
- data_models.FixedIP(
134
- subnet_id=mgmt_subnet.id)])
135
-
136
- vrrp_subnet = data_models.Subnet(
137
- id=VIP_SUBNET_ID,
138
- network_id=VIP_NETWORK_ID)
139
- vrrp_port = data_models.Port(
140
- id=VRRP_PORT_ID,
141
- network_id=VIP_NETWORK_ID,
142
- fixed_ips=[
143
- data_models.FixedIP(
144
- subnet=vrrp_subnet,
145
- subnet_id=vrrp_subnet.id)])
146
- vrrp_interface = data_models.Interface(
147
- network_id=VIP_NETWORK_ID,
148
- fixed_ips=vrrp_port.fixed_ips)
149
-
150
- member_subnet = data_models.Subnet(
151
- id=MEMBER_SUBNET_ID,
152
- network_id=MEMBER_NETWORK_ID)
153
-
154
- to_be_deleted_interface = data_models.Interface(
155
- id=mock.Mock(),
156
- network_id=DELETE_NETWORK_ID)
157
-
158
- mock_driver.get_port.return_value = vrrp_port
159
- mock_driver.get_subnet.return_value = member_subnet
160
- mock_driver.get_network.return_value = mgmt_net
161
- mock_driver.get_plugged_networks.return_value = [
162
- mgmt_interface,
163
- vrrp_interface,
164
- to_be_deleted_interface]
165
-
166
- calc_amp_delta = network_tasks.CalculateAmphoraDelta()
167
-
168
- # Test vrrp_port_id is None
169
- result = calc_amp_delta.execute(lb_mock, amphora_mock, {})
170
-
171
- self.assertEqual(AMPHORA_ID, result.amphora_id)
172
- self.assertEqual(COMPUTE_ID, result.compute_id)
173
- self.assertEqual(1, len(result.add_nics))
174
- self.assertEqual(MEMBER_NETWORK_ID, result.add_nics[0].network_id)
175
- self.assertEqual(1, len(result.delete_nics))
176
- self.assertEqual(DELETE_NETWORK_ID, result.delete_nics[0].network_id)
177
- mock_driver.get_subnet.assert_called_once_with(MEMBER_SUBNET_ID)
178
- mock_driver.get_plugged_networks.assert_called_once_with(COMPUTE_ID)
179
-
180
- def test_calculate_delta(self, mock_get_net_driver):
181
- mock_driver = mock.MagicMock()
182
- mock_get_net_driver.return_value = mock_driver
183
- empty_deltas = {self.amphora_mock.id: data_models.Delta(
184
- amphora_id=self.amphora_mock.id,
185
- compute_id=self.amphora_mock.compute_id,
186
- add_nics=[],
187
- delete_nics=[],
188
- add_subnets=[],
189
- delete_subnets=[],
190
- )}
191
-
192
- mgmt_subnet = data_models.Subnet(
193
- id=self.mgmt_subnet_id, network_id=self.mgmt_net_id)
194
- mgmt_net = data_models.Network(
195
- id=self.mgmt_net_id,
196
- subnets=[mgmt_subnet.id])
197
- mgmt_ip_address = mock.MagicMock()
198
- mgmt_interface = data_models.Interface(
199
- network_id=self.mgmt_net_id,
200
- fixed_ips=[
201
- data_models.FixedIP(
202
- subnet=mgmt_subnet,
203
- subnet_id=self.mgmt_subnet_id,
204
- ip_address=mgmt_ip_address
205
- )
206
- ])
207
- vrrp_subnet = data_models.Subnet(
208
- id=self.vip_mock.subnet_id, network_id=self.vip_mock.network_id,
209
- name='vrrp_subnet')
210
- member_vip_subnet = data_models.Subnet(
211
- id=uuidutils.generate_uuid(), network_id=self.vip_mock.network_id,
212
- name='member_vip_subnet')
213
- vip_net = data_models.Network(
214
- id=self.vip_mock.network_id,
215
- subnets=[member_vip_subnet, vrrp_subnet],
216
- name='flat_network')
217
- vrrp_port = data_models.Port(
218
- id=uuidutils.generate_uuid(),
219
- network_id=vip_net.id, network=vip_net,
220
- fixed_ips=[
221
- data_models.FixedIP(
222
- subnet=vrrp_subnet, subnet_id=vrrp_subnet.id,
223
- ip_address=t_constants.MOCK_IP_ADDRESS)
224
- ],
225
- name='vrrp_port')
226
-
227
- member_private_net_id = uuidutils.generate_uuid()
228
- member_private_subnet = data_models.Subnet(
229
- id=uuidutils.generate_uuid(), network_id=member_private_net_id,
230
- name='member_private_subnet')
231
- member_private_subnet2 = data_models.Subnet(
232
- id=uuidutils.generate_uuid(), network_id=member_private_net_id,
233
- name='member_private_subnet2')
234
- member_private_net = data_models.Network(
235
- id=member_private_subnet.network_id,
236
- subnets=[member_private_subnet, member_private_subnet2],
237
- name='member_private_net')
238
- member_private_subnet_port = data_models.Port(
239
- id=uuidutils.generate_uuid(),
240
- network_id=member_private_net.id, network=member_private_net,
241
- fixed_ips=[
242
- data_models.FixedIP(
243
- subnet=member_private_subnet,
244
- subnet_id=member_private_subnet.id,
245
- ip_address=t_constants.MOCK_IP_ADDRESS2)
246
- ],
247
- name='member_private_net_port')
248
- member_private_subnet2_port = data_models.Port(
249
- id=uuidutils.generate_uuid(),
250
- network_id=member_private_net.id, network=member_private_net,
251
- fixed_ips=[
252
- data_models.FixedIP(
253
- subnet=member_private_subnet2,
254
- subnet_id=member_private_subnet2.id,
255
- ip_address=t_constants.MOCK_IP_ADDRESS2)
256
- ],
257
- name='member_private_net_port')
258
-
259
- # Pretend the VIP is on the member network, so already plugged
260
- mock_driver.get_plugged_networks.return_value = [
261
- mgmt_interface,
262
- data_models.Interface(
263
- network_id=vip_net.id, port_id=vrrp_port.id,
264
- fixed_ips=vrrp_port.fixed_ips)]
265
- mock_driver.get_port.return_value = vrrp_port
266
- mock_driver.get_subnet.return_value = vrrp_subnet
267
- mock_driver.get_network.return_value = mgmt_net
268
-
269
- calc_delta = network_tasks.CalculateDelta()
270
-
271
- # Test with no amps or anything at all
272
- self.assertEqual({}, calc_delta.execute(
273
- self.load_balancer_mock, {}))
274
-
275
- # Test with one amp and no pools, only the base network plugged
276
- # Delta should be empty
277
- mock_driver.reset_mock()
278
-
279
- self.amphora_mock.load_balancer = self.load_balancer_mock
280
- self.load_balancer_mock.amphorae = [self.amphora_mock]
281
- self.load_balancer_mock.pools = []
282
- self.assertEqual(empty_deltas,
283
- calc_delta.execute(self.load_balancer_mock, {}))
284
- mock_driver.get_plugged_networks.assert_called_once_with(COMPUTE_ID)
285
-
286
- # Test with one amp and one pool but no members, nothing plugged
287
- # Delta should be empty
288
- mock_driver.reset_mock()
289
- pool_mock = mock.MagicMock()
290
- pool_mock.members = []
291
- self.load_balancer_mock.pools = [pool_mock]
292
- self.assertEqual(empty_deltas,
293
- calc_delta.execute(self.load_balancer_mock, {}))
294
-
295
- # Test with one amp/pool and one member (on a distinct member subnet)
296
- # Dummy AZ is provided
297
- # Only the base network is already plugged
298
- # Delta should be one additional network/subnet to plug
299
- mock_driver.reset_mock()
300
- member_mock = mock.MagicMock()
301
- member_mock.subnet_id = member_private_subnet.id
302
- member2_mock = mock.MagicMock()
303
- member2_mock.subnet_id = member_private_subnet2.id
304
- pool_mock.members = [member_mock]
305
- az = {
306
- constants.COMPUTE_ZONE: 'foo'
307
- }
308
- mock_driver.get_subnet.return_value = data_models.Subnet(
309
- id=2, network_id=3)
310
-
311
- ndm = data_models.Delta(
312
- amphora_id=self.amphora_mock.id,
313
- compute_id=self.amphora_mock.compute_id,
314
- add_nics=[
315
- data_models.Interface(
316
- network_id=3,
317
- fixed_ips=[
318
- data_models.FixedIP(
319
- subnet_id=member_private_subnet.id)])],
320
- delete_nics=[],
321
- add_subnets=[{
322
- 'subnet_id': member_private_subnet.id,
323
- 'network_id': 3,
324
- 'port_id': None}],
325
- delete_subnets=[])
326
- self.assertEqual({self.amphora_mock.id: ndm},
327
- calc_delta.execute(self.load_balancer_mock, az))
328
-
329
- mock_driver.get_subnet.assert_called_once_with(
330
- member_mock.subnet_id)
331
-
332
- # Test with one amp/pool and one member (not plugged) that is being
333
- # deleted
334
- # Only the base network is already plugged
335
- # Delta should be empty
336
- mock_driver.reset_mock()
337
- member_mock = mock.MagicMock()
338
- member_mock.subnet_id = member_private_subnet.id
339
- member_mock.provisioning_status = constants.PENDING_DELETE
340
- pool_mock.members = [member_mock]
341
-
342
- self.assertEqual(empty_deltas,
343
- calc_delta.execute(self.load_balancer_mock, {}))
344
-
345
- # Test with one amp/pool and one member (without any subnets)
346
- # Only the base network is already plugged
347
- # No delta
348
- mock_driver.reset_mock()
349
- member_mock = mock.MagicMock()
350
- member_mock.subnet_id = None
351
- pool_mock.members = [member_mock]
352
-
353
- self.assertEqual(empty_deltas,
354
- calc_delta.execute(self.load_balancer_mock, {}))
355
-
356
- # Test with one amp and one pool and one member
357
- # Management network is defined in AZ metadata
358
- # Base network AND member network/subnet already plugged
359
- # Delta should be empty
360
- mock_driver.reset_mock()
361
- member_mock = mock.MagicMock()
362
- member_mock.subnet_id = member_private_subnet.id
363
- pool_mock.members = [member_mock]
364
-
365
- mgmt2_subnet_id = uuidutils.generate_uuid()
366
- mgmt2_net_id = uuidutils.generate_uuid()
367
- mgmt2_subnet = data_models.Subnet(
368
- id=mgmt2_subnet_id,
369
- network_id=mgmt2_net_id)
370
- mgmt2_net = data_models.Network(
371
- id=mgmt2_net_id,
372
- subnets=[mgmt2_subnet.id]
373
- )
374
- mgmt2_interface = data_models.Interface(
375
- network_id=mgmt2_net_id,
376
- fixed_ips=[
377
- data_models.FixedIP(
378
- subnet=mgmt2_subnet,
379
- subnet_id=mgmt2_subnet_id,
380
- )
381
- ])
382
- mock_driver.get_network.return_value = mgmt2_net
383
- az = {
384
- constants.MANAGEMENT_NETWORK: mgmt2_net_id,
385
- }
386
- mock_driver.get_subnet.return_value = member_private_subnet
387
- mock_driver.get_plugged_networks.return_value = [
388
- mgmt2_interface,
389
- data_models.Interface(
390
- network_id=vrrp_subnet.network_id,
391
- fixed_ips=vrrp_port.fixed_ips),
392
- data_models.Interface(
393
- network_id=member_private_subnet.network_id,
394
- fixed_ips=member_private_subnet_port.fixed_ips)]
395
-
396
- self.assertEqual(empty_deltas,
397
- calc_delta.execute(self.load_balancer_mock, az))
398
-
399
- # Test with one amp and one pool and one member, wrong network plugged
400
- # Delta should be one network/subnet to add and one to remove
401
- mock_driver.reset_mock()
402
- mock_driver.get_network.return_value = mgmt_net
403
- member_mock = mock.MagicMock()
404
- member_mock.subnet_id = member_private_subnet.id
405
- pool_mock.members = [member_mock]
406
- az = {
407
- constants.COMPUTE_ZONE: 'foo'
408
- }
409
- mock_driver.get_subnet.return_value = member_private_subnet
410
- mock_driver.get_plugged_networks.return_value = [
411
- mgmt_interface,
412
- data_models.Interface(
413
- network_id=vrrp_subnet.network_id,
414
- fixed_ips=vrrp_port.fixed_ips),
415
- data_models.Interface(
416
- network_id='bad_net',
417
- fixed_ips=[data_models.FixedIP(subnet_id='bad_subnet')])]
418
-
419
- ndm = data_models.Delta(
420
- amphora_id=self.amphora_mock.id,
421
- compute_id=self.amphora_mock.compute_id,
422
- add_nics=[data_models.Interface(
423
- network_id=member_private_net.id,
424
- fixed_ips=[data_models.FixedIP(
425
- subnet_id=member_private_subnet.id)])],
426
- delete_nics=[data_models.Interface(network_id='bad_net')],
427
- add_subnets=[{
428
- 'subnet_id': member_private_subnet.id,
429
- 'network_id': member_private_net.id,
430
- 'port_id': None
431
- }],
432
- delete_subnets=[{
433
- 'subnet_id': 'bad_subnet',
434
- 'network_id': 'bad_net',
435
- 'port_id': None
436
- }])
437
- self.assertEqual({self.amphora_mock.id: ndm},
438
- calc_delta.execute(self.load_balancer_mock, az))
439
-
440
- # Test with one amp and one pool and no members, one network plugged
441
- # Delta should be one network to remove
442
- mock_driver.reset_mock()
443
- pool_mock.members = []
444
- mock_driver.get_subnet.side_effect = [
445
- vrrp_subnet]
446
- mock_driver.get_plugged_networks.return_value = [
447
- mgmt_interface,
448
- data_models.Interface(
449
- network_id=vrrp_subnet.network_id,
450
- fixed_ips=vrrp_port.fixed_ips),
451
- data_models.Interface(
452
- network_id='bad_net',
453
- fixed_ips=[data_models.FixedIP(subnet_id='bad_subnet')])]
454
-
455
- ndm = data_models.Delta(
456
- amphora_id=self.amphora_mock.id,
457
- compute_id=self.amphora_mock.compute_id,
458
- add_nics=[],
459
- delete_nics=[data_models.Interface(network_id='bad_net')],
460
- add_subnets=[],
461
- delete_subnets=[{
462
- 'subnet_id': 'bad_subnet',
463
- 'network_id': 'bad_net',
464
- 'port_id': None
465
- }])
466
- self.assertEqual({self.amphora_mock.id: ndm},
467
- calc_delta.execute(self.load_balancer_mock, {}))
468
-
469
- # Add a new member on a new subnet, an interface with another subnet of
470
- # the same network is already plugged
471
- # Delta should be one new subnet
472
- mock_driver.reset_mock()
473
- pool_mock.members = [member_mock, member2_mock]
474
- mock_driver.get_subnet.side_effect = [
475
- vrrp_subnet,
476
- member_private_subnet,
477
- member_private_subnet2]
478
- mock_driver.get_plugged_networks.return_value = [
479
- mgmt_interface,
480
- data_models.Interface(
481
- network_id=vrrp_subnet.network_id,
482
- fixed_ips=vrrp_port.fixed_ips),
483
- data_models.Interface(
484
- network_id=member_private_net_id,
485
- port_id=member_private_subnet_port.id,
486
- fixed_ips=member_private_subnet_port.fixed_ips)]
487
-
488
- ndm = data_models.Delta(
489
- amphora_id=self.amphora_mock.id,
490
- compute_id=self.amphora_mock.compute_id,
491
- add_nics=[],
492
- delete_nics=[],
493
- add_subnets=[{
494
- 'subnet_id': member_private_subnet2.id,
495
- 'network_id': member_private_net_id,
496
- 'port_id': member_private_subnet_port.id
497
- }],
498
- delete_subnets=[]
499
- )
500
- self.assertEqual({self.amphora_mock.id: ndm},
501
- calc_delta.execute(self.load_balancer_mock, {}))
502
-
503
- # a new member on a new subnet on an existing network, a delete member2
504
- # on another subnet of the same network
505
- # Delta should be one new subnet, one deleted subnet, no interface
506
- # change
507
- mock_driver.reset_mock()
508
- pool_mock.members = [member_mock]
509
- mock_driver.get_subnet.return_value = member_private_subnet
510
- mock_driver.get_plugged_networks.return_value = [
511
- mgmt_interface,
512
- data_models.Interface(
513
- network_id=vrrp_subnet.network_id,
514
- fixed_ips=vrrp_port.fixed_ips),
515
- data_models.Interface(
516
- network_id=member_private_net_id,
517
- port_id=member_private_subnet2_port.id,
518
- fixed_ips=member_private_subnet2_port.fixed_ips)]
519
-
520
- ndm = data_models.Delta(
521
- amphora_id=self.amphora_mock.id,
522
- compute_id=self.amphora_mock.compute_id,
523
- add_nics=[],
524
- delete_nics=[],
525
- add_subnets=[{
526
- 'subnet_id': member_private_subnet.id,
527
- 'network_id': member_private_net_id,
528
- 'port_id': member_private_subnet2_port.id}],
529
- delete_subnets=[{
530
- 'subnet_id': member_private_subnet2.id,
531
- 'network_id': member_private_net_id,
532
- 'port_id': member_private_subnet2_port.id}]
533
- )
534
- self.assertEqual({self.amphora_mock.id: ndm},
535
- calc_delta.execute(self.load_balancer_mock, {}))
536
-
537
- # member on subnet on the same network as the vip subnet
538
- mock_driver.reset_mock()
539
- member_mock.subnet_id = member_vip_subnet.id
540
- pool_mock.members = [member_mock]
541
- mock_driver.get_subnet.side_effect = [
542
- vrrp_subnet,
543
- member_vip_subnet]
544
- mock_driver.get_plugged_networks.return_value = [
545
- mgmt_interface,
546
- data_models.Interface(
547
- network_id=vrrp_subnet.network_id,
548
- port_id=vrrp_port.id,
549
- fixed_ips=vrrp_port.fixed_ips),
550
- data_models.Interface(
551
- network_id=member_private_net_id,
552
- port_id=member_private_subnet_port.id,
553
- fixed_ips=member_private_subnet_port.fixed_ips)]
554
-
555
- ndm = data_models.Delta(
556
- amphora_id=self.amphora_mock.id,
557
- compute_id=self.amphora_mock.compute_id,
558
- add_nics=[],
559
- delete_nics=[
560
- data_models.Interface(
561
- network_id=member_private_net_id,
562
- port_id=member_private_subnet_port.id)],
563
- add_subnets=[{
564
- 'subnet_id': member_vip_subnet.id,
565
- 'network_id': vip_net.id,
566
- 'port_id': vrrp_port.id}],
567
- delete_subnets=[{
568
- 'subnet_id': member_private_subnet.id,
569
- 'network_id': member_private_net_id,
570
- 'port_id': member_private_subnet_port.id}]
571
- )
572
- self.assertEqual({self.amphora_mock.id: ndm},
573
- calc_delta.execute(self.load_balancer_mock, {}))
574
-
575
- def test_calculate_delta_ipv6_ipv4_subnets(self, mock_get_net_driver):
576
- mock_driver = mock.MagicMock()
577
- mock_get_net_driver.return_value = mock_driver
578
-
579
- # Pool mock should be configured explicitly for each test
580
- pool_mock = mock.MagicMock()
581
- self.load_balancer_mock.pools = [pool_mock]
582
- self.amphora_mock.load_balancer = self.load_balancer_mock
583
- self.load_balancer_mock.amphorae = [self.amphora_mock]
584
-
585
- # Test with one amp and one pool and one new member (in the VIP net)
586
- # Delta should be one additional subnet to plug to the existing port
587
- vrrp_subnet = data_models.Subnet(
588
- id=self.vip_mock.subnet_id, network_id=self.vip_mock.network_id)
589
- member_subnet = data_models.Subnet(
590
- id=uuidutils.generate_uuid(), network_id=self.vip_mock.network_id)
591
- flat_network = data_models.Network(
592
- id=self.vip_mock.network_id, subnets=[member_subnet, vrrp_subnet])
593
- vrrp_port = data_models.Port(
594
- id=uuidutils.generate_uuid(),
595
- network_id=flat_network.id, network=flat_network,
596
- fixed_ips=[
597
- data_models.FixedIP(
598
- subnet=vrrp_subnet, subnet_id=vrrp_subnet.id,
599
- ip_address=t_constants.MOCK_IP_ADDRESS)
600
- ])
601
- mock_driver.get_subnet.return_value = member_subnet
602
- member_mock = mock.MagicMock()
603
- member_mock.subnet_id = member_subnet.id
604
- pool_mock.members = [member_mock]
605
- # Pretend the VIP is on the member network, so already plugged
606
- mock_driver.get_plugged_networks.return_value = [
607
- data_models.Interface(
608
- network_id=flat_network.id, port_id=vrrp_port.id,
609
- fixed_ips=vrrp_port.fixed_ips)]
610
- mock_driver.get_port.return_value = vrrp_port
611
-
612
- calc_delta = network_tasks.CalculateDelta()
613
- deltas = calc_delta.execute(self.load_balancer_mock, {})
614
-
615
- expected_delta = {self.amphora_mock.id: data_models.Delta(
616
- amphora_id=self.amphora_mock.id,
617
- compute_id=self.amphora_mock.compute_id,
618
- add_nics=[],
619
- delete_nics=[],
620
- add_subnets=[member_subnet.id],
621
- delete_subnets=[])}
622
- self.assertEqual(expected_delta, deltas)
623
-
624
- def test_get_plumbed_networks(self, mock_get_net_driver):
625
- mock_driver = mock.MagicMock()
626
- mock_get_net_driver.return_value = mock_driver
627
- mock_driver.get_plugged_networks.side_effect = [['blah']]
628
- net = network_tasks.GetPlumbedNetworks()
629
-
630
- self.assertEqual(['blah'], net.execute(self.amphora_mock))
631
- mock_driver.get_plugged_networks.assert_called_once_with(
632
- COMPUTE_ID)
633
-
634
- def test_plug_networks(self, mock_get_net_driver):
635
- mock_driver = mock.MagicMock()
636
- mock_get_net_driver.return_value = mock_driver
637
-
638
- def _interface(network_id):
639
- return [data_models.Interface(network_id=network_id)]
640
-
641
- net = network_tasks.PlugNetworks()
642
-
643
- net.execute(self.amphora_mock, None)
644
- self.assertFalse(mock_driver.plug_network.called)
645
-
646
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
647
- compute_id=self.amphora_mock.compute_id,
648
- add_nics=[],
649
- delete_nics=[])
650
- net.execute(self.amphora_mock, delta)
651
- self.assertFalse(mock_driver.plug_network.called)
652
-
653
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
654
- compute_id=self.amphora_mock.compute_id,
655
- add_nics=_interface(1),
656
- delete_nics=[])
657
- net.execute(self.amphora_mock, delta)
658
- mock_driver.plug_network.assert_called_once_with(COMPUTE_ID, 1)
659
-
660
- # revert
661
- net.revert(self.amphora_mock, None)
662
- self.assertFalse(mock_driver.unplug_network.called)
663
-
664
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
665
- compute_id=self.amphora_mock.compute_id,
666
- add_nics=[],
667
- delete_nics=[])
668
- net.revert(self.amphora_mock, delta)
669
- self.assertFalse(mock_driver.unplug_network.called)
670
-
671
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
672
- compute_id=self.amphora_mock.compute_id,
673
- add_nics=_interface(1),
674
- delete_nics=[])
675
- net.revert(self.amphora_mock, delta)
676
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
677
-
678
- mock_driver.reset_mock()
679
- mock_driver.unplug_network.side_effect = net_base.NetworkNotFound
680
- net.revert(self.amphora_mock, delta) # No exception
681
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
682
-
683
- mock_driver.reset_mock()
684
- mock_driver.unplug_network.side_effect = TestException('test')
685
- self.assertRaises(TestException,
686
- net.revert,
687
- self.amphora_mock,
688
- delta)
689
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
690
-
691
- def test_unplug_networks(self, mock_get_net_driver):
692
- mock_driver = mock.MagicMock()
693
- mock_get_net_driver.return_value = mock_driver
694
-
695
- def _interface(network_id):
696
- return [data_models.Interface(network_id=network_id)]
697
-
698
- net = network_tasks.UnPlugNetworks()
699
-
700
- net.execute(self.amphora_mock, None)
701
- self.assertFalse(mock_driver.unplug_network.called)
702
-
703
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
704
- compute_id=self.amphora_mock.compute_id,
705
- add_nics=[],
706
- delete_nics=[])
707
- net.execute(self.amphora_mock, delta)
708
- self.assertFalse(mock_driver.unplug_network.called)
709
-
710
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
711
- compute_id=self.amphora_mock.compute_id,
712
- add_nics=[],
713
- delete_nics=_interface(1))
714
- net.execute(self.amphora_mock, delta)
715
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
716
-
717
- mock_driver.reset_mock()
718
- mock_driver.unplug_network.side_effect = net_base.NetworkNotFound
719
- net.execute(self.amphora_mock, delta) # No exception
720
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
721
-
722
- # Do a test with a general exception in case behavior changes
723
- mock_driver.reset_mock()
724
- mock_driver.unplug_network.side_effect = Exception()
725
- net.execute(self.amphora_mock, delta) # No exception
726
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
727
-
728
- def test_get_member_ports(self, mock_get_net_driver):
729
- mock_driver = mock.MagicMock()
730
- mock_get_net_driver.return_value = mock_driver
731
-
732
- def _interface(port_id):
733
- return [data_models.Interface(port_id=port_id)]
734
-
735
- net_task = network_tasks.GetMemberPorts()
736
- net_task.execute(LB, self.amphora_mock)
737
- mock_driver.get_port.assert_called_once_with(t_constants.MOCK_PORT_ID)
738
- mock_driver.get_plugged_networks.assert_called_once_with(COMPUTE_ID)
739
-
740
- mock_driver.reset_mock()
741
- net_task = network_tasks.GetMemberPorts()
742
- mock_driver.get_plugged_networks.return_value = _interface(1)
743
- mock_driver.get_port.side_effect = [
744
- data_models.Port(network_id=NETWORK_ID),
745
- data_models.Port(network_id=NETWORK_ID)]
746
- net_task.execute(self.load_balancer_mock, self.amphora_mock)
747
- self.assertEqual(2, mock_driver.get_port.call_count)
748
- self.assertFalse(mock_driver.get_network.called)
749
-
750
- mock_driver.reset_mock()
751
- port_mock = mock.MagicMock()
752
- fixed_ip_mock = mock.MagicMock()
753
- fixed_ip_mock.subnet_id = 1
754
- port_mock.fixed_ips = [fixed_ip_mock]
755
- net_task = network_tasks.GetMemberPorts()
756
- mock_driver.get_plugged_networks.return_value = _interface(1)
757
- mock_driver.get_port.side_effect = [
758
- data_models.Port(network_id=NETWORK_ID), port_mock]
759
- ports = net_task.execute(self.load_balancer_mock, self.amphora_mock)
760
- mock_driver.get_subnet.assert_called_once_with(1)
761
- self.assertEqual([port_mock], ports)
762
-
763
- def test_handle_network_delta(self, mock_get_net_driver):
764
- mock_net_driver = mock.MagicMock()
765
- mock_get_net_driver.return_value = mock_net_driver
766
-
767
- nic1 = mock.MagicMock()
768
- nic1.fixed_ips = [data_models.FixedIP(
769
- subnet_id=uuidutils.generate_uuid())]
770
- nic1.network_id = uuidutils.generate_uuid()
771
- nic2 = mock.MagicMock()
772
- nic2.fixed_ips = [data_models.FixedIP(
773
- subnet_id=uuidutils.generate_uuid())]
774
- nic2.network_id = uuidutils.generate_uuid()
775
- interface1 = mock.MagicMock()
776
- interface1.port_id = uuidutils.generate_uuid()
777
- port1 = mock.MagicMock()
778
- port1.network_id = uuidutils.generate_uuid()
779
- fixed_ip = mock.MagicMock()
780
- fixed_ip.subnet_id = nic1.fixed_ips[0].subnet_id
781
- fixed_ip2 = mock.MagicMock()
782
- fixed_ip2.subnet_id = uuidutils.generate_uuid()
783
- port1.fixed_ips = [fixed_ip, fixed_ip2]
784
- subnet = mock.MagicMock()
785
- network = mock.MagicMock()
786
-
787
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
788
- compute_id=self.amphora_mock.compute_id,
789
- add_nics=[nic1],
790
- delete_nics=[nic2, nic2, nic2],
791
- add_subnets=[],
792
- delete_subnets=[])
793
-
794
- mock_net_driver.plug_network.return_value = interface1
795
- mock_net_driver.get_port.return_value = port1
796
- fixed_port1 = mock.MagicMock()
797
- fixed_port1.network_id = port1.network_id
798
- fixed_port1.fixed_ips = [fixed_ip]
799
- mock_net_driver.unplug_fixed_ip.return_value = fixed_port1
800
- mock_net_driver.get_network.return_value = network
801
- mock_net_driver.get_subnet.return_value = subnet
802
-
803
- mock_net_driver.unplug_network.side_effect = [
804
- None, net_base.NetworkNotFound, Exception]
805
-
806
- handle_net_delta_obj = network_tasks.HandleNetworkDelta()
807
- result = handle_net_delta_obj.execute(self.amphora_mock, delta)
808
-
809
- mock_net_driver.plug_network.assert_called_once_with(
810
- self.amphora_mock.compute_id, nic1.network_id)
811
- mock_net_driver.unplug_fixed_ip.assert_called_once_with(
812
- port_id=interface1.port_id, subnet_id=fixed_ip2.subnet_id)
813
- mock_net_driver.get_port.assert_called_once_with(interface1.port_id)
814
- mock_net_driver.get_network.assert_called_once_with(port1.network_id)
815
- mock_net_driver.get_subnet.assert_called_once_with(fixed_ip.subnet_id)
816
-
817
- self.assertEqual({self.amphora_mock.id: [fixed_port1]}, result)
818
-
819
- mock_net_driver.unplug_network.assert_called_with(
820
- self.amphora_mock.compute_id, nic2.network_id)
821
-
822
- # Revert
823
- delta2 = data_models.Delta(amphora_id=self.amphora_mock.id,
824
- compute_id=self.amphora_mock.compute_id,
825
- add_nics=[nic1, nic1],
826
- delete_nics=[nic2, nic2, nic2])
827
-
828
- mock_net_driver.unplug_network.reset_mock()
829
- handle_net_delta_obj.revert(
830
- failure.Failure.from_exception(Exception('boom')), None, None)
831
- mock_net_driver.unplug_network.assert_not_called()
832
-
833
- mock_net_driver.unplug_network.reset_mock()
834
- handle_net_delta_obj.revert(None, None, None)
835
- mock_net_driver.unplug_network.assert_not_called()
836
-
837
- mock_net_driver.unplug_network.reset_mock()
838
- handle_net_delta_obj.revert(None, None, delta2)
839
-
840
- def test_handle_network_deltas(self, mock_get_net_driver):
841
- mock_driver = mock.MagicMock()
842
- mock_get_net_driver.return_value = mock_driver
843
-
844
- self.load_balancer_mock.amphorae = [self.amphora_mock]
845
-
846
- subnet1 = uuidutils.generate_uuid()
847
- network1 = uuidutils.generate_uuid()
848
- port1 = uuidutils.generate_uuid()
849
- subnet2 = uuidutils.generate_uuid()
850
-
851
- def _interface(network_id, port_id=None, subnet_id=None):
852
- return data_models.Interface(
853
- network_id=network_id,
854
- port_id=port_id,
855
- fixed_ips=[
856
- data_models.FixedIP(
857
- subnet_id=subnet_id)])
858
-
859
- net = network_tasks.HandleNetworkDeltas()
860
-
861
- net.execute({}, self.load_balancer_mock)
862
- self.assertFalse(mock_driver.plug_network.called)
863
-
864
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
865
- compute_id=self.amphora_mock.compute_id,
866
- add_nics=[],
867
- delete_nics=[],
868
- add_subnets=[],
869
- delete_subnets=[])
870
- net.execute({self.amphora_mock.id: delta}, self.load_balancer_mock)
871
- self.assertFalse(mock_driver.plug_network.called)
872
-
873
- # Adding a subnet on a new network
874
- port = data_models.Port(
875
- id=port1,
876
- network_id=network1,
877
- fixed_ips=[
878
- data_models.FixedIP(subnet_id=subnet1)])
879
- mock_driver.get_port.return_value = port
880
- mock_driver.plug_fixed_ip.return_value = port
881
- mock_driver.get_network.return_value = data_models.Network(
882
- id=network1)
883
- mock_driver.get_subnet.return_value = data_models.Subnet(
884
- id=subnet1,
885
- network_id=network1)
886
- add_nics = [_interface(network1, subnet_id=subnet1)]
887
- add_subnets = [{
888
- 'subnet_id': subnet1,
889
- 'network_id': network1,
890
- 'port_id': None}]
891
-
892
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
893
- compute_id=self.amphora_mock.compute_id,
894
- add_nics=add_nics,
895
- delete_nics=[],
896
- add_subnets=add_subnets,
897
- delete_subnets=[])
898
- updated_ports = net.execute({self.amphora_mock.id: delta},
899
- self.load_balancer_mock)
900
- mock_driver.plug_network.assert_called_once_with(
901
- self.amphora_mock.compute_id, network1)
902
- mock_driver.unplug_network.assert_not_called()
903
-
904
- self.assertEqual(1, len(updated_ports))
905
-
906
- updated_port = updated_ports[self.amphora_mock.id][0]
907
- self.assertEqual(port1, updated_port.id)
908
- self.assertEqual(network1, updated_port.network_id)
909
- self.assertEqual(1, len(updated_port.fixed_ips))
910
- self.assertEqual(subnet1, updated_port.fixed_ips[0].subnet_id)
911
-
912
- # revert
913
- net.revert(None, {self.amphora_mock.id: delta},
914
- self.load_balancer_mock)
915
- mock_driver.unplug_network.assert_called_once_with(
916
- self.amphora_mock.compute_id, network1)
917
-
918
- # Adding a subnet on an existing network/port
919
- mock_driver.reset_mock()
920
- port = data_models.Port(
921
- id=port1,
922
- network_id=network1,
923
- fixed_ips=[
924
- data_models.FixedIP(subnet_id=subnet2),
925
- data_models.FixedIP(subnet_id=subnet1)])
926
- mock_driver.plug_fixed_ip.return_value = port
927
- mock_driver.get_network.return_value = data_models.Network(
928
- id=network1)
929
- mock_driver.get_subnet.side_effect = [
930
- data_models.Subnet(
931
- id=subnet2,
932
- network_id=network1),
933
- data_models.Subnet(
934
- id=subnet1,
935
- network_id=network1)]
936
- add_nics = [_interface(network1)]
937
- add_subnets = [{
938
- 'subnet_id': subnet1,
939
- 'network_id': network1,
940
- 'port_id': port1}]
941
-
942
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
943
- compute_id=self.amphora_mock.compute_id,
944
- add_nics=[],
945
- delete_nics=[],
946
- add_subnets=add_subnets,
947
- delete_subnets=[])
948
- updated_ports = net.execute({self.amphora_mock.id: delta},
949
- self.load_balancer_mock)
950
- mock_driver.plug_network.assert_not_called()
951
- mock_driver.unplug_network.assert_not_called()
952
- mock_driver.get_port.assert_not_called()
953
- mock_driver.plug_fixed_ip.assert_called_once_with(port_id=port1,
954
- subnet_id=subnet1)
955
- self.assertEqual(1, len(updated_ports))
956
-
957
- updated_port = updated_ports[self.amphora_mock.id][0]
958
- self.assertEqual(port1, updated_port.id)
959
- self.assertEqual(network1, updated_port.network_id)
960
- self.assertEqual(2, len(updated_port.fixed_ips))
961
- self.assertEqual(subnet2, updated_port.fixed_ips[0].subnet_id)
962
- self.assertEqual(subnet1, updated_port.fixed_ips[1].subnet_id)
963
-
964
- # Deleting a subnet
965
- mock_driver.reset_mock()
966
- delete_subnets = [{
967
- 'subnet_id': subnet1,
968
- 'network_id': network1,
969
- 'port_id': port1}]
970
- mock_driver.get_subnet.side_effect = [
971
- data_models.Subnet(
972
- id=subnet2,
973
- network_id=network1)]
974
- mock_driver.unplug_fixed_ip.return_value = data_models.Port(
975
- id=port1,
976
- network_id=network1,
977
- fixed_ips=[
978
- data_models.FixedIP(subnet_id=subnet2)])
979
-
980
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
981
- compute_id=self.amphora_mock.compute_id,
982
- add_nics=[],
983
- delete_nics=[],
984
- add_subnets=[],
985
- delete_subnets=delete_subnets)
986
- updated_ports = net.execute({self.amphora_mock.id: delta},
987
- self.load_balancer_mock)
988
- mock_driver.delete_port.assert_not_called()
989
- mock_driver.plug_network.assert_not_called()
990
- mock_driver.plug_fixed_ip.assert_not_called()
991
- self.assertEqual(1, len(updated_ports))
992
- self.assertEqual(1, len(updated_ports[self.amphora_mock.id]))
993
-
994
- updated_port = updated_ports[self.amphora_mock.id][0]
995
- self.assertEqual(port1, updated_port.id)
996
- self.assertEqual(network1, updated_port.network_id)
997
- self.assertEqual(1, len(updated_port.fixed_ips))
998
- self.assertEqual(subnet2, updated_port.fixed_ips[0].subnet_id)
999
-
1000
- # Deleting a subnet, but neutron doesn't unplug it
1001
- # Delta are empty because there's nothing to update
1002
- mock_driver.reset_mock()
1003
- delete_subnets = [{
1004
- 'subnet_id': subnet1,
1005
- 'network_id': network1,
1006
- 'port_id': port1}]
1007
- mock_driver.get_subnet.side_effect = [
1008
- data_models.Subnet(
1009
- id=subnet2,
1010
- network_id=network1),
1011
- data_models.Subnet(
1012
- id=subnet2,
1013
- network_id=network1)]
1014
- mock_driver.unplug_fixed_ip.return_value = data_models.Port(
1015
- id=port1,
1016
- network_id=network1,
1017
- fixed_ips=[
1018
- data_models.FixedIP(subnet_id=subnet1),
1019
- data_models.FixedIP(subnet_id=subnet2)])
1020
-
1021
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
1022
- compute_id=self.amphora_mock.compute_id,
1023
- add_nics=[],
1024
- delete_nics=[],
1025
- add_subnets=[],
1026
- delete_subnets=[])
1027
- net.execute({self.amphora_mock.id: delta},
1028
- self.load_balancer_mock)
1029
- mock_driver.delete_port.assert_not_called()
1030
- mock_driver.plug_network.assert_not_called()
1031
- mock_driver.plug_fixed_ip.assert_not_called()
1032
-
1033
- # Deleting a subnet and a network
1034
- mock_driver.reset_mock()
1035
- mock_driver.get_subnet.side_effect = [
1036
- data_models.Subnet(
1037
- id=subnet2,
1038
- network_id=network1),
1039
- data_models.Subnet(
1040
- id=subnet1,
1041
- network_id=network1)]
1042
- delete_nics = [_interface(network1, port_id=port1)]
1043
- delete_subnets = [{
1044
- 'subnet_id': subnet1,
1045
- 'network_id': network1,
1046
- 'port_id': port1}]
1047
-
1048
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
1049
- compute_id=self.amphora_mock.compute_id,
1050
- add_nics=[],
1051
- delete_nics=delete_nics,
1052
- add_subnets=[],
1053
- delete_subnets=delete_subnets)
1054
- updated_ports = net.execute({self.amphora_mock.id: delta},
1055
- self.load_balancer_mock)
1056
- mock_driver.delete_port.assert_called_once_with(port1)
1057
- mock_driver.plug_network.assert_not_called()
1058
- mock_driver.plug_fixed_ip.assert_not_called()
1059
- self.assertEqual(1, len(updated_ports))
1060
- self.assertEqual(0, len(updated_ports[self.amphora_mock.id]))
1061
-
1062
- # No delta, no actions
1063
- mock_driver.reset_mock()
1064
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
1065
- compute_id=self.amphora_mock.compute_id,
1066
- add_nics=[],
1067
- delete_nics=[],
1068
- add_subnets=[],
1069
- delete_subnets=[])
1070
- net.execute({self.amphora_mock.id: delta}, self.load_balancer_mock)
1071
- mock_driver.plug_network.assert_not_called()
1072
- mock_driver.plug_fixed_ip.assert_not_called()
1073
- mock_driver.unplug_network.assert_not_called()
1074
-
1075
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
1076
- compute_id=self.amphora_mock.compute_id,
1077
- add_nics=[_interface(1, port_id=12)],
1078
- delete_nics=[],
1079
- add_subnets=[],
1080
- delete_subnets=[])
1081
- mock_driver.reset_mock()
1082
- mock_driver.unplug_network.side_effect = TestException('test')
1083
- net.revert(None, {self.amphora_mock.id: delta},
1084
- self.load_balancer_mock)
1085
- mock_driver.unplug_network.assert_called_once_with(
1086
- self.amphora_mock.compute_id, 1)
1087
-
1088
- mock_driver.reset_mock()
1089
- mock_driver.delete_port.side_effect = TestException('test')
1090
- net.revert(None, {self.amphora_mock.id: delta},
1091
- self.load_balancer_mock)
1092
- mock_driver.unplug_network.assert_called_once_with(
1093
- self.amphora_mock.compute_id, 1)
1094
- mock_driver.delete_port.assert_called_once_with(12)
1095
-
1096
- mock_driver.reset_mock()
1097
- net.execute({}, self.load_balancer_mock)
1098
- self.assertFalse(mock_driver.unplug_network.called)
1099
-
1100
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
1101
- compute_id=self.amphora_mock.compute_id,
1102
- add_nics=[],
1103
- delete_nics=[],
1104
- add_subnets=[],
1105
- delete_subnets=[])
1106
- net.execute({self.amphora_mock.id: delta}, self.load_balancer_mock)
1107
- self.assertFalse(mock_driver.unplug_network.called)
1108
-
1109
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
1110
- compute_id=self.amphora_mock.compute_id,
1111
- add_nics=[],
1112
- delete_nics=[_interface(1)],
1113
- add_subnets=[],
1114
- delete_subnets=[])
1115
- net.execute({self.amphora_mock.id: delta}, self.load_balancer_mock)
1116
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
1117
-
1118
- mock_driver.reset_mock()
1119
- mock_driver.unplug_network.side_effect = net_base.NetworkNotFound
1120
- net.execute({self.amphora_mock.id: delta}, self.load_balancer_mock)
1121
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
1122
-
1123
- # Do a test with a general exception in case behavior changes
1124
- mock_driver.reset_mock()
1125
- mock_driver.unplug_network.side_effect = Exception()
1126
- net.execute({self.amphora_mock.id: delta}, self.load_balancer_mock)
1127
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
1128
-
1129
- # Do a test with a general exception in case behavior changes
1130
- delta = data_models.Delta(amphora_id=self.amphora_mock.id,
1131
- compute_id=self.amphora_mock.compute_id,
1132
- add_nics=[],
1133
- delete_nics=[_interface(1, port_id=12)],
1134
- add_subnets=[],
1135
- delete_subnets=[])
1136
- mock_driver.reset_mock()
1137
- mock_driver.delete_port.side_effect = Exception()
1138
- net.execute({self.amphora_mock.id: delta}, self.load_balancer_mock)
1139
- mock_driver.unplug_network.assert_called_once_with(COMPUTE_ID, 1)
1140
- mock_driver.delete_port.assert_called_once_with(12)
1141
-
1142
- mock_driver.unplug_network.reset_mock()
1143
- net.revert(
1144
- failure.Failure.from_exception(Exception('boom')), None, None)
1145
- mock_driver.unplug_network.assert_not_called()
1146
-
1147
- mock_driver.unplug_network.reset_mock()
1148
- net.revert(None, None, None)
1149
- mock_driver.unplug_network.assert_not_called()
1150
-
1151
- def test_plug_vip(self, mock_get_net_driver):
1152
- mock_driver = mock.MagicMock()
1153
- mock_get_net_driver.return_value = mock_driver
1154
- net = network_tasks.PlugVIP()
1155
-
1156
- mock_driver.plug_vip.return_value = ["vip"]
1157
-
1158
- data = net.execute(LB)
1159
- mock_driver.plug_vip.assert_called_once_with(LB, LB.vip)
1160
- self.assertEqual(["vip"], data)
1161
-
1162
- # revert
1163
- net.revert(["vip"], LB)
1164
- mock_driver.unplug_vip.assert_called_once_with(LB, LB.vip)
1165
-
1166
- # revert with exception
1167
- mock_driver.reset_mock()
1168
- mock_driver.unplug_vip.side_effect = Exception('UnplugVipException')
1169
- net.revert(["vip"], LB)
1170
- mock_driver.unplug_vip.assert_called_once_with(LB, LB.vip)
1171
-
1172
- @mock.patch('octavia.controller.worker.task_utils.TaskUtils.'
1173
- 'get_current_loadbalancer_from_db')
1174
- def test_apply_qos_on_creation(self, mock_get_lb_db, mock_get_net_driver):
1175
- mock_driver = mock.MagicMock()
1176
- mock_get_net_driver.return_value = mock_driver
1177
- net = network_tasks.ApplyQos()
1178
- mock_get_lb_db.return_value = LB
1179
-
1180
- # execute
1181
- UPDATE_DICT[constants.TOPOLOGY] = constants.TOPOLOGY_SINGLE
1182
- update_dict = UPDATE_DICT
1183
- net.execute(LB, [AMPS_DATA[0]], update_dict)
1184
- mock_driver.apply_qos_on_port.assert_called_once_with(
1185
- VIP.qos_policy_id, AMPS_DATA[0].vrrp_port_id)
1186
- self.assertEqual(1, mock_driver.apply_qos_on_port.call_count)
1187
- standby_topology = constants.TOPOLOGY_ACTIVE_STANDBY
1188
- mock_driver.reset_mock()
1189
- update_dict[constants.TOPOLOGY] = standby_topology
1190
- net.execute(LB, AMPS_DATA, update_dict)
1191
- mock_driver.apply_qos_on_port.assert_called_with(
1192
- t_constants.MOCK_QOS_POLICY_ID1, mock.ANY)
1193
- self.assertEqual(2, mock_driver.apply_qos_on_port.call_count)
1194
-
1195
- # revert
1196
- mock_driver.reset_mock()
1197
- update_dict = UPDATE_DICT
1198
- net.revert(None, LB, [AMPS_DATA[0]], update_dict)
1199
- self.assertEqual(0, mock_driver.apply_qos_on_port.call_count)
1200
- mock_driver.reset_mock()
1201
- update_dict[constants.TOPOLOGY] = standby_topology
1202
- net.revert(None, LB, AMPS_DATA, update_dict)
1203
- self.assertEqual(0, mock_driver.apply_qos_on_port.call_count)
1204
-
1205
- @mock.patch('octavia.controller.worker.task_utils.TaskUtils.'
1206
- 'get_current_loadbalancer_from_db')
1207
- def test_apply_qos_on_update(self, mock_get_lb_db, mock_get_net_driver):
1208
- mock_driver = mock.MagicMock()
1209
- mock_get_net_driver.return_value = mock_driver
1210
- net = network_tasks.ApplyQos()
1211
- null_qos_vip = o_data_models.Vip(qos_policy_id=None)
1212
- null_qos_lb = o_data_models.LoadBalancer(
1213
- vip=null_qos_vip, topology=constants.TOPOLOGY_SINGLE,
1214
- amphorae=[AMPS_DATA[0]])
1215
-
1216
- tmp_vip_object = o_data_models.Vip(
1217
- qos_policy_id=t_constants.MOCK_QOS_POLICY_ID1)
1218
- tmp_lb = o_data_models.LoadBalancer(
1219
- vip=tmp_vip_object, topology=constants.TOPOLOGY_SINGLE,
1220
- amphorae=[AMPS_DATA[0]])
1221
-
1222
- # execute
1223
- update_dict = {'description': 'fool'}
1224
- net.execute(tmp_lb, update_dict=update_dict)
1225
- mock_driver.apply_qos_on_port.assert_called_once_with(
1226
- t_constants.MOCK_QOS_POLICY_ID1, AMPS_DATA[0].vrrp_port_id)
1227
- self.assertEqual(1, mock_driver.apply_qos_on_port.call_count)
1228
-
1229
- mock_driver.reset_mock()
1230
- update_dict = {'vip': {'qos_policy_id': None}}
1231
- net.execute(null_qos_lb, update_dict=update_dict)
1232
- mock_driver.apply_qos_on_port.assert_called_once_with(
1233
- None, AMPS_DATA[0].vrrp_port_id)
1234
- self.assertEqual(1, mock_driver.apply_qos_on_port.call_count)
1235
-
1236
- mock_driver.reset_mock()
1237
- update_dict = {'name': '123'}
1238
- net.execute(null_qos_lb, update_dict=update_dict)
1239
- self.assertEqual(0, mock_driver.apply_qos_on_port.call_count)
1240
-
1241
- mock_driver.reset_mock()
1242
- update_dict = {'description': 'fool'}
1243
- tmp_lb.amphorae = AMPS_DATA
1244
- tmp_lb.topology = constants.TOPOLOGY_ACTIVE_STANDBY
1245
- net.execute(tmp_lb, update_dict=update_dict)
1246
- mock_driver.apply_qos_on_port.assert_called_with(
1247
- t_constants.MOCK_QOS_POLICY_ID1, mock.ANY)
1248
- self.assertEqual(2, mock_driver.apply_qos_on_port.call_count)
1249
-
1250
- mock_driver.reset_mock()
1251
- update_dict = {'description': 'fool',
1252
- 'vip': {
1253
- 'qos_policy_id': t_constants.MOCK_QOS_POLICY_ID1}}
1254
- tmp_lb.amphorae = AMPS_DATA
1255
- tmp_lb.topology = constants.TOPOLOGY_ACTIVE_STANDBY
1256
- net.execute(tmp_lb, update_dict=update_dict)
1257
- mock_driver.apply_qos_on_port.assert_called_with(
1258
- t_constants.MOCK_QOS_POLICY_ID1, mock.ANY)
1259
- self.assertEqual(2, mock_driver.apply_qos_on_port.call_count)
1260
-
1261
- mock_driver.reset_mock()
1262
- update_dict = {}
1263
- net.execute(null_qos_lb, update_dict=update_dict)
1264
- self.assertEqual(0, mock_driver.apply_qos_on_port.call_count)
1265
-
1266
- # revert
1267
- mock_driver.reset_mock()
1268
- tmp_lb.amphorae = [AMPS_DATA[0]]
1269
- tmp_lb.topology = constants.TOPOLOGY_SINGLE
1270
- update_dict = {'description': 'fool'}
1271
- mock_get_lb_db.return_value = tmp_lb
1272
- net.revert(None, tmp_lb, update_dict=update_dict)
1273
- self.assertEqual(0, mock_driver.apply_qos_on_port.call_count)
1274
-
1275
- mock_driver.reset_mock()
1276
- update_dict = {'vip': {'qos_policy_id': None}}
1277
- ori_lb_db = LB2
1278
- ori_lb_db.amphorae = [AMPS_DATA[0]]
1279
- mock_get_lb_db.return_value = ori_lb_db
1280
- net.revert(None, null_qos_lb, update_dict=update_dict)
1281
- mock_driver.apply_qos_on_port.assert_called_once_with(
1282
- t_constants.MOCK_QOS_POLICY_ID2, AMPS_DATA[0].vrrp_port_id)
1283
- self.assertEqual(1, mock_driver.apply_qos_on_port.call_count)
1284
-
1285
- mock_driver.reset_mock()
1286
- update_dict = {'vip': {
1287
- 'qos_policy_id': t_constants.MOCK_QOS_POLICY_ID2}}
1288
- tmp_lb.amphorae = AMPS_DATA
1289
- tmp_lb.topology = constants.TOPOLOGY_ACTIVE_STANDBY
1290
- ori_lb_db = LB2
1291
- ori_lb_db.amphorae = [AMPS_DATA[0]]
1292
- mock_get_lb_db.return_value = ori_lb_db
1293
- net.revert(None, tmp_lb, update_dict=update_dict)
1294
- mock_driver.apply_qos_on_port.assert_called_with(
1295
- t_constants.MOCK_QOS_POLICY_ID2, mock.ANY)
1296
- self.assertEqual(2, mock_driver.apply_qos_on_port.call_count)
1297
-
1298
- def test_unplug_vip(self, mock_get_net_driver):
1299
- mock_driver = mock.MagicMock()
1300
- mock_get_net_driver.return_value = mock_driver
1301
- net = network_tasks.UnplugVIP()
1302
-
1303
- net.execute(LB)
1304
- mock_driver.unplug_vip.assert_called_once_with(LB, LB.vip)
1305
-
1306
- def test_allocate_vip(self, mock_get_net_driver):
1307
- mock_driver = mock.MagicMock()
1308
- mock_get_net_driver.return_value = mock_driver
1309
- net = network_tasks.AllocateVIP()
1310
-
1311
- mock_driver.allocate_vip.return_value = (LB.vip, [])
1312
-
1313
- mock_driver.reset_mock()
1314
- self.assertEqual(LB.vip, net.execute(LB))
1315
- mock_driver.allocate_vip.assert_called_once_with(LB)
1316
-
1317
- # revert
1318
- vip_mock = mock.MagicMock()
1319
- net.revert(vip_mock, LB)
1320
- mock_driver.deallocate_vip.assert_called_once_with(vip_mock)
1321
-
1322
- # revert exception
1323
- mock_driver.reset_mock()
1324
- mock_driver.deallocate_vip.side_effect = Exception('DeallVipException')
1325
- vip_mock = mock.MagicMock()
1326
- net.revert(vip_mock, LB)
1327
- mock_driver.deallocate_vip.assert_called_once_with(vip_mock)
1328
-
1329
- def test_allocate_vip_for_failover(self, mock_get_net_driver):
1330
- mock_driver = mock.MagicMock()
1331
- mock_get_net_driver.return_value = mock_driver
1332
- net = network_tasks.AllocateVIPforFailover()
1333
-
1334
- mock_driver.allocate_vip.return_value = (LB.vip, [])
1335
-
1336
- mock_driver.reset_mock()
1337
- self.assertEqual(LB.vip, net.execute(LB))
1338
- mock_driver.allocate_vip.assert_called_once_with(LB)
1339
-
1340
- # revert
1341
- vip_mock = mock.MagicMock()
1342
- net.revert(vip_mock, LB)
1343
- mock_driver.deallocate_vip.assert_not_called()
1344
-
1345
- def test_deallocate_vip(self, mock_get_net_driver):
1346
- mock_driver = mock.MagicMock()
1347
- mock_get_net_driver.return_value = mock_driver
1348
- net = network_tasks.DeallocateVIP()
1349
- vip = o_data_models.Vip()
1350
- lb = o_data_models.LoadBalancer(vip=vip)
1351
- net.execute(lb)
1352
- mock_driver.deallocate_vip.assert_called_once_with(lb.vip)
1353
-
1354
- def test_update_vip(self, mock_get_net_driver):
1355
- mock_driver = mock.MagicMock()
1356
- mock_get_net_driver.return_value = mock_driver
1357
- vip = o_data_models.Vip()
1358
- lb = o_data_models.LoadBalancer(vip=vip)
1359
- net_task = network_tasks.UpdateVIP()
1360
- net_task.execute(lb)
1361
- mock_driver.update_vip.assert_called_once_with(lb)
1362
-
1363
- def test_update_vip_for_delete(self, mock_get_net_driver):
1364
- mock_driver = mock.MagicMock()
1365
- mock_get_net_driver.return_value = mock_driver
1366
- vip = o_data_models.Vip()
1367
- lb = o_data_models.LoadBalancer(vip=vip)
1368
- net_task = network_tasks.UpdateVIPForDelete()
1369
- net_task.execute(lb)
1370
- mock_driver.update_vip.assert_called_once_with(lb, for_delete=True)
1371
-
1372
- @mock.patch('octavia.db.api.get_session', return_value='TEST')
1373
- @mock.patch('octavia.db.repositories.AmphoraRepository.get')
1374
- @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
1375
- def test_get_amphora_network_configs_by_id(
1376
- self, mock_lb_get, mock_amp_get,
1377
- mock_get_session, mock_get_net_driver):
1378
- LB_ID = uuidutils.generate_uuid()
1379
- AMP_ID = uuidutils.generate_uuid()
1380
- mock_driver = mock.MagicMock()
1381
- mock_get_net_driver.return_value = mock_driver
1382
- mock_amp_get.return_value = 'mock amphora'
1383
- mock_lb_get.return_value = 'mock load balancer'
1384
-
1385
- net_task = network_tasks.GetAmphoraNetworkConfigsByID()
1386
-
1387
- net_task.execute(LB_ID, AMP_ID)
1388
-
1389
- mock_driver.get_network_configs.assert_called_once_with(
1390
- 'mock load balancer', amphora='mock amphora')
1391
- mock_amp_get.assert_called_once_with('TEST', id=AMP_ID)
1392
- mock_lb_get.assert_called_once_with('TEST', id=LB_ID)
1393
-
1394
- @mock.patch('octavia.db.api.get_session', return_value='TEST')
1395
- @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
1396
- def test_get_amphorae_network_configs(self, mock_lb_get, mock_get_session,
1397
- mock_get_net_driver):
1398
- mock_driver = mock.MagicMock()
1399
- mock_get_net_driver.return_value = mock_driver
1400
- lb = o_data_models.LoadBalancer()
1401
- mock_lb_get.return_value = lb
1402
- net_task = network_tasks.GetAmphoraeNetworkConfigs()
1403
- net_task.execute(lb.id)
1404
- mock_lb_get.assert_called_once_with('TEST', id=lb.id)
1405
- mock_driver.get_network_configs.assert_called_once_with(lb)
1406
-
1407
- def test_failover_preparation_for_amphora(self, mock_get_net_driver):
1408
- mock_driver = mock.MagicMock()
1409
- mock_get_net_driver.return_value = mock_driver
1410
- failover = network_tasks.FailoverPreparationForAmphora()
1411
- amphora = o_data_models.Amphora(id=AMPHORA_ID,
1412
- lb_network_ip=IP_ADDRESS)
1413
- failover.execute(amphora)
1414
- mock_driver.failover_preparation.assert_called_once_with(amphora)
1415
-
1416
- def test_retrieve_portids_on_amphora_except_lb_network(
1417
- self, mock_get_net_driver):
1418
- mock_driver = mock.MagicMock()
1419
- mock_get_net_driver.return_value = mock_driver
1420
-
1421
- def _interface(port_id):
1422
- return [data_models.Interface(port_id=port_id)]
1423
-
1424
- net_task = network_tasks.RetrievePortIDsOnAmphoraExceptLBNetwork()
1425
- amphora = o_data_models.Amphora(id=AMPHORA_ID, compute_id=COMPUTE_ID,
1426
- lb_network_ip=IP_ADDRESS)
1427
-
1428
- mock_driver.get_plugged_networks.return_value = []
1429
- net_task.execute(amphora)
1430
- mock_driver.get_plugged_networks.assert_called_once_with(
1431
- compute_id=COMPUTE_ID)
1432
- self.assertFalse(mock_driver.get_port.called)
1433
-
1434
- mock_driver.reset_mock()
1435
- net_task = network_tasks.RetrievePortIDsOnAmphoraExceptLBNetwork()
1436
- mock_driver.get_plugged_networks.return_value = _interface(1)
1437
- net_task.execute(amphora)
1438
- mock_driver.get_port.assert_called_once_with(port_id=1)
1439
-
1440
- mock_driver.reset_mock()
1441
- net_task = network_tasks.RetrievePortIDsOnAmphoraExceptLBNetwork()
1442
- port_mock = mock.MagicMock()
1443
- fixed_ip_mock = mock.MagicMock()
1444
- fixed_ip_mock.ip_address = IP_ADDRESS
1445
- port_mock.fixed_ips = [fixed_ip_mock]
1446
- mock_driver.get_plugged_networks.return_value = _interface(1)
1447
- mock_driver.get_port.return_value = port_mock
1448
- ports = net_task.execute(amphora)
1449
- self.assertEqual([], ports)
1450
-
1451
- mock_driver.reset_mock()
1452
- net_task = network_tasks.RetrievePortIDsOnAmphoraExceptLBNetwork()
1453
- port_mock = mock.MagicMock()
1454
- fixed_ip_mock = mock.MagicMock()
1455
- fixed_ip_mock.ip_address = "172.17.17.17"
1456
- port_mock.fixed_ips = [fixed_ip_mock]
1457
- mock_driver.get_plugged_networks.return_value = _interface(1)
1458
- mock_driver.get_port.return_value = port_mock
1459
- ports = net_task.execute(amphora)
1460
- self.assertEqual(1, len(ports))
1461
-
1462
- def test_plug_ports(self, mock_get_net_driver):
1463
- mock_driver = mock.MagicMock()
1464
- mock_get_net_driver.return_value = mock_driver
1465
-
1466
- amphora = mock.MagicMock()
1467
- port1 = mock.MagicMock()
1468
- port2 = mock.MagicMock()
1469
-
1470
- plugports = network_tasks.PlugPorts()
1471
- plugports.execute(amphora, [port1, port2])
1472
-
1473
- mock_driver.plug_port.assert_any_call(amphora, port1)
1474
- mock_driver.plug_port.assert_any_call(amphora, port2)
1475
-
1476
- @mock.patch('octavia.db.api.get_session', return_value='TEST')
1477
- @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
1478
- def test_update_vip_sg(self, mock_lb_get, mock_get_session,
1479
- mock_get_net_driver):
1480
- mock_driver = mock.MagicMock()
1481
- mock_driver.update_vip_sg.return_value = SG_ID
1482
- mock_get_net_driver.return_value = mock_driver
1483
- mock_lb_get.return_value = self.load_balancer_mock
1484
- net = network_tasks.UpdateVIPSecurityGroup()
1485
-
1486
- sg_id = net.execute(self.load_balancer_mock.id)
1487
- mock_lb_get.assert_called_once_with('TEST',
1488
- id=self.load_balancer_mock.id)
1489
- mock_driver.update_vip_sg.assert_called_once_with(
1490
- self.load_balancer_mock, self.load_balancer_mock.vip)
1491
- self.assertEqual(sg_id, SG_ID)
1492
-
1493
- def test_get_subnet_from_vip(self, mock_get_net_driver):
1494
- mock_driver = mock.MagicMock()
1495
- mock_get_net_driver.return_value = mock_driver
1496
- net = network_tasks.GetSubnetFromVIP()
1497
-
1498
- net.execute(LB)
1499
- mock_driver.get_subnet.assert_called_once_with(LB.vip.subnet_id)
1500
-
1501
- def test_plug_vip_amphora(self, mock_get_net_driver):
1502
- mock_driver = mock.MagicMock()
1503
- mock_get_net_driver.return_value = mock_driver
1504
- net = network_tasks.PlugVIPAmpphora()
1505
- mockSubnet = mock.MagicMock()
1506
- net.execute(LB, self.amphora_mock, mockSubnet)
1507
- mock_driver.plug_aap_port.assert_called_once_with(
1508
- LB, LB.vip, self.amphora_mock, mockSubnet)
1509
-
1510
- def test_revert_plug_vip_amphora(self, mock_get_net_driver):
1511
- mock_driver = mock.MagicMock()
1512
- mock_get_net_driver.return_value = mock_driver
1513
- net = network_tasks.PlugVIPAmpphora()
1514
- mockSubnet = mock.MagicMock()
1515
- net.revert(AMPS_DATA[0], LB, self.amphora_mock, mockSubnet)
1516
- mock_driver.unplug_aap_port.assert_called_once_with(
1517
- LB.vip, self.amphora_mock, mockSubnet)
1518
-
1519
- @mock.patch('octavia.controller.worker.v1.tasks.network_tasks.DeletePort.'
1520
- 'update_progress')
1521
- def test_delete_port(self, mock_update_progress, mock_get_net_driver):
1522
- PORT_ID = uuidutils.generate_uuid()
1523
- mock_driver = mock.MagicMock()
1524
- mock_get_net_driver.return_value = mock_driver
1525
- mock_driver.delete_port.side_effect = [
1526
- mock.DEFAULT, exceptions.OctaviaException('boom'), mock.DEFAULT,
1527
- exceptions.OctaviaException('boom'),
1528
- exceptions.OctaviaException('boom'),
1529
- exceptions.OctaviaException('boom'),
1530
- exceptions.OctaviaException('boom'),
1531
- exceptions.OctaviaException('boom'),
1532
- exceptions.OctaviaException('boom')]
1533
- mock_driver.admin_down_port.side_effect = [
1534
- mock.DEFAULT, exceptions.OctaviaException('boom')]
1535
-
1536
- net_task = network_tasks.DeletePort()
1537
-
1538
- # Limit the retry attempts for the test run to save time
1539
- net_task.execute.retry.stop = tenacity.stop_after_attempt(2)
1540
-
1541
- # Test port ID is None (no-op)
1542
- net_task.execute(None)
1543
-
1544
- mock_update_progress.assert_not_called()
1545
- mock_driver.delete_port.assert_not_called()
1546
-
1547
- # Test successful delete
1548
- mock_update_progress.reset_mock()
1549
- mock_driver.reset_mock()
1550
-
1551
- net_task.execute(PORT_ID)
1552
-
1553
- mock_update_progress.assert_called_once_with(0.5)
1554
- mock_driver.delete_port.assert_called_once_with(PORT_ID)
1555
-
1556
- # Test exception and successful retry
1557
- mock_update_progress.reset_mock()
1558
- mock_driver.reset_mock()
1559
-
1560
- net_task.execute(PORT_ID)
1561
-
1562
- mock_update_progress.assert_has_calls([mock.call(0.5), mock.call(1.0)])
1563
- mock_driver.delete_port.assert_has_calls([mock.call(PORT_ID),
1564
- mock.call(PORT_ID)])
1565
-
1566
- # Test passive failure
1567
- mock_update_progress.reset_mock()
1568
- mock_driver.reset_mock()
1569
-
1570
- net_task.execute(PORT_ID, passive_failure=True)
1571
-
1572
- mock_update_progress.assert_has_calls([mock.call(0.5), mock.call(1.0)])
1573
- mock_driver.delete_port.assert_has_calls([mock.call(PORT_ID),
1574
- mock.call(PORT_ID)])
1575
- mock_driver.admin_down_port.assert_called_once_with(PORT_ID)
1576
-
1577
- # Test passive failure admin down failure
1578
- mock_update_progress.reset_mock()
1579
- mock_driver.reset_mock()
1580
- mock_driver.admin_down_port.reset_mock()
1581
-
1582
- net_task.execute(PORT_ID, passive_failure=True)
1583
-
1584
- mock_update_progress.assert_has_calls([mock.call(0.5), mock.call(1.0)])
1585
- mock_driver.delete_port.assert_has_calls([mock.call(PORT_ID),
1586
- mock.call(PORT_ID)])
1587
- mock_driver.admin_down_port.assert_called_once_with(PORT_ID)
1588
-
1589
- # Test non-passive failure
1590
- mock_update_progress.reset_mock()
1591
- mock_driver.reset_mock()
1592
- mock_driver.admin_down_port.reset_mock()
1593
-
1594
- mock_driver.admin_down_port.side_effect = [
1595
- exceptions.OctaviaException('boom')]
1596
-
1597
- self.assertRaises(exceptions.OctaviaException, net_task.execute,
1598
- PORT_ID)
1599
-
1600
- mock_update_progress.assert_has_calls([mock.call(0.5), mock.call(1.0)])
1601
- mock_driver.delete_port.assert_has_calls([mock.call(PORT_ID),
1602
- mock.call(PORT_ID)])
1603
- mock_driver.admin_down_port.assert_not_called()
1604
-
1605
- def test_create_vip_base_port(self, mock_get_net_driver):
1606
- AMP_ID = uuidutils.generate_uuid()
1607
- PORT_ID = uuidutils.generate_uuid()
1608
- VIP_NETWORK_ID = uuidutils.generate_uuid()
1609
- VIP_QOS_ID = uuidutils.generate_uuid()
1610
- VIP_SG_ID = uuidutils.generate_uuid()
1611
- VIP_SUBNET_ID = uuidutils.generate_uuid()
1612
- VIP_IP_ADDRESS = '203.0.113.81'
1613
- mock_driver = mock.MagicMock()
1614
- mock_get_net_driver.return_value = mock_driver
1615
- vip_mock = mock.MagicMock()
1616
- vip_mock.ip_address = VIP_IP_ADDRESS
1617
- vip_mock.network_id = VIP_NETWORK_ID
1618
- vip_mock.qos_policy_id = VIP_QOS_ID
1619
- vip_mock.subnet_id = VIP_SUBNET_ID
1620
- port_mock = mock.MagicMock()
1621
- port_mock.id = PORT_ID
1622
-
1623
- mock_driver.create_port.side_effect = [
1624
- port_mock, exceptions.OctaviaException('boom'),
1625
- exceptions.OctaviaException('boom'),
1626
- exceptions.OctaviaException('boom')]
1627
- mock_driver.delete_port.side_effect = [mock.DEFAULT, Exception('boom')]
1628
-
1629
- net_task = network_tasks.CreateVIPBasePort()
1630
-
1631
- # Limit the retry attempts for the test run to save time
1632
- net_task.execute.retry.stop = tenacity.stop_after_attempt(2)
1633
-
1634
- # Test execute
1635
- result = net_task.execute(vip_mock, VIP_SG_ID, AMP_ID)
1636
-
1637
- self.assertEqual(port_mock, result)
1638
- mock_driver.create_port.assert_called_once_with(
1639
- VIP_NETWORK_ID, name=constants.AMP_BASE_PORT_PREFIX + AMP_ID,
1640
- fixed_ips=[{constants.SUBNET_ID: VIP_SUBNET_ID}],
1641
- secondary_ips=[VIP_IP_ADDRESS], security_group_ids=[VIP_SG_ID],
1642
- qos_policy_id=VIP_QOS_ID)
1643
-
1644
- # Test execute exception
1645
- mock_driver.reset_mock()
1646
-
1647
- self.assertRaises(exceptions.OctaviaException, net_task.execute,
1648
- vip_mock, None, AMP_ID)
1649
-
1650
- # Test revert when this task failed
1651
- mock_driver.reset_mock()
1652
-
1653
- net_task.revert(failure.Failure.from_exception(Exception('boom')),
1654
- vip_mock, VIP_SG_ID, AMP_ID)
1655
-
1656
- mock_driver.delete_port.assert_not_called()
1657
-
1658
- # Test revert
1659
- mock_driver.reset_mock()
1660
-
1661
- net_task.revert([port_mock], vip_mock, VIP_SG_ID, AMP_ID)
1662
-
1663
- mock_driver.delete_port.assert_called_once_with(PORT_ID)
1664
-
1665
- # Test revert exception
1666
- mock_driver.reset_mock()
1667
-
1668
- net_task.revert([port_mock], vip_mock, VIP_SG_ID, AMP_ID)
1669
-
1670
- mock_driver.delete_port.assert_called_once_with(PORT_ID)
1671
-
1672
- @mock.patch('time.sleep')
1673
- def test_admin_down_port(self, mock_sleep, mock_get_net_driver):
1674
- PORT_ID = uuidutils.generate_uuid()
1675
- mock_driver = mock.MagicMock()
1676
- mock_get_net_driver.return_value = mock_driver
1677
- port_down_mock = mock.MagicMock()
1678
- port_down_mock.status = constants.DOWN
1679
- port_up_mock = mock.MagicMock()
1680
- port_up_mock.status = constants.UP
1681
- mock_driver.set_port_admin_state_up.side_effect = [
1682
- mock.DEFAULT, net_base.PortNotFound, mock.DEFAULT, mock.DEFAULT,
1683
- Exception('boom')]
1684
- mock_driver.get_port.side_effect = [port_down_mock, port_up_mock]
1685
-
1686
- net_task = network_tasks.AdminDownPort()
1687
-
1688
- # Test execute
1689
- net_task.execute(PORT_ID)
1690
-
1691
- mock_driver.set_port_admin_state_up.assert_called_once_with(PORT_ID,
1692
- False)
1693
- mock_driver.get_port.assert_called_once_with(PORT_ID)
1694
-
1695
- # Test passive fail on port not found
1696
- mock_driver.reset_mock()
1697
-
1698
- net_task.execute(PORT_ID)
1699
-
1700
- mock_driver.set_port_admin_state_up.assert_called_once_with(PORT_ID,
1701
- False)
1702
- mock_driver.get_port.assert_not_called()
1703
-
1704
- # Test passive fail on port stays up
1705
- mock_driver.reset_mock()
1706
-
1707
- net_task.execute(PORT_ID)
1708
-
1709
- mock_driver.set_port_admin_state_up.assert_called_once_with(PORT_ID,
1710
- False)
1711
- mock_driver.get_port.assert_called_once_with(PORT_ID)
1712
-
1713
- # Test revert when this task failed
1714
- mock_driver.reset_mock()
1715
-
1716
- net_task.revert(failure.Failure.from_exception(Exception('boom')),
1717
- PORT_ID)
1718
-
1719
- mock_driver.set_port_admin_state_up.assert_not_called()
1720
-
1721
- # Test revert
1722
- mock_driver.reset_mock()
1723
-
1724
- net_task.revert(None, PORT_ID)
1725
-
1726
- mock_driver.set_port_admin_state_up.assert_called_once_with(PORT_ID,
1727
- True)
1728
-
1729
- # Test revert exception passive failure
1730
- mock_driver.reset_mock()
1731
-
1732
- net_task.revert(None, PORT_ID)
1733
-
1734
- mock_driver.set_port_admin_state_up.assert_called_once_with(PORT_ID,
1735
- True)
1736
-
1737
- @mock.patch('octavia.common.utils.get_vip_security_group_name')
1738
- def test_get_vip_security_group_id(self, mock_get_sg_name,
1739
- mock_get_net_driver):
1740
- LB_ID = uuidutils.generate_uuid()
1741
- SG_ID = uuidutils.generate_uuid()
1742
- SG_NAME = 'fake_SG_name'
1743
- mock_driver = mock.MagicMock()
1744
- mock_get_net_driver.return_value = mock_driver
1745
- mock_get_sg_name.return_value = SG_NAME
1746
- sg_mock = mock.MagicMock()
1747
- sg_mock.id = SG_ID
1748
- mock_driver.get_security_group.side_effect = [
1749
- sg_mock, None, net_base.SecurityGroupNotFound,
1750
- net_base.SecurityGroupNotFound]
1751
-
1752
- net_task = network_tasks.GetVIPSecurityGroupID()
1753
-
1754
- # Test execute
1755
- result = net_task.execute(LB_ID)
1756
-
1757
- mock_driver.get_security_group.assert_called_once_with(SG_NAME)
1758
- mock_get_sg_name.assert_called_once_with(LB_ID)
1759
-
1760
- # Test execute with empty get subnet response
1761
- mock_driver.reset_mock()
1762
- mock_get_sg_name.reset_mock()
1763
-
1764
- result = net_task.execute(LB_ID)
1765
-
1766
- self.assertIsNone(result)
1767
- mock_get_sg_name.assert_called_once_with(LB_ID)
1768
-
1769
- # Test execute no security group found, security groups enabled
1770
- mock_driver.reset_mock()
1771
- mock_get_sg_name.reset_mock()
1772
- mock_driver.sec_grp_enabled = True
1773
-
1774
- self.assertRaises(net_base.SecurityGroupNotFound, net_task.execute,
1775
- LB_ID)
1776
- mock_driver.get_security_group.assert_called_once_with(SG_NAME)
1777
- mock_get_sg_name.assert_called_once_with(LB_ID)
1778
-
1779
- # Test execute no security group found, security groups disabled
1780
- mock_driver.reset_mock()
1781
- mock_get_sg_name.reset_mock()
1782
- mock_driver.sec_grp_enabled = False
1783
-
1784
- result = net_task.execute(LB_ID)
1785
-
1786
- self.assertIsNone(result)
1787
- mock_driver.get_security_group.assert_called_once_with(SG_NAME)
1788
- mock_get_sg_name.assert_called_once_with(LB_ID)