python-openstackclient 8.1.0__py3-none-any.whl → 8.3.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 (241) hide show
  1. openstackclient/api/compute_v2.py +2 -2
  2. openstackclient/api/object_store_v1.py +4 -1
  3. openstackclient/api/volume_v2.py +60 -0
  4. openstackclient/api/volume_v3.py +60 -0
  5. openstackclient/command.py +27 -0
  6. openstackclient/common/availability_zone.py +1 -1
  7. openstackclient/common/clientmanager.py +59 -21
  8. openstackclient/common/configuration.py +1 -1
  9. openstackclient/common/extension.py +1 -1
  10. openstackclient/common/limits.py +1 -1
  11. openstackclient/common/module.py +4 -2
  12. openstackclient/common/project_cleanup.py +10 -8
  13. openstackclient/common/quota.py +23 -6
  14. openstackclient/common/versions.py +1 -2
  15. openstackclient/compute/v2/agent.py +1 -1
  16. openstackclient/compute/v2/aggregate.py +6 -5
  17. openstackclient/compute/v2/console.py +5 -3
  18. openstackclient/compute/v2/console_connection.py +1 -1
  19. openstackclient/compute/v2/flavor.py +15 -2
  20. openstackclient/compute/v2/host.py +1 -1
  21. openstackclient/compute/v2/hypervisor.py +1 -1
  22. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  23. openstackclient/compute/v2/keypair.py +1 -1
  24. openstackclient/compute/v2/server.py +77 -30
  25. openstackclient/compute/v2/server_backup.py +1 -1
  26. openstackclient/compute/v2/server_event.py +1 -1
  27. openstackclient/compute/v2/server_group.py +4 -2
  28. openstackclient/compute/v2/server_image.py +1 -1
  29. openstackclient/compute/v2/server_migration.py +1 -1
  30. openstackclient/compute/v2/server_volume.py +1 -1
  31. openstackclient/compute/v2/service.py +1 -1
  32. openstackclient/compute/v2/usage.py +6 -4
  33. openstackclient/identity/common.py +10 -14
  34. openstackclient/identity/v2_0/catalog.py +3 -2
  35. openstackclient/identity/v2_0/ec2creds.py +1 -1
  36. openstackclient/identity/v2_0/endpoint.py +1 -1
  37. openstackclient/identity/v2_0/project.py +17 -7
  38. openstackclient/identity/v2_0/role.py +1 -1
  39. openstackclient/identity/v2_0/role_assignment.py +3 -3
  40. openstackclient/identity/v2_0/service.py +1 -1
  41. openstackclient/identity/v2_0/token.py +1 -1
  42. openstackclient/identity/v2_0/user.py +2 -2
  43. openstackclient/identity/v3/access_rule.py +16 -4
  44. openstackclient/identity/v3/application_credential.py +116 -95
  45. openstackclient/identity/v3/catalog.py +3 -3
  46. openstackclient/identity/v3/consumer.py +1 -1
  47. openstackclient/identity/v3/credential.py +1 -1
  48. openstackclient/identity/v3/domain.py +15 -10
  49. openstackclient/identity/v3/ec2creds.py +1 -1
  50. openstackclient/identity/v3/endpoint.py +33 -12
  51. openstackclient/identity/v3/endpoint_group.py +1 -1
  52. openstackclient/identity/v3/federation_protocol.py +1 -1
  53. openstackclient/identity/v3/group.py +11 -5
  54. openstackclient/identity/v3/identity_provider.py +12 -10
  55. openstackclient/identity/v3/implied_role.py +1 -1
  56. openstackclient/identity/v3/limit.py +1 -1
  57. openstackclient/identity/v3/mapping.py +1 -1
  58. openstackclient/identity/v3/policy.py +1 -1
  59. openstackclient/identity/v3/project.py +34 -22
  60. openstackclient/identity/v3/region.py +1 -1
  61. openstackclient/identity/v3/registered_limit.py +16 -11
  62. openstackclient/identity/v3/role.py +27 -41
  63. openstackclient/identity/v3/role_assignment.py +12 -23
  64. openstackclient/identity/v3/service.py +1 -1
  65. openstackclient/identity/v3/service_provider.py +1 -1
  66. openstackclient/identity/v3/tag.py +3 -2
  67. openstackclient/identity/v3/token.py +3 -2
  68. openstackclient/identity/v3/trust.py +4 -2
  69. openstackclient/identity/v3/unscoped_saml.py +1 -1
  70. openstackclient/identity/v3/user.py +22 -13
  71. openstackclient/image/v1/image.py +35 -17
  72. openstackclient/image/v2/cache.py +11 -7
  73. openstackclient/image/v2/image.py +62 -12
  74. openstackclient/image/v2/info.py +1 -1
  75. openstackclient/image/v2/metadef_namespaces.py +1 -1
  76. openstackclient/image/v2/metadef_objects.py +9 -3
  77. openstackclient/image/v2/metadef_properties.py +11 -3
  78. openstackclient/image/v2/metadef_resource_type_association.py +1 -1
  79. openstackclient/image/v2/metadef_resource_types.py +1 -1
  80. openstackclient/image/v2/task.py +1 -1
  81. openstackclient/network/common.py +10 -9
  82. openstackclient/network/v2/address_group.py +4 -3
  83. openstackclient/network/v2/address_scope.py +8 -6
  84. openstackclient/network/v2/default_security_group_rule.py +9 -8
  85. openstackclient/network/v2/floating_ip.py +16 -9
  86. openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
  87. openstackclient/network/v2/ip_availability.py +7 -4
  88. openstackclient/network/v2/l3_conntrack_helper.py +11 -4
  89. openstackclient/network/v2/local_ip.py +13 -7
  90. openstackclient/network/v2/local_ip_association.py +7 -4
  91. openstackclient/network/v2/ndp_proxy.py +13 -6
  92. openstackclient/network/v2/network.py +33 -16
  93. openstackclient/network/v2/network_agent.py +5 -5
  94. openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
  95. openstackclient/network/v2/network_flavor.py +1 -1
  96. openstackclient/network/v2/network_flavor_profile.py +1 -1
  97. openstackclient/network/v2/network_meter.py +1 -1
  98. openstackclient/network/v2/network_meter_rule.py +1 -1
  99. openstackclient/network/v2/network_qos_policy.py +7 -5
  100. openstackclient/network/v2/network_qos_rule.py +1 -1
  101. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  102. openstackclient/network/v2/network_rbac.py +8 -5
  103. openstackclient/network/v2/network_segment.py +2 -2
  104. openstackclient/network/v2/network_segment_range.py +13 -6
  105. openstackclient/network/v2/network_service_provider.py +1 -1
  106. openstackclient/network/v2/network_trunk.py +65 -42
  107. openstackclient/network/v2/port.py +38 -20
  108. openstackclient/network/v2/router.py +19 -8
  109. openstackclient/network/v2/security_group.py +52 -7
  110. openstackclient/network/v2/security_group_rule.py +27 -4
  111. openstackclient/network/v2/subnet.py +17 -18
  112. openstackclient/network/v2/subnet_pool.py +11 -9
  113. openstackclient/network/v2/taas/__init__.py +0 -0
  114. openstackclient/network/v2/taas/tap_flow.py +245 -0
  115. openstackclient/network/v2/taas/tap_mirror.py +237 -0
  116. openstackclient/network/v2/taas/tap_service.py +211 -0
  117. openstackclient/object/v1/account.py +1 -1
  118. openstackclient/object/v1/container.py +1 -1
  119. openstackclient/object/v1/object.py +1 -1
  120. openstackclient/shell.py +18 -8
  121. openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
  122. openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
  123. openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
  124. openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
  125. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  126. openstackclient/tests/functional/image/v2/test_image.py +36 -14
  127. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  128. openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
  129. openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
  130. openstackclient/tests/unit/api/test_volume_v2.py +124 -0
  131. openstackclient/tests/unit/api/test_volume_v3.py +124 -0
  132. openstackclient/tests/unit/common/test_command.py +1 -1
  133. openstackclient/tests/unit/common/test_extension.py +2 -3
  134. openstackclient/tests/unit/common/test_module.py +14 -7
  135. openstackclient/tests/unit/common/test_quota.py +20 -0
  136. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  137. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  138. openstackclient/tests/unit/compute/v2/test_flavor.py +160 -177
  139. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  140. openstackclient/tests/unit/compute/v2/test_server.py +406 -81
  141. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  142. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  143. openstackclient/tests/unit/fakes.py +35 -134
  144. openstackclient/tests/unit/identity/test_common.py +100 -0
  145. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  146. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  147. openstackclient/tests/unit/identity/v3/test_application_credential.py +50 -44
  148. openstackclient/tests/unit/identity/v3/test_domain.py +3 -3
  149. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  150. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  151. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  152. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  153. openstackclient/tests/unit/identity/v3/test_project.py +31 -54
  154. openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
  155. openstackclient/tests/unit/identity/v3/test_role.py +3 -90
  156. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  157. openstackclient/tests/unit/image/v1/test_image.py +47 -0
  158. openstackclient/tests/unit/image/v2/test_image.py +190 -9
  159. openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
  160. openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
  161. openstackclient/tests/unit/network/test_common.py +9 -13
  162. openstackclient/tests/unit/network/v2/fakes.py +1 -0
  163. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  164. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  165. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  166. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  167. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  168. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  169. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  170. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  171. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  172. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  173. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  174. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  175. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  176. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -23
  177. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  178. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  179. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  180. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  181. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  182. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  183. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  184. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  185. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  186. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  187. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  188. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  189. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  190. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  191. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  192. openstackclient/tests/unit/network/v2/test_port.py +113 -84
  193. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  194. openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -26
  195. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +66 -18
  196. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  197. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  198. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  199. openstackclient/tests/unit/volume/v2/test_volume.py +358 -305
  200. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  201. openstackclient/tests/unit/volume/v3/test_volume.py +443 -415
  202. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  203. openstackclient/volume/client.py +7 -17
  204. openstackclient/volume/v2/backup_record.py +1 -1
  205. openstackclient/volume/v2/consistency_group.py +1 -1
  206. openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
  207. openstackclient/volume/v2/qos_specs.py +1 -1
  208. openstackclient/volume/v2/service.py +2 -2
  209. openstackclient/volume/v2/volume.py +80 -54
  210. openstackclient/volume/v2/volume_backend.py +1 -1
  211. openstackclient/volume/v2/volume_backup.py +5 -3
  212. openstackclient/volume/v2/volume_host.py +1 -2
  213. openstackclient/volume/v2/volume_snapshot.py +2 -2
  214. openstackclient/volume/v2/volume_transfer_request.py +1 -1
  215. openstackclient/volume/v2/volume_type.py +11 -6
  216. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  217. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  218. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  219. openstackclient/volume/v3/block_storage_manage.py +1 -1
  220. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  221. openstackclient/volume/v3/service.py +2 -2
  222. openstackclient/volume/v3/volume.py +104 -77
  223. openstackclient/volume/v3/volume_attachment.py +6 -5
  224. openstackclient/volume/v3/volume_backup.py +18 -3
  225. openstackclient/volume/v3/volume_group.py +2 -2
  226. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  227. openstackclient/volume/v3/volume_group_type.py +1 -1
  228. openstackclient/volume/v3/volume_message.py +1 -1
  229. openstackclient/volume/v3/volume_snapshot.py +2 -2
  230. openstackclient/volume/v3/volume_transfer_request.py +1 -1
  231. openstackclient/volume/v3/volume_type.py +15 -9
  232. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +19 -17
  233. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +239 -224
  234. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
  235. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
  236. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +15 -0
  237. python_openstackclient-8.3.0.dist-info/pbr.json +1 -0
  238. openstackclient/tests/unit/common/test_logs.py +0 -221
  239. python_openstackclient-8.1.0.dist-info/pbr.json +0 -1
  240. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/LICENSE +0 -0
  241. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
