python-openstackclient 6.6.0__py3-none-any.whl → 7.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 (337) hide show
  1. openstackclient/api/api.py +7 -8
  2. openstackclient/api/compute_v2.py +352 -638
  3. openstackclient/api/image_v1.py +1 -1
  4. openstackclient/api/object_store_v1.py +3 -4
  5. openstackclient/common/availability_zone.py +1 -1
  6. openstackclient/common/clientmanager.py +16 -4
  7. openstackclient/common/configuration.py +1 -1
  8. openstackclient/common/extension.py +1 -1
  9. openstackclient/common/limits.py +66 -32
  10. openstackclient/common/module.py +3 -3
  11. openstackclient/common/progressbar.py +2 -2
  12. openstackclient/common/project_cleanup.py +5 -2
  13. openstackclient/common/quota.py +281 -410
  14. openstackclient/common/versions.py +1 -1
  15. openstackclient/compute/client.py +7 -116
  16. openstackclient/compute/v2/agent.py +75 -49
  17. openstackclient/compute/v2/aggregate.py +9 -9
  18. openstackclient/compute/v2/console.py +2 -2
  19. openstackclient/compute/v2/flavor.py +6 -6
  20. openstackclient/compute/v2/host.py +38 -33
  21. openstackclient/compute/v2/hypervisor.py +4 -3
  22. openstackclient/compute/v2/keypair.py +7 -8
  23. openstackclient/compute/v2/server.py +478 -396
  24. openstackclient/compute/v2/server_backup.py +1 -1
  25. openstackclient/compute/v2/server_group.py +4 -4
  26. openstackclient/compute/v2/server_image.py +1 -1
  27. openstackclient/compute/v2/server_migration.py +3 -4
  28. openstackclient/compute/v2/service.py +4 -4
  29. openstackclient/compute/v2/usage.py +3 -3
  30. openstackclient/identity/common.py +34 -0
  31. openstackclient/identity/v2_0/catalog.py +2 -2
  32. openstackclient/identity/v2_0/ec2creds.py +4 -4
  33. openstackclient/identity/v2_0/endpoint.py +4 -4
  34. openstackclient/identity/v2_0/project.py +6 -6
  35. openstackclient/identity/v2_0/role.py +5 -5
  36. openstackclient/identity/v2_0/role_assignment.py +1 -1
  37. openstackclient/identity/v2_0/service.py +4 -4
  38. openstackclient/identity/v2_0/token.py +2 -2
  39. openstackclient/identity/v2_0/user.py +7 -7
  40. openstackclient/identity/v3/access_rule.py +3 -3
  41. openstackclient/identity/v3/application_credential.py +127 -45
  42. openstackclient/identity/v3/catalog.py +2 -2
  43. openstackclient/identity/v3/consumer.py +4 -4
  44. openstackclient/identity/v3/credential.py +5 -5
  45. openstackclient/identity/v3/domain.py +5 -5
  46. openstackclient/identity/v3/ec2creds.py +4 -4
  47. openstackclient/identity/v3/endpoint.py +7 -7
  48. openstackclient/identity/v3/endpoint_group.py +8 -10
  49. openstackclient/identity/v3/federation_protocol.py +5 -5
  50. openstackclient/identity/v3/group.py +8 -8
  51. openstackclient/identity/v3/identity_provider.py +5 -5
  52. openstackclient/identity/v3/implied_role.py +3 -3
  53. openstackclient/identity/v3/limit.py +5 -5
  54. openstackclient/identity/v3/mapping.py +5 -5
  55. openstackclient/identity/v3/policy.py +5 -5
  56. openstackclient/identity/v3/project.py +5 -5
  57. openstackclient/identity/v3/region.py +5 -5
  58. openstackclient/identity/v3/registered_limit.py +5 -5
  59. openstackclient/identity/v3/role.py +7 -7
  60. openstackclient/identity/v3/role_assignment.py +92 -140
  61. openstackclient/identity/v3/service.py +64 -34
  62. openstackclient/identity/v3/service_provider.py +4 -4
  63. openstackclient/identity/v3/tag.py +2 -2
  64. openstackclient/identity/v3/token.py +5 -5
  65. openstackclient/identity/v3/trust.py +3 -3
  66. openstackclient/identity/v3/user.py +144 -80
  67. openstackclient/image/client.py +4 -4
  68. openstackclient/image/v1/image.py +8 -9
  69. openstackclient/image/v2/cache.py +12 -10
  70. openstackclient/image/v2/metadef_objects.py +44 -0
  71. openstackclient/image/v2/metadef_resource_type_association.py +189 -0
  72. openstackclient/image/v2/task.py +1 -1
  73. openstackclient/network/common.py +6 -5
  74. openstackclient/network/utils.py +2 -2
  75. openstackclient/network/v2/address_group.py +6 -6
  76. openstackclient/network/v2/address_scope.py +5 -5
  77. openstackclient/network/v2/default_security_group_rule.py +1 -1
  78. openstackclient/network/v2/floating_ip.py +8 -10
  79. openstackclient/network/v2/floating_ip_pool.py +6 -15
  80. openstackclient/network/v2/floating_ip_port_forwarding.py +5 -13
  81. openstackclient/network/v2/ip_availability.py +2 -2
  82. openstackclient/network/v2/l3_conntrack_helper.py +5 -5
  83. openstackclient/network/v2/network.py +8 -8
  84. openstackclient/network/v2/network_agent.py +8 -8
  85. openstackclient/network/v2/network_auto_allocated_topology.py +2 -2
  86. openstackclient/network/v2/network_flavor.py +6 -8
  87. openstackclient/network/v2/network_flavor_profile.py +4 -4
  88. openstackclient/network/v2/network_meter.py +3 -3
  89. openstackclient/network/v2/network_meter_rule.py +3 -3
  90. openstackclient/network/v2/network_qos_policy.py +5 -5
  91. openstackclient/network/v2/network_qos_rule.py +9 -9
  92. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  93. openstackclient/network/v2/network_rbac.py +5 -5
  94. openstackclient/network/v2/network_segment.py +5 -5
  95. openstackclient/network/v2/network_segment_range.py +7 -7
  96. openstackclient/network/v2/network_trunk.py +7 -7
  97. openstackclient/network/v2/port.py +26 -12
  98. openstackclient/network/v2/router.py +403 -54
  99. openstackclient/network/v2/security_group.py +18 -14
  100. openstackclient/network/v2/security_group_rule.py +18 -15
  101. openstackclient/network/v2/subnet.py +15 -8
  102. openstackclient/network/v2/subnet_pool.py +6 -6
  103. openstackclient/object/v1/account.py +2 -2
  104. openstackclient/object/v1/container.py +7 -7
  105. openstackclient/object/v1/object.py +7 -7
  106. openstackclient/shell.py +4 -6
  107. openstackclient/tests/functional/base.py +1 -1
  108. openstackclient/tests/functional/common/test_extension.py +1 -1
  109. openstackclient/tests/functional/common/test_help.py +2 -2
  110. openstackclient/tests/functional/common/test_module.py +1 -1
  111. openstackclient/tests/functional/common/test_quota.py +43 -61
  112. openstackclient/tests/functional/compute/v2/common.py +2 -2
  113. openstackclient/tests/functional/compute/v2/test_flavor.py +2 -2
  114. openstackclient/tests/functional/compute/v2/test_keypair.py +1 -1
  115. openstackclient/tests/functional/compute/v2/test_server.py +5 -5
  116. openstackclient/tests/functional/compute/v2/test_server_event.py +1 -1
  117. openstackclient/tests/functional/identity/v2/common.py +3 -3
  118. openstackclient/tests/functional/identity/v3/common.py +14 -6
  119. openstackclient/tests/functional/identity/v3/test_application_credential.py +13 -19
  120. openstackclient/tests/functional/identity/v3/test_domain.py +1 -3
  121. openstackclient/tests/functional/identity/v3/test_endpoint.py +1 -1
  122. openstackclient/tests/functional/identity/v3/test_idp.py +1 -1
  123. openstackclient/tests/functional/identity/v3/test_limit.py +2 -2
  124. openstackclient/tests/functional/identity/v3/test_region.py +1 -3
  125. openstackclient/tests/functional/identity/v3/test_registered_limit.py +1 -1
  126. openstackclient/tests/functional/identity/v3/test_role.py +2 -2
  127. openstackclient/tests/functional/identity/v3/test_role_assignment.py +210 -0
  128. openstackclient/tests/functional/identity/v3/test_service.py +4 -6
  129. openstackclient/tests/functional/identity/v3/test_service_provider.py +1 -3
  130. openstackclient/tests/functional/image/base.py +1 -1
  131. openstackclient/tests/functional/image/v2/test_image.py +1 -1
  132. openstackclient/tests/functional/image/v2/test_info.py +1 -1
  133. openstackclient/tests/functional/network/v2/common.py +4 -6
  134. openstackclient/tests/functional/network/v2/test_network.py +5 -3
  135. openstackclient/tests/functional/network/v2/test_network_agent.py +7 -5
  136. openstackclient/tests/functional/network/v2/test_network_qos_rule.py +4 -4
  137. openstackclient/tests/functional/network/v2/test_port.py +11 -7
  138. openstackclient/tests/functional/network/v2/test_router.py +2 -2
  139. openstackclient/tests/functional/object/v1/common.py +1 -1
  140. openstackclient/tests/functional/object/v1/test_container.py +3 -3
  141. openstackclient/tests/functional/object/v1/test_object.py +9 -13
  142. openstackclient/tests/functional/volume/base.py +1 -1
  143. openstackclient/tests/functional/volume/v1/test_service.py +1 -1
  144. openstackclient/tests/functional/volume/v1/test_snapshot.py +2 -2
  145. openstackclient/tests/functional/volume/v1/test_transfer_request.py +2 -2
  146. openstackclient/tests/functional/volume/v1/test_volume_type.py +1 -1
  147. openstackclient/tests/functional/volume/v2/test_service.py +2 -2
  148. openstackclient/tests/functional/volume/v2/test_volume_backup.py +2 -2
  149. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +2 -2
  150. openstackclient/tests/functional/volume/v2/test_volume_type.py +1 -1
  151. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +2 -2
  152. openstackclient/tests/functional/volume/v3/test_volume_type.py +1 -1
  153. openstackclient/tests/unit/api/fakes.py +1 -1
  154. openstackclient/tests/unit/api/test_api.py +2 -2
  155. openstackclient/tests/unit/api/test_compute_v2.py +522 -707
  156. openstackclient/tests/unit/api/test_image_v1.py +1 -1
  157. openstackclient/tests/unit/api/test_image_v2.py +1 -1
  158. openstackclient/tests/unit/api/test_object_store_v1.py +4 -4
  159. openstackclient/tests/unit/common/test_limits.py +73 -35
  160. openstackclient/tests/unit/common/test_logs.py +2 -2
  161. openstackclient/tests/unit/common/test_module.py +4 -2
  162. openstackclient/tests/unit/common/test_project_cleanup.py +31 -6
  163. openstackclient/tests/unit/common/test_quota.py +490 -630
  164. openstackclient/tests/unit/compute/v2/fakes.py +37 -286
  165. openstackclient/tests/unit/compute/v2/test_agent.py +189 -147
  166. openstackclient/tests/unit/compute/v2/test_aggregate.py +18 -16
  167. openstackclient/tests/unit/compute/v2/test_console.py +4 -5
  168. openstackclient/tests/unit/compute/v2/test_flavor.py +59 -68
  169. openstackclient/tests/unit/compute/v2/test_host.py +83 -54
  170. openstackclient/tests/unit/compute/v2/test_hypervisor.py +28 -31
  171. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -2
  172. openstackclient/tests/unit/compute/v2/test_keypair.py +65 -50
  173. openstackclient/tests/unit/compute/v2/test_server.py +2895 -2459
  174. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -1
  175. openstackclient/tests/unit/compute/v2/test_server_event.py +14 -39
  176. openstackclient/tests/unit/compute/v2/test_server_group.py +28 -29
  177. openstackclient/tests/unit/compute/v2/test_server_migration.py +43 -68
  178. openstackclient/tests/unit/compute/v2/test_server_volume.py +17 -34
  179. openstackclient/tests/unit/compute/v2/test_service.py +34 -52
  180. openstackclient/tests/unit/compute/v2/test_usage.py +4 -4
  181. openstackclient/tests/unit/fakes.py +11 -11
  182. openstackclient/tests/unit/identity/v2_0/fakes.py +27 -10
  183. openstackclient/tests/unit/identity/v2_0/test_catalog.py +3 -3
  184. openstackclient/tests/unit/identity/v2_0/test_endpoint.py +7 -7
  185. openstackclient/tests/unit/identity/v2_0/test_project.py +8 -8
  186. openstackclient/tests/unit/identity/v2_0/test_role.py +10 -10
  187. openstackclient/tests/unit/identity/v2_0/test_role_assignment.py +4 -4
  188. openstackclient/tests/unit/identity/v2_0/test_service.py +6 -6
  189. openstackclient/tests/unit/identity/v2_0/test_token.py +4 -4
  190. openstackclient/tests/unit/identity/v2_0/test_user.py +8 -8
  191. openstackclient/tests/unit/identity/v3/fakes.py +59 -20
  192. openstackclient/tests/unit/identity/v3/test_access_rule.py +5 -5
  193. openstackclient/tests/unit/identity/v3/test_application_credential.py +212 -235
  194. openstackclient/tests/unit/identity/v3/test_catalog.py +3 -3
  195. openstackclient/tests/unit/identity/v3/test_consumer.py +7 -8
  196. openstackclient/tests/unit/identity/v3/test_credential.py +9 -9
  197. openstackclient/tests/unit/identity/v3/test_domain.py +8 -8
  198. openstackclient/tests/unit/identity/v3/test_endpoint.py +13 -13
  199. openstackclient/tests/unit/identity/v3/test_endpoint_group.py +12 -14
  200. openstackclient/tests/unit/identity/v3/test_group.py +12 -12
  201. openstackclient/tests/unit/identity/v3/test_identity_provider.py +8 -8
  202. openstackclient/tests/unit/identity/v3/test_implied_role.py +5 -5
  203. openstackclient/tests/unit/identity/v3/test_limit.py +7 -7
  204. openstackclient/tests/unit/identity/v3/test_mappings.py +7 -7
  205. openstackclient/tests/unit/identity/v3/test_oauth.py +5 -5
  206. openstackclient/tests/unit/identity/v3/test_project.py +16 -16
  207. openstackclient/tests/unit/identity/v3/test_protocol.py +7 -7
  208. openstackclient/tests/unit/identity/v3/test_region.py +7 -7
  209. openstackclient/tests/unit/identity/v3/test_registered_limit.py +12 -13
  210. openstackclient/tests/unit/identity/v3/test_role.py +13 -13
  211. openstackclient/tests/unit/identity/v3/test_role_assignment.py +410 -331
  212. openstackclient/tests/unit/identity/v3/test_service.py +93 -97
  213. openstackclient/tests/unit/identity/v3/test_service_provider.py +7 -7
  214. openstackclient/tests/unit/identity/v3/test_token.py +4 -4
  215. openstackclient/tests/unit/identity/v3/test_trust.py +9 -9
  216. openstackclient/tests/unit/identity/v3/test_unscoped_saml.py +4 -4
  217. openstackclient/tests/unit/identity/v3/test_user.py +299 -327
  218. openstackclient/tests/unit/image/v1/test_image.py +6 -6
  219. openstackclient/tests/unit/image/v2/fakes.py +46 -9
  220. openstackclient/tests/unit/image/v2/test_cache.py +2 -2
  221. openstackclient/tests/unit/image/v2/test_image.py +3 -3
  222. openstackclient/tests/unit/image/v2/test_metadef_objects.py +62 -0
  223. openstackclient/tests/unit/image/v2/test_metadef_resource_type_association.py +131 -0
  224. openstackclient/tests/unit/integ/base.py +1 -1
  225. openstackclient/tests/unit/integ/cli/test_project.py +4 -4
  226. openstackclient/tests/unit/integ/cli/test_shell.py +7 -7
  227. openstackclient/tests/unit/network/test_common.py +12 -21
  228. openstackclient/tests/unit/network/v2/fakes.py +64 -130
  229. openstackclient/tests/unit/network/v2/test_address_group.py +15 -15
  230. openstackclient/tests/unit/network/v2/test_address_scope.py +13 -13
  231. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +49 -27
  232. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +40 -38
  233. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +15 -15
  234. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +4 -7
  235. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +3 -5
  236. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +11 -11
  237. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -6
  238. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +11 -21
  239. openstackclient/tests/unit/network/v2/test_local_ip.py +7 -7
  240. openstackclient/tests/unit/network/v2/test_local_ip_association.py +3 -5
  241. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -13
  242. openstackclient/tests/unit/network/v2/test_network.py +23 -28
  243. openstackclient/tests/unit/network/v2/test_network_agent.py +17 -21
  244. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +8 -8
  245. openstackclient/tests/unit/network/v2/test_network_compute.py +66 -65
  246. openstackclient/tests/unit/network/v2/test_network_flavor.py +17 -19
  247. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +13 -13
  248. openstackclient/tests/unit/network/v2/test_network_meter.py +11 -11
  249. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +11 -11
  250. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +11 -21
  251. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +51 -77
  252. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +5 -9
  253. openstackclient/tests/unit/network/v2/test_network_rbac.py +12 -12
  254. openstackclient/tests/unit/network/v2/test_network_segment.py +11 -15
  255. openstackclient/tests/unit/network/v2/test_network_segment_range.py +11 -13
  256. openstackclient/tests/unit/network/v2/test_network_service_provider.py +3 -5
  257. openstackclient/tests/unit/network/v2/test_network_trunk.py +11 -11
  258. openstackclient/tests/unit/network/v2/test_port.py +22 -25
  259. openstackclient/tests/unit/network/v2/test_router.py +721 -51
  260. openstackclient/tests/unit/network/v2/test_security_group_compute.py +65 -49
  261. openstackclient/tests/unit/network/v2/test_security_group_network.py +15 -15
  262. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +57 -45
  263. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +11 -19
  264. openstackclient/tests/unit/network/v2/test_subnet.py +29 -25
  265. openstackclient/tests/unit/network/v2/test_subnet_pool.py +15 -15
  266. openstackclient/tests/unit/object/v1/fakes.py +1 -1
  267. openstackclient/tests/unit/object/v1/test_container.py +5 -5
  268. openstackclient/tests/unit/object/v1/test_container_all.py +6 -6
  269. openstackclient/tests/unit/object/v1/test_object.py +3 -3
  270. openstackclient/tests/unit/object/v1/test_object_all.py +5 -5
  271. openstackclient/tests/unit/test_shell.py +5 -5
  272. openstackclient/tests/unit/utils.py +4 -1
  273. openstackclient/tests/unit/volume/test_find_resource.py +2 -2
  274. openstackclient/tests/unit/volume/v1/fakes.py +5 -6
  275. openstackclient/tests/unit/volume/v1/test_volume.py +5 -4
  276. openstackclient/tests/unit/volume/v2/fakes.py +39 -259
  277. openstackclient/tests/unit/volume/v2/test_consistency_group_snapshot.py +5 -5
  278. openstackclient/tests/unit/volume/v2/test_qos_specs.py +9 -9
  279. openstackclient/tests/unit/volume/v2/test_volume.py +21 -87
  280. openstackclient/tests/unit/volume/v2/test_volume_backup.py +7 -368
  281. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +1 -1
  282. openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +0 -44
  283. openstackclient/tests/unit/volume/v2/test_volume_type.py +6 -87
  284. openstackclient/tests/unit/volume/v3/fakes.py +505 -22
  285. openstackclient/tests/unit/volume/v3/test_block_storage_cleanup.py +2 -3
  286. openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py +10 -11
  287. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +10 -6
  288. openstackclient/tests/unit/volume/v3/test_block_storage_manage.py +25 -17
  289. openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py +6 -32
  290. openstackclient/tests/unit/volume/v3/test_service.py +271 -0
  291. openstackclient/tests/unit/volume/v3/test_volume.py +2177 -33
  292. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +48 -52
  293. openstackclient/tests/unit/volume/v3/test_volume_backup.py +892 -0
  294. openstackclient/tests/unit/volume/v3/test_volume_group.py +19 -20
  295. openstackclient/tests/unit/volume/v3/test_volume_group_snapshot.py +14 -34
  296. openstackclient/tests/unit/volume/v3/test_volume_group_type.py +13 -16
  297. openstackclient/tests/unit/volume/v3/test_volume_message.py +10 -11
  298. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +161 -0
  299. openstackclient/tests/unit/volume/v3/test_volume_transfer_request.py +425 -0
  300. openstackclient/tests/unit/volume/v3/test_volume_type.py +1109 -0
  301. openstackclient/volume/v1/qos_specs.py +7 -7
  302. openstackclient/volume/v1/service.py +2 -2
  303. openstackclient/volume/v1/volume.py +12 -12
  304. openstackclient/volume/v1/volume_backup.py +7 -7
  305. openstackclient/volume/v1/volume_snapshot.py +8 -8
  306. openstackclient/volume/v1/volume_transfer_request.py +5 -5
  307. openstackclient/volume/v1/volume_type.py +7 -7
  308. openstackclient/volume/v2/backup_record.py +2 -2
  309. openstackclient/volume/v2/consistency_group.py +7 -9
  310. openstackclient/volume/v2/consistency_group_snapshot.py +4 -12
  311. openstackclient/volume/v2/qos_specs.py +7 -7
  312. openstackclient/volume/v2/service.py +2 -2
  313. openstackclient/volume/v2/volume.py +80 -80
  314. openstackclient/volume/v2/volume_backend.py +2 -2
  315. openstackclient/volume/v2/volume_backup.py +7 -217
  316. openstackclient/volume/v2/volume_host.py +2 -2
  317. openstackclient/volume/v2/volume_snapshot.py +8 -8
  318. openstackclient/volume/v2/volume_transfer_request.py +5 -37
  319. openstackclient/volume/v2/volume_type.py +7 -89
  320. openstackclient/volume/v3/service.py +56 -0
  321. openstackclient/volume/v3/volume.py +971 -0
  322. openstackclient/volume/v3/volume_attachment.py +31 -29
  323. openstackclient/volume/v3/volume_backup.py +670 -0
  324. openstackclient/volume/v3/volume_message.py +1 -1
  325. openstackclient/volume/v3/volume_snapshot.py +97 -0
  326. openstackclient/volume/v3/volume_transfer_request.py +233 -0
  327. openstackclient/volume/v3/volume_type.py +967 -0
  328. {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/AUTHORS +4 -0
  329. {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/METADATA +3 -3
  330. python_openstackclient-7.0.0.dist-info/RECORD +502 -0
  331. {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/entry_points.txt +33 -27
  332. python_openstackclient-7.0.0.dist-info/pbr.json +1 -0
  333. python_openstackclient-6.6.0.dist-info/RECORD +0 -489
  334. python_openstackclient-6.6.0.dist-info/pbr.json +0 -1
  335. {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/LICENSE +0 -0
  336. {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/WHEEL +0 -0
  337. {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/top_level.txt +0 -0
@@ -9,645 +9,359 @@
9
9
  # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
- #
13
12
 
14
- """Compute v2 API Library"""
13
+ """Compute v2 API Library
14
+
15
+ A collection of wrappers for deprecated Compute v2 APIs that are not
16
+ intentionally supported by SDK. Most of these are proxy APIs.
17
+ """
18
+
19
+ import http
15
20
 
16
- from keystoneauth1 import exceptions as ksa_exceptions
17
- from osc_lib.api import api
21
+ from openstack import exceptions as sdk_exceptions
18
22
  from osc_lib import exceptions
19
- from osc_lib.i18n import _
20
-
21
-
22
- # TODO(dtroyer): Mingrate this to osc-lib
23
- class InvalidValue(Exception):
24
- """An argument value is not valid: wrong type, out of range, etc"""
25
-
26
- message = "Supplied value is not valid"
27
-
28
-
29
- class APIv2(api.BaseAPI):
30
- """Compute v2 API"""
31
-
32
- def __init__(self, **kwargs):
33
- super(APIv2, self).__init__(**kwargs)
34
-
35
- # Overrides
36
-
37
- def _check_integer(self, value, msg=None):
38
- """Attempt to convert value to an integer
39
-
40
- Raises InvalidValue on failure
41
-
42
- :param value:
43
- Convert this to an integer. None is converted to 0 (zero).
44
- :param msg:
45
- An alternate message for the exception, must include exactly
46
- one substitution to receive the attempted value.
47
- """
48
-
49
- if value is None:
50
- return 0
51
-
52
- try:
53
- value = int(value)
54
- except (TypeError, ValueError):
55
- if not msg:
56
- msg = _("%s is not an integer") % value
57
- raise InvalidValue(msg)
58
- return value
59
-
60
- # TODO(dtroyer): Override find() until these fixes get into an osc-lib
61
- # minimum release
62
- def find(
63
- self,
64
- path,
65
- value=None,
66
- attr=None,
67
- ):
68
- """Find a single resource by name or ID
69
-
70
- :param string path:
71
- The API-specific portion of the URL path
72
- :param string value:
73
- search expression (required, really)
74
- :param string attr:
75
- name of attribute for secondary search
76
- """
77
-
78
- try:
79
- ret = self._request('GET', "/%s/%s" % (path, value)).json()
80
- if isinstance(ret, dict):
81
- # strip off the enclosing dict
82
- key = list(ret.keys())[0]
83
- ret = ret[key]
84
- except (
85
- ksa_exceptions.NotFound,
86
- ksa_exceptions.BadRequest,
87
- ):
88
- kwargs = {attr: value}
89
- try:
90
- ret = self.find_one(path, **kwargs)
91
- except ksa_exceptions.NotFound:
92
- msg = _("%s not found") % value
93
- raise exceptions.NotFound(msg)
94
-
95
- return ret
96
-
97
- # Floating IPs
98
-
99
- def floating_ip_add(
100
- self,
101
- server,
102
- address,
103
- fixed_address=None,
104
- ):
105
- """Add a floating IP to a server
106
-
107
- :param server:
108
- The :class:`Server` (or its ID) to add an IP to.
109
- :param address:
110
- The FloatingIP or string floating address to add.
111
- :param fixed_address:
112
- The FixedIP the floatingIP should be associated with (optional)
113
- """
114
-
115
- url = '/servers'
116
-
117
- server = self.find(
118
- url,
119
- attr='name',
120
- value=server,
121
- )
122
-
123
- address = address.ip if hasattr(address, 'ip') else address
124
- if fixed_address:
125
- if hasattr(fixed_address, 'ip'):
126
- fixed_address = fixed_address.ip
127
-
128
- body = {
129
- 'address': address,
130
- 'fixed_address': fixed_address,
131
- }
132
- else:
133
- body = {
134
- 'address': address,
135
- }
136
-
137
- return self._request(
138
- "POST",
139
- "/%s/%s/action" % (url, server['id']),
140
- json={'addFloatingIp': body},
141
- )
142
-
143
- def floating_ip_create(
144
- self,
145
- pool=None,
146
- ):
147
- """Create a new floating ip
148
-
149
- https://docs.openstack.org/api-ref/compute/#create-allocate-floating-ip-address
150
-
151
- :param pool: Name of floating IP pool
152
- """
153
-
154
- url = "/os-floating-ips"
155
-
156
- try:
157
- return self.create(
158
- url,
159
- json={'pool': pool},
160
- )['floating_ip']
161
- except (
162
- ksa_exceptions.NotFound,
163
- ksa_exceptions.BadRequest,
164
- ):
165
- msg = _("%s not found") % pool
166
- raise exceptions.NotFound(msg)
167
-
168
- def floating_ip_delete(
169
- self,
170
- floating_ip_id=None,
171
- ):
172
- """Delete a floating IP
173
-
174
- https://docs.openstack.org/api-ref/compute/#delete-deallocate-floating-ip-address
175
-
176
- :param string floating_ip_id:
177
- Floating IP ID
178
- """
179
-
180
- url = "/os-floating-ips"
181
-
182
- if floating_ip_id is not None:
183
- return self.delete('/%s/%s' % (url, floating_ip_id))
184
-
185
- return None
186
-
187
- def floating_ip_find(
188
- self,
189
- floating_ip=None,
190
- ):
191
- """Return a security group given name or ID
192
-
193
- https://docs.openstack.org/api-ref/compute/#list-floating-ip-addresses
194
-
195
- :param string floating_ip:
196
- Floating IP address
197
- :returns: A dict of the floating IP attributes
198
- """
199
-
200
- url = "/os-floating-ips"
201
-
202
- return self.find(
203
- url,
204
- attr='ip',
205
- value=floating_ip,
206
- )
207
-
208
- def floating_ip_list(
209
- self,
210
- ):
211
- """Get floating IPs
212
-
213
- https://docs.openstack.org/api-ref/compute/#show-floating-ip-address-details
214
-
215
- :returns:
216
- list of floating IPs
217
- """
218
-
219
- url = "/os-floating-ips"
220
-
221
- return self.list(url)["floating_ips"]
222
-
223
- def floating_ip_remove(
224
- self,
225
- server,
226
- address,
227
- ):
228
- """Remove a floating IP from a server
229
-
230
- :param server:
231
- The :class:`Server` (or its ID) to add an IP to.
232
- :param address:
233
- The FloatingIP or string floating address to add.
234
- """
235
-
236
- url = '/servers'
237
-
238
- server = self.find(
239
- url,
240
- attr='name',
241
- value=server,
242
- )
243
-
244
- address = address.ip if hasattr(address, 'ip') else address
245
- body = {
246
- 'address': address,
247
- }
248
23
 
249
- return self._request(
250
- "POST",
251
- "/%s/%s/action" % (url, server['id']),
252
- json={'removeFloatingIp': body},
253
- )
254
-
255
- # Floating IP Pools
256
-
257
- def floating_ip_pool_list(
258
- self,
259
- ):
260
- """Get floating IP pools
261
-
262
- https://docs.openstack.org/api-ref/compute/?expanded=#list-floating-ip-pools
263
-
264
- :returns:
265
- list of floating IP pools
266
- """
267
-
268
- url = "/os-floating-ip-pools"
269
-
270
- return self.list(url)["floating_ip_pools"]
271
-
272
- # Hosts
273
-
274
- def host_list(
275
- self,
276
- zone=None,
277
- ):
278
- """Lists hypervisor Hosts
279
-
280
- https://docs.openstack.org/api-ref/compute/#list-hosts
281
- Valid for Compute 2.0 - 2.42
282
-
283
- :param string zone:
284
- Availability zone
285
- :returns: A dict of the floating IP attributes
286
- """
287
-
288
- url = "/os-hosts"
289
- if zone:
290
- url = '/os-hosts?zone=%s' % zone
291
-
292
- return self.list(url)["hosts"]
293
-
294
- def host_set(
295
- self, host=None, status=None, maintenance_mode=None, **params
296
- ):
297
- """Modify host properties
298
-
299
- https://docs.openstack.org/api-ref/compute/#update-host-status
300
- Valid for Compute 2.0 - 2.42
301
-
302
- status
303
- maintenance_mode
304
- """
305
-
306
- url = "/os-hosts"
307
-
308
- params = {}
309
- if status:
310
- params['status'] = status
311
- if maintenance_mode:
312
- params['maintenance_mode'] = maintenance_mode
313
- if params == {}:
314
- # Don't bother calling if nothing given
315
- return None
316
- else:
317
- return self._request(
318
- "PUT",
319
- "/%s/%s" % (url, host),
320
- json=params,
321
- ).json()
322
-
323
- def host_show(
324
- self,
325
- host=None,
326
- ):
327
- """Show host
328
-
329
- https://docs.openstack.org/api-ref/compute/#show-host-details
330
- Valid for Compute 2.0 - 2.42
331
- """
332
-
333
- url = "/os-hosts"
334
-
335
- r_host = self.find(
336
- url,
337
- attr='host_name',
338
- value=host,
339
- )
340
-
341
- data = []
342
- for h in r_host:
343
- data.append(h['resource'])
344
- return data
345
-
346
- # Networks
347
-
348
- def network_create(
349
- self,
350
- name=None,
351
- subnet=None,
352
- share_subnet=None,
353
- ):
354
- """Create a new network
355
-
356
- https://docs.openstack.org/api-ref/compute/#create-network
357
-
358
- :param string name:
359
- Network label (required)
360
- :param integer subnet:
361
- Subnet for IPv4 fixed addresses in CIDR notation (required)
362
- :param integer share_subnet:
363
- Shared subnet between projects, True or False
364
- :returns: A dict of the network attributes
365
- """
366
-
367
- url = "/os-networks"
368
-
369
- params = {
370
- 'label': name,
371
- 'cidr': subnet,
372
- }
373
- if share_subnet is not None:
374
- params['share_address'] = share_subnet
375
-
376
- return self.create(
377
- url,
378
- json={'network': params},
379
- )['network']
380
-
381
- def network_delete(
382
- self,
383
- network=None,
384
- ):
385
- """Delete a network
386
-
387
- https://docs.openstack.org/api-ref/compute/#delete-network
388
-
389
- :param string network:
390
- Network name or ID
391
- """
392
-
393
- url = "/os-networks"
394
-
395
- network = self.find(
396
- url,
397
- attr='label',
398
- value=network,
399
- )['id']
400
- if network is not None:
401
- return self.delete('/%s/%s' % (url, network))
402
-
403
- return None
404
-
405
- def network_find(
406
- self,
407
- network=None,
408
- ):
409
- """Return a network given name or ID
410
-
411
- https://docs.openstack.org/api-ref/compute/#show-network-details
412
-
413
- :param string network:
414
- Network name or ID
415
- :returns: A dict of the network attributes
416
- """
417
-
418
- url = "/os-networks"
419
-
420
- return self.find(
421
- url,
422
- attr='label',
423
- value=network,
424
- )
425
-
426
- def network_list(
427
- self,
428
- ):
429
- """Get networks
430
-
431
- https://docs.openstack.org/api-ref/compute/#list-networks
432
-
433
- :returns:
434
- list of networks
435
- """
436
-
437
- url = "/os-networks"
438
-
439
- return self.list(url)["networks"]
440
-
441
- # Security Groups
442
-
443
- def security_group_create(
444
- self,
445
- name=None,
446
- description=None,
447
- ):
448
- """Create a new security group
449
-
450
- https://docs.openstack.org/api-ref/compute/#create-security-group
451
-
452
- :param string name:
453
- Security group name
454
- :param integer description:
455
- Security group description
456
- """
457
-
458
- url = "/os-security-groups"
459
-
460
- params = {
461
- 'name': name,
462
- 'description': description,
463
- }
464
-
465
- return self.create(
466
- url,
467
- json={'security_group': params},
468
- )['security_group']
469
-
470
- def security_group_delete(
471
- self,
472
- security_group=None,
473
- ):
474
- """Delete a security group
475
-
476
- https://docs.openstack.org/api-ref/compute/#delete-security-group
477
-
478
- :param string security_group:
479
- Security group name or ID
480
- """
481
-
482
- url = "/os-security-groups"
483
-
484
- security_group = self.find(
485
- url,
486
- attr='name',
487
- value=security_group,
488
- )['id']
489
- if security_group is not None:
490
- return self.delete('/%s/%s' % (url, security_group))
491
-
492
- return None
493
-
494
- def security_group_find(
495
- self,
496
- security_group=None,
497
- ):
498
- """Return a security group given name or ID
499
-
500
- https://docs.openstack.org/api-ref/compute/#show-security-group-details
501
-
502
- :param string security_group:
503
- Security group name or ID
504
- :returns: A dict of the security group attributes
505
- """
506
-
507
- url = "/os-security-groups"
508
-
509
- return self.find(
510
- url,
511
- attr='name',
512
- value=security_group,
513
- )
514
-
515
- def security_group_list(
516
- self,
517
- limit=None,
518
- marker=None,
519
- search_opts=None,
520
- ):
521
- """Get security groups
522
-
523
- https://docs.openstack.org/api-ref/compute/#list-security-groups
524
-
525
- :param integer limit:
526
- query return count limit
527
- :param string marker:
528
- query marker
529
- :param search_opts:
530
- (undocumented) Search filter dict
531
- all_tenants: True|False - return all projects
532
- :returns:
533
- list of security groups names
534
- """
535
-
536
- params = {}
537
- if search_opts is not None:
538
- params = dict((k, v) for (k, v) in search_opts.items() if v)
539
- if limit:
540
- params['limit'] = limit
541
- if marker:
542
- params['offset'] = marker
543
-
544
- url = "/os-security-groups"
545
- return self.list(url, **params)["security_groups"]
546
-
547
- def security_group_set(
548
- self,
549
- security_group=None,
550
- # name=None,
551
- # description=None,
552
- **params
553
- ):
554
- """Update a security group
555
-
556
- https://docs.openstack.org/api-ref/compute/#update-security-group
557
-
558
- :param string security_group:
559
- Security group name or ID
560
-
561
- TODO(dtroyer): Create an update method in osc-lib
562
- """
563
-
564
- # Short-circuit no-op
565
- if params is None:
566
- return None
567
-
568
- url = "/os-security-groups"
569
-
570
- security_group = self.find(
571
- url,
572
- attr='name',
573
- value=security_group,
574
- )
575
- if security_group is not None:
576
- for k, v in params.items():
577
- # Only set a value if it is already present
578
- if k in security_group:
579
- security_group[k] = v
580
- return self._request(
581
- "PUT",
582
- "/%s/%s" % (url, security_group['id']),
583
- json={'security_group': security_group},
584
- ).json()['security_group']
585
- return None
586
-
587
- # Security Group Rules
588
-
589
- def security_group_rule_create(
590
- self,
591
- security_group_id=None,
592
- ip_protocol=None,
593
- from_port=None,
594
- to_port=None,
595
- remote_ip=None,
596
- remote_group=None,
597
- ):
598
- """Create a new security group rule
599
-
600
- https://docs.openstack.org/api-ref/compute/#create-security-group-rule
601
-
602
- :param string security_group_id:
603
- Security group ID
604
- :param ip_protocol:
605
- IP protocol, 'tcp', 'udp' or 'icmp'
606
- :param from_port:
607
- Source port
608
- :param to_port:
609
- Destination port
610
- :param remote_ip:
611
- Source IP address in CIDR notation
612
- :param remote_group:
613
- Remote security group
614
- """
615
-
616
- url = "/os-security-group-rules"
617
-
618
- if ip_protocol.lower() not in ['icmp', 'tcp', 'udp']:
619
- raise InvalidValue(
620
- "%(s) is not one of 'icmp', 'tcp', or 'udp'" % ip_protocol
621
- )
622
-
623
- params = {
624
- 'parent_group_id': security_group_id,
625
- 'ip_protocol': ip_protocol,
626
- 'from_port': self._check_integer(from_port),
627
- 'to_port': self._check_integer(to_port),
628
- 'cidr': remote_ip,
629
- 'group_id': remote_group,
630
- }
631
-
632
- return self.create(
633
- url,
634
- json={'security_group_rule': params},
635
- )['security_group_rule']
636
-
637
- def security_group_rule_delete(
638
- self,
639
- security_group_rule_id=None,
640
- ):
641
- """Delete a security group rule
642
-
643
- https://docs.openstack.org/api-ref/compute/#delete-security-group-rule
644
-
645
- :param string security_group_rule_id:
646
- Security group rule ID
647
- """
648
-
649
- url = "/os-security-group-rules"
650
- if security_group_rule_id is not None:
651
- return self.delete('/%s/%s' % (url, security_group_rule_id))
652
-
653
- return None
24
+
25
+ # security groups
26
+
27
+
28
+ def create_security_group(compute_client, name=None, description=None):
29
+ """Create a new security group
30
+
31
+ https://docs.openstack.org/api-ref/compute/#create-security-group
32
+
33
+ :param compute_client: A compute client
34
+ :param str name: Security group name
35
+ :param str description: Security group description
36
+ :returns: A security group object
37
+ """
38
+ data = {
39
+ 'name': name,
40
+ 'description': description,
41
+ }
42
+ response = compute_client.post(
43
+ '/os-security-groups', data=data, microversion='2.1'
44
+ )
45
+ sdk_exceptions.raise_from_response(response)
46
+ return response.json()['security_group']
47
+
48
+
49
+ def list_security_groups(compute_client, all_projects=None):
50
+ """Get all security groups
51
+
52
+ https://docs.openstack.org/api-ref/compute/#list-security-groups
53
+
54
+ :param compute_client: A compute client
55
+ :param bool all_projects: If true, list from all projects
56
+ :returns: A list of security group objects
57
+ """
58
+ url = '/os-security-groups'
59
+ if all_projects is not None:
60
+ url += f'?all_tenants={all_projects}'
61
+ response = compute_client.get(url, microversion='2.1')
62
+ sdk_exceptions.raise_from_response(response)
63
+ return response.json()['security_groups']
64
+
65
+
66
+ def find_security_group(compute_client, name_or_id):
67
+ """Find the name for a given security group name or ID
68
+
69
+ https://docs.openstack.org/api-ref/compute/#show-security-group-details
70
+
71
+ :param compute_client: A compute client
72
+ :param name_or_id: The name or ID of the security group to look up
73
+ :returns: A security group object
74
+ :raises exception.NotFound: If a matching security group could not be
75
+ found or more than one match was found
76
+ """
77
+ response = compute_client.get(
78
+ f'/os-security-groups/{name_or_id}', microversion='2.1'
79
+ )
80
+ if response.status_code != http.HTTPStatus.NOT_FOUND:
81
+ # there might be other, non-404 errors
82
+ sdk_exceptions.raise_from_response(response)
83
+ return response.json()['security_group']
84
+
85
+ response = compute_client.get('/os-security-groups', microversion='2.1')
86
+ sdk_exceptions.raise_from_response(response)
87
+ found = None
88
+ security_groups = response.json()['security_groups']
89
+ for security_group in security_groups:
90
+ if security_group['name'] == name_or_id:
91
+ if found:
92
+ raise exceptions.NotFound(
93
+ f'multiple matches found for {name_or_id}'
94
+ )
95
+ found = security_group
96
+
97
+ if not found:
98
+ raise exceptions.NotFound(f'{name_or_id} not found')
99
+
100
+ return found
101
+
102
+
103
+ def update_security_group(
104
+ compute_client, security_group_id, name=None, description=None
105
+ ):
106
+ """Update an existing security group
107
+
108
+ https://docs.openstack.org/api-ref/compute/#update-security-group
109
+
110
+ :param compute_client: A compute client
111
+ :param str security_group_id: The ID of the security group to update
112
+ :param str name: Security group name
113
+ :param str description: Security group description
114
+ :returns: A security group object
115
+ """
116
+ data = {}
117
+ if name:
118
+ data['name'] = name
119
+ if description:
120
+ data['description'] = description
121
+ response = compute_client.put(
122
+ f'/os-security-groups/{security_group_id}',
123
+ data=data,
124
+ microversion='2.1',
125
+ )
126
+ sdk_exceptions.raise_from_response(response)
127
+ return response.json()['security_group']
128
+
129
+
130
+ def delete_security_group(compute_client, security_group_id=None):
131
+ """Delete a security group
132
+
133
+ https://docs.openstack.org/api-ref/compute/#delete-security-group
134
+
135
+ :param compute_client: A compute client
136
+ :param str security_group_id: Security group ID
137
+ :returns: None
138
+ """
139
+ response = compute_client.delete(
140
+ f'/os-security-groups/{security_group_id}', microversion='2.1'
141
+ )
142
+ sdk_exceptions.raise_from_response(response)
143
+
144
+
145
+ # security group rules
146
+
147
+
148
+ def create_security_group_rule(
149
+ compute_client,
150
+ security_group_id=None,
151
+ ip_protocol=None,
152
+ from_port=None,
153
+ to_port=None,
154
+ remote_ip=None,
155
+ remote_group=None,
156
+ ):
157
+ """Create a new security group rule
158
+
159
+ https://docs.openstack.org/api-ref/compute/#create-security-group-rule
160
+
161
+ :param compute_client: A compute client
162
+ :param str security_group_id: Security group ID
163
+ :param str ip_protocol: IP protocol, 'tcp', 'udp' or 'icmp'
164
+ :param int from_port: Source port
165
+ :param int to_port: Destination port
166
+ :param str remote_ip: Source IP address in CIDR notation
167
+ :param str remote_group: Remote security group
168
+ :returns: A security group object
169
+ """
170
+ data = {
171
+ 'parent_group_id': security_group_id,
172
+ 'ip_protocol': ip_protocol,
173
+ 'from_port': from_port,
174
+ 'to_port': to_port,
175
+ 'cidr': remote_ip,
176
+ 'group_id': remote_group,
177
+ }
178
+ response = compute_client.post(
179
+ '/os-security-group-rules', data=data, microversion='2.1'
180
+ )
181
+ sdk_exceptions.raise_from_response(response)
182
+ return response.json()['security_group_rule']
183
+
184
+
185
+ def delete_security_group_rule(compute_client, security_group_rule_id=None):
186
+ """Delete a security group rule
187
+
188
+ https://docs.openstack.org/api-ref/compute/#delete-security-group-rule
189
+
190
+ :param compute_client: A compute client
191
+ :param str security_group_rule_id: Security group rule ID
192
+ :returns: None
193
+ """
194
+ response = compute_client.delete(
195
+ f'/os-security-group-rules/{security_group_rule_id}',
196
+ microversion='2.1',
197
+ )
198
+ sdk_exceptions.raise_from_response(response)
199
+
200
+
201
+ # networks
202
+
203
+
204
+ def create_network(compute_client, name, subnet, share_subnet=None):
205
+ """Create a new network
206
+
207
+ https://docs.openstack.org/api-ref/compute/#create-network
208
+
209
+ :param compute_client: A compute client
210
+ :param str name: Network label
211
+ :param int subnet: Subnet for IPv4 fixed addresses in CIDR notation
212
+ :param bool share_subnet: Shared subnet between projects
213
+ :returns: A network object
214
+ """
215
+ data = {
216
+ 'label': name,
217
+ 'cidr': subnet,
218
+ }
219
+ if share_subnet is not None:
220
+ data['share_address'] = share_subnet
221
+
222
+ response = compute_client.post(
223
+ '/os-networks', data=data, microversion='2.1'
224
+ )
225
+ sdk_exceptions.raise_from_response(response)
226
+ return response.json()['network']
227
+
228
+
229
+ def list_networks(compute_client):
230
+ """Get all networks
231
+
232
+ https://docs.openstack.org/api-ref/compute/#list-networks
233
+
234
+ :param compute_client: A compute client
235
+ :returns: A list of network objects
236
+ """
237
+ response = compute_client.get('/os-networks', microversion='2.1')
238
+ sdk_exceptions.raise_from_response(response)
239
+ return response.json()['networks']
240
+
241
+
242
+ def find_network(compute_client, name_or_id):
243
+ """Find the ID for a given network name or ID
244
+
245
+ https://docs.openstack.org/api-ref/compute/#show-network-details
246
+
247
+ :param compute_client: A compute client
248
+ :param name_or_id: The name or ID of the network to look up
249
+ :returns: A network object
250
+ :raises exception.NotFound: If a matching network could not be found or
251
+ more than one match was found
252
+ """
253
+ response = compute_client.get(
254
+ f'/os-networks/{name_or_id}', microversion='2.1'
255
+ )
256
+ if response.status_code != http.HTTPStatus.NOT_FOUND:
257
+ # there might be other, non-404 errors
258
+ sdk_exceptions.raise_from_response(response)
259
+ return response.json()['network']
260
+
261
+ response = compute_client.get('/os-networks', microversion='2.1')
262
+ sdk_exceptions.raise_from_response(response)
263
+ found = None
264
+ networks = response.json()['networks']
265
+ for network in networks:
266
+ if network['label'] == name_or_id:
267
+ if found:
268
+ raise exceptions.NotFound(
269
+ f'multiple matches found for {name_or_id}'
270
+ )
271
+ found = network
272
+
273
+ if not found:
274
+ raise exceptions.NotFound(f'{name_or_id} not found')
275
+
276
+ return found
277
+
278
+
279
+ def delete_network(compute_client, network_id):
280
+ """Delete a network
281
+
282
+ https://docs.openstack.org/api-ref/compute/#delete-network
283
+
284
+ :param compute_client: A compute client
285
+ :param string network_id: The network ID
286
+ :returns: None
287
+ """
288
+ response = compute_client.delete(
289
+ f'/os-networks/{network_id}', microversion='2.1'
290
+ )
291
+ sdk_exceptions.raise_from_response(response)
292
+
293
+
294
+ # floating ips
295
+
296
+
297
+ def create_floating_ip(compute_client, network):
298
+ """Create a new floating ip
299
+
300
+ https://docs.openstack.org/api-ref/compute/#create-allocate-floating-ip-address
301
+
302
+ :param network: Name of floating IP pool
303
+ :returns: A floating IP object
304
+ """
305
+ response = compute_client.post(
306
+ '/os-floating-ips', data={'pool': network}, microversion='2.1'
307
+ )
308
+ sdk_exceptions.raise_from_response(response)
309
+ return response.json()['floating_ip']
310
+
311
+
312
+ def list_floating_ips(compute_client):
313
+ """Get all floating IPs
314
+
315
+ https://docs.openstack.org/api-ref/compute/#list-floating-ip-addresses
316
+
317
+ :returns: A list of floating IP objects
318
+ """
319
+ response = compute_client.get('/os-floating-ips', microversion='2.1')
320
+ sdk_exceptions.raise_from_response(response)
321
+ return response.json()['floating_ips']
322
+
323
+
324
+ def get_floating_ip(compute_client, floating_ip_id):
325
+ """Get a floating IP
326
+
327
+ https://docs.openstack.org/api-ref/compute/#show-floating-ip-address-details
328
+
329
+ :param string floating_ip_id: The floating IP address
330
+ :returns: A floating IP object
331
+ """
332
+ response = compute_client.get(
333
+ f'/os-floating-ips/{floating_ip_id}', microversion='2.1'
334
+ )
335
+ sdk_exceptions.raise_from_response(response)
336
+ return response.json()['floating_ip']
337
+
338
+
339
+ def delete_floating_ip(compute_client, floating_ip_id):
340
+ """Delete a floating IP
341
+
342
+ https://docs.openstack.org/api-ref/compute/#delete-deallocate-floating-ip-address
343
+
344
+ :param string floating_ip_id: The floating IP address
345
+ :returns: None
346
+ """
347
+ response = compute_client.delete(
348
+ f'/os-floating-ips/{floating_ip_id}', microversion='2.1'
349
+ )
350
+ sdk_exceptions.raise_from_response(response)
351
+
352
+
353
+ # floating ip pools
354
+
355
+
356
+ def list_floating_ip_pools(compute_client):
357
+ """Get all floating IP pools
358
+
359
+ https://docs.openstack.org/api-ref/compute/#list-floating-ip-pools
360
+
361
+ :param compute_client: A compute client
362
+ :returns: A list of floating IP pool objects
363
+ """
364
+ response = compute_client.get('/os-floating-ip-pools', microversion='2.1')
365
+ sdk_exceptions.raise_from_response(response)
366
+
367
+ return response.json()['floating_ip_pools']