octavia 13.0.0.0rc1__py3-none-any.whl → 14.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. octavia/amphorae/backends/agent/api_server/lvs_listener_base.py +1 -1
  2. octavia/amphorae/backends/agent/api_server/osutils.py +5 -5
  3. octavia/amphorae/backends/agent/api_server/plug.py +3 -2
  4. octavia/amphorae/backends/agent/api_server/rules_schema.py +52 -0
  5. octavia/amphorae/backends/agent/api_server/server.py +28 -1
  6. octavia/amphorae/backends/utils/interface.py +45 -6
  7. octavia/amphorae/backends/utils/interface_file.py +9 -6
  8. octavia/amphorae/backends/utils/nftable_utils.py +125 -0
  9. octavia/amphorae/drivers/driver_base.py +27 -0
  10. octavia/amphorae/drivers/haproxy/rest_api_driver.py +42 -10
  11. octavia/amphorae/drivers/health/heartbeat_udp.py +2 -2
  12. octavia/amphorae/drivers/keepalived/vrrp_rest_driver.py +2 -1
  13. octavia/amphorae/drivers/noop_driver/driver.py +25 -0
  14. octavia/api/app.py +3 -0
  15. octavia/api/common/pagination.py +2 -2
  16. octavia/api/drivers/amphora_driver/flavor_schema.py +6 -1
  17. octavia/api/root_controller.py +4 -1
  18. octavia/api/v2/controllers/health_monitor.py +0 -1
  19. octavia/api/v2/controllers/l7policy.py +0 -1
  20. octavia/api/v2/controllers/l7rule.py +0 -1
  21. octavia/api/v2/controllers/listener.py +0 -1
  22. octavia/api/v2/controllers/load_balancer.py +13 -7
  23. octavia/api/v2/controllers/member.py +6 -3
  24. octavia/api/v2/controllers/pool.py +6 -7
  25. octavia/api/v2/types/load_balancer.py +5 -1
  26. octavia/api/v2/types/pool.py +1 -1
  27. octavia/certificates/common/pkcs12.py +9 -9
  28. octavia/certificates/manager/barbican.py +24 -16
  29. octavia/certificates/manager/castellan_mgr.py +12 -7
  30. octavia/certificates/manager/local.py +4 -4
  31. octavia/certificates/manager/noop.py +106 -0
  32. octavia/cmd/driver_agent.py +1 -1
  33. octavia/cmd/health_checker.py +0 -4
  34. octavia/cmd/health_manager.py +1 -5
  35. octavia/cmd/house_keeping.py +1 -1
  36. octavia/cmd/interface.py +0 -4
  37. octavia/cmd/octavia_worker.py +0 -4
  38. octavia/cmd/prometheus_proxy.py +0 -5
  39. octavia/cmd/status.py +0 -6
  40. octavia/common/base_taskflow.py +1 -1
  41. octavia/common/clients.py +15 -3
  42. octavia/common/config.py +24 -6
  43. octavia/common/constants.py +34 -0
  44. octavia/common/data_models.py +3 -1
  45. octavia/common/exceptions.py +11 -0
  46. octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +7 -5
  47. octavia/common/keystone.py +7 -7
  48. octavia/common/tls_utils/cert_parser.py +24 -10
  49. octavia/common/utils.py +6 -0
  50. octavia/common/validate.py +2 -2
  51. octavia/compute/drivers/nova_driver.py +23 -5
  52. octavia/controller/worker/task_utils.py +28 -6
  53. octavia/controller/worker/v2/controller_worker.py +49 -15
  54. octavia/controller/worker/v2/flows/amphora_flows.py +120 -21
  55. octavia/controller/worker/v2/flows/flow_utils.py +15 -13
  56. octavia/controller/worker/v2/flows/listener_flows.py +95 -5
  57. octavia/controller/worker/v2/flows/load_balancer_flows.py +74 -30
  58. octavia/controller/worker/v2/taskflow_jobboard_driver.py +17 -1
  59. octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +145 -24
  60. octavia/controller/worker/v2/tasks/compute_tasks.py +1 -1
  61. octavia/controller/worker/v2/tasks/database_tasks.py +72 -41
  62. octavia/controller/worker/v2/tasks/lifecycle_tasks.py +97 -41
  63. octavia/controller/worker/v2/tasks/network_tasks.py +57 -60
  64. octavia/controller/worker/v2/tasks/shim_tasks.py +28 -0
  65. octavia/db/migration/alembic_migrations/versions/55874a4ceed6_add_l7policy_action_redirect_prefix.py +1 -1
  66. octavia/db/migration/alembic_migrations/versions/5a3ee5472c31_add_cert_expiration__infor_in_amphora_table.py +1 -1
  67. octavia/db/migration/alembic_migrations/versions/6742ca1b27c2_add_l7policy_redirect_http_code.py +1 -1
  68. octavia/db/migration/alembic_migrations/versions/db2a73e82626_add_vnic_type_for_vip.py +36 -0
  69. octavia/db/models.py +1 -0
  70. octavia/db/prepare.py +1 -1
  71. octavia/db/repositories.py +53 -34
  72. octavia/distributor/drivers/driver_base.py +1 -1
  73. octavia/network/base.py +3 -16
  74. octavia/network/data_models.py +4 -1
  75. octavia/network/drivers/neutron/allowed_address_pairs.py +27 -26
  76. octavia/network/drivers/noop_driver/driver.py +10 -23
  77. octavia/tests/common/sample_certs.py +115 -0
  78. octavia/tests/common/sample_haproxy_prometheus +1 -1
  79. octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +37 -0
  80. octavia/tests/functional/api/test_healthcheck.py +2 -2
  81. octavia/tests/functional/api/v2/base.py +1 -1
  82. octavia/tests/functional/api/v2/test_listener.py +45 -0
  83. octavia/tests/functional/api/v2/test_load_balancer.py +17 -0
  84. octavia/tests/functional/db/base.py +9 -0
  85. octavia/tests/functional/db/test_models.py +2 -1
  86. octavia/tests/functional/db/test_repositories.py +55 -99
  87. octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +4 -2
  88. octavia/tests/unit/amphorae/backends/utils/test_interface.py +201 -1
  89. octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +1 -1
  90. octavia/tests/unit/amphorae/backends/utils/test_nftable_utils.py +194 -0
  91. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver.py +27 -5
  92. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +15 -2
  93. octavia/tests/unit/amphorae/drivers/keepalived/test_vrrp_rest_driver.py +17 -0
  94. octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +2 -1
  95. octavia/tests/unit/api/v2/types/test_pool.py +71 -0
  96. octavia/tests/unit/certificates/manager/test_barbican.py +3 -3
  97. octavia/tests/unit/certificates/manager/test_noop.py +53 -0
  98. octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +16 -17
  99. octavia/tests/unit/common/sample_configs/sample_configs_combined.py +5 -3
  100. octavia/tests/unit/common/test_config.py +35 -0
  101. octavia/tests/unit/common/test_keystone.py +32 -0
  102. octavia/tests/unit/common/test_utils.py +39 -0
  103. octavia/tests/unit/compute/drivers/test_nova_driver.py +22 -0
  104. octavia/tests/unit/controller/worker/test_task_utils.py +58 -2
  105. octavia/tests/unit/controller/worker/v2/flows/test_amphora_flows.py +28 -5
  106. octavia/tests/unit/controller/worker/v2/flows/test_listener_flows.py +64 -16
  107. octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +49 -9
  108. octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +265 -17
  109. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +101 -1
  110. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +19 -19
  111. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +105 -42
  112. octavia/tests/unit/controller/worker/v2/tasks/test_shim_tasks.py +33 -0
  113. octavia/tests/unit/controller/worker/v2/test_controller_worker.py +85 -42
  114. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +48 -51
  115. octavia/tests/unit/network/drivers/neutron/test_utils.py +2 -0
  116. octavia/tests/unit/network/drivers/noop_driver/test_driver.py +0 -7
  117. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/README.rst +6 -1
  118. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/diskimage-create.sh +10 -4
  119. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/requirements.txt +0 -2
  120. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/tox.ini +30 -13
  121. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/AUTHORS +5 -0
  122. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/METADATA +6 -6
  123. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/RECORD +134 -126
  124. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/entry_points.txt +1 -1
  125. octavia-14.0.0.dist-info/pbr.json +1 -0
  126. octavia-13.0.0.0rc1.dist-info/pbr.json +0 -1
  127. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/LICENSE +0 -0
  128. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/README.rst +0 -0
  129. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  130. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  131. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  132. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/scripts/octavia-wsgi +0 -0
  133. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/LICENSE +0 -0
  134. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/WHEEL +0 -0
  135. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/top_level.txt +0 -0