@@ -822,6 +822,8 @@ class TestImageList(TestImage):
822
822
  'Visibility',
823
823
  'Protected',
824
824
  'Project',
825
+ 'Hash Algorithm',
826
+ 'Hash Value',
825
827
  'Tags',
826
828
  )
827
829
 
@@ -830,14 +832,16 @@ class TestImageList(TestImage):
830
832
  (
831
833
  self._image.id,
832
834
  self._image.name,
833
- None,
834
- None,
835
- None,
836
- None,
837
- None,
835
+ self._image.disk_format,
836
+ self._image.container_format,
837
+ self._image.size,
838
+ self._image.checksum,
839
+ self._image.status,
838
840
  self._image.visibility,
839
841
  self._image.is_protected,
840
842
  self._image.owner_id,
843
+ self._image.hash_algo,
844
+ self._image.hash_value,
841
845
  format_columns.ListColumn(self._image.tags),
842
846
  ),
843
847
  )
@@ -1291,6 +1295,117 @@ class TestImageSet(TestImage):
1291
1295
  # the 'update membership' route.
1292
1296
  self.image_client.update_image.assert_called_with(self._image.id)
1293
1297
 
1298
+ def test_image_set_membership_accept_with_project_no_owner_change(self):
1299
+ """Test that --project with --accept doesn't change image owner."""
1300
+ membership = image_fakes.create_one_image_member(
1301
+ attrs={
1302
+ 'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
1303
+ 'member_id': self.project.id,
1304
+ }
1305
+ )
1306
+ self.image_client.update_member.return_value = membership
1307
+
1308
+ arglist = [
1309
+ '--project',
1310
+ self.project.name,
1311
+ '--accept',
1312
+ self._image.id,
1313
+ ]
1314
+ verifylist = [
1315
+ ('project', self.project.name),
1316
+ ('membership', 'accepted'),
1317
+ ('image', self._image.id),
1318
+ ]
1319
+
1320
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1321
+ self.cmd.take_action(parsed_args)
1322
+
1323
+ self.image_client.update_member.assert_called_once_with(
1324
+ image=self._image.id,
1325
+ member=self.project.id,
1326
+ status='accepted',
1327
+ )
1328
+
1329
+ self.image_client.update_image.assert_called()
1330
+ call_args = self.image_client.update_image.call_args
1331
+ if call_args:
1332
+ args, kwargs = call_args
1333
+ self.assertNotIn('owner_id', kwargs)
1334
+
1335
+ def test_image_set_membership_reject_with_project_no_owner_change(self):
1336
+ """Test that --project with --reject doesn't change image owner."""
1337
+ membership = image_fakes.create_one_image_member(
1338
+ attrs={
1339
+ 'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
1340
+ 'member_id': self.project.id,
1341
+ }
1342
+ )
1343
+ self.image_client.update_member.return_value = membership
1344
+
1345
+ arglist = [
1346
+ '--project',
1347
+ self.project.name,
1348
+ '--reject',
1349
+ self._image.id,
1350
+ ]
1351
+ verifylist = [
1352
+ ('project', self.project.name),
1353
+ ('membership', 'rejected'),
1354
+ ('image', self._image.id),
1355
+ ]
1356
+
1357
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1358
+ self.cmd.take_action(parsed_args)
1359
+
1360
+ self.image_client.update_member.assert_called_once_with(
1361
+ image=self._image.id,
1362
+ member=self.project.id,
1363
+ status='rejected',
1364
+ )
1365
+
1366
+ self.image_client.update_image.assert_called()
1367
+ call_args = self.image_client.update_image.call_args
1368
+ if call_args:
1369
+ args, kwargs = call_args
1370
+ self.assertNotIn('owner_id', kwargs)
1371
+
1372
+ def test_image_set_membership_pending_with_project_no_owner_change(self):
1373
+ """Test that --project with --pending doesn't change image owner."""
1374
+ membership = image_fakes.create_one_image_member(
1375
+ attrs={
1376
+ 'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
1377
+ 'member_id': self.project.id,
1378
+ }
1379
+ )
1380
+ self.image_client.update_member.return_value = membership
1381
+
1382
+ arglist = [
1383
+ '--project',
1384
+ self.project.name,
1385
+ '--pending',
1386
+ self._image.id,
1387
+ ]
1388
+ verifylist = [
1389
+ ('project', self.project.name),
1390
+ ('membership', 'pending'),
1391
+ ('image', self._image.id),
1392
+ ]
1393
+
1394
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1395
+ self.cmd.take_action(parsed_args)
1396
+
1397
+ self.image_client.update_member.assert_called_once_with(
1398
+ image=self._image.id,
1399
+ member=self.project.id,
1400
+ status='pending',
1401
+ )
1402
+
1403
+ self.image_client.update_image.assert_called()
1404
+ call_args = self.image_client.update_image.call_args
1405
+ if call_args:
1406
+ args, kwargs = call_args
1407
+ self.assertNotIn('owner_id', kwargs)
1408
+
1294
1409
  def test_image_set_options(self):
