python-openstackclient 6.6.1__py3-none-any.whl → 7.1.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 (336) hide show
  1. openstackclient/api/api.py +4 -4
  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 +24 -20
  7. openstackclient/common/configuration.py +1 -1
  8. openstackclient/common/extension.py +1 -1
  9. openstackclient/common/limits.py +67 -34
  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 +299 -423
  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 +38 -32
  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 +9 -6
  22. openstackclient/compute/v2/keypair.py +7 -8
  23. openstackclient/compute/v2/server.py +479 -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 +125 -43
  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/releasenotes/notes/volume-backup-created-at-list-b49ec893ae1f6b0d.yaml +4 -0
  107. openstackclient/shell.py +4 -6
  108. openstackclient/tests/functional/base.py +1 -1
  109. openstackclient/tests/functional/common/test_extension.py +1 -1
  110. openstackclient/tests/functional/common/test_help.py +2 -2
  111. openstackclient/tests/functional/common/test_module.py +1 -1
  112. openstackclient/tests/functional/common/test_quota.py +43 -61
  113. openstackclient/tests/functional/compute/v2/common.py +2 -2
  114. openstackclient/tests/functional/compute/v2/test_flavor.py +2 -2
  115. openstackclient/tests/functional/compute/v2/test_keypair.py +1 -1
  116. openstackclient/tests/functional/compute/v2/test_server.py +5 -5
  117. openstackclient/tests/functional/compute/v2/test_server_event.py +1 -1
  118. openstackclient/tests/functional/identity/v2/common.py +3 -3
  119. openstackclient/tests/functional/identity/v3/common.py +12 -4
  120. openstackclient/tests/functional/identity/v3/test_application_credential.py +6 -12
  121. openstackclient/tests/functional/identity/v3/test_domain.py +1 -3
  122. openstackclient/tests/functional/identity/v3/test_endpoint.py +1 -1
  123. openstackclient/tests/functional/identity/v3/test_idp.py +1 -1
  124. openstackclient/tests/functional/identity/v3/test_region.py +1 -3
  125. openstackclient/tests/functional/identity/v3/test_role.py +2 -2
  126. openstackclient/tests/functional/identity/v3/test_role_assignment.py +210 -0
  127. openstackclient/tests/functional/identity/v3/test_service.py +1 -3
  128. openstackclient/tests/functional/identity/v3/test_service_provider.py +1 -3
  129. openstackclient/tests/functional/image/base.py +1 -1
  130. openstackclient/tests/functional/image/v2/test_image.py +1 -1
  131. openstackclient/tests/functional/image/v2/test_info.py +1 -1
  132. openstackclient/tests/functional/network/v2/common.py +4 -6
  133. openstackclient/tests/functional/network/v2/test_network.py +5 -3
  134. openstackclient/tests/functional/network/v2/test_network_agent.py +7 -5
  135. openstackclient/tests/functional/network/v2/test_network_qos_rule.py +4 -4
  136. openstackclient/tests/functional/network/v2/test_port.py +11 -7
  137. openstackclient/tests/functional/network/v2/test_router.py +2 -2
  138. openstackclient/tests/functional/object/v1/common.py +1 -1
  139. openstackclient/tests/functional/object/v1/test_container.py +3 -3
  140. openstackclient/tests/functional/object/v1/test_object.py +9 -13
  141. openstackclient/tests/functional/volume/base.py +1 -1
  142. openstackclient/tests/functional/volume/v1/test_service.py +1 -1
  143. openstackclient/tests/functional/volume/v1/test_snapshot.py +2 -2
  144. openstackclient/tests/functional/volume/v1/test_transfer_request.py +2 -2
  145. openstackclient/tests/functional/volume/v1/test_volume_type.py +1 -1
  146. openstackclient/tests/functional/volume/v2/test_service.py +2 -2
  147. openstackclient/tests/functional/volume/v2/test_volume_backup.py +2 -2
  148. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +2 -2
  149. openstackclient/tests/functional/volume/v2/test_volume_type.py +1 -1
  150. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +2 -2
  151. openstackclient/tests/functional/volume/v3/test_volume_type.py +1 -1
  152. openstackclient/tests/unit/api/fakes.py +1 -1
  153. openstackclient/tests/unit/api/test_api.py +2 -2
  154. openstackclient/tests/unit/api/test_compute_v2.py +522 -707
  155. openstackclient/tests/unit/api/test_image_v1.py +1 -1
  156. openstackclient/tests/unit/api/test_image_v2.py +1 -1
  157. openstackclient/tests/unit/api/test_object_store_v1.py +4 -4
  158. openstackclient/tests/unit/common/test_limits.py +73 -35
  159. openstackclient/tests/unit/common/test_logs.py +2 -2
  160. openstackclient/tests/unit/common/test_module.py +4 -2
  161. openstackclient/tests/unit/common/test_project_cleanup.py +31 -6
  162. openstackclient/tests/unit/common/test_quota.py +490 -630
  163. openstackclient/tests/unit/compute/v2/fakes.py +37 -286
  164. openstackclient/tests/unit/compute/v2/test_agent.py +189 -147
  165. openstackclient/tests/unit/compute/v2/test_aggregate.py +87 -57
  166. openstackclient/tests/unit/compute/v2/test_console.py +4 -5
  167. openstackclient/tests/unit/compute/v2/test_flavor.py +59 -68
  168. openstackclient/tests/unit/compute/v2/test_host.py +83 -54
  169. openstackclient/tests/unit/compute/v2/test_hypervisor.py +57 -34
  170. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -2
  171. openstackclient/tests/unit/compute/v2/test_keypair.py +65 -50
  172. openstackclient/tests/unit/compute/v2/test_server.py +2850 -2453
  173. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -1
  174. openstackclient/tests/unit/compute/v2/test_server_event.py +14 -39
  175. openstackclient/tests/unit/compute/v2/test_server_group.py +28 -29
  176. openstackclient/tests/unit/compute/v2/test_server_migration.py +43 -68
  177. openstackclient/tests/unit/compute/v2/test_server_volume.py +17 -34
  178. openstackclient/tests/unit/compute/v2/test_service.py +34 -52
  179. openstackclient/tests/unit/compute/v2/test_usage.py +4 -4
  180. openstackclient/tests/unit/fakes.py +12 -12
  181. openstackclient/tests/unit/identity/v2_0/fakes.py +27 -10
  182. openstackclient/tests/unit/identity/v2_0/test_catalog.py +3 -3
  183. openstackclient/tests/unit/identity/v2_0/test_endpoint.py +7 -7
  184. openstackclient/tests/unit/identity/v2_0/test_project.py +8 -8
  185. openstackclient/tests/unit/identity/v2_0/test_role.py +10 -10
  186. openstackclient/tests/unit/identity/v2_0/test_role_assignment.py +4 -4
  187. openstackclient/tests/unit/identity/v2_0/test_service.py +6 -6
  188. openstackclient/tests/unit/identity/v2_0/test_token.py +4 -4
  189. openstackclient/tests/unit/identity/v2_0/test_user.py +8 -8
  190. openstackclient/tests/unit/identity/v3/fakes.py +59 -20
  191. openstackclient/tests/unit/identity/v3/test_access_rule.py +5 -5
  192. openstackclient/tests/unit/identity/v3/test_application_credential.py +207 -230
  193. openstackclient/tests/unit/identity/v3/test_catalog.py +3 -3
  194. openstackclient/tests/unit/identity/v3/test_consumer.py +7 -8
  195. openstackclient/tests/unit/identity/v3/test_credential.py +9 -9
  196. openstackclient/tests/unit/identity/v3/test_domain.py +8 -8
  197. openstackclient/tests/unit/identity/v3/test_endpoint.py +13 -13
  198. openstackclient/tests/unit/identity/v3/test_endpoint_group.py +12 -14
  199. openstackclient/tests/unit/identity/v3/test_group.py +12 -12
  200. openstackclient/tests/unit/identity/v3/test_identity_provider.py +8 -8
  201. openstackclient/tests/unit/identity/v3/test_implied_role.py +5 -5
  202. openstackclient/tests/unit/identity/v3/test_limit.py +7 -7
  203. openstackclient/tests/unit/identity/v3/test_mappings.py +7 -7
  204. openstackclient/tests/unit/identity/v3/test_oauth.py +5 -5
  205. openstackclient/tests/unit/identity/v3/test_project.py +16 -16
  206. openstackclient/tests/unit/identity/v3/test_protocol.py +7 -7
  207. openstackclient/tests/unit/identity/v3/test_region.py +7 -7
  208. openstackclient/tests/unit/identity/v3/test_registered_limit.py +12 -13
  209. openstackclient/tests/unit/identity/v3/test_role.py +13 -13
  210. openstackclient/tests/unit/identity/v3/test_role_assignment.py +410 -331
  211. openstackclient/tests/unit/identity/v3/test_service.py +90 -94
  212. openstackclient/tests/unit/identity/v3/test_service_provider.py +7 -7
  213. openstackclient/tests/unit/identity/v3/test_token.py +4 -4
  214. openstackclient/tests/unit/identity/v3/test_trust.py +9 -9
  215. openstackclient/tests/unit/identity/v3/test_unscoped_saml.py +4 -4
  216. openstackclient/tests/unit/identity/v3/test_user.py +299 -327
  217. openstackclient/tests/unit/image/v1/test_image.py +6 -6
  218. openstackclient/tests/unit/image/v2/fakes.py +46 -9
  219. openstackclient/tests/unit/image/v2/test_cache.py +2 -2
  220. openstackclient/tests/unit/image/v2/test_image.py +3 -3
  221. openstackclient/tests/unit/image/v2/test_metadef_objects.py +62 -0
  222. openstackclient/tests/unit/image/v2/test_metadef_resource_type_association.py +131 -0
  223. openstackclient/tests/unit/integ/base.py +1 -1
  224. openstackclient/tests/unit/integ/cli/test_project.py +4 -4
  225. openstackclient/tests/unit/integ/cli/test_shell.py +7 -7
  226. openstackclient/tests/unit/network/test_common.py +12 -21
  227. openstackclient/tests/unit/network/v2/fakes.py +64 -130
  228. openstackclient/tests/unit/network/v2/test_address_group.py +15 -15
  229. openstackclient/tests/unit/network/v2/test_address_scope.py +13 -13
  230. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +49 -27
  231. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +40 -38
  232. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +15 -15
  233. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +4 -7
  234. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +3 -5
  235. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +11 -11
  236. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -6
  237. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +11 -21
  238. openstackclient/tests/unit/network/v2/test_local_ip.py +7 -7
  239. openstackclient/tests/unit/network/v2/test_local_ip_association.py +3 -5
  240. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -13
  241. openstackclient/tests/unit/network/v2/test_network.py +23 -28
  242. openstackclient/tests/unit/network/v2/test_network_agent.py +17 -21
  243. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +8 -8
  244. openstackclient/tests/unit/network/v2/test_network_compute.py +66 -65
  245. openstackclient/tests/unit/network/v2/test_network_flavor.py +17 -19
  246. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +13 -13
  247. openstackclient/tests/unit/network/v2/test_network_meter.py +11 -11
  248. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +11 -11
  249. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +11 -21
  250. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +51 -77
  251. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +5 -9
  252. openstackclient/tests/unit/network/v2/test_network_rbac.py +12 -12
  253. openstackclient/tests/unit/network/v2/test_network_segment.py +11 -15
  254. openstackclient/tests/unit/network/v2/test_network_segment_range.py +11 -13
  255. openstackclient/tests/unit/network/v2/test_network_service_provider.py +3 -5
  256. openstackclient/tests/unit/network/v2/test_network_trunk.py +11 -11
  257. openstackclient/tests/unit/network/v2/test_port.py +22 -25
  258. openstackclient/tests/unit/network/v2/test_router.py +721 -51
  259. openstackclient/tests/unit/network/v2/test_security_group_compute.py +65 -49
  260. openstackclient/tests/unit/network/v2/test_security_group_network.py +15 -15
  261. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +57 -45
  262. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +11 -19
  263. openstackclient/tests/unit/network/v2/test_subnet.py +29 -25
  264. openstackclient/tests/unit/network/v2/test_subnet_pool.py +15 -15
  265. openstackclient/tests/unit/object/v1/fakes.py +1 -1
  266. openstackclient/tests/unit/object/v1/test_container.py +5 -5
  267. openstackclient/tests/unit/object/v1/test_container_all.py +6 -6
  268. openstackclient/tests/unit/object/v1/test_object.py +3 -3
  269. openstackclient/tests/unit/object/v1/test_object_all.py +5 -5
  270. openstackclient/tests/unit/test_shell.py +5 -5
  271. openstackclient/tests/unit/utils.py +4 -1
  272. openstackclient/tests/unit/volume/test_find_resource.py +2 -2
  273. openstackclient/tests/unit/volume/v1/fakes.py +5 -6
  274. openstackclient/tests/unit/volume/v1/test_volume.py +5 -4
  275. openstackclient/tests/unit/volume/v2/fakes.py +39 -259
  276. openstackclient/tests/unit/volume/v2/test_consistency_group_snapshot.py +5 -5
  277. openstackclient/tests/unit/volume/v2/test_qos_specs.py +9 -9
  278. openstackclient/tests/unit/volume/v2/test_volume.py +21 -87
  279. openstackclient/tests/unit/volume/v2/test_volume_backup.py +10 -368
  280. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +1 -1
  281. openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +0 -44
  282. openstackclient/tests/unit/volume/v2/test_volume_type.py +6 -87
  283. openstackclient/tests/unit/volume/v3/fakes.py +505 -22
  284. openstackclient/tests/unit/volume/v3/test_block_storage_cleanup.py +2 -3
  285. openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py +10 -11
  286. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +10 -6
  287. openstackclient/tests/unit/volume/v3/test_block_storage_manage.py +25 -17
  288. openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py +6 -32
  289. openstackclient/tests/unit/volume/v3/test_service.py +271 -0
  290. openstackclient/tests/unit/volume/v3/test_volume.py +2177 -33
  291. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +48 -52
  292. openstackclient/tests/unit/volume/v3/test_volume_backup.py +892 -0
  293. openstackclient/tests/unit/volume/v3/test_volume_group.py +19 -20
  294. openstackclient/tests/unit/volume/v3/test_volume_group_snapshot.py +14 -34
  295. openstackclient/tests/unit/volume/v3/test_volume_group_type.py +13 -16
  296. openstackclient/tests/unit/volume/v3/test_volume_message.py +10 -11
  297. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +161 -0
  298. openstackclient/tests/unit/volume/v3/test_volume_transfer_request.py +425 -0
  299. openstackclient/tests/unit/volume/v3/test_volume_type.py +1109 -0
  300. openstackclient/volume/v1/qos_specs.py +7 -7
  301. openstackclient/volume/v1/service.py +2 -2
  302. openstackclient/volume/v1/volume.py +12 -12
  303. openstackclient/volume/v1/volume_backup.py +7 -7
  304. openstackclient/volume/v1/volume_snapshot.py +8 -8
  305. openstackclient/volume/v1/volume_transfer_request.py +5 -5
  306. openstackclient/volume/v1/volume_type.py +7 -7
  307. openstackclient/volume/v2/backup_record.py +2 -2
  308. openstackclient/volume/v2/consistency_group.py +7 -9
  309. openstackclient/volume/v2/consistency_group_snapshot.py +4 -12
  310. openstackclient/volume/v2/qos_specs.py +7 -7
  311. openstackclient/volume/v2/service.py +2 -2
  312. openstackclient/volume/v2/volume.py +80 -80
  313. openstackclient/volume/v2/volume_backend.py +2 -2
  314. openstackclient/volume/v2/volume_backup.py +9 -217
  315. openstackclient/volume/v2/volume_host.py +2 -2
  316. openstackclient/volume/v2/volume_snapshot.py +8 -8
  317. openstackclient/volume/v2/volume_transfer_request.py +5 -37
  318. openstackclient/volume/v2/volume_type.py +7 -89
  319. openstackclient/volume/v3/service.py +56 -0
  320. openstackclient/volume/v3/volume.py +971 -0
  321. openstackclient/volume/v3/volume_attachment.py +31 -29
  322. openstackclient/volume/v3/volume_backup.py +670 -0
  323. openstackclient/volume/v3/volume_message.py +1 -1
  324. openstackclient/volume/v3/volume_snapshot.py +97 -0
  325. openstackclient/volume/v3/volume_transfer_request.py +233 -0
  326. openstackclient/volume/v3/volume_type.py +967 -0
  327. {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/AUTHORS +6 -0
  328. {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/METADATA +4 -4
  329. python_openstackclient-7.1.0.dist-info/RECORD +503 -0
  330. {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/entry_points.txt +33 -27
  331. python_openstackclient-7.1.0.dist-info/pbr.json +1 -0
  332. python_openstackclient-6.6.1.dist-info/RECORD +0 -489
  333. python_openstackclient-6.6.1.dist-info/pbr.json +0 -1
  334. {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/LICENSE +0 -0
  335. {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/WHEEL +0 -0
  336. {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,892 @@
1
+ #
2
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
3
+ # not use this file except in compliance with the License. You may obtain
4
+ # a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11
+ # License for the specific language governing permissions and limitations
12
+ # under the License.
13
+
14
+ from unittest.mock import call
15
+
16
+ from osc_lib import exceptions
17
+
18
+ from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
19
+ from openstackclient.volume.v3 import volume_backup
20
+
21
+
22
+ class TestBackupLegacy(volume_fakes.TestVolume):
23
+ def setUp(self):
24
+ super().setUp()
25
+
26
+ self.backups_mock = self.volume_client.backups
27
+ self.backups_mock.reset_mock()
28
+ self.volumes_mock = self.volume_client.volumes
29
+ self.volumes_mock.reset_mock()
30
+ self.snapshots_mock = self.volume_client.volume_snapshots
31
+ self.snapshots_mock.reset_mock()
32
+ self.restores_mock = self.volume_client.restores
33
+ self.restores_mock.reset_mock()
34
+
35
+
36
+ class TestBackupCreate(volume_fakes.TestVolume):
37
+ volume = volume_fakes.create_one_volume()
38
+ snapshot = volume_fakes.create_one_snapshot()
39
+ new_backup = volume_fakes.create_one_backup(
40
+ attrs={'volume_id': volume.id, 'snapshot_id': snapshot.id}
41
+ )
42
+
43
+ columns = (
44
+ 'id',
45
+ 'name',
46
+ 'volume_id',
47
+ )
48
+ data = (
49
+ new_backup.id,
50
+ new_backup.name,
51
+ new_backup.volume_id,
52
+ )
53
+
54
+ def setUp(self):
55
+ super().setUp()
56
+
57
+ self.volume_sdk_client.find_volume.return_value = self.volume
58
+ self.volume_sdk_client.find_snapshot.return_value = self.snapshot
59
+ self.volume_sdk_client.create_backup.return_value = self.new_backup
60
+
61
+ # Get the command object to test
62
+ self.cmd = volume_backup.CreateVolumeBackup(self.app, None)
63
+
64
+ def test_backup_create(self):
65
+ arglist = [
66
+ "--name",
67
+ self.new_backup.name,
68
+ "--description",
69
+ self.new_backup.description,
70
+ "--container",
71
+ self.new_backup.container,
72
+ "--force",
73
+ "--incremental",
74
+ "--snapshot",
75
+ self.new_backup.snapshot_id,
76
+ self.new_backup.volume_id,
77
+ ]
78
+ verifylist = [
79
+ ("name", self.new_backup.name),
80
+ ("description", self.new_backup.description),
81
+ ("container", self.new_backup.container),
82
+ ("force", True),
83
+ ("incremental", True),
84
+ ("snapshot", self.new_backup.snapshot_id),
85
+ ("volume", self.new_backup.volume_id),
86
+ ]
87
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
88
+
89
+ columns, data = self.cmd.take_action(parsed_args)
90
+
91
+ self.volume_sdk_client.create_backup.assert_called_with(
92
+ volume_id=self.new_backup.volume_id,
93
+ container=self.new_backup.container,
94
+ name=self.new_backup.name,
95
+ description=self.new_backup.description,
96
+ force=True,
97
+ is_incremental=True,
98
+ snapshot_id=self.new_backup.snapshot_id,
99
+ )
100
+ self.assertEqual(self.columns, columns)
101
+ self.assertEqual(self.data, data)
102
+
103
+ def test_backup_create_with_properties(self):
104
+ self.set_volume_api_version('3.43')
105
+
106
+ arglist = [
107
+ "--property",
108
+ "foo=bar",
109
+ "--property",
110
+ "wow=much-cool",
111
+ self.new_backup.volume_id,
112
+ ]
113
+ verifylist = [
114
+ ("properties", {"foo": "bar", "wow": "much-cool"}),
115
+ ("volume", self.new_backup.volume_id),
116
+ ]
117
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
118
+
119
+ columns, data = self.cmd.take_action(parsed_args)
120
+
121
+ self.volume_sdk_client.create_backup.assert_called_with(
122
+ volume_id=self.new_backup.volume_id,
123
+ container=None,
124
+ name=None,
125
+ description=None,
126
+ force=False,
127
+ is_incremental=False,
128
+ metadata={"foo": "bar", "wow": "much-cool"},
129
+ )
130
+ self.assertEqual(self.columns, columns)
131
+ self.assertEqual(self.data, data)
132
+
133
+ def test_backup_create_with_properties_pre_v343(self):
134
+ self.set_volume_api_version('3.42')
135
+
136
+ arglist = [
137
+ "--property",
138
+ "foo=bar",
139
+ "--property",
140
+ "wow=much-cool",
141
+ self.new_backup.volume_id,
142
+ ]
143
+ verifylist = [
144
+ ("properties", {"foo": "bar", "wow": "much-cool"}),
145
+ ("volume", self.new_backup.volume_id),
146
+ ]
147
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
148
+
149
+ exc = self.assertRaises(
150
+ exceptions.CommandError, self.cmd.take_action, parsed_args
151
+ )
152
+ self.assertIn("--os-volume-api-version 3.43 or greater", str(exc))
153
+
154
+ def test_backup_create_with_availability_zone(self):
155
+ self.set_volume_api_version('3.51')
156
+
157
+ arglist = [
158
+ "--availability-zone",
159
+ "my-az",
160
+ self.new_backup.volume_id,
161
+ ]
162
+ verifylist = [
163
+ ("availability_zone", "my-az"),
164
+ ("volume", self.new_backup.volume_id),
165
+ ]
166
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
167
+
168
+ columns, data = self.cmd.take_action(parsed_args)
169
+
170
+ self.volume_sdk_client.create_backup.assert_called_with(
171
+ volume_id=self.new_backup.volume_id,
172
+ container=None,
173
+ name=None,
174
+ description=None,
175
+ force=False,
176
+ is_incremental=False,
177
+ availability_zone="my-az",
178
+ )
179
+ self.assertEqual(self.columns, columns)
180
+ self.assertEqual(self.data, data)
181
+
182
+ def test_backup_create_with_availability_zone_pre_v351(self):
183
+ self.set_volume_api_version('3.50')
184
+
185
+ arglist = [
186
+ "--availability-zone",
187
+ "my-az",
188
+ self.new_backup.volume_id,
189
+ ]
190
+ verifylist = [
191
+ ("availability_zone", "my-az"),
192
+ ("volume", self.new_backup.volume_id),
193
+ ]
194
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
195
+
196
+ exc = self.assertRaises(
197
+ exceptions.CommandError, self.cmd.take_action, parsed_args
198
+ )
199
+ self.assertIn("--os-volume-api-version 3.51 or greater", str(exc))
200
+
201
+ def test_backup_create_without_name(self):
202
+ arglist = [
203
+ "--description",
204
+ self.new_backup.description,
205
+ "--container",
206
+ self.new_backup.container,
207
+ self.new_backup.volume_id,
208
+ ]
209
+ verifylist = [
210
+ ("description", self.new_backup.description),
211
+ ("container", self.new_backup.container),
212
+ ("volume", self.new_backup.volume_id),
213
+ ]
214
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
215
+
216
+ columns, data = self.cmd.take_action(parsed_args)
217
+
218
+ self.volume_sdk_client.create_backup.assert_called_with(
219
+ volume_id=self.new_backup.volume_id,
220
+ container=self.new_backup.container,
221
+ name=None,
222
+ description=self.new_backup.description,
223
+ force=False,
224
+ is_incremental=False,
225
+ )
226
+ self.assertEqual(self.columns, columns)
227
+ self.assertEqual(self.data, data)
228
+
229
+
230
+ class TestBackupDelete(volume_fakes.TestVolume):
231
+ backups = volume_fakes.create_backups(count=2)
232
+
233
+ def setUp(self):
234
+ super().setUp()
235
+
236
+ self.volume_sdk_client.find_backup = volume_fakes.get_backups(
237
+ self.backups
238
+ )
239
+ self.volume_sdk_client.delete_backup.return_value = None
240
+
241
+ # Get the command object to mock
242
+ self.cmd = volume_backup.DeleteVolumeBackup(self.app, None)
243
+
244
+ def test_backup_delete(self):
245
+ arglist = [self.backups[0].id]
246
+ verifylist = [("backups", [self.backups[0].id])]
247
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
248
+
249
+ result = self.cmd.take_action(parsed_args)
250
+
251
+ self.volume_sdk_client.delete_backup.assert_called_with(
252
+ self.backups[0].id, ignore_missing=False, force=False
253
+ )
254
+ self.assertIsNone(result)
255
+
256
+ def test_backup_delete_with_force(self):
257
+ arglist = [
258
+ '--force',
259
+ self.backups[0].id,
260
+ ]
261
+ verifylist = [('force', True), ("backups", [self.backups[0].id])]
262
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
263
+
264
+ result = self.cmd.take_action(parsed_args)
265
+
266
+ self.volume_sdk_client.delete_backup.assert_called_with(
267
+ self.backups[0].id, ignore_missing=False, force=True
268
+ )
269
+ self.assertIsNone(result)
270
+
271
+ def test_delete_multiple_backups(self):
272
+ arglist = []
273
+ for b in self.backups:
274
+ arglist.append(b.id)
275
+ verifylist = [
276
+ ('backups', arglist),
277
+ ]
278
+
279
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
280
+ result = self.cmd.take_action(parsed_args)
281
+
282
+ calls = []
283
+ for b in self.backups:
284
+ calls.append(call(b.id, ignore_missing=False, force=False))
285
+ self.volume_sdk_client.delete_backup.assert_has_calls(calls)
286
+ self.assertIsNone(result)
287
+
288
+ def test_delete_multiple_backups_with_exception(self):
289
+ arglist = [
290
+ self.backups[0].id,
291
+ 'unexist_backup',
292
+ ]
293
+ verifylist = [
294
+ ('backups', arglist),
295
+ ]
296
+
297
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
298
+
299
+ find_mock_result = [self.backups[0], exceptions.CommandError]
300
+ self.volume_sdk_client.find_backup.side_effect = find_mock_result
301
+
302
+ try:
303
+ self.cmd.take_action(parsed_args)
304
+ self.fail('CommandError should be raised.')
305
+ except exceptions.CommandError as e:
306
+ self.assertEqual('1 of 2 backups failed to delete.', str(e))
307
+
308
+ self.volume_sdk_client.find_backup.assert_any_call(
309
+ self.backups[0].id, ignore_missing=False
310
+ )
311
+ self.volume_sdk_client.find_backup.assert_any_call(
312
+ 'unexist_backup', ignore_missing=False
313
+ )
314
+
315
+ self.assertEqual(2, self.volume_sdk_client.find_backup.call_count)
316
+ self.volume_sdk_client.delete_backup.assert_called_once_with(
317
+ self.backups[0].id,
318
+ ignore_missing=False,
319
+ force=False,
320
+ )
321
+
322
+
323
+ class TestBackupList(volume_fakes.TestVolume):
324
+ volume = volume_fakes.create_one_volume()
325
+ backups = volume_fakes.create_backups(
326
+ attrs={'volume_id': volume.name}, count=3
327
+ )
328
+
329
+ columns = (
330
+ 'ID',
331
+ 'Name',
332
+ 'Description',
333
+ 'Status',
334
+ 'Size',
335
+ 'Incremental',
336
+ )
337
+ columns_long = columns + (
338
+ 'Availability Zone',
339
+ 'Volume',
340
+ 'Container',
341
+ )
342
+
343
+ data = []
344
+ for b in backups:
345
+ data.append(
346
+ (
347
+ b.id,
348
+ b.name,
349
+ b.description,
350
+ b.status,
351
+ b.size,
352
+ b.is_incremental,
353
+ )
354
+ )
355
+ data_long = []
356
+ for b in backups:
357
+ data_long.append(
358
+ (
359
+ b.id,
360
+ b.name,
361
+ b.description,
362
+ b.status,
363
+ b.size,
364
+ b.is_incremental,
365
+ b.availability_zone,
366
+ volume_backup.VolumeIdColumn(b.volume_id),
367
+ b.container,
368
+ )
369
+ )
370
+
371
+ def setUp(self):
372
+ super().setUp()
373
+
374
+ self.volume_sdk_client.volumes.return_value = [self.volume]
375
+ self.volume_sdk_client.backups.return_value = self.backups
376
+ self.volume_sdk_client.find_volume.return_value = self.volume
377
+ self.volume_sdk_client.find_backup.return_value = self.backups[0]
378
+
379
+ # Get the command to test
380
+ self.cmd = volume_backup.ListVolumeBackup(self.app, None)
381
+
382
+ def test_backup_list_without_options(self):
383
+ arglist = []
384
+ verifylist = [
385
+ ("long", False),
386
+ ("name", None),
387
+ ("status", None),
388
+ ("volume", None),
389
+ ("marker", None),
390
+ ("limit", None),
391
+ ('all_projects', False),
392
+ ]
393
+
394
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
395
+ columns, data = self.cmd.take_action(parsed_args)
396
+
397
+ self.volume_sdk_client.find_volume.assert_not_called()
398
+ self.volume_sdk_client.find_backup.assert_not_called()
399
+ self.volume_sdk_client.backups.assert_called_with(
400
+ name=None,
401
+ status=None,
402
+ volume_id=None,
403
+ all_tenants=False,
404
+ marker=None,
405
+ limit=None,
406
+ )
407
+ self.assertEqual(self.columns, columns)
408
+ self.assertCountEqual(self.data, list(data))
409
+
410
+ def test_backup_list_with_options(self):
411
+ arglist = [
412
+ "--long",
413
+ "--name",
414
+ self.backups[0].name,
415
+ "--status",
416
+ "error",
417
+ "--volume",
418
+ self.volume.id,
419
+ "--marker",
420
+ self.backups[0].id,
421
+ "--all-projects",
422
+ "--limit",
423
+ "3",
424
+ ]
425
+ verifylist = [
426
+ ("long", True),
427
+ ("name", self.backups[0].name),
428
+ ("status", "error"),
429
+ ("volume", self.volume.id),
430
+ ("marker", self.backups[0].id),
431
+ ('all_projects', True),
432
+ ("limit", 3),
433
+ ]
434
+
435
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
436
+ columns, data = self.cmd.take_action(parsed_args)
437
+
438
+ self.volume_sdk_client.find_volume.assert_called_once_with(
439
+ self.volume.id, ignore_missing=False
440
+ )
441
+ self.volume_sdk_client.find_backup.assert_called_once_with(
442
+ self.backups[0].id, ignore_missing=False
443
+ )
444
+ self.volume_sdk_client.backups.assert_called_with(
445
+ name=self.backups[0].name,
446
+ status="error",
447
+ volume_id=self.volume.id,
448
+ all_tenants=True,
449
+ marker=self.backups[0].id,
450
+ limit=3,
451
+ )
452
+ self.assertEqual(self.columns_long, columns)
453
+ self.assertCountEqual(self.data_long, list(data))
454
+
455
+
456
+ class TestBackupRestore(volume_fakes.TestVolume):
457
+ volume = volume_fakes.create_one_volume()
458
+ backup = volume_fakes.create_one_backup(
459
+ attrs={'volume_id': volume.id},
460
+ )
461
+
462
+ def setUp(self):
463
+ super().setUp()
464
+
465
+ self.volume_sdk_client.find_backup.return_value = self.backup
466
+ self.volume_sdk_client.find_volume.return_value = self.volume
467
+ self.volume_sdk_client.restore_backup.return_value = (
468
+ volume_fakes.create_one_volume(
469
+ {'id': self.volume['id']},
470
+ )
471
+ )
472
+
473
+ # Get the command object to mock
474
+ self.cmd = volume_backup.RestoreVolumeBackup(self.app, None)
475
+
476
+ def test_backup_restore(self):
477
+ self.volume_sdk_client.find_volume.side_effect = (
478
+ exceptions.CommandError()
479
+ )
480
+ arglist = [self.backup.id]
481
+ verifylist = [
482
+ ("backup", self.backup.id),
483
+ ("volume", None),
484
+ ]
485
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
486
+
487
+ result = self.cmd.take_action(parsed_args)
488
+ self.volume_sdk_client.restore_backup.assert_called_with(
489
+ self.backup.id,
490
+ volume_id=None,
491
+ name=None,
492
+ )
493
+ self.assertIsNotNone(result)
494
+
495
+ def test_backup_restore_with_volume(self):
496
+ self.volume_sdk_client.find_volume.side_effect = (
497
+ exceptions.CommandError()
498
+ )
499
+ arglist = [
500
+ self.backup.id,
501
+ self.backup.volume_id,
502
+ ]
503
+ verifylist = [
504
+ ("backup", self.backup.id),
505
+ ("volume", self.backup.volume_id),
506
+ ]
507
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
508
+
509
+ result = self.cmd.take_action(parsed_args)
510
+ self.volume_sdk_client.restore_backup.assert_called_with(
511
+ self.backup.id,
512
+ volume_id=None,
513
+ name=self.backup.volume_id,
514
+ )
515
+ self.assertIsNotNone(result)
516
+
517
+ def test_backup_restore_with_volume_force(self):
518
+ arglist = [
519
+ "--force",
520
+ self.backup.id,
521
+ self.volume.name,
522
+ ]
523
+ verifylist = [
524
+ ("force", True),
525
+ ("backup", self.backup.id),
526
+ ("volume", self.volume.name),
527
+ ]
528
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
529
+
530
+ result = self.cmd.take_action(parsed_args)
531
+ self.volume_sdk_client.restore_backup.assert_called_with(
532
+ self.backup.id,
533
+ volume_id=self.volume.id,
534
+ name=None,
535
+ )
536
+ self.assertIsNotNone(result)
537
+
538
+ def test_backup_restore_with_volume_existing(self):
539
+ arglist = [
540
+ self.backup.id,
541
+ self.volume.name,
542
+ ]
543
+ verifylist = [
544
+ ("backup", self.backup.id),
545
+ ("volume", self.volume.name),
546
+ ]
547
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
548
+
549
+ self.assertRaises(
550
+ exceptions.CommandError,
551
+ self.cmd.take_action,
552
+ parsed_args,
553
+ )
554
+
555
+
556
+ class TestBackupSet(TestBackupLegacy):
557
+ backup = volume_fakes.create_one_backup(
558
+ attrs={'metadata': {'wow': 'cool'}},
559
+ )
560
+
561
+ def setUp(self):
562
+ super().setUp()
563
+
564
+ self.backups_mock.get.return_value = self.backup
565
+
566
+ # Get the command object to test
567
+ self.cmd = volume_backup.SetVolumeBackup(self.app, None)
568
+
569
+ def test_backup_set_name(self):
570
+ self.set_volume_api_version('3.9')
571
+
572
+ arglist = [
573
+ '--name',
574
+ 'new_name',
575
+ self.backup.id,
576
+ ]
577
+ verifylist = [
578
+ ('name', 'new_name'),
579
+ ('backup', self.backup.id),
580
+ ]
581
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
582
+
583
+ # In base command class ShowOne in cliff, abstract method take_action()
584
+ # returns nothing
585
+ result = self.cmd.take_action(parsed_args)
586
+ self.backups_mock.update.assert_called_once_with(
587
+ self.backup.id, **{'name': 'new_name'}
588
+ )
589
+ self.assertIsNone(result)
590
+
591
+ def test_backup_set_name_pre_v39(self):
592
+ self.set_volume_api_version('3.8')
593
+
594
+ arglist = [
595
+ '--name',
596
+ 'new_name',
597
+ self.backup.id,
598
+ ]
599
+ verifylist = [
600
+ ('name', 'new_name'),
601
+ ('backup', self.backup.id),
602
+ ]
603
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
604
+
605
+ exc = self.assertRaises(
606
+ exceptions.CommandError, self.cmd.take_action, parsed_args
607
+ )
608
+ self.assertIn("--os-volume-api-version 3.9 or greater", str(exc))
609
+
610
+ def test_backup_set_description(self):
611
+ self.set_volume_api_version('3.9')
612
+
613
+ arglist = [
614
+ '--description',
615
+ 'new_description',
616
+ self.backup.id,
617
+ ]
618
+ verifylist = [
619
+ ('name', None),
620
+ ('description', 'new_description'),
621
+ ('backup', self.backup.id),
622
+ ]
623
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
624
+
625
+ result = self.cmd.take_action(parsed_args)
626
+
627
+ # Set expected values
628
+ kwargs = {'description': 'new_description'}
629
+ self.backups_mock.update.assert_called_once_with(
630
+ self.backup.id, **kwargs
631
+ )
632
+ self.assertIsNone(result)
633
+
634
+ def test_backup_set_description_pre_v39(self):
635
+ self.set_volume_api_version('3.8')
636
+
637
+ arglist = [
638
+ '--description',
639
+ 'new_description',
640
+ self.backup.id,
641
+ ]
642
+ verifylist = [
643
+ ('name', None),
644
+ ('description', 'new_description'),
645
+ ('backup', self.backup.id),
646
+ ]
647
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
648
+
649
+ exc = self.assertRaises(
650
+ exceptions.CommandError, self.cmd.take_action, parsed_args
651
+ )
652
+ self.assertIn("--os-volume-api-version 3.9 or greater", str(exc))
653
+
654
+ def test_backup_set_state(self):
655
+ arglist = ['--state', 'error', self.backup.id]
656
+ verifylist = [('state', 'error'), ('backup', self.backup.id)]
657
+
658
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
659
+
660
+ result = self.cmd.take_action(parsed_args)
661
+ self.backups_mock.reset_state.assert_called_once_with(
662
+ self.backup.id, 'error'
663
+ )
664
+ self.assertIsNone(result)
665
+
666
+ def test_backup_set_state_failed(self):
667
+ self.backups_mock.reset_state.side_effect = exceptions.CommandError()
668
+ arglist = ['--state', 'error', self.backup.id]
669
+ verifylist = [('state', 'error'), ('backup', self.backup.id)]
670
+
671
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
672
+ try:
673
+ self.cmd.take_action(parsed_args)
674
+ self.fail('CommandError should be raised.')
675
+ except exceptions.CommandError as e:
676
+ self.assertEqual(
677
+ 'One or more of the set operations failed', str(e)
678
+ )
679
+ self.backups_mock.reset_state.assert_called_with(
680
+ self.backup.id, 'error'
681
+ )
682
+
683
+ def test_backup_set_no_property(self):
684
+ self.set_volume_api_version('3.43')
685
+
686
+ arglist = [
687
+ '--no-property',
688
+ self.backup.id,
689
+ ]
690
+ verifylist = [
691
+ ('no_property', True),
692
+ ('backup', self.backup.id),
693
+ ]
694
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
695
+
696
+ result = self.cmd.take_action(parsed_args)
697
+
698
+ # Set expected values
699
+ kwargs = {
700
+ 'metadata': {},
701
+ }
702
+ self.backups_mock.update.assert_called_once_with(
703
+ self.backup.id, **kwargs
704
+ )
705
+ self.assertIsNone(result)
706
+
707
+ def test_backup_set_no_property_pre_v343(self):
708
+ self.set_volume_api_version('3.42')
709
+
710
+ arglist = [
711
+ '--no-property',
712
+ self.backup.id,
713
+ ]
714
+ verifylist = [
715
+ ('no_property', True),
716
+ ('backup', self.backup.id),
717
+ ]
718
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
719
+
720
+ exc = self.assertRaises(
721
+ exceptions.CommandError, self.cmd.take_action, parsed_args
722
+ )
723
+ self.assertIn("--os-volume-api-version 3.43 or greater", str(exc))
724
+
725
+ def test_backup_set_property(self):
726
+ self.set_volume_api_version('3.43')
727
+
728
+ arglist = [
729
+ '--property',
730
+ 'foo=bar',
731
+ self.backup.id,
732
+ ]
733
+ verifylist = [
734
+ ('properties', {'foo': 'bar'}),
735
+ ('backup', self.backup.id),
736
+ ]
737
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
738
+
739
+ result = self.cmd.take_action(parsed_args)
740
+
741
+ # Set expected values
742
+ kwargs = {
743
+ 'metadata': {'wow': 'cool', 'foo': 'bar'},
744
+ }
745
+ self.backups_mock.update.assert_called_once_with(
746
+ self.backup.id, **kwargs
747
+ )
748
+ self.assertIsNone(result)
749
+
750
+ def test_backup_set_property_pre_v343(self):
751
+ self.set_volume_api_version('3.42')
752
+
753
+ arglist = [
754
+ '--property',
755
+ 'foo=bar',
756
+ self.backup.id,
757
+ ]
758
+ verifylist = [
759
+ ('properties', {'foo': 'bar'}),
760
+ ('backup', self.backup.id),
761
+ ]
762
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
763
+
764
+ exc = self.assertRaises(
765
+ exceptions.CommandError, self.cmd.take_action, parsed_args
766
+ )
767
+ self.assertIn("--os-volume-api-version 3.43 or greater", str(exc))
768
+
769
+
770
+ class TestBackupUnset(TestBackupLegacy):
771
+ backup = volume_fakes.create_one_backup(
772
+ attrs={'metadata': {'foo': 'bar'}},
773
+ )
774
+
775
+ def setUp(self):
776
+ super().setUp()
777
+
778
+ self.backups_mock.get.return_value = self.backup
779
+
780
+ # Get the command object to test
781
+ self.cmd = volume_backup.UnsetVolumeBackup(self.app, None)
782
+
783
+ def test_backup_unset_property(self):
784
+ self.set_volume_api_version('3.43')
785
+
786
+ arglist = [
787
+ '--property',
788
+ 'foo',
789
+ self.backup.id,
790
+ ]
791
+ verifylist = [
792
+ ('properties', ['foo']),
793
+ ('backup', self.backup.id),
794
+ ]
795
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
796
+
797
+ result = self.cmd.take_action(parsed_args)
798
+
799
+ # Set expected values
800
+ kwargs = {
801
+ 'metadata': {},
802
+ }
803
+ self.backups_mock.update.assert_called_once_with(
804
+ self.backup.id, **kwargs
805
+ )
806
+ self.assertIsNone(result)
807
+
808
+ def test_backup_unset_property_pre_v343(self):
809
+ self.set_volume_api_version('3.42')
810
+
811
+ arglist = [
812
+ '--property',
813
+ 'foo',
814
+ self.backup.id,
815
+ ]
816
+ verifylist = [
817
+ ('properties', ['foo']),
818
+ ('backup', self.backup.id),
819
+ ]
820
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
821
+
822
+ exc = self.assertRaises(
823
+ exceptions.CommandError, self.cmd.take_action, parsed_args
824
+ )
825
+ self.assertIn("--os-volume-api-version 3.43 or greater", str(exc))
826
+
827
+
828
+ class TestBackupShow(volume_fakes.TestVolume):
829
+ backup = volume_fakes.create_one_backup()
830
+
831
+ columns = (
832
+ "availability_zone",
833
+ "container",
834
+ "created_at",
835
+ "data_timestamp",
836
+ "description",
837
+ "encryption_key_id",
838
+ "fail_reason",
839
+ "has_dependent_backups",
840
+ "id",
841
+ "is_incremental",
842
+ "metadata",
843
+ "name",
844
+ "object_count",
845
+ "project_id",
846
+ "size",
847
+ "snapshot_id",
848
+ "status",
849
+ "updated_at",
850
+ "user_id",
851
+ "volume_id",
852
+ )
853
+ data = (
854
+ backup.availability_zone,
855
+ backup.container,
856
+ backup.created_at,
857
+ backup.data_timestamp,
858
+ backup.description,
859
+ backup.encryption_key_id,
860
+ backup.fail_reason,
861
+ backup.has_dependent_backups,
862
+ backup.id,
863
+ backup.is_incremental,
864
+ backup.metadata,
865
+ backup.name,
866
+ backup.object_count,
867
+ backup.project_id,
868
+ backup.size,
869
+ backup.snapshot_id,
870
+ backup.status,
871
+ backup.updated_at,
872
+ backup.user_id,
873
+ backup.volume_id,
874
+ )
875
+
876
+ def setUp(self):
877
+ super().setUp()
878
+
879
+ self.volume_sdk_client.get_backup.return_value = self.backup
880
+ # Get the command object to test
881
+ self.cmd = volume_backup.ShowVolumeBackup(self.app, None)
882
+
883
+ def test_backup_show(self):
884
+ arglist = [self.backup.id]
885
+ verifylist = [("backup", self.backup.id)]
886
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
887
+
888
+ columns, data = self.cmd.take_action(parsed_args)
889
+ self.volume_sdk_client.get_backup.assert_called_with(self.backup.id)
890
+
891
+ self.assertEqual(self.columns, columns)
892
+ self.assertEqual(self.data, data)