@@ -96,6 +96,32 @@ class TestLoadBalancerFlows(base.TestCase):
96
96
  self.LBFlow.get_create_load_balancer_flow,
97
97
  'BOGUS')
98
98
 
99
+ @mock.patch('octavia.common.rpc.NOTIFIER',
100
+ new_callable=MockNOTIFIER)
101
+ def test_get_create_load_balancer_flow_SRIOV(self, mock_get_net_driver,
102
+ mock_notifier):
103
+ amp_flow = self.LBFlow.get_create_load_balancer_flow(
104
+ constants.TOPOLOGY_SINGLE, flavor_dict={constants.SRIOV_VIP: True})
105
+ self.assertIsInstance(amp_flow, flow.Flow)
106
+ self.assertIn(constants.AVAILABILITY_ZONE, amp_flow.requires)
107
+ self.assertIn(constants.BUILD_TYPE_PRIORITY, amp_flow.requires)
108
+ self.assertIn(constants.FLAVOR, amp_flow.requires)
109
+ self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
110
+ self.assertIn(constants.SERVER_GROUP_ID, amp_flow.requires)
111
+ self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
112
+ self.assertIn(constants.ADDITIONAL_VIPS, amp_flow.provides)
113
+ self.assertIn(constants.AMP_DATA, amp_flow.provides)
114
+ self.assertIn(constants.AMPHORA, amp_flow.provides)
115
+ self.assertIn(constants.AMPHORA_ID, amp_flow.provides)
116
+ self.assertIn(constants.AMPHORA_NETWORK_CONFIG, amp_flow.provides)
117
+ self.assertIn(constants.COMPUTE_ID, amp_flow.provides)
118
+ self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)
119
+ self.assertIn(constants.LOADBALANCER, amp_flow.provides)
120
+ self.assertIn(constants.PORT_DATA, amp_flow.provides)
121
+ self.assertIn(constants.SERVER_PEM, amp_flow.provides)
122
+ self.assertIn(constants.SUBNET, amp_flow.provides)
123
+ self.assertIn(constants.VIP, amp_flow.provides)
124
+
99
125
  @mock.patch('octavia.common.rpc.NOTIFIER',
100
126
  new_callable=MockNOTIFIER)
101
127
  def test_get_delete_load_balancer_flow(self, mock_get_net_driver,
@@ -199,14 +225,16 @@ class TestLoadBalancerFlows(base.TestCase):
199
225
 
200
226
  self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
201
227
  self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
228
+ self.assertIn(constants.AMPHORA_ID, amp_flow.requires)
202
229
 
203
230
  self.assertIn(constants.AMPHORAE, amp_flow.provides)
231
+ self.assertIn(constants.AMPHORAE_STATUS, amp_flow.provides)
204
232
  self.assertIn(constants.AMP_VRRP_INT, amp_flow.provides)
205
233
  self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, amp_flow.provides)
206
234
  self.assertIn(constants.LOADBALANCER, amp_flow.provides)
207
235
 