1295
1410
  arglist = [
1296
1411
  '--name',
@@ -1356,15 +1471,17 @@ class TestImageSet(TestImage):
1356
1471
  exceptions.CommandError, self.cmd.take_action, parsed_args
1357
1472
  )
1358
1473
 
1359
- def test_image_set_bools1(self):
1474
+ def test_image_set_bools_true(self):
1360
1475
  arglist = [
1361
1476
  '--protected',
1362
1477
  '--private',
1478
+ '--hidden',
1363
1479
  'graven',
1364
1480
  ]
1365
1481
  verifylist = [
1366
1482
  ('is_protected', True),
1367
1483
  ('visibility', 'private'),
1484
+ ('is_hidden', True),
1368
1485
  ('image', 'graven'),
1369
1486
  ]
1370
1487
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -1374,6 +1491,7 @@ class TestImageSet(TestImage):
1374
1491
  kwargs = {
1375
1492
  'is_protected': True,
1376
1493
  'visibility': 'private',
1494
+ 'is_hidden': True,
1377
1495
  }
1378
1496
  # ImageManager.update(image, **kwargs)
1379
1497
  self.image_client.update_image.assert_called_with(
@@ -1381,15 +1499,17 @@ class TestImageSet(TestImage):
1381
1499
  )
1382
1500
  self.assertIsNone(result)
