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
@@ -12,7 +12,9 @@
12
12
  # License for the specific language governing permissions and limitations
13
13
  # under the License.
14
14
 
15
- from neutronclient.common import exceptions as neutron_client_exceptions
15
+ from openstack.connection import Connection
16
+ import openstack.exceptions as os_exceptions
17
+ from openstack.network.v2._proxy import Proxy
16
18
  from oslo_config import cfg
17
19
  from oslo_log import log as logging
18
20
 
@@ -23,33 +25,28 @@ from octavia.network import base
23
25
  from octavia.network import data_models as network_models
24
26
  from octavia.network.drivers.neutron import utils
25
27
 
26
-
27
28
  LOG = logging.getLogger(__name__)
28
29
  DNS_INT_EXT_ALIAS = 'dns-integration'
29
30
  SEC_GRP_EXT_ALIAS = 'security-group'
30
31
  QOS_EXT_ALIAS = 'qos'
32
+ CONF_GROUP = 'neutron'
31
33
 
32
34
  CONF = cfg.CONF
33
35
 
34
36
 
35
37
  class BaseNeutronDriver(base.AbstractNetworkDriver):
36
-
37
38
  def __init__(self):
38
- self.neutron_client = clients.NeutronAuth.get_neutron_client(
39
- endpoint=CONF.neutron.endpoint,
40
- region=CONF.neutron.region_name,
41
- endpoint_type=CONF.neutron.endpoint_type,
42
- service_name=CONF.neutron.service_name,
43
- insecure=CONF.neutron.insecure,
44
- ca_cert=CONF.neutron.ca_certificates_file
45
- )
39
+ self.network_proxy: Proxy = self.os_connection.network
46
40
  self._check_extension_cache = {}
47
41
  self.sec_grp_enabled = self._check_extension_enabled(SEC_GRP_EXT_ALIAS)
48
42
  self.dns_integration_enabled = self._check_extension_enabled(
49
43
  DNS_INT_EXT_ALIAS)
50
44
  self._qos_enabled = self._check_extension_enabled(QOS_EXT_ALIAS)
51
- self.project_id = self.neutron_client.get_auth_info().get(
52
- 'auth_tenant_id')
45
+ self.project_id = self.os_connection.current_project_id
46
+
47
+ @property
48
+ def os_connection(self) -> Connection:
49
+ return clients.NeutronAuth.get_neutron_client()
53
50
 
54
51
  def _check_extension_enabled(self, extension_alias):
55
52
  if extension_alias in self._check_extension_cache:
@@ -60,12 +57,11 @@ class BaseNeutronDriver(base.AbstractNetworkDriver):
60
57
  'status': 'enabled' if status else 'disabled'
61
58
  })
62
59
  else:
63
- try:
64
- self.neutron_client.show_extension(extension_alias)
60
+ if self.network_proxy.find_extension(extension_alias):
65
61
  LOG.debug('Neutron extension %(ext)s found enabled',
66
62
  {'ext': extension_alias})
67
63
  self._check_extension_cache[extension_alias] = True
68
- except neutron_client_exceptions.NotFound:
64
+ else:
69
65
  LOG.debug('Neutron extension %(ext)s is not enabled',
70
66
  {'ext': extension_alias})
71
67
  self._check_extension_cache[extension_alias] = False
@@ -123,64 +119,51 @@ class BaseNeutronDriver(base.AbstractNetworkDriver):
123
119
  fixed_ips=fixed_ips)
124
120
 
125
121
  def _add_allowed_address_pairs_to_port(self, port_id, ip_address_list):
126
- aap = {
127
- 'port': {
128
- 'allowed_address_pairs': [
129
- {'ip_address': ip} for ip in ip_address_list
130
- ]
131
- }
132
- }
133
- self.neutron_client.update_port(port_id, aap)
122
+ aap = [{'ip_address': ip} for ip in ip_address_list]
123
+ self.network_proxy.update_port(port_id,
124
+ allowed_address_pairs=aap)
134
125
 