208
- self.assertEqual(2, len(amp_flow.requires), amp_flow.requires)
209
- self.assertEqual(4, len(amp_flow.provides), amp_flow.provides)
236
+ self.assertEqual(3, len(amp_flow.requires), amp_flow.requires)
237
+ self.assertEqual(5, len(amp_flow.provides), amp_flow.provides)
210
238
 
211
239
  amp_flow = self.LBFlow.get_post_lb_amp_association_flow(
212
240
  '123', constants.TOPOLOGY_ACTIVE_STANDBY)
@@ -215,14 +243,16 @@ class TestLoadBalancerFlows(base.TestCase):
215
243
 
216
244
  self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
217
245
  self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
246
+ self.assertIn(constants.AMPHORA_ID, amp_flow.requires)
218
247
 
219
248
  self.assertIn(constants.AMPHORAE, amp_flow.provides)
249
+ self.assertIn(constants.AMPHORAE_STATUS, amp_flow.provides)
220
250
  self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, amp_flow.provides)
221
251
  self.assertIn(constants.AMP_VRRP_INT, amp_flow.provides)
222
252
  self.assertIn(constants.LOADBALANCER, amp_flow.provides)
223
253
 
224
- self.assertEqual(2, len(amp_flow.requires), amp_flow.requires)
225
- self.assertEqual(4, len(amp_flow.provides), amp_flow.provides)
254
+ self.assertEqual(3, len(amp_flow.requires), amp_flow.requires)
255
+ self.assertEqual(5, len(amp_flow.provides), amp_flow.provides)
226
256
 
227
257
  @mock.patch('octavia.common.rpc.NOTIFIER',
228
258
  new_callable=MockNOTIFIER)
@@ -285,6 +315,7 @@ class TestLoadBalancerFlows(base.TestCase):
285
315
  self.assertIn(constants.AMPHORA_ID, create_flow.provides)
286
316
  self.assertIn(constants.AMPHORA_NETWORK_CONFIG, create_flow.provides)
287
317
  self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, create_flow.provides)
318
+ self.assertIn(constants.AMPHORAE_STATUS, create_flow.provides)
288
319
  self.assertIn(constants.COMPUTE_ID, create_flow.provides)
289
320
  self.assertIn(constants.COMPUTE_OBJ, create_flow.provides)
290
321
  self.assertIn(constants.DELTAS, create_flow.provides)
@@ -296,7 +327,7 @@ class TestLoadBalancerFlows(base.TestCase):
296
327
  self.assertIn(constants.ADDITIONAL_VIPS, create_flow.provides)
297
328
 
298
329
  self.assertEqual(6, len(create_flow.requires), create_flow.requires)