1383
1501
 
1384
- def test_image_set_bools2(self):
1502
+ def test_image_set_bools_false(self):
1385
1503
  arglist = [
1386
1504
  '--unprotected',
1387
1505
  '--public',
1506
+ '--unhidden',
1388
1507
  'graven',
1389
1508
  ]
1390
1509
  verifylist = [
1391
1510
  ('is_protected', False),
1392
1511
  ('visibility', 'public'),
1512
+ ('is_hidden', False),
1393
1513
  ('image', 'graven'),
1394
1514
  ]
1395
1515
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -1399,6 +1519,7 @@ class TestImageSet(TestImage):
1399
1519
  kwargs = {
1400
1520
  'is_protected': False,
1401
1521
  'visibility': 'public',
1522
+ 'is_hidden': False,
1402
1523
  }
1403
1524
  # ImageManager.update(image, **kwargs)
1404
1525
  self.image_client.update_image.assert_called_with(
@@ -1779,6 +1900,7 @@ class TestImageUnset(TestImage):
1779
1900
  attrs['hw_rng_model'] = 'virtio'
1780
1901
  attrs['prop'] = 'test'
1781
1902
  attrs['prop2'] = 'fake'
1903
+ attrs['os_secure_boot'] = 'required'
1782
1904
  self.image = image_fakes.create_one_image(attrs)
1783
1905
 
1784
1906
  self.image_client.find_image.return_value = self.image
@@ -1822,11 +1944,18 @@ class TestImageUnset(TestImage):
1822
1944
  'hw_rng_model',
1823
1945
  '--property',
1824
1946
  'prop',
1947
+ '--property',
1948
+ 'os_secure_boot',
1825
1949
  self.image.id,
1826
1950
  ]