135
126
  def _add_security_group_to_port(self, sec_grp_id, port_id):
136
- port_update = {'port': {'security_groups': [sec_grp_id]}}
137
127
  # Note: Neutron accepts the SG even if it already exists
138
128
  try:
139
- self.neutron_client.update_port(port_id, port_update)
140
- except neutron_client_exceptions.PortNotFoundClient as e:
129
+ self.network_proxy.update_port(
130
+ port_id, security_groups=[sec_grp_id])
131
+ except os_exceptions.NotFoundException as e:
141
132
  raise base.PortNotFound(str(e))
142
133
  except Exception as e:
143
134
  raise base.NetworkException(str(e))
144
135
 
145
136
  def _get_ports_by_security_group(self, sec_grp_id):
146
- all_ports = self.neutron_client.list_ports(project_id=self.project_id)
147
- filtered_ports = []
148
- for port in all_ports.get('ports', []):
149
- if sec_grp_id in port.get('security_groups', []):
150
- filtered_ports.append(port)
137
+ all_ports = self.network_proxy.ports(project_id=self.project_id)
138
+ filtered_ports = [
139
+ p for p in all_ports if (p.security_group_ids and
140
+ sec_grp_id in p.security_group_ids)]
151
141
  return filtered_ports
152
142
 
153
143
  def _create_security_group(self, name):
154
- new_sec_grp = {'security_group': {'name': name}}
155
- sec_grp = self.neutron_client.create_security_group(new_sec_grp)
156
- return sec_grp['security_group']
144
+ sec_grp = self.network_proxy.create_security_group(name=name)
145
+ return sec_grp
157
146
 
158
147
  def _create_security_group_rule(self, sec_grp_id, protocol,
159
148
  direction='ingress', port_min=None,
160
149
  port_max=None, ethertype='IPv6',
161
150
  cidr=None):
162
151
  rule = {
163
- 'security_group_rule': {
164
- 'security_group_id': sec_grp_id,
165
- 'direction': direction,
166
- 'protocol': protocol,
167
- 'port_range_min': port_min,
168
- 'port_range_max': port_max,
169
- 'ethertype': ethertype,
170
- 'remote_ip_prefix': cidr,
171
- }
152
+ 'security_group_id': sec_grp_id,
153
+ 'direction': direction,
154
+ 'protocol': protocol,
155
+ 'port_range_min': port_min,
156
+ 'port_range_max': port_max,
157
+ 'ethertype': ethertype,
158
+ 'remote_ip_prefix': cidr,
172
159
  }
173
160
 
174
- self.neutron_client.create_security_group_rule(rule)
161
+ self.network_proxy.create_security_group_rule(**rule)
175
162
 
176
163
  def apply_qos_on_port(self, qos_id, port_id):
177
- body = {
178
- 'port':
179
- {'qos_policy_id': qos_id}
180
- }
181
164
  try:
182
- self.neutron_client.update_port(port_id, body)
183
- except neutron_client_exceptions.PortNotFoundClient as e:
165
+ self.network_proxy.update_port(port_id, qos_policy_id=qos_id)
166
+ except os_exceptions.ResourceNotFound as e:
184
167
  raise base.PortNotFound(str(e))
185
168
  except Exception as e:
186
169
  raise base.NetworkException(str(e))
@@ -188,26 +171,26 @@ class BaseNeutronDriver(base.AbstractNetworkDriver):
188
171
  def get_plugged_networks(self, compute_id):
189
172
  # List neutron ports associated with the Amphora
190
173
  try:
191
- ports = self.neutron_client.list_ports(device_id=compute_id)
174
+ ports = self.network_proxy.ports(device_id=compute_id)
192
175
  except Exception:
193
176
  LOG.debug('Error retrieving plugged networks for compute '
194
177
  'device %s.', compute_id)