299
- self.assertEqual(17, len(create_flow.provides),
330
+ self.assertEqual(18, len(create_flow.provides),
300
331
  create_flow.provides)
301
332
 
302
333
  def _test_get_failover_LB_flow_single(self, amphorae):
@@ -313,6 +344,7 @@ class TestLoadBalancerFlows(base.TestCase):
313
344
  self.assertIn(constants.FLAVOR, failover_flow.requires)
314
345
  self.assertIn(constants.LOADBALANCER, failover_flow.requires)
315
346
  self.assertIn(constants.LOADBALANCER_ID, failover_flow.requires)
347
+ self.assertIn(constants.AMPHORAE_STATUS, failover_flow.requires)
316
348
 
317
349
  self.assertIn(constants.UPDATED_PORTS, failover_flow.provides)
318
350
  self.assertIn(constants.AMPHORA, failover_flow.provides)
@@ -328,10 +360,13 @@ class TestLoadBalancerFlows(base.TestCase):
328
360
  self.assertIn(constants.VIP, failover_flow.provides)
329
361
  self.assertIn(constants.ADDITIONAL_VIPS, failover_flow.provides)
330
362
  self.assertIn(constants.VIP_SG_ID, failover_flow.provides)
363
+ self.assertIn(constants.AMPHORA_FIREWALL_RULES, failover_flow.provides)
364
+ self.assertIn(constants.SUBNET, failover_flow.provides)
365
+ self.assertIn(constants.NEW_AMPHORAE, failover_flow.provides)
331
366
 
332
- self.assertEqual(6, len(failover_flow.requires),
367
+ self.assertEqual(7, len(failover_flow.requires),
333
368
  failover_flow.requires)
334
- self.assertEqual(13, len(failover_flow.provides),
369
+ self.assertEqual(16, len(failover_flow.provides),
335
370
  failover_flow.provides)
336
371
 
337
372
  @mock.patch('octavia.common.rpc.NOTIFIER',
@@ -389,6 +424,7 @@ class TestLoadBalancerFlows(base.TestCase):
389
424
  self.assertIn(constants.FLAVOR, failover_flow.requires)
390
425
  self.assertIn(constants.LOADBALANCER, failover_flow.requires)
391
426
  self.assertIn(constants.LOADBALANCER_ID, failover_flow.requires)
427
+ self.assertIn(constants.AMPHORAE_STATUS, failover_flow.requires)
392
428
 
393
429
  self.assertIn(constants.UPDATED_PORTS, failover_flow.provides)
394
430
  self.assertIn(constants.AMPHORA, failover_flow.provides)
@@ -404,10 +440,14 @@ class TestLoadBalancerFlows(base.TestCase):
404
440
  self.assertIn(constants.VIP, failover_flow.provides)
405
441
  self.assertIn(constants.ADDITIONAL_VIPS, failover_flow.provides)
406
442
  self.assertIn(constants.VIP_SG_ID, failover_flow.provides)
443
+ self.assertIn(constants.SUBNET, failover_flow.provides)
444
+ self.assertIn(constants.AMPHORA_FIREWALL_RULES, failover_flow.provides)
445
+ self.assertIn(constants.SUBNET, failover_flow.provides)
446
+ self.assertIn(constants.NEW_AMPHORAE, failover_flow.provides)
407
447
 
408
- self.assertEqual(6, len(failover_flow.requires),
448
+ self.assertEqual(7, len(failover_flow.requires),
409
449
  failover_flow.requires)
410
- self.assertEqual(13, len(failover_flow.provides),
450
+ self.assertEqual(16, len(failover_flow.provides),
411
451
  failover_flow.provides)
412
452
 
413
453
  @mock.patch('octavia.common.rpc.NOTIFIER',
@@ -132,21 +132,54 @@ class TestAmphoraDriverTasks(base.TestCase):
132
132
 
133
133
  mock_amphora_repo_get.return_value = _db_amphora_mock
134
134
  mock_lb_get.return_value = _db_load_balancer_mock
135
+ amphorae_status = {
136
+ _amphora_mock[constants.ID]: {
137
+ constants.UNREACHABLE: False
138
+ }
139
+ }
140
+
135
141
  amp_list_update_obj = amphora_driver_tasks.AmphoraIndexListenerUpdate()
136
142
  amp_list_update_obj.execute(_LB_mock, 0, [_amphora_mock],
143
+ amphorae_status,
144
+ _amphora_mock[constants.ID],
137
145
  self.timeout_dict)
138
146
 
139
147
  mock_driver.update_amphora_listeners.assert_called_once_with(
140
148
  _db_load_balancer_mock, _db_amphora_mock, self.timeout_dict)
141
149
 
150
+ # Unreachable amp
151
+ mock_driver.reset_mock()
152
+ amphorae_status = {
153
+ _amphora_mock[constants.ID]: {
154
+ constants.UNREACHABLE: True
155
+ }
156
+ }
157
+ amp_list_update_obj.execute(_LB_mock, 0, [_amphora_mock],
158
+ amphorae_status,
159
+ _amphora_mock[constants.ID],
160
+ self.timeout_dict)
161
+ mock_driver.update_amphora_listeners.assert_not_called()
162
+
163
+ # Test exception
142
164
  mock_driver.update_amphora_listeners.side_effect = Exception('boom')
143
165
 
144
- amp_list_update_obj.execute(_LB_mock, 0,
145
- [_amphora_mock], self.timeout_dict)
166
+ amp_list_update_obj.execute(_LB_mock, 0, [_amphora_mock], {},
167
+ _amphora_mock[constants.ID],
168
+ self.timeout_dict)
146
169
 
147
170
  mock_amphora_repo_update.assert_called_once_with(
148
171
  _session_mock, AMP_ID, status=constants.ERROR)
149
172
 
173
+ # Test exception, secondary amp
174
+ mock_amphora_repo_update.reset_mock()
175
+ mock_driver.update_amphora_listeners.side_effect = Exception('boom')
176
+
177
+ amp_list_update_obj.execute(_LB_mock, 0, [_amphora_mock], {},
178
+ '1234',
179
+ self.timeout_dict)
180
+
181
+ mock_amphora_repo_update.assert_not_called()
182
+
150
183
  @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
151
184
  @mock.patch('octavia.db.api.session')
152
185
  def test_listeners_update(self,
@@ -198,39 +231,70 @@ class TestAmphoraDriverTasks(base.TestCase):
198
231
  mock_driver, mock_generate_uuid, mock_log, mock_get_session,
199
232
  mock_listener_repo_get, mock_listener_repo_update,
200
233
  mock_amphora_repo_get, mock_amphora_repo_update):
201
- amphora_mock = mock.MagicMock()
202
234
  listeners_reload_obj = (
203
235
  amphora_driver_tasks.AmphoraIndexListenersReload())
204
236
  mock_lb = mock.MagicMock()
205
237
  mock_listener = mock.MagicMock()
206
238
  mock_listener.id = '12345'
207
- mock_amphora_repo_get.return_value = amphora_mock
239
+ mock_amphora_repo_get.return_value = _amphora_mock
208
240
  mock_lb_repo_get.return_value = mock_lb
209
241
  mock_driver.reload.side_effect = [mock.DEFAULT, Exception('boom')]
210
242
 
211
243
  # Test no listeners
212
244
  mock_lb.listeners = None
213
- listeners_reload_obj.execute(mock_lb, 0, None)
245
+ listeners_reload_obj.execute(mock_lb, 0, None, {},
246
+ _amphora_mock[constants.ID])
214
247
  mock_driver.reload.assert_not_called()
215
248
 
216
249
  # Test with listeners
217
- mock_driver.start.reset_mock()
250
+ amphorae_status = {
251
+ _amphora_mock[constants.ID]: {
252
+ constants.UNREACHABLE: False
253
+ }
254
+ }
255
+ mock_driver.reload.reset_mock()
218
256
  mock_lb.listeners = [mock_listener]
219
- listeners_reload_obj.execute(mock_lb, 0, [amphora_mock],
257
+ listeners_reload_obj.execute(mock_lb, 0, [_amphora_mock],
258
+ amphorae_status,
259
+ _amphora_mock[constants.ID],
220
260
  timeout_dict=self.timeout_dict)
221
- mock_driver.reload.assert_called_once_with(mock_lb, amphora_mock,
261
+ mock_driver.reload.assert_called_once_with(mock_lb, _amphora_mock,
222
262
  self.timeout_dict)
223
263
 
264
+ # Unreachable amp
265
+ amphorae_status = {
266
+ _amphora_mock[constants.ID]: {
267
+ constants.UNREACHABLE: True
268
+ }
269
+ }
270
+ mock_driver.reload.reset_mock()
271
+ listeners_reload_obj.execute(mock_lb, 0, [_amphora_mock],
272
+ amphorae_status,
273
+ _amphora_mock[constants.ID],
274
+ timeout_dict=self.timeout_dict)
275
+ mock_driver.reload.assert_not_called()
276
+
224
277
  # Test with reload exception
225
278
  mock_driver.reload.reset_mock()
226
- listeners_reload_obj.execute(mock_lb, 0, [amphora_mock],
279
+ listeners_reload_obj.execute(mock_lb, 0, [_amphora_mock], {},
280
+ _amphora_mock[constants.ID],
227
281
  timeout_dict=self.timeout_dict)
228
- mock_driver.reload.assert_called_once_with(mock_lb, amphora_mock,
282
+ mock_driver.reload.assert_called_once_with(mock_lb, _amphora_mock,
229
283
  self.timeout_dict)
230
284
  mock_amphora_repo_update.assert_called_once_with(
231
- _session_mock, amphora_mock[constants.ID],
285
+ _session_mock, _amphora_mock[constants.ID],
232
286
  status=constants.ERROR)
233
287
 
288
+ # Test with reload exception, secondary amp
289
+ mock_driver.reload.reset_mock()
290
+ mock_amphora_repo_update.reset_mock()
291
+ listeners_reload_obj.execute(mock_lb, 0, [_amphora_mock], {},
292
+ '1234',
293
+ timeout_dict=self.timeout_dict)
294
+ mock_driver.reload.assert_called_once_with(mock_lb, _amphora_mock,
295
+ self.timeout_dict)
296
+ mock_amphora_repo_update.assert_not_called()
297
+
234
298
  @mock.patch('octavia.controller.worker.task_utils.TaskUtils.'
235
299
  'mark_listener_prov_status_error')
236
300
  @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
@@ -827,6 +891,11 @@ class TestAmphoraDriverTasks(base.TestCase):
827
891
  FAKE_INTERFACE = 'fake0'
828
892
  mock_driver.get_interface_from_ip.side_effect = [FAKE_INTERFACE,
829
893
  Exception('boom')]
894
+ amphorae_status = {
895
+ _amphora_mock[constants.ID]: {
896
+ constants.UNREACHABLE: False
897
+ }
898
+ }
830
899
 
831
900
  timeout_dict = {constants.CONN_MAX_RETRIES: CONN_MAX_RETRIES,
832
901
  constants.CONN_RETRY_INTERVAL: CONN_RETRY_INTERVAL}
@@ -834,20 +903,39 @@ class TestAmphoraDriverTasks(base.TestCase):
834
903
  amphora_update_vrrp_interface_obj = (
835
904
  amphora_driver_tasks.AmphoraIndexUpdateVRRPInterface())
836
905
  amphora_update_vrrp_interface_obj.execute(
837
- 0, [_amphora_mock], timeout_dict)
906
+ 0, [_amphora_mock], amphorae_status, _amphora_mock[constants.ID],
907
+ timeout_dict)
838
908
  mock_driver.get_interface_from_ip.assert_called_once_with(
839
909
  _db_amphora_mock, _db_amphora_mock.vrrp_ip,
840
910
  timeout_dict=timeout_dict)
841
911
  mock_amphora_repo_update.assert_called_once_with(
842
912
  _session_mock, _db_amphora_mock.id, vrrp_interface=FAKE_INTERFACE)
843
913
 
914
+ # Unreachable amp
915
+ mock_driver.reset_mock()
916
+ amphorae_status = {
917
+ _amphora_mock[constants.ID]: {
918
+ constants.UNREACHABLE: True
919
+ }
920
+ }
921
+ amphora_update_vrrp_interface_obj.execute(
922
+ 0, [_amphora_mock], amphorae_status, _amphora_mock[constants.ID],
923
+ timeout_dict)
924
+ mock_driver.get_interface_from_ip.assert_not_called()
925
+
844
926
  # Test with an exception
845
927
  mock_amphora_repo_update.reset_mock()
846
928
  amphora_update_vrrp_interface_obj.execute(
847
- 0, [_amphora_mock], timeout_dict)
929
+ 0, [_amphora_mock], {}, _amphora_mock[constants.ID], timeout_dict)
848
930
  mock_amphora_repo_update.assert_called_once_with(
849
931
  _session_mock, _db_amphora_mock.id, status=constants.ERROR)
850
932
 
933
+ # Test with an exception, secondary amp
934
+ mock_amphora_repo_update.reset_mock()
935
+ amphora_update_vrrp_interface_obj.execute(
936
+ 0, [_amphora_mock], {}, '1234', timeout_dict)
937
+ mock_amphora_repo_update.assert_not_called()
938
+
851
939
  @mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
852
940
  def test_amphora_vrrp_update(self,
853
941
  mock_lb_get,
@@ -895,23 +983,52 @@ class TestAmphoraDriverTasks(base.TestCase):
895
983
  Exception('boom')]
896
984
  mock_lb_get.return_value = _db_load_balancer_mock
897
985
  mock_amphora_repo_get.return_value = _db_amphora_mock
986
+ amphorae_status = {
987
+ _amphora_mock[constants.ID]: {
988
+ constants.UNREACHABLE: False
989
+ }
990
+ }
991
+
898
992
  amphora_vrrp_update_obj = (
899
993
  amphora_driver_tasks.AmphoraIndexVRRPUpdate())
900
994
 
901
995
  amphora_vrrp_update_obj.execute(LB_ID, amphorae_network_config,
902
- 0, [_amphora_mock], 'fakeint0',
996
+ 0, [_amphora_mock], amphorae_status,
997
+ 'fakeint0',
998
+ _amphora_mock[constants.ID],
903
999
  timeout_dict=self.timeout_dict)
904
1000
  mock_driver.update_vrrp_conf.assert_called_once_with(
905
1001
  _db_load_balancer_mock, amphorae_network_config, _db_amphora_mock,
906
1002
  self.timeout_dict)
907
1003
 
1004
+ # Unreachable amp
1005
+ amphorae_status = {
1006
+ _amphora_mock[constants.ID]: {
1007
+ constants.UNREACHABLE: True
1008
+ }
1009
+ }
1010
+ mock_amphora_repo_update.reset_mock()
1011
+ mock_driver.update_vrrp_conf.reset_mock()
1012
+ amphora_vrrp_update_obj.execute(LB_ID, amphorae_network_config,
1013
+ 0, [_amphora_mock], amphorae_status,
1014
+ None, _amphora_mock[constants.ID])
1015
+ mock_driver.update_vrrp_conf.assert_not_called()
1016
+
908
1017
  # Test with an exception
909
1018
  mock_amphora_repo_update.reset_mock()
910
1019
  amphora_vrrp_update_obj.execute(LB_ID, amphorae_network_config,
911
- 0, [_amphora_mock], 'fakeint0')
1020
+ 0, [_amphora_mock], {}, 'fakeint0',
1021
+ _amphora_mock[constants.ID])
912
1022
  mock_amphora_repo_update.assert_called_once_with(
913
1023
  _session_mock, _db_amphora_mock.id, status=constants.ERROR)
914
1024
 
1025
+ # Test with an exception, secondary amp
1026
+ mock_amphora_repo_update.reset_mock()
1027
+ amphora_vrrp_update_obj.execute(LB_ID, amphorae_network_config,
1028
+ 0, [_amphora_mock], {}, 'fakeint0',
1029
+ '1234')
1030
+ mock_amphora_repo_update.assert_not_called()
1031
+
915
1032
  def test_amphora_vrrp_start(self,
916
1033
  mock_driver,
917
1034
  mock_generate_uuid,
@@ -939,25 +1056,54 @@ class TestAmphoraDriverTasks(base.TestCase):
939
1056
  mock_amphora_repo_get,
940
1057
  mock_amphora_repo_update):
941
1058
  mock_amphora_repo_get.return_value = _db_amphora_mock
1059
+ amphorae_status = {
1060
+ _amphora_mock[constants.ID]: {
1061
+ constants.UNREACHABLE: False
1062
+ }
1063
+ }
1064
+
942
1065
  amphora_vrrp_start_obj = (
943
1066
  amphora_driver_tasks.AmphoraIndexVRRPStart())
944
1067
  mock_driver.start_vrrp_service.side_effect = [mock.DEFAULT,
945
1068
  Exception('boom')]
946
1069
 
947
- amphora_vrrp_start_obj.execute(0, [_amphora_mock],
1070
+ amphora_vrrp_start_obj.execute(0, [_amphora_mock], amphorae_status,
1071
+ _amphora_mock[constants.ID],
948
1072
  timeout_dict=self.timeout_dict)
949
1073
  mock_driver.start_vrrp_service.assert_called_once_with(
950
1074
  _db_amphora_mock, self.timeout_dict)
951
1075
 
1076
+ # Unreachable amp
1077
+ mock_driver.start_vrrp_service.reset_mock()
1078
+ amphorae_status = {
1079
+ _amphora_mock[constants.ID]: {
1080
+ constants.UNREACHABLE: True
1081
+ }
1082
+ }
1083
+ amphora_vrrp_start_obj.execute(0, [_amphora_mock], amphorae_status,
1084
+ _amphora_mock[constants.ID],
1085
+ timeout_dict=self.timeout_dict)
1086
+ mock_driver.start_vrrp_service.assert_not_called()
1087
+
952
1088
  # Test with a start exception
953
1089
  mock_driver.start_vrrp_service.reset_mock()
954
- amphora_vrrp_start_obj.execute(0, [_amphora_mock],
1090
+ amphora_vrrp_start_obj.execute(0, [_amphora_mock], {},
1091
+ _amphora_mock[constants.ID],
955
1092
  timeout_dict=self.timeout_dict)
956
1093
  mock_driver.start_vrrp_service.assert_called_once_with(
957
1094
  _db_amphora_mock, self.timeout_dict)
958
1095
  mock_amphora_repo_update.assert_called_once_with(
959
1096
  _session_mock, _db_amphora_mock.id, status=constants.ERROR)
960
1097
 
1098
+ # Test with a start exception, secondary amp
1099
+ mock_driver.start_vrrp_service.reset_mock()
1100
+ mock_amphora_repo_update.reset_mock()
1101
+ amphora_vrrp_start_obj.execute(0, [_amphora_mock], {}, '1234',
1102
+ timeout_dict=self.timeout_dict)
1103
+ mock_driver.start_vrrp_service.assert_called_once_with(
1104
+ _db_amphora_mock, self.timeout_dict)
1105
+ mock_amphora_repo_update.assert_not_called()
1106
+
961
1107
  def test_amphora_compute_connectivity_wait(self,
962
1108
  mock_driver,
963
1109
  mock_generate_uuid,
@@ -1029,3 +1175,105 @@ class TestAmphoraDriverTasks(base.TestCase):
1029
1175
  self.assertRaises(driver_except.TimeOutException,
1030
1176
  amp_config_update_obj.execute,
1031
1177
  _amphora_mock, flavor)
1178
+
1179
+ def test_amphorae_get_connectivity_status(self,
1180
+ mock_driver,
1181
+ mock_generate_uuid,
1182
+ mock_log,
1183
+ mock_get_session,
1184
+ mock_listener_repo_get,
1185
+ mock_listener_repo_update,
1186
+ mock_amphora_repo_get,
1187
+ mock_amphora_repo_update):
1188
+ amphora1_mock = mock.MagicMock()
1189
+ amphora1_mock[constants.ID] = 'id1'
1190
+ amphora2_mock = mock.MagicMock()
1191
+ amphora2_mock[constants.ID] = 'id2'
1192
+ db_amphora1_mock = mock.Mock()
1193
+ db_amphora2_mock = mock.Mock()
1194
+
1195
+ amp_get_connectivity_status = (
1196
+ amphora_driver_tasks.AmphoraeGetConnectivityStatus())
1197
+
1198
+ # All amphorae reachable
1199
+ mock_amphora_repo_get.side_effect = [
1200
+ db_amphora1_mock,
1201
+ db_amphora2_mock]
1202
+ mock_driver.check.return_value = None
1203
+
1204
+ ret = amp_get_connectivity_status.execute(
1205
+ [amphora1_mock, amphora2_mock],
1206
+ amphora1_mock[constants.ID],
1207
+ timeout_dict=self.timeout_dict)
1208
+ mock_driver.check.assert_has_calls(
1209
+ [mock.call(db_amphora1_mock, timeout_dict=self.timeout_dict),
1210
+ mock.call(db_amphora2_mock, timeout_dict=self.timeout_dict)])
1211
+ self.assertFalse(
1212
+ ret[amphora1_mock[constants.ID]][constants.UNREACHABLE])
1213
+ self.assertFalse(
1214
+ ret[amphora2_mock[constants.ID]][constants.UNREACHABLE])
1215
+
1216
+ # amphora1 unreachable
1217
+ mock_driver.check.reset_mock()
1218
+ mock_amphora_repo_get.side_effect = [
1219
+ db_amphora1_mock,
1220
+ db_amphora2_mock]
1221
+ mock_driver.check.side_effect = [
1222
+ driver_except.TimeOutException, None]
1223
+ self.assertRaises(driver_except.TimeOutException,
1224
+ amp_get_connectivity_status.execute,
1225
+ [amphora1_mock, amphora2_mock],
1226
+ amphora1_mock[constants.ID],
1227
+ timeout_dict=self.timeout_dict)
1228
+ mock_driver.check.assert_called_with(
1229
+ db_amphora1_mock, timeout_dict=self.timeout_dict)
1230
+
1231
+ # amphora2 unreachable
1232
+ mock_driver.check.reset_mock()
1233
+ mock_amphora_repo_get.side_effect = [
1234
+ db_amphora1_mock,
1235
+ db_amphora2_mock]
1236
+ mock_driver.check.side_effect = [
1237
+ None, driver_except.TimeOutException]
1238
+ ret = amp_get_connectivity_status.execute(
1239
+ [amphora1_mock, amphora2_mock],
1240
+ amphora1_mock[constants.ID],
1241
+ timeout_dict=self.timeout_dict)
1242
+ mock_driver.check.assert_has_calls(
1243
+ [mock.call(db_amphora1_mock, timeout_dict=self.timeout_dict),
1244
+ mock.call(db_amphora2_mock, timeout_dict=self.timeout_dict)])
1245
+ self.assertFalse(
1246
+ ret[amphora1_mock[constants.ID]][constants.UNREACHABLE])
1247
+ self.assertTrue(
1248
+ ret[amphora2_mock[constants.ID]][constants.UNREACHABLE])
1249
+
1250
+ def test_set_amphora_firewall_rules(self,
1251
+ mock_driver,
1252
+ mock_generate_uuid,
1253
+ mock_log,
1254
+ mock_get_session,
1255
+ mock_listener_repo_get,
1256
+ mock_listener_repo_update,
1257
+ mock_amphora_repo_get,
1258
+ mock_amphora_repo_update):
1259
+ amphora = {constants.ID: AMP_ID, constants.VRRP_IP: '192.0.2.88'}
1260
+ mock_amphora_repo_get.return_value = _db_amphora_mock
1261
+
1262
+ set_amp_fw_rules = amphora_driver_tasks.SetAmphoraFirewallRules()
1263
+
1264
+ # Test non-SRIOV VIP path
1265
+ set_amp_fw_rules.execute([amphora], 0, [{'non-sriov-vip': True}], {},
1266
+ timeout_dict=None)
1267
+
1268
+ mock_get_session.assert_not_called()
1269
+ mock_driver.set_interface_rules.assert_not_called()
1270
+
1271
+ # Test SRIOV VIP path
1272
+ set_amp_fw_rules.execute([amphora], 0, [{'fake_rule': True}], {},
1273
+ timeout_dict=None)
1274
+
1275
+ mock_amphora_repo_get.assert_called_once_with(_session_mock, id=AMP_ID)
1276
+
1277
+ mock_driver.set_interface_rules.assert_called_once_with(
1278
+ _db_amphora_mock, '192.0.2.88', [{'fake_rule': True}],
1279
+ timeout_dict=None)
@@ -12,6 +12,7 @@
12
12
  # License for the specific language governing permissions and limitations
13
13
  # under the License.
14
14
  #
15
+ import copy
15
16
  import random
16
17
  from unittest import mock
17
18
 
@@ -24,6 +25,7 @@ from taskflow.types import failure
24
25
  from octavia.api.drivers import utils as provider_utils
25
26
  from octavia.common import constants
26
27
  from octavia.common import data_models
28
+ from octavia.common import exceptions
27
29
  from octavia.common import utils
28
30
  from octavia.controller.worker.v2.tasks import database_tasks
29
31
  from octavia.db import repositories as repo
@@ -31,6 +33,7 @@ import octavia.tests.unit.base as base
31
33
 
32
34
 
33
35
  AMP_ID = uuidutils.generate_uuid()
36
+ AMP2_ID = uuidutils.generate_uuid()
34
37
  COMPUTE_ID = uuidutils.generate_uuid()
35
38
  LB_ID = uuidutils.generate_uuid()
36
39
  SERVER_GROUP_ID = uuidutils.generate_uuid()
@@ -1424,7 +1427,7 @@ class TestDatabaseTasks(base.TestCase):
1424
1427
  provisioning_status=constants.ERROR)
1425
1428
  ])
1426
1429
  self.assertEqual(2, repo.HealthMonitorRepository.update.call_count)
1427
- repo.HealthMonitorRepository.update.has_calls(
1430
+ repo.HealthMonitorRepository.update.assert_has_calls(
1428
1431
  [mock.call(mock_session, health_monitor.id,
1429
1432
  provisioning_status=constants.ERROR)])
1430
1433
  self.assertEqual(1, repo.L7PolicyRepository.update.call_count)
@@ -2987,3 +2990,100 @@ class TestDatabaseTasks(base.TestCase):
2987
2990
  mock_session,
2988
2991
  POOL_ID,
2989
2992
  operating_status=constants.ONLINE)
2993
+
2994
+ @mock.patch('octavia.common.utils.ip_version')
2995
+ @mock.patch('octavia.db.api.get_session')
2996
+ @mock.patch('octavia.db.repositories.ListenerRepository.'
2997
+ 'get_port_protocol_cidr_for_lb')
2998
+ def test_get_amphora_firewall_rules(self,
2999
+ mock_get_port_for_lb,
3000
+ mock_db_get_session,
3001
+ mock_ip_version,
3002
+ mock_generate_uuid,
3003
+ mock_LOG,
3004
+ mock_get_session,
3005
+ mock_loadbalancer_repo_update,
3006
+ mock_listener_repo_update,
3007
+ mock_amphora_repo_update,
3008
+ mock_amphora_repo_delete):
3009
+
3010
+ amphora_dict = {constants.ID: AMP_ID}
3011
+ rules = [{'protocol': 'TCP', 'cidr': '192.0.2.0/24', 'port': 80},
3012
+ {'protocol': 'TCP', 'cidr': '198.51.100.0/24', 'port': 80}]
3013
+ vrrp_rules = [
3014
+ {'protocol': 'TCP', 'cidr': '192.0.2.0/24', 'port': 80},
3015
+ {'protocol': 'TCP', 'cidr': '198.51.100.0/24', 'port': 80},
3016
+ {'cidr': '203.0.113.5/32', 'port': 112, 'protocol': 'vrrp'}]
3017
+ mock_get_port_for_lb.side_effect = [
3018
+ copy.deepcopy(rules), copy.deepcopy(rules), copy.deepcopy(rules),
3019
+ copy.deepcopy(rules)]
3020
+ mock_ip_version.side_effect = [4, 6, 55]
3021
+
3022
+ get_amp_fw_rules = database_tasks.GetAmphoraFirewallRules()
3023
+
3024
+ # Test non-SRIOV VIP
3025
+ amphora_net_cfg_dict = {
3026
+ AMP_ID: {constants.AMPHORA: {
3027
+ 'load_balancer': {constants.VIP: {
3028
+ constants.VNIC_TYPE: constants.VNIC_TYPE_NORMAL}}}}}
3029
+ result = get_amp_fw_rules.execute([amphora_dict], 0,
3030
+ amphora_net_cfg_dict)
3031
+ self.assertEqual([{'non-sriov-vip': True}], result)
3032
+
3033
+ # Test SRIOV VIP - Single
3034
+ amphora_net_cfg_dict = {
3035
+ AMP_ID: {constants.AMPHORA: {
3036
+ 'load_balancer': {constants.VIP: {
3037
+ constants.VNIC_TYPE: constants.VNIC_TYPE_DIRECT},
3038
+ constants.TOPOLOGY: constants.TOPOLOGY_SINGLE},
3039
+ constants.LOAD_BALANCER_ID: LB_ID}}}
3040
+ result = get_amp_fw_rules.execute([amphora_dict], 0,
3041
+ amphora_net_cfg_dict)
3042
+ mock_get_port_for_lb.assert_called_once_with(mock_db_get_session(),
3043
+ LB_ID)
3044
+ self.assertEqual(rules, result)
3045
+
3046
+ mock_get_port_for_lb.reset_mock()
3047
+
3048
+ # Test SRIOV VIP - Active/Standby
3049
+ amphora_net_cfg_dict = {
3050
+ AMP_ID: {constants.AMPHORA: {
3051
+ 'load_balancer': {constants.VIP: {
3052
+ constants.VNIC_TYPE: constants.VNIC_TYPE_DIRECT},
3053
+ constants.TOPOLOGY: constants.TOPOLOGY_ACTIVE_STANDBY,
3054
+ constants.AMPHORAE: [{
3055
+ constants.ID: AMP_ID,
3056
+ constants.STATUS: constants.AMPHORA_ALLOCATED},
3057
+ {constants.ID: AMP2_ID,
3058
+ constants.STATUS: constants.AMPHORA_ALLOCATED,
3059
+ constants.VRRP_IP: '203.0.113.5'}]},
3060
+ constants.LOAD_BALANCER_ID: LB_ID}}}
3061
+
3062
+ # IPv4 path
3063
+ mock_get_port_for_lb.reset_mock()
3064
+ vrrp_rules = [
3065
+ {'protocol': 'TCP', 'cidr': '192.0.2.0/24', 'port': 80},
3066
+ {'protocol': 'TCP', 'cidr': '198.51.100.0/24', 'port': 80},
3067
+ {'cidr': '203.0.113.5/32', 'port': 112, 'protocol': 'vrrp'}]
3068
+ result = get_amp_fw_rules.execute([amphora_dict], 0,
3069
+ amphora_net_cfg_dict)
3070
+ mock_get_port_for_lb.assert_called_once_with(mock_db_get_session(),
3071
+ LB_ID)
3072
+ self.assertEqual(vrrp_rules, result)
3073
+
3074
+ # IPv6 path
3075
+ mock_get_port_for_lb.reset_mock()
3076
+ vrrp_rules = [
3077
+ {'protocol': 'TCP', 'cidr': '192.0.2.0/24', 'port': 80},
3078
+ {'protocol': 'TCP', 'cidr': '198.51.100.0/24', 'port': 80},
3079
+ {'cidr': '203.0.113.5/128', 'port': 112, 'protocol': 'vrrp'}]
3080
+ result = get_amp_fw_rules.execute([amphora_dict], 0,
3081
+ amphora_net_cfg_dict)
3082
+ mock_get_port_for_lb.assert_called_once_with(mock_db_get_session(),
3083
+ LB_ID)
3084
+ self.assertEqual(vrrp_rules, result)
3085
+
3086
+ # Bogus IP version path
3087
+ self.assertRaises(exceptions.InvalidIPAddress,
3088
+ get_amp_fw_rules.execute, [amphora_dict], 0,
3089
+ amphora_net_cfg_dict)