1827
1951
 
1952
+ # openstacksdk translates 'os_secure_boot' property to
1953
+ # 'needs_secure_boot' Image attribute. This is true for
1954
+ # all IMAGE_ATTRIBUTES_CUSTOM_NAMES keys
1955
+ self.assertEqual(self.image.needs_secure_boot, 'required')
1956
+ self.assertFalse(hasattr(self.image, 'os_secure_boot'))
1828
1957
  verifylist = [
1829
- ('properties', ['hw_rng_model', 'prop']),
1958
+ ('properties', ['hw_rng_model', 'prop', 'os_secure_boot']),
1830
1959
  ('image', self.image.id),
1831
1960
  ]
1832
1961
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -2039,6 +2168,36 @@ class TestImageImport(TestImage):
2039
2168
 
2040
2169
  self.image_client.import_image.assert_not_called()
2041
2170
 
2171
+ def test_import_image__web_download_invalid_url(self):
2172
+ arglist = [
2173
+ self.image.name,
2174
+ '--method',
2175
+ 'web-download',
2176
+ '--uri',
2177
+ 'invalid:1234',
2178
+ ]
2179
+
2180
+ verifylist = [
2181
+ ('image', self.image.name),
2182
+ ('import_method', 'web-download'),
2183
+ ('uri', 'invalid:1234'),
2184
+ ]
2185
+
2186
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2187
+
2188
+ exc = self.assertRaises(
2189
+ exceptions.CommandError,
2190
+ self.cmd.take_action,
2191
+ parsed_args,
2192
+ )
2193
+
2194
+ self.assertIn(
2195
+ "'invalid:1234' is not a valid url",
2196
+ str(exc),
2197
+ )
2198
+
2199
+ self.image_client.import_image.assert_not_called()
2200
+
2042
2201
  def test_import_image__web_download_invalid_image_state(self):
2043
2202
  self.image.status = 'uploading' # != 'queued'
2044
2203
  arglist = [
@@ -2190,7 +2349,29 @@ class TestImageSave(TestImage):
2190
2349
  self.cmd.take_action(parsed_args)
2191
2350
 
2192
2351
  self.image_client.download_image.assert_called_once_with(
2193
- self.image.id, stream=True, output='/path/to/file'
2352
+ self.image.id, output='/path/to/file', stream=True, chunk_size=1024
2353
+ )
2354
+
2355
+ def test_save_data_with_chunk_size(self):
2356
+ arglist = [
2357
+ '--file',
2358
+ '/path/to/file',
2359
+ '--chunk-size',
2360
+ '2048',
2361
+ self.image.id,
2362
+ ]
2363
+
2364
+ verifylist = [
2365
+ ('filename', '/path/to/file'),
2366
+ ('chunk_size', 2048),
2367
+ ('image', self.image.id),
2368
+ ]
2369
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2370
+
2371
+ self.cmd.take_action(parsed_args)
2372
+
2373
+ self.image_client.download_image.assert_called_once_with(
2374
+ self.image.id, output='/path/to/file', stream=True, chunk_size=2048
2194
2375
  )
2195
2376
 
2196
2377
 
@@ -113,6 +113,7 @@ class TestMetadefObjectDelete(fakes.TestImagev2):
113
113
  super().setUp()
114
114
 
115
115
  self.image_client.delete_metadef_object.return_value = None
116
+ self.image_client.delete_all_metadef_objects.return_value = None
116
117
  self.cmd = metadef_objects.DeleteMetadefObject(self.app, None)
117
118
 
118
119
  def test_object_delete(self):
@@ -126,8 +127,29 @@ class TestMetadefObjectDelete(fakes.TestImagev2):
126
127
 
127
128
  result = self.cmd.take_action(parsed_args)
128
129
 
130
+ self.image_client.delete_metadef_object.assert_called_once_with(
131
+ self.image_client.get_metadef_object(),
132
+ self._metadef_namespace.namespace,
133
+ )
134
+ self.image_client.delete_all_metadef_objects.assert_not_called()
129
135
  self.assertIsNone(result)
130
136
 
137
+ def test_object_delete_all(self):
138
+ arglist = [
139
+ self._metadef_namespace.namespace,
140
+ ]
141
+
142
+ verifylist = []
143
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
144
+
145
+ result = self.cmd.take_action(parsed_args)
146
+
147
+ self.assertIsNone(result)
148
+ self.image_client.delete_all_metadef_objects.assert_called_with(
149
+ self._metadef_namespace.namespace,
150
+ )
151
+ self.image_client.delete_metadef_object.assert_not_called()
152
+
131
153
 
132
154
  class TestMetadefObjectList(fakes.TestImagev2):
133
155
  _metadef_namespace = fakes.create_one_metadef_namespace()
@@ -91,6 +91,7 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
91
91
  super().setUp()
92
92
 
93
93
  self.cmd = metadef_properties.DeleteMetadefProperty(self.app, None)
94
+ self.image_client.delete_all_metadef_properties.return_value = None
94
95
 
95
96
  def test_metadef_property_delete(self):
96
97
  arglist = ['namespace', 'property']
@@ -100,6 +101,10 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
100
101
  result = self.cmd.take_action(parsed_args)
101
102
 
102
103
  self.assertIsNone(result)
104
+ self.image_client.delete_metadef_property.assert_called_with(
105
+ 'property', 'namespace', ignore_missing=False
106
+ )
107
+ self.image_client.delete_all_metadef_properties.assert_not_called()
103
108
 
104
109
  def test_metadef_property_delete_missing_arguments(self):
105
110
  arglist = []
@@ -110,21 +115,13 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
110
115
  arglist,
111
116
  [],
112
117
  )