195
- ports = {'ports': []}
196
- return [self._port_to_octavia_interface(
197
- compute_id, port) for port in ports['ports']]
178
+ ports = tuple()
179
+ return [self._port_to_octavia_interface(compute_id, port) for port in
180
+ ports]
198
181
 
199
182
  def _get_resource(self, resource_type, resource_id, context=None):
200
- neutron_client = self.neutron_client
183
+ network = self.network_proxy
201
184
  if context and not CONF.networking.allow_invisible_resource_usage:
202
- neutron_client = clients.NeutronAuth.get_user_neutron_client(
185
+ network = clients.NeutronAuth.get_user_neutron_client(
203
186
  context)
204
187
 
205
188
  try:
206
- resource = getattr(neutron_client, 'show_%s' %
207
- resource_type)(resource_id)
208
- return getattr(utils, 'convert_%s_dict_to_model' %
189
+ resource = getattr(
190
+ network, f"get_{resource_type}")(resource_id)
191
+ return getattr(utils, 'convert_%s_to_model' %
209
192
  resource_type)(resource)
210
- except neutron_client_exceptions.NotFound as e:
193
+ except os_exceptions.ResourceNotFound as e:
211
194
  message = _('{resource_type} not found '
212
195
  '({resource_type} id: {resource_id}).').format(
213
196
  resource_type=resource_type, resource_id=resource_id)
@@ -228,20 +211,25 @@ class BaseNeutronDriver(base.AbstractNetworkDriver):
228
211
  If unique_item set to True, only the first resource is returned.
229
212
  """
230
213
  try:
231
- resource = getattr(self.neutron_client, 'list_%ss' %
232
- resource_type)(**filters)
214
+ resources = getattr(
215
+ self.network_proxy, f"{resource_type}s")(**filters)
233
216
  conversion_function = getattr(
234
217
  utils,
235
- 'convert_%s_dict_to_model' % resource_type)
236
- if not resource['%ss' % resource_type]:
237
- # no items found
238
- raise neutron_client_exceptions.NotFound()
218
+ 'convert_%s_to_model' % resource_type)
219
+ try:
220
+ # get first item to see if there is at least one resource
221
+ res_list = [conversion_function(next(resources))]
222
+ except StopIteration:
223
+ # pylint: disable=raise-missing-from
224
+ raise os_exceptions.NotFoundException(
225
+ f'No resource of type {resource_type} found that matches '
226
+ f'given filter criteria: {filters}.')
227
+
239
228
  if unique_item:
240
- return conversion_function(resource['%ss' % resource_type][0])
229
+ return res_list[0]
230
+ return res_list + [conversion_function(r) for r in resources]
241
231
 
242
- return list(map(conversion_function,
243
- resource['%ss' % resource_type]))
244
- except neutron_client_exceptions.NotFound as e:
232
+ except os_exceptions.NotFoundException as e:
245
233
  message = _('{resource_type} not found '
246
234
  '({resource_type} Filters: {filters}.').format(
247
235
  resource_type=resource_type, filters=filters)
@@ -300,10 +288,10 @@ class BaseNeutronDriver(base.AbstractNetworkDriver):
300
288
 
301
289
  fixed_ips.append(new_fixed_ip_dict)
302
290
 
303
- body = {'port': {'fixed_ips': fixed_ips}}
304
291
  try:
305
- updated_port = self.neutron_client.update_port(port_id, body)
306
- return utils.convert_port_dict_to_model(updated_port)
292
+ updated_port = self.network_proxy.update_port(
293
+ port_id, fixed_ips=fixed_ips)
294
+ return utils.convert_port_to_model(updated_port)
307
295
  except Exception as e:
308
296
  raise base.NetworkException(str(e))
309
297
 
@@ -315,9 +303,9 @@ class BaseNeutronDriver(base.AbstractNetworkDriver):
315
303
  if fixed_ip.subnet_id != subnet_id
316
304
  ]
317
305
 
318
- body = {'port': {'fixed_ips': fixed_ips}}
319
306
  try:
320
- updated_port = self.neutron_client.update_port(port_id, body)
321
- return utils.convert_port_dict_to_model(updated_port)
307
+ updated_port = self.network_proxy.update_port(
308
+ port_id, fixed_ips=fixed_ips)
309
+ return utils.convert_port_to_model(updated_port)
322
310
  except Exception as e:
323
311
  raise base.NetworkException(str(e))
@@ -13,113 +13,97 @@
13
13
  # under the License.
14
14
 
15
15
 
16
- from octavia.common import constants
16
+ from openstack.network.v2.network_ip_availability import NetworkIPAvailability
17
+
17
18
  from octavia.network import data_models as network_models
18
19
 
19
20
 
20
- def convert_subnet_dict_to_model(subnet_dict):
21
- subnet = subnet_dict.get('subnet', subnet_dict)
22
- subnet_hrs = subnet.get('host_routes', [])
21
+ def convert_subnet_to_model(subnet):
23
22
  host_routes = [network_models.HostRoute(nexthop=hr.get('nexthop'),
24
23
  destination=hr.get('destination'))
25
- for hr in subnet_hrs]
26
- return network_models.Subnet(id=subnet.get(constants.ID),
27
- name=subnet.get(constants.NAME),
28
- network_id=subnet.get('network_id'),
29
- project_id=subnet.get(constants.TENANT_ID),
30
- gateway_ip=subnet.get('gateway_ip'),
31
- cidr=subnet.get('cidr'),
32
- ip_version=subnet.get('ip_version'),
33
- host_routes=host_routes
34
- )
35
-
36
-
37
- def convert_port_dict_to_model(port_dict):
38
- port = port_dict.get('port', port_dict)
39
- fixed_ips = [network_models.FixedIP(subnet_id=fixed_ip.get('subnet_id'),
40
- ip_address=fixed_ip.get('ip_address'))
41
- for fixed_ip in port.get('fixed_ips', [])]
24
+ for hr in subnet.host_routes] if subnet.host_routes else []
25
+ return network_models.Subnet(
26
+ id=subnet.id,
27
+ name=subnet.name,
28
+ network_id=subnet.network_id,
29
+ project_id=subnet.project_id,
30
+ gateway_ip=subnet.gateway_ip,
31
+ cidr=subnet.cidr,
32
+ ip_version=subnet.ip_version,
33
+ host_routes=host_routes,
34
+ )
35
+
36
+
37
+ def convert_port_to_model(port):
38
+ if port.get('fixed_ips'):
39
+ fixed_ips = [convert_fixed_ip_dict_to_model(fixed_ip)
40
+ for fixed_ip in port.fixed_ips]
41
+ else:
42
+ fixed_ips = []
42
43
  return network_models.Port(
43
- id=port.get(constants.ID),
44
- name=port.get(constants.NAME),
45
- device_id=port.get('device_id'),
46
- device_owner=port.get('device_owner'),
47
- mac_address=port.get('mac_address'),
48
- network_id=port.get('network_id'),
49
- status=port.get('status'),
50
- project_id=port.get(constants.TENANT_ID),
51
- admin_state_up=port.get('admin_state_up'),
44
+ id=port.id,
45
+ name=port.name,
46
+ device_id=port.device_id,
47
+ device_owner=port.device_owner,
48
+ mac_address=port.mac_address,
49
+ network_id=port.network_id,
50
+ status=port.status,
51
+ project_id=port.project_id,
52
+ admin_state_up=port.is_admin_state_up,
52
53
  fixed_ips=fixed_ips,
53
- qos_policy_id=port.get('qos_policy_id'),
54
- security_group_ids=port.get(constants.SECURITY_GROUPS, [])
54
+ qos_policy_id=port.qos_policy_id,
55
+ security_group_ids=port.security_group_ids
55
56
  )
56
57
 
57
58
 
58
- def convert_network_dict_to_model(network_dict):
59
- nw = network_dict.get('network', network_dict)
59
+ def convert_network_to_model(nw):
60
60
  return network_models.Network(
61
- id=nw.get(constants.ID),
62
- name=nw.get(constants.NAME),
63
- subnets=nw.get('subnets'),
64
- project_id=nw.get(constants.TENANT_ID),
65
- admin_state_up=nw.get('admin_state_up'),
66
- mtu=nw.get('mtu'),
67
- provider_network_type=nw.get('provider:network_type'),
68
- provider_physical_network=nw.get('provider:physical_network'),
69
- provider_segmentation_id=nw.get('provider:segmentation_id'),
70
- router_external=nw.get('router:external'),
71
- port_security_enabled=nw.get('port_security_enabled')
61
+ id=nw.id,
62
+ name=nw.name,
63
+ subnets=nw.subnet_ids,
64
+ project_id=nw.project_id,
65
+ admin_state_up=nw.is_admin_state_up,
66
+ mtu=nw.mtu,
67
+ provider_network_type=nw.provider_network_type,
68
+ provider_physical_network=nw.provider_physical_network,
69
+ provider_segmentation_id=nw.provider_segmentation_id,
70
+ router_external=nw.is_router_external,
71
+ port_security_enabled=nw.is_port_security_enabled,
72
72
  )
73
73
 
74
74
 
75
- def convert_fixed_ip_dict_to_model(fixed_ip_dict):
76
- fixed_ip = fixed_ip_dict.get('fixed_ip', fixed_ip_dict)
75
+ def convert_fixed_ip_dict_to_model(fixed_ip: dict):
77
76
  return network_models.FixedIP(subnet_id=fixed_ip.get('subnet_id'),
78
77
  ip_address=fixed_ip.get('ip_address'))
79
78
 
80
79
 
81
- def convert_qos_policy_dict_to_model(qos_policy_dict):
82
- qos_policy = qos_policy_dict.get('policy', qos_policy_dict)
83
- return network_models.QosPolicy(id=qos_policy.get(constants.ID))
84
-
85
-
86
- # We can't use "floating_ip" because we need to match the neutron client method
87
- def convert_floatingip_dict_to_model(floating_ip_dict):
88
- floating_ip = floating_ip_dict.get('floatingip', floating_ip_dict)
89
- return network_models.FloatingIP(
90
- id=floating_ip.get(constants.ID),
91
- description=floating_ip.get(constants.DESCRIPTION),
92
- project_id=floating_ip.get(constants.PROJECT_ID,
93
- floating_ip.get(constants.TENANT_ID)),
94
- status=floating_ip.get('status'),
95
- router_id=floating_ip.get('router_id'),
96
- port_id=floating_ip.get('port_id'),
97
- floating_network_id=floating_ip.get('floating_network_id'),
98
- floating_ip_address=floating_ip.get('floating_ip_address'),
99
- fixed_ip_address=floating_ip.get('fixed_ip_address'),
100
- fixed_port_id=floating_ip.get('fixed_port_id')
101
- )
80
+ def convert_qos_policy_to_model(qos_policy):
81
+ return network_models.QosPolicy(id=qos_policy.id)
102
82
 
103
83
 
104
- def convert_network_ip_availability_dict_to_model(
105
- network_ip_availability_dict):
106
- nw_ip_avail = network_ip_availability_dict.get(
107
- 'network_ip_availability', network_ip_availability_dict)
108
- ip_avail = network_models.Network_IP_Availability.from_dict(nw_ip_avail)
109
- ip_avail.subnet_ip_availability = nw_ip_avail.get('subnet_ip_availability')
84
+ def convert_network_ip_availability_to_model(
85
+ nw_ip_avail: NetworkIPAvailability):
86
+ ip_avail = network_models.Network_IP_Availability(
87
+ network_id=nw_ip_avail.network_id,
88
+ tenant_id=nw_ip_avail.tenant_id,
89
+ project_id=nw_ip_avail.project_id,
90
+ network_name=nw_ip_avail.network_name, total_ips=nw_ip_avail.total_ips,
91
+ used_ips=nw_ip_avail.used_ips,
92
+ subnet_ip_availability=nw_ip_avail.subnet_ip_availability)
110
93
  return ip_avail
111
94
 
112
95
 
113
- def convert_security_group_dict_to_model(security_group_dict):
114
- sg_rule_ids = [rule.get(constants.ID) for rule in
115
- security_group_dict.get(constants.SECURITY_GROUP_RULES, [])]
96
+ def convert_security_group_to_model(security_group):
97
+ if security_group.security_group_rules:
98
+ sg_rule_ids = [rule['id'] for rule in
99
+ security_group.security_group_rules]
100
+ else:
101
+ sg_rule_ids = []
116
102
  return network_models.SecurityGroup(
117
- id=security_group_dict.get(constants.ID),
118
- project_id=security_group_dict.get(
119
- constants.PROJECT_ID,
120
- security_group_dict.get(constants.TENANT_ID)),
121
- name=security_group_dict.get(constants.NAME),
122
- description=security_group_dict.get(constants.DESCRIPTION),
103
+ id=security_group.id,
104
+ project_id=security_group.project_id,
105
+ name=security_group.name,
106
+ description=security_group.description,
123
107
  security_group_rule_ids=sg_rule_ids,
124
- tags=security_group_dict.get(constants.TAGS, []),
125
- stateful=security_group_dict.get('stateful'))
108
+ tags=security_group.tags,
109
+ stateful=security_group.stateful)
@@ -352,10 +352,6 @@ class NoopManager(object):
352
352
 
353
353
  return amp_configs
354
354
 
355
- def wait_for_port_detach(self, amphora):
356
- LOG.debug("failover %s no-op, wait_for_port_detach, amphora id %s",
357
- self.__class__.__name__, amphora.id)
358
-
359
355
  def get_qos_policy(self, qos_policy_id):
360
356
  LOG.debug("Qos Policy %s no-op, get_qos_policy qos_policy_id %s",
361
357
  self.__class__.__name__, qos_policy_id)
@@ -520,9 +516,6 @@ class NoopNetworkDriver(driver_base.AbstractNetworkDriver):
520
516
  def get_network_configs(self, loadbalancer, amphora=None):
521
517
  return self.driver.get_network_configs(loadbalancer, amphora)
522
518
 
523
- def wait_for_port_detach(self, amphora):
524
- self.driver.wait_for_port_detach(amphora)
525
-
526
519
  def apply_qos_on_port(self, qos_id, port_id):
527
520
  self.driver.apply_qos_on_port(qos_id, port_id)
528
521
 
@@ -31,13 +31,13 @@ class StatsUpdateDb(stats_base.StatsDriverMixin):
31
31
 
32
32
  def update_stats(self, listener_stats, deltas=False):
33
33
  """This function is to update the db with listener stats"""
34
- session = db_api.get_session()
35
- for stats_object in listener_stats:
36
- LOG.debug("Updating listener stats in db for listener `%s` / "
37
- "amphora `%s`: %s",
38
- stats_object.listener_id, stats_object.amphora_id,
39
- stats_object.get_stats())
40
- if deltas:
41
- self.listener_stats_repo.increment(session, stats_object)
42
- else:
43
- self.listener_stats_repo.replace(session, stats_object)
34
+ with db_api.session().begin() as session:
35
+ for stats_object in listener_stats:
36
+ LOG.debug("Updating listener stats in db for listener `%s` / "
37
+ "amphora `%s`: %s",
38
+ stats_object.listener_id, stats_object.amphora_id,
39
+ stats_object.get_stats())
40
+ if deltas:
41
+ self.listener_stats_repo.increment(session, stats_object)
42
+ else:
43
+ self.listener_stats_repo.replace(session, stats_object)