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,692 +0,0 @@
1
- # Copyright 2015 Hewlett-Packard Development Company, L.P.
2
- # Copyright 2020 Red Hat, Inc. All rights reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License"); you may
5
- # not use this file except in compliance with the License. You may obtain
6
- # a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
- # License for the specific language governing permissions and limitations
14
- # under the License.
15
- #
16
-
17
- from oslo_config import cfg
18
- from oslo_log import log as logging
19
- from taskflow.patterns import linear_flow
20
- from taskflow.patterns import unordered_flow
21
-
22
- from octavia.common import constants
23
- from octavia.common import exceptions
24
- from octavia.common import utils
25
- from octavia.controller.worker.v1.flows import amphora_flows
26
- from octavia.controller.worker.v1.flows import listener_flows
27
- from octavia.controller.worker.v1.flows import member_flows
28
- from octavia.controller.worker.v1.flows import pool_flows
29
- from octavia.controller.worker.v1.tasks import amphora_driver_tasks
30
- from octavia.controller.worker.v1.tasks import compute_tasks
31
- from octavia.controller.worker.v1.tasks import database_tasks
32
- from octavia.controller.worker.v1.tasks import lifecycle_tasks
33
- from octavia.controller.worker.v1.tasks import network_tasks
34
-
35
- CONF = cfg.CONF
36
- LOG = logging.getLogger(__name__)
37
-
38
-
39
- class LoadBalancerFlows(object):
40
-
41
- def __init__(self):
42
- self.amp_flows = amphora_flows.AmphoraFlows()
43
- self.listener_flows = listener_flows.ListenerFlows()
44
- self.pool_flows = pool_flows.PoolFlows()
45
- self.member_flows = member_flows.MemberFlows()
46
-
47
- def get_create_load_balancer_flow(self, topology, listeners=None):
48
- """Creates a conditional graph flow that allocates a loadbalancer.
49
-
50
- :raises InvalidTopology: Invalid topology specified
51
- :return: The graph flow for creating a loadbalancer.
52
- """
53
- f_name = constants.CREATE_LOADBALANCER_FLOW
54
- lb_create_flow = linear_flow.Flow(f_name)
55
-
56
- lb_create_flow.add(lifecycle_tasks.LoadBalancerIDToErrorOnRevertTask(
57
- requires=constants.LOADBALANCER_ID))
58
-
59
- # allocate VIP
60
- lb_create_flow.add(database_tasks.ReloadLoadBalancer(
61
- name=constants.RELOAD_LB_BEFOR_ALLOCATE_VIP,
62
- requires=constants.LOADBALANCER_ID,
63
- provides=constants.LOADBALANCER
64
- ))
65
- lb_create_flow.add(network_tasks.AllocateVIP(
66
- requires=constants.LOADBALANCER,
67
- provides=constants.VIP))
68
- lb_create_flow.add(database_tasks.UpdateVIPAfterAllocation(
69
- requires=(constants.LOADBALANCER_ID, constants.VIP),
70
- provides=constants.LOADBALANCER))
71
- lb_create_flow.add(network_tasks.UpdateVIPSecurityGroup(
72
- requires=constants.LOADBALANCER_ID))
73
- lb_create_flow.add(network_tasks.GetSubnetFromVIP(
74
- requires=constants.LOADBALANCER,
75
- provides=constants.SUBNET))
76
-
77
- if topology == constants.TOPOLOGY_ACTIVE_STANDBY:
78
- lb_create_flow.add(*self._create_active_standby_topology())
79
- elif topology == constants.TOPOLOGY_SINGLE:
80
- lb_create_flow.add(*self._create_single_topology())
81
- else:
82
- LOG.error("Unknown topology: %s. Unable to build load balancer.",
83
- topology)
84
- raise exceptions.InvalidTopology(topology=topology)
85
-
86
- post_amp_prefix = constants.POST_LB_AMP_ASSOCIATION_SUBFLOW
87
- lb_create_flow.add(
88
- self.get_post_lb_amp_association_flow(
89
- post_amp_prefix, topology, mark_active=not listeners))
90
-
91
- if listeners:
92
- lb_create_flow.add(*self._create_listeners_flow())
93
-
94
- return lb_create_flow
95
-
96
- def _create_single_topology(self):
97
- sf_name = (constants.ROLE_STANDALONE + '-' +
98
- constants.AMP_PLUG_NET_SUBFLOW)
99
- amp_for_lb_net_flow = linear_flow.Flow(sf_name)
100
- amp_for_lb_flow = self.amp_flows.get_amphora_for_lb_subflow(
101
- prefix=constants.ROLE_STANDALONE,
102
- role=constants.ROLE_STANDALONE)
103
- amp_for_lb_net_flow.add(amp_for_lb_flow)
104
- amp_for_lb_net_flow.add(*self._get_amp_net_subflow(sf_name))
105
- return amp_for_lb_net_flow
106
-
107
- def _create_active_standby_topology(
108
- self, lf_name=constants.CREATE_LOADBALANCER_FLOW):
109
- # When we boot up amphora for an active/standby topology,
110
- # we should leverage the Nova anti-affinity capabilities
111
- # to place the amphora on different hosts, also we need to check
112
- # if anti-affinity-flag is enabled or not:
113
- anti_affinity = CONF.nova.enable_anti_affinity
114
- flows = []
115
- if anti_affinity:
116
- # we need to create a server group first
117
- flows.append(
118
- compute_tasks.NovaServerGroupCreate(
119
- name=lf_name + '-' +
120
- constants.CREATE_SERVER_GROUP_FLOW,
121
- requires=(constants.LOADBALANCER_ID),
122
- provides=constants.SERVER_GROUP_ID))
123
-
124
- # update server group id in lb table
125
- flows.append(
126
- database_tasks.UpdateLBServerGroupInDB(
127
- name=lf_name + '-' +
128
- constants.UPDATE_LB_SERVERGROUPID_FLOW,
129
- requires=(constants.LOADBALANCER_ID,
130
- constants.SERVER_GROUP_ID)))
131
-
132
- f_name = constants.CREATE_LOADBALANCER_FLOW
133
- amps_flow = unordered_flow.Flow(f_name)
134
-
135
- master_sf_name = (constants.ROLE_MASTER + '-' +
136
- constants.AMP_PLUG_NET_SUBFLOW)
137
- master_amp_sf = linear_flow.Flow(master_sf_name)
138
- master_amp_sf.add(self.amp_flows.get_amphora_for_lb_subflow(
139
- prefix=constants.ROLE_MASTER, role=constants.ROLE_MASTER))
140
- master_amp_sf.add(*self._get_amp_net_subflow(master_sf_name))
141
-
142
- backup_sf_name = (constants.ROLE_BACKUP + '-' +
143
- constants.AMP_PLUG_NET_SUBFLOW)
144
- backup_amp_sf = linear_flow.Flow(backup_sf_name)
145
- backup_amp_sf.add(self.amp_flows.get_amphora_for_lb_subflow(
146
- prefix=constants.ROLE_BACKUP, role=constants.ROLE_BACKUP))
147
- backup_amp_sf.add(*self._get_amp_net_subflow(backup_sf_name))
148
-
149
- amps_flow.add(master_amp_sf, backup_amp_sf)
150
-
151
- return flows + [amps_flow]
152
-
153
- def _get_amp_net_subflow(self, sf_name):
154
- flows = []
155
- flows.append(network_tasks.PlugVIPAmpphora(
156
- name=sf_name + '-' + constants.PLUG_VIP_AMPHORA,
157
- requires=(constants.LOADBALANCER, constants.AMPHORA,
158
- constants.SUBNET),
159
- provides=constants.AMP_DATA))
160
-
161
- flows.append(network_tasks.ApplyQosAmphora(
162
- name=sf_name + '-' + constants.APPLY_QOS_AMP,
163
- requires=(constants.LOADBALANCER, constants.AMP_DATA,
164
- constants.UPDATE_DICT)))
165
- flows.append(database_tasks.UpdateAmphoraVIPData(
166
- name=sf_name + '-' + constants.UPDATE_AMPHORA_VIP_DATA,
167
- requires=constants.AMP_DATA))
168
- flows.append(database_tasks.ReloadAmphora(
169
- name=sf_name + '-' + constants.RELOAD_AMP_AFTER_PLUG_VIP,
170
- requires=constants.AMPHORA_ID,
171
- provides=constants.AMPHORA))
172
- flows.append(database_tasks.ReloadLoadBalancer(
173
- name=sf_name + '-' + constants.RELOAD_LB_AFTER_PLUG_VIP,
174
- requires=constants.LOADBALANCER_ID,
175
- provides=constants.LOADBALANCER))
176
- flows.append(network_tasks.GetAmphoraNetworkConfigs(
177
- name=sf_name + '-' + constants.GET_AMP_NETWORK_CONFIG,
178
- requires=(constants.LOADBALANCER, constants.AMPHORA),
179
- provides=constants.AMPHORA_NETWORK_CONFIG))
180
- flows.append(amphora_driver_tasks.AmphoraPostVIPPlug(
181
- name=sf_name + '-' + constants.AMP_POST_VIP_PLUG,
182
- rebind={constants.AMPHORAE_NETWORK_CONFIG:
183
- constants.AMPHORA_NETWORK_CONFIG},
184
- requires=(constants.LOADBALANCER,
185
- constants.AMPHORAE_NETWORK_CONFIG)))
186
- return flows
187
-
188
- def _create_listeners_flow(self):
189
- flows = []
190
- flows.append(
191
- database_tasks.ReloadLoadBalancer(
192
- name=constants.RELOAD_LB_AFTER_AMP_ASSOC_FULL_GRAPH,
193
- requires=constants.LOADBALANCER_ID,
194
- provides=constants.LOADBALANCER
195
- )
196
- )
197
- flows.append(
198
- network_tasks.CalculateDelta(
199
- requires=(constants.LOADBALANCER, constants.AVAILABILITY_ZONE),
200
- provides=constants.DELTAS
201
- )
202
- )
203
- flows.append(
204
- network_tasks.HandleNetworkDeltas(
205
- requires=constants.DELTAS, provides=constants.UPDATED_PORTS
206
- )
207
- )
208
- flows.append(
209
- network_tasks.GetAmphoraeNetworkConfigs(
210
- requires=constants.LOADBALANCER_ID,
211
- provides=constants.AMPHORAE_NETWORK_CONFIG
212
- )
213
- )
214
- flows.append(
215
- amphora_driver_tasks.AmphoraePostNetworkPlug(
216
- requires=(constants.LOADBALANCER, constants.UPDATED_PORTS,
217
- constants.AMPHORAE_NETWORK_CONFIG)
218
- )
219
- )
220
- flows.append(
221
- self.listener_flows.get_create_all_listeners_flow()
222
- )
223
- flows.append(
224
- database_tasks.MarkLBActiveInDB(
225
- mark_subobjects=True,
226
- requires=constants.LOADBALANCER
227
- )
228
- )
229
- return flows
230
-
231
- def get_post_lb_amp_association_flow(self, prefix, topology,
232
- mark_active=True):
233
- """Reload the loadbalancer and create networking subflows for
234
-
235
- created/allocated amphorae.
236
- :return: Post amphorae association subflow
237
- """
238
- sf_name = prefix + '-' + constants.POST_LB_AMP_ASSOCIATION_SUBFLOW
239
- post_create_LB_flow = linear_flow.Flow(sf_name)
240
- post_create_LB_flow.add(
241
- database_tasks.ReloadLoadBalancer(
242
- name=sf_name + '-' + constants.RELOAD_LB_AFTER_AMP_ASSOC,
243
- requires=constants.LOADBALANCER_ID,
244
- provides=constants.LOADBALANCER))
245
-
246
- if topology == constants.TOPOLOGY_ACTIVE_STANDBY:
247
- post_create_LB_flow.add(database_tasks.GetAmphoraeFromLoadbalancer(
248
- requires=constants.LOADBALANCER_ID,
249
- provides=constants.AMPHORAE))
250
-
251
- vrrp_subflow = self.amp_flows.get_vrrp_subflow(prefix)
252
- post_create_LB_flow.add(vrrp_subflow)
253
-
254
- post_create_LB_flow.add(database_tasks.UpdateLoadbalancerInDB(
255
- requires=[constants.LOADBALANCER, constants.UPDATE_DICT]))
256
- if mark_active:
257
- post_create_LB_flow.add(database_tasks.MarkLBActiveInDB(
258
- name=sf_name + '-' + constants.MARK_LB_ACTIVE_INDB,
259
- requires=constants.LOADBALANCER))
260
- return post_create_LB_flow
261
-
262
- def _get_delete_listeners_flow(self, lb):
263
- """Sets up an internal delete flow
264
-
265
- Because task flow doesn't support loops we store each listener
266
- we want to delete in the store part and then rebind
267
-
268
- :param lb: load balancer
269
- :return: (flow, store) -- flow for the deletion and store with all
270
- the listeners stored properly
271
- """
272
- listeners_delete_flow = unordered_flow.Flow('listener_delete_flow')
273
- store = {}
274
- for listener in lb.listeners:
275
- listener_name = 'listener_' + listener.id
276
- store[listener_name] = listener
277
- listeners_delete_flow.add(
278
- self.listener_flows.get_delete_listener_internal_flow(
279
- listener_name))
280
- return (listeners_delete_flow, store)
281
-
282
- def get_delete_load_balancer_flow(self, lb):
283
- """Creates a flow to delete a load balancer.
284
-
285
- :returns: The flow for deleting a load balancer
286
- """
287
- return self._get_delete_load_balancer_flow(lb, False)
288
-
289
- def _get_delete_pools_flow(self, lb):
290
- """Sets up an internal delete flow
291
-
292
- Because task flow doesn't support loops we store each pool
293
- we want to delete in the store part and then rebind
294
-
295
- :param lb: load balancer
296
- :return: (flow, store) -- flow for the deletion and store with all
297
- the listeners stored properly
298
- """
299
- pools_delete_flow = unordered_flow.Flow('pool_delete_flow')
300
- store = {}
301
- for pool in lb.pools:
302
- pool_name = 'pool' + pool.id
303
- store[pool_name] = pool
304
- pools_delete_flow.add(
305
- self.pool_flows.get_delete_pool_flow_internal(
306
- pool_name))
307
- return (pools_delete_flow, store)
308
-
309
- def _get_delete_load_balancer_flow(self, lb, cascade):
310
- store = {}
311
- delete_LB_flow = linear_flow.Flow(constants.DELETE_LOADBALANCER_FLOW)
312
- delete_LB_flow.add(lifecycle_tasks.LoadBalancerToErrorOnRevertTask(
313
- requires=constants.LOADBALANCER))
314
- delete_LB_flow.add(compute_tasks.NovaServerGroupDelete(
315
- requires=constants.SERVER_GROUP_ID))
316
- delete_LB_flow.add(database_tasks.MarkLBAmphoraeHealthBusy(
317
- requires=constants.LOADBALANCER))
318
- if cascade:
319
- (listeners_delete, store) = self._get_delete_listeners_flow(lb)
320
- (pools_delete, pool_store) = self._get_delete_pools_flow(lb)
321
- store.update(pool_store)
322
- delete_LB_flow.add(pools_delete)
323
- delete_LB_flow.add(listeners_delete)
324
- delete_LB_flow.add(network_tasks.UnplugVIP(
325
- requires=constants.LOADBALANCER))
326
- delete_LB_flow.add(network_tasks.DeallocateVIP(
327
- requires=constants.LOADBALANCER))
328
- delete_LB_flow.add(compute_tasks.DeleteAmphoraeOnLoadBalancer(
329
- requires=constants.LOADBALANCER))
330
- delete_LB_flow.add(database_tasks.MarkLBAmphoraeDeletedInDB(
331
- requires=constants.LOADBALANCER))
332
- delete_LB_flow.add(database_tasks.DisableLBAmphoraeHealthMonitoring(
333
- requires=constants.LOADBALANCER))
334
- delete_LB_flow.add(database_tasks.MarkLBDeletedInDB(
335
- requires=constants.LOADBALANCER))
336
- delete_LB_flow.add(database_tasks.DecrementLoadBalancerQuota(
337
- requires=constants.LOADBALANCER))
338
- return (delete_LB_flow, store)
339
-
340
- def get_cascade_delete_load_balancer_flow(self, lb):
341
- """Creates a flow to delete a load balancer.
342
-
343
- :returns: The flow for deleting a load balancer
344
- """
345
- return self._get_delete_load_balancer_flow(lb, True)
346
-
347
- def get_update_load_balancer_flow(self):
348
- """Creates a flow to update a load balancer.
349
-
350
- :returns: The flow for update a load balancer
351
- """
352
- update_LB_flow = linear_flow.Flow(constants.UPDATE_LOADBALANCER_FLOW)
353
- update_LB_flow.add(lifecycle_tasks.LoadBalancerToErrorOnRevertTask(
354
- requires=constants.LOADBALANCER))
355
- update_LB_flow.add(network_tasks.ApplyQos(
356
- requires=(constants.LOADBALANCER, constants.UPDATE_DICT)))
357
- update_LB_flow.add(amphora_driver_tasks.ListenersUpdate(
358
- requires=constants.LOADBALANCER))
359
- update_LB_flow.add(database_tasks.UpdateLoadbalancerInDB(
360
- requires=[constants.LOADBALANCER, constants.UPDATE_DICT]))
361
- update_LB_flow.add(database_tasks.MarkLBActiveInDB(
362
- requires=constants.LOADBALANCER))
363
-
364
- return update_LB_flow
365
-
366
- def get_failover_LB_flow(self, amps, lb):
367
- """Failover a load balancer.
368
-
369
- 1. Validate the VIP port is correct and present.
370
- 2. Build a replacement amphora.
371
- 3. Delete the failed amphora.
372
- 4. Configure the replacement amphora listeners.
373
- 5. Configure VRRP for the listeners.
374
- 6. Build the second replacement amphora.
375
- 7. Delete the second failed amphora.
376
- 8. Delete any extraneous amphora.
377
- 9. Configure the listeners on the new amphorae.
378
- 10. Configure the VRRP on the new amphorae.
379
- 11. Reload the listener configurations to pick up VRRP changes.
380
- 12. Mark the load balancer back to ACTIVE.
381
-
382
- :returns: The flow that will provide the failover.
383
- """
384
- # Pick one amphora to be failed over if any exist.
385
- failed_amp = None
386
- if amps:
387
- failed_amp = amps.pop()
388
-
389
- failover_LB_flow = linear_flow.Flow(
390
- constants.FAILOVER_LOADBALANCER_FLOW)
391
-
392
- # Revert LB to provisioning_status ERROR if this flow goes wrong
393
- failover_LB_flow.add(lifecycle_tasks.LoadBalancerToErrorOnRevertTask(
394
- requires=constants.LOADBALANCER))
395
-
396
- # Setup timeouts for our requests to the amphorae
397
- timeout_dict = {
398
- constants.CONN_MAX_RETRIES:
399
- CONF.haproxy_amphora.active_connection_max_retries,
400
- constants.CONN_RETRY_INTERVAL:
401
- CONF.haproxy_amphora.active_connection_retry_interval}
402
-
403
- if failed_amp:
404
- if failed_amp.role in (constants.ROLE_MASTER,
405
- constants.ROLE_BACKUP):
406
- amp_role = 'master_or_backup'
407
- elif failed_amp.role == constants.ROLE_STANDALONE:
408
- amp_role = 'standalone'
409
- else:
410
- amp_role = 'undefined'
411
- LOG.info("Performing failover for amphora: %s",
412
- {"id": failed_amp.id,
413
- "load_balancer_id": lb.id,
414
- "lb_network_ip": failed_amp.lb_network_ip,
415
- "compute_id": failed_amp.compute_id,
416
- "role": amp_role})
417
-
418
- failover_LB_flow.add(database_tasks.MarkAmphoraPendingDeleteInDB(
419
- requires=constants.AMPHORA,
420
- inject={constants.AMPHORA: failed_amp}))
421
-
422
- failover_LB_flow.add(database_tasks.MarkAmphoraHealthBusy(
423
- requires=constants.AMPHORA,
424
- inject={constants.AMPHORA: failed_amp}))
425
-
426
- # Check that the VIP port exists and is ok
427
- failover_LB_flow.add(
428
- network_tasks.AllocateVIPforFailover(
429
- requires=constants.LOADBALANCER, provides=constants.VIP))
430
-
431
- # Update the database with the VIP information
432
- failover_LB_flow.add(database_tasks.UpdateVIPAfterAllocation(
433
- requires=(constants.LOADBALANCER_ID, constants.VIP),
434
- provides=constants.LOADBALANCER))
435
-
436
- # Make sure the SG has the correct rules and re-apply to the
437
- # VIP port. It is not used on the VIP port, but will help lock
438
- # the SG as in use.
439
- failover_LB_flow.add(network_tasks.UpdateVIPSecurityGroup(
440
- requires=constants.LOADBALANCER_ID, provides=constants.VIP_SG_ID))
441
-
442
- new_amp_role = constants.ROLE_STANDALONE
443
- if lb.topology == constants.TOPOLOGY_ACTIVE_STANDBY:
444
- new_amp_role = constants.ROLE_BACKUP
445
-
446
- # Get a replacement amphora and plug all of the networking.
447
- #
448
- # Do this early as the compute services have been observed to be
449
- # unreliable. The community decided the chance that deleting first
450
- # would open resources for an instance is less likely than the compute
451
- # service failing to boot an instance for other reasons.
452
- if failed_amp:
453
- failed_vrrp_is_ipv6 = False
454
- if failed_amp.vrrp_ip:
455
- failed_vrrp_is_ipv6 = utils.is_ipv6(failed_amp.vrrp_ip)
456
- failover_LB_flow.add(
457
- self.amp_flows.get_amphora_for_lb_failover_subflow(
458
- prefix=constants.FAILOVER_LOADBALANCER_FLOW,
459
- role=new_amp_role,
460
- failed_amp_vrrp_port_id=failed_amp.vrrp_port_id,
461
- is_vrrp_ipv6=failed_vrrp_is_ipv6))
462
- else:
463
- failover_LB_flow.add(
464
- self.amp_flows.get_amphora_for_lb_failover_subflow(
465
- prefix=constants.FAILOVER_LOADBALANCER_FLOW,
466
- role=new_amp_role))
467
-
468
- if lb.topology == constants.TOPOLOGY_ACTIVE_STANDBY:
469
- failover_LB_flow.add(database_tasks.MarkAmphoraBackupInDB(
470
- name=constants.MARK_AMP_BACKUP_INDB,
471
- requires=constants.AMPHORA))
472
-
473
- # Delete the failed amp
474
- if failed_amp:
475
- failover_LB_flow.add(
476
- self.amp_flows.get_delete_amphora_flow(failed_amp))
477
-
478
- # Update the data stored in the flow from the database
479
- failover_LB_flow.add(database_tasks.ReloadLoadBalancer(
480
- requires=constants.LOADBALANCER_ID,
481
- provides=constants.LOADBALANCER))
482
-
483
- # Configure the listener(s)
484
- # We will run update on this amphora again later if this is
485
- # an active/standby load balancer because we want this amp
486
- # functional as soon as possible. It must run again to update
487
- # the configurations for the new peers.
488
- failover_LB_flow.add(amphora_driver_tasks.AmpListenersUpdate(
489
- name=constants.AMP_LISTENER_UPDATE,
490
- requires=(constants.LOADBALANCER, constants.AMPHORA),
491
- inject={constants.TIMEOUT_DICT: timeout_dict}))
492
-
493
- # Bring up the new "backup" amphora VIP now to reduce the outage
494
- # on the final failover. This dropped the outage from 8-9 seconds
495
- # to less than one in my lab.
496
- # This does mean some steps have to be repeated later to reconfigure
497
- # for the second amphora as a peer.
498
- if lb.topology == constants.TOPOLOGY_ACTIVE_STANDBY:
499
-
500
- failover_LB_flow.add(database_tasks.CreateVRRPGroupForLB(
501
- name=new_amp_role + '-' + constants.CREATE_VRRP_GROUP_FOR_LB,
502
- requires=constants.LOADBALANCER_ID))
503
-
504
- failover_LB_flow.add(network_tasks.GetAmphoraNetworkConfigsByID(
505
- name=(new_amp_role + '-' +
506
- constants.GET_AMPHORA_NETWORK_CONFIGS_BY_ID),
507
- requires=(constants.LOADBALANCER_ID, constants.AMPHORA_ID),
508
- provides=constants.FIRST_AMP_NETWORK_CONFIGS))
509
-
510
- failover_LB_flow.add(
511
- amphora_driver_tasks.AmphoraUpdateVRRPInterface(
512
- name=new_amp_role + '-' + constants.AMP_UPDATE_VRRP_INTF,
513
- requires=constants.AMPHORA,
514
- inject={constants.TIMEOUT_DICT: timeout_dict},
515
- provides=constants.FIRST_AMP_VRRP_INTERFACE))
516
-
517
- failover_LB_flow.add(amphora_driver_tasks.AmphoraVRRPUpdate(
518
- name=new_amp_role + '-' + constants.AMP_VRRP_UPDATE,
519
- requires=(constants.LOADBALANCER_ID, constants.AMPHORA),
520
- rebind={constants.AMPHORAE_NETWORK_CONFIG:
521
- constants.FIRST_AMP_NETWORK_CONFIGS,
522
- constants.AMP_VRRP_INT:
523
- constants.FIRST_AMP_VRRP_INTERFACE},
524
- inject={constants.TIMEOUT_DICT: timeout_dict}))
525
-
526
- failover_LB_flow.add(amphora_driver_tasks.AmphoraVRRPStart(
527
- name=new_amp_role + '-' + constants.AMP_VRRP_START,
528
- requires=constants.AMPHORA,
529
- inject={constants.TIMEOUT_DICT: timeout_dict}))
530
-
531
- # Start the listener. This needs to be done here because
532
- # it will create the required haproxy check scripts for
533
- # the VRRP deployed above.
534
- # A "V" or newer amphora-agent will remove the need for this
535
- # task here.
536
- # TODO(johnsom) Remove this in the "X" cycle
537
- failover_LB_flow.add(amphora_driver_tasks.ListenersStart(
538
- name=new_amp_role + '-' + constants.AMP_LISTENER_START,
539
- requires=(constants.LOADBALANCER, constants.AMPHORA)))
540
-
541
- # #### Work on standby amphora if needed #####
542
-
543
- new_amp_role = constants.ROLE_MASTER
544
- failed_amp = None
545
- if amps:
546
- failed_amp = amps.pop()
547
-
548
- if failed_amp:
549
- if failed_amp.role in (constants.ROLE_MASTER,
550
- constants.ROLE_BACKUP):
551
- amp_role = 'master_or_backup'
552
- elif failed_amp.role == constants.ROLE_STANDALONE:
553
- amp_role = 'standalone'
554
- else:
555
- amp_role = 'undefined'
556
- LOG.info("Performing failover for amphora: %s",
557
- {"id": failed_amp.id,
558
- "load_balancer_id": lb.id,
559
- "lb_network_ip": failed_amp.lb_network_ip,
560
- "compute_id": failed_amp.compute_id,
561
- "role": amp_role})
562
-
563
- failover_LB_flow.add(
564
- database_tasks.MarkAmphoraPendingDeleteInDB(
565
- name=(new_amp_role + '-' +
566
- constants.MARK_AMPHORA_PENDING_DELETE),
567
- requires=constants.AMPHORA,
568
- inject={constants.AMPHORA: failed_amp}))
569
-
570
- failover_LB_flow.add(database_tasks.MarkAmphoraHealthBusy(
571
- name=(new_amp_role + '-' +
572
- constants.MARK_AMPHORA_HEALTH_BUSY),
573
- requires=constants.AMPHORA,
574
- inject={constants.AMPHORA: failed_amp}))
575
-
576
- # Get a replacement amphora and plug all of the networking.
577
- #
578
- # Do this early as the compute services have been observed to be
579
- # unreliable. The community decided the chance that deleting first
580
- # would open resources for an instance is less likely than the
581
- # compute service failing to boot an instance for other reasons.
582
- failover_LB_flow.add(
583
- self.amp_flows.get_amphora_for_lb_failover_subflow(
584
- prefix=(new_amp_role + '-' +
585
- constants.FAILOVER_LOADBALANCER_FLOW),
586
- role=new_amp_role))
587
-
588
- failover_LB_flow.add(database_tasks.MarkAmphoraMasterInDB(
589
- name=constants.MARK_AMP_MASTER_INDB,
590
- requires=constants.AMPHORA))
591
-
592
- # Delete the failed amp
593
- if failed_amp:
594
- failover_LB_flow.add(
595
- self.amp_flows.get_delete_amphora_flow(
596
- failed_amp))
597
- failover_LB_flow.add(
598
- database_tasks.DisableAmphoraHealthMonitoring(
599
- name=(new_amp_role + '-' +
600
- constants.DISABLE_AMP_HEALTH_MONITORING),
601
- requires=constants.AMPHORA,
602
- inject={constants.AMPHORA: failed_amp}))
603
-
604
- # Remove any extraneous amphora
605
- # Note: This runs in all topology situations.
606
- # It should run before the act/stdby final listener update so
607
- # that we don't bother attempting to update dead amphorae.
608
- delete_extra_amps_flow = unordered_flow.Flow(
609
- constants.DELETE_EXTRA_AMPHORAE_FLOW)
610
- for amp in amps:
611
- LOG.debug('Found extraneous amphora %s on load balancer %s. '
612
- 'Deleting.', amp.id, lb.id)
613
- delete_extra_amps_flow.add(
614
- self.amp_flows.get_delete_amphora_flow(amp))
615
-
616
- failover_LB_flow.add(delete_extra_amps_flow)
617
-
618
- if lb.topology == constants.TOPOLOGY_ACTIVE_STANDBY:
619
- # Update the data stored in the flow from the database
620
- failover_LB_flow.add(database_tasks.ReloadLoadBalancer(
621
- name=new_amp_role + '-' + constants.RELOAD_LB_AFTER_AMP_ASSOC,
622
- requires=constants.LOADBALANCER_ID,
623
- provides=constants.LOADBALANCER))
624
-
625
- failover_LB_flow.add(database_tasks.GetAmphoraeFromLoadbalancer(
626
- name=new_amp_role + '-' + constants.GET_AMPHORAE_FROM_LB,
627
- requires=constants.LOADBALANCER_ID,
628
- provides=constants.AMPHORAE))
629
-
630
- # Listeners update needs to be run on all amphora to update
631
- # their peer configurations. So parallelize this with an
632
- # unordered subflow.
633
- update_amps_subflow = unordered_flow.Flow(
634
- constants.UPDATE_AMPS_SUBFLOW)
635
-
636
- # Setup parallel flows for each amp. We don't know the new amp
637
- # details at flow creation time, so setup a subflow for each
638
- # amp on the LB, they let the task index into a list of amps
639
- # to find the amphora it should work on.
640
- update_amps_subflow.add(
641
- amphora_driver_tasks.AmphoraIndexListenerUpdate(
642
- name=(constants.AMPHORA + '-0-' +
643
- constants.AMP_LISTENER_UPDATE),
644
- requires=(constants.LOADBALANCER, constants.AMPHORAE),
645
- inject={constants.AMPHORA_INDEX: 0,
646
- constants.TIMEOUT_DICT: timeout_dict}))
647
- update_amps_subflow.add(
648
- amphora_driver_tasks.AmphoraIndexListenerUpdate(
649
- name=(constants.AMPHORA + '-1-' +
650
- constants.AMP_LISTENER_UPDATE),
651
- requires=(constants.LOADBALANCER, constants.AMPHORAE),
652
- inject={constants.AMPHORA_INDEX: 1,
653
- constants.TIMEOUT_DICT: timeout_dict}))
654
-
655
- failover_LB_flow.add(update_amps_subflow)
656
-
657
- # Configure and enable keepalived in the amphora
658
- failover_LB_flow.add(self.amp_flows.get_vrrp_subflow(
659
- new_amp_role + '-' + constants.GET_VRRP_SUBFLOW,
660
- timeout_dict, create_vrrp_group=False))
661
-
662
- # #### End of standby ####
663
-
664
- # Reload the listener. This needs to be done here because
665
- # it will create the required haproxy check scripts for
666
- # the VRRP deployed above.
667
- # A "V" or newer amphora-agent will remove the need for this
668
- # task here.
669
- # TODO(johnsom) Remove this in the "X" cycle
670
- failover_LB_flow.add(
671
- amphora_driver_tasks.AmphoraIndexListenersReload(
672
- name=(new_amp_role + '-' +
673
- constants.AMPHORA_RELOAD_LISTENER),
674
- requires=(constants.LOADBALANCER, constants.AMPHORAE),
675
- inject={constants.AMPHORA_INDEX: 1,
676
- constants.TIMEOUT_DICT: timeout_dict}))
677
-
678
- # Remove any extraneous ports
679
- # Note: Nova sometimes fails to delete ports attached to an instance.
680
- # For example, if you create an LB with a listener, then
681
- # 'openstack server delete' the amphora, you will see the vrrp
682
- # port attached to that instance will remain after the instance
683
- # is deleted.
684
- # TODO(johnsom) Fix this as part of
685
- # https://storyboard.openstack.org/#!/story/2007077
686
-
687
- # Mark LB ACTIVE
688
- failover_LB_flow.add(
689
- database_tasks.MarkLBActiveInDB(mark_subobjects=True,
690
- requires=constants.LOADBALANCER))
691
-
692
- return failover_LB_flow