113
-
114
- arglist = ['namespace']
115
- self.assertRaises(
116
- tests_utils.ParserException,
117
- self.check_parser,
118
- self.cmd,
119
- arglist,
120
- [],
121
- )
118
+ self.image_client.delete_all_metadef_properties.assert_not_called()
119
+ self.image_client.delete_metadef_property.assert_not_called()
122
120
 
123
121
  def test_metadef_property_delete_exception(self):
124
122
  arglist = ['namespace', 'property']
125
123
  verifylist = []
126
124
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
127
-
128
125
  self.image_client.delete_metadef_property.side_effect = (
129
126
  sdk_exceptions.ResourceNotFound
130
127
  )
@@ -132,6 +129,23 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
132
129
  self.assertRaises(
133
130
  exceptions.CommandError, self.cmd.take_action, parsed_args
134
131
  )
132
+ self.image_client.delete_metadef_property.assert_called_with(
133
+ 'property', 'namespace', ignore_missing=False
134
+ )
135
+ self.image_client.delete_all_metadef_properties.assert_not_called()
136
+
137
+ def test_metadef_property_delete_all(self):
138
+ arglist = ['namespace']
139
+ verifylist = []
140
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
141
+
142
+ result = self.cmd.take_action(parsed_args)
143
+
144
+ self.assertIsNone(result)
145
+ self.image_client.delete_all_metadef_properties.assert_called_with(
146
+ 'namespace'
147
+ )
148
+ self.image_client.delete_metadef_property.assert_not_called()
135
149
 
136
150
 
137
151
  class TestMetadefPropertyList(image_fakes.TestImagev2):
@@ -126,17 +126,13 @@ class TestNetworkAndCompute(utils.TestCommand):
126
126
  # Create client mocks. Note that we intentionally do not use specced
127
127
  # mocks since we want to test fake methods.
128
128
 
129
- self.app.client_manager.network = mock.Mock()
130
- self.network_client = self.app.client_manager.network
131
- self.network_client.network_action = mock.Mock(
132
- return_value='take_action_network'
133
- )
129
+ self.app.client_manager.network = mock.Mock() # noqa: O401
130
+ self.network_client = self.app.client_manager.network # noqa: O401
131
+ self.network_client.network_action.return_value = 'take_action_network'
134
132
 
135
- self.app.client_manager.compute = mock.Mock()
136
- self.compute_client = self.app.client_manager.compute
137
- self.compute_client.compute_action = mock.Mock(
138
- return_value='take_action_compute'
139
- )
133
+ self.app.client_manager.compute = mock.Mock() # noqa: O401
134
+ self.compute_client = self.app.client_manager.compute # noqa: O401
135
+ self.compute_client.compute_action.return_value = 'take_action_compute'
140
136
 
141
137
  self.cmd = FakeNetworkAndComputeCommand(self.app, None)
142
138
 
@@ -205,9 +201,9 @@ class TestNeutronCommandWithExtraArgs(utils.TestCommand):
205
201
  # Create client mocks. Note that we intentionally do not use specced
206
202
  # mocks since we want to test fake methods.
207
203
 
208
- self.app.client_manager.network = mock.Mock()
209
- self.network_client = self.app.client_manager.network
210
- self.network_client.test_create_action = mock.Mock()
204
+ self.app.client_manager.network = mock.Mock() # noqa: O401
205
+ self.network_client = self.app.client_manager.network # noqa: O401
206
+ self.network_client.test_create_action = mock.Mock() # noqa: O402
211
207
 
212
208
  # Subclasses can override the command object to test.
213
209
  self.cmd = FakeCreateNeutronCommandWithExtraArgs(self.app, None)
@@ -1412,6 +1412,7 @@ def create_one_security_group(attrs=None):
1412
1412
  'security_group_rules': [],
1413
1413
  'tags': [],
1414
1414
  'location': 'MUNCHMUNCHMUNCH',
1415
+ 'is_shared': False,
1415
1416
  }
1416
1417
 
1417
1418
  # Overwrite default attributes.
File without changes