python-openstackclient 8.2.0__py3-none-any.whl → 9.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 (233) hide show
  1. openstackclient/api/object_store_v1.py +4 -1
  2. openstackclient/command.py +27 -0
  3. openstackclient/common/availability_zone.py +1 -1
  4. openstackclient/common/clientmanager.py +59 -21
  5. openstackclient/common/configuration.py +1 -1
  6. openstackclient/common/extension.py +1 -1
  7. openstackclient/common/limits.py +1 -1
  8. openstackclient/common/module.py +5 -3
  9. openstackclient/common/project_cleanup.py +10 -8
  10. openstackclient/common/quota.py +54 -23
  11. openstackclient/common/versions.py +1 -2
  12. openstackclient/compute/v2/agent.py +1 -1
  13. openstackclient/compute/v2/aggregate.py +6 -5
  14. openstackclient/compute/v2/console.py +5 -3
  15. openstackclient/compute/v2/console_connection.py +1 -1
  16. openstackclient/compute/v2/flavor.py +1 -1
  17. openstackclient/compute/v2/host.py +1 -1
  18. openstackclient/compute/v2/hypervisor.py +1 -1
  19. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  20. openstackclient/compute/v2/keypair.py +1 -1
  21. openstackclient/compute/v2/server.py +78 -29
  22. openstackclient/compute/v2/server_backup.py +1 -1
  23. openstackclient/compute/v2/server_event.py +1 -1
  24. openstackclient/compute/v2/server_group.py +4 -2
  25. openstackclient/compute/v2/server_image.py +1 -1
  26. openstackclient/compute/v2/server_migration.py +1 -1
  27. openstackclient/compute/v2/server_volume.py +1 -1
  28. openstackclient/compute/v2/service.py +1 -1
  29. openstackclient/compute/v2/usage.py +6 -4
  30. openstackclient/identity/common.py +33 -1
  31. openstackclient/identity/v2_0/catalog.py +3 -2
  32. openstackclient/identity/v2_0/ec2creds.py +1 -1
  33. openstackclient/identity/v2_0/endpoint.py +1 -1
  34. openstackclient/identity/v2_0/project.py +17 -7
  35. openstackclient/identity/v2_0/role.py +1 -1
  36. openstackclient/identity/v2_0/role_assignment.py +3 -3
  37. openstackclient/identity/v2_0/service.py +4 -2
  38. openstackclient/identity/v2_0/token.py +1 -1
  39. openstackclient/identity/v2_0/user.py +2 -2
  40. openstackclient/identity/v3/access_rule.py +16 -4
  41. openstackclient/identity/v3/application_credential.py +30 -10
  42. openstackclient/identity/v3/catalog.py +3 -3
  43. openstackclient/identity/v3/consumer.py +1 -1
  44. openstackclient/identity/v3/credential.py +1 -1
  45. openstackclient/identity/v3/domain.py +10 -4
  46. openstackclient/identity/v3/ec2creds.py +1 -1
  47. openstackclient/identity/v3/endpoint.py +33 -12
  48. openstackclient/identity/v3/endpoint_group.py +1 -1
  49. openstackclient/identity/v3/federation_protocol.py +40 -41
  50. openstackclient/identity/v3/group.py +11 -5
  51. openstackclient/identity/v3/identity_provider.py +12 -10
  52. openstackclient/identity/v3/implied_role.py +1 -1
  53. openstackclient/identity/v3/limit.py +86 -85
  54. openstackclient/identity/v3/mapping.py +1 -1
  55. openstackclient/identity/v3/policy.py +1 -1
  56. openstackclient/identity/v3/project.py +191 -115
  57. openstackclient/identity/v3/region.py +1 -1
  58. openstackclient/identity/v3/registered_limit.py +97 -109
  59. openstackclient/identity/v3/role.py +20 -39
  60. openstackclient/identity/v3/role_assignment.py +12 -23
  61. openstackclient/identity/v3/service.py +1 -1
  62. openstackclient/identity/v3/service_provider.py +1 -1
  63. openstackclient/identity/v3/tag.py +1 -11
  64. openstackclient/identity/v3/token.py +3 -2
  65. openstackclient/identity/v3/trust.py +4 -2
  66. openstackclient/identity/v3/unscoped_saml.py +1 -1
  67. openstackclient/identity/v3/user.py +22 -13
  68. openstackclient/image/v1/image.py +19 -16
  69. openstackclient/image/v2/cache.py +1 -1
  70. openstackclient/image/v2/image.py +16 -12
  71. openstackclient/image/v2/info.py +1 -1
  72. openstackclient/image/v2/metadef_namespaces.py +1 -1
  73. openstackclient/image/v2/metadef_objects.py +1 -1
  74. openstackclient/image/v2/metadef_properties.py +3 -2
  75. openstackclient/image/v2/metadef_resource_type_association.py +1 -1
  76. openstackclient/image/v2/metadef_resource_types.py +1 -1
  77. openstackclient/image/v2/task.py +1 -1
  78. openstackclient/network/common.py +10 -9
  79. openstackclient/network/v2/address_group.py +4 -3
  80. openstackclient/network/v2/address_scope.py +8 -6
  81. openstackclient/network/v2/default_security_group_rule.py +9 -8
  82. openstackclient/network/v2/floating_ip.py +16 -9
  83. openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
  84. openstackclient/network/v2/ip_availability.py +7 -4
  85. openstackclient/network/v2/l3_conntrack_helper.py +11 -4
  86. openstackclient/network/v2/local_ip.py +13 -7
  87. openstackclient/network/v2/local_ip_association.py +7 -4
  88. openstackclient/network/v2/ndp_proxy.py +13 -6
  89. openstackclient/network/v2/network.py +33 -16
  90. openstackclient/network/v2/network_agent.py +5 -5
  91. openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
  92. openstackclient/network/v2/network_flavor.py +1 -1
  93. openstackclient/network/v2/network_flavor_profile.py +1 -1
  94. openstackclient/network/v2/network_meter.py +1 -1
  95. openstackclient/network/v2/network_meter_rule.py +1 -1
  96. openstackclient/network/v2/network_qos_policy.py +7 -5
  97. openstackclient/network/v2/network_qos_rule.py +1 -1
  98. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  99. openstackclient/network/v2/network_rbac.py +8 -5
  100. openstackclient/network/v2/network_segment.py +2 -2
  101. openstackclient/network/v2/network_segment_range.py +13 -6
  102. openstackclient/network/v2/network_service_provider.py +1 -1
  103. openstackclient/network/v2/network_trunk.py +65 -42
  104. openstackclient/network/v2/port.py +22 -20
  105. openstackclient/network/v2/router.py +19 -8
  106. openstackclient/network/v2/security_group.py +10 -6
  107. openstackclient/network/v2/security_group_rule.py +11 -5
  108. openstackclient/network/v2/subnet.py +17 -18
  109. openstackclient/network/v2/subnet_pool.py +11 -9
  110. openstackclient/network/v2/taas/__init__.py +0 -0
  111. openstackclient/network/v2/taas/tap_flow.py +245 -0
  112. openstackclient/network/v2/taas/tap_mirror.py +237 -0
  113. openstackclient/network/v2/taas/tap_service.py +211 -0
  114. openstackclient/object/v1/account.py +1 -1
  115. openstackclient/object/v1/container.py +1 -1
  116. openstackclient/object/v1/object.py +1 -1
  117. openstackclient/shell.py +18 -8
  118. openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
  119. openstackclient/tests/functional/identity/v3/test_limit.py +47 -0
  120. openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
  121. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  122. openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
  123. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  124. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +46 -132
  125. openstackclient/tests/unit/common/test_command.py +1 -1
  126. openstackclient/tests/unit/common/test_extension.py +2 -3
  127. openstackclient/tests/unit/common/test_module.py +14 -7
  128. openstackclient/tests/unit/common/test_quota.py +79 -0
  129. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  130. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  131. openstackclient/tests/unit/compute/v2/test_flavor.py +1 -3
  132. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  133. openstackclient/tests/unit/compute/v2/test_server.py +370 -38
  134. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  135. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  136. openstackclient/tests/unit/fakes.py +35 -134
  137. openstackclient/tests/unit/identity/test_common.py +100 -0
  138. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  139. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  140. openstackclient/tests/unit/identity/v3/test_application_credential.py +3 -3
  141. openstackclient/tests/unit/identity/v3/test_domain.py +1 -1
  142. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  143. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  144. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  145. openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
  146. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  147. openstackclient/tests/unit/identity/v3/test_project.py +832 -513
  148. openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
  149. openstackclient/tests/unit/identity/v3/test_registered_limit.py +356 -221
  150. openstackclient/tests/unit/identity/v3/test_role.py +1 -82
  151. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  152. openstackclient/tests/unit/image/v2/test_image.py +116 -5
  153. openstackclient/tests/unit/network/test_common.py +9 -13
  154. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  155. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  156. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  157. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  158. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  159. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  160. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  161. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  162. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  163. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  164. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  165. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  166. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  167. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +11 -21
  168. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  169. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  170. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  171. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  172. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  173. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  174. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  175. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  176. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  177. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  178. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  179. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  180. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  181. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  182. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  183. openstackclient/tests/unit/network/v2/test_port.py +75 -86
  184. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  185. openstackclient/tests/unit/network/v2/test_security_group_network.py +19 -26
  186. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +17 -18
  187. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  188. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  189. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  190. openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
  191. openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
  192. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  193. openstackclient/tests/unit/volume/v3/test_volume.py +38 -12
  194. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  195. openstackclient/volume/client.py +7 -17
  196. openstackclient/volume/v2/backup_record.py +1 -1
  197. openstackclient/volume/v2/consistency_group.py +9 -9
  198. openstackclient/volume/v2/consistency_group_snapshot.py +3 -3
  199. openstackclient/volume/v2/qos_specs.py +3 -3
  200. openstackclient/volume/v2/service.py +1 -1
  201. openstackclient/volume/v2/volume.py +14 -7
  202. openstackclient/volume/v2/volume_backend.py +1 -1
  203. openstackclient/volume/v2/volume_backup.py +7 -5
  204. openstackclient/volume/v2/volume_host.py +1 -2
  205. openstackclient/volume/v2/volume_snapshot.py +4 -4
  206. openstackclient/volume/v2/volume_transfer_request.py +3 -3
  207. openstackclient/volume/v2/volume_type.py +16 -11
  208. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  209. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  210. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  211. openstackclient/volume/v3/block_storage_manage.py +1 -1
  212. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  213. openstackclient/volume/v3/service.py +1 -1
  214. openstackclient/volume/v3/volume.py +16 -9
  215. openstackclient/volume/v3/volume_attachment.py +6 -5
  216. openstackclient/volume/v3/volume_backup.py +20 -5
  217. openstackclient/volume/v3/volume_group.py +1 -1
  218. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  219. openstackclient/volume/v3/volume_group_type.py +1 -1
  220. openstackclient/volume/v3/volume_message.py +1 -1
  221. openstackclient/volume/v3/volume_snapshot.py +4 -4
  222. openstackclient/volume/v3/volume_transfer_request.py +3 -3
  223. openstackclient/volume/v3/volume_type.py +20 -14
  224. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/METADATA +15 -13
  225. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/RECORD +231 -219
  226. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/WHEEL +1 -1
  227. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/entry_points.txt +15 -0
  228. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/AUTHORS +15 -0
  229. python_openstackclient-9.0.0.dist-info/pbr.json +1 -0
  230. openstackclient/tests/unit/common/test_logs.py +0 -221
  231. python_openstackclient-8.2.0.dist-info/pbr.json +0 -1
  232. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/LICENSE +0 -0
  233. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/top_level.txt +0 -0
@@ -62,6 +62,47 @@ class RoleAssignmentTests(common.IdentityTests):
62
62
  items = self.parse_listing(raw_output)
63
63
  self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
64
64
 
65
+ def test_role_assignment_list_group_domain(self):
66
+ domain_name_A = self._create_dummy_domain()
67
+ domain_name_B = self._create_dummy_domain()
68
+ role_name = self._create_dummy_role()
69
+ group_name = 'group_name'
70
+ self.openstack(f'group create --domain {domain_name_A} {group_name}')
71
+ self.addCleanup(
72
+ self.openstack,
73
+ f'group delete --domain {domain_name_A} {group_name}',
74
+ )
75
+ self.openstack(f'group create --domain {domain_name_B} {group_name}')
76
+ self.addCleanup(
77
+ self.openstack,
78
+ f'group delete --domain {domain_name_B} {group_name}',
79
+ )
80
+ raw_output = self.openstack(
81
+ 'role add '
82
+ f'--project {self.project_name} '
83
+ f'--group {group_name} --group-domain {domain_name_A} '
84
+ f'{role_name}'
85
+ )
86
+ self.addCleanup(
87
+ self.openstack,
88
+ 'role remove '
89
+ f'--project {self.project_name} '
90
+ f'--group {group_name} --group-domain {domain_name_A} '
91
+ f'{role_name}',
92
+ )
93
+ self.assertEqual('', raw_output.strip())
94
+ raw_output = self.openstack(
95
+ f'role assignment list '
96
+ f'--group {group_name} --group-domain {domain_name_A} '
97
+ )
98
+ items = self.parse_listing(raw_output)
99
+ self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
100
+ raw_output = self.openstack(
101
+ f'role assignment list '
102
+ f'--group {group_name} --group-domain {domain_name_B} '
103
+ )
104
+ self.assertEqual('', raw_output.strip())
105
+
65
106
  def test_role_assignment_list_domain(self):
66
107
  role_name = self._create_dummy_role()
67
108
  username = self._create_dummy_user()
@@ -85,6 +126,89 @@ class RoleAssignmentTests(common.IdentityTests):
85
126
  items = self.parse_listing(raw_output)
86
127
  self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
87
128
 
129
+ def test_role_assignment_list_user_domain(self):
130
+ domain_name_A = self._create_dummy_domain()
131
+ domain_name_B = self._create_dummy_domain()
132
+ role_name = self._create_dummy_role()
133
+ username = 'username'
134
+ self.openstack(f'user create --domain {domain_name_A} {username}')
135
+ self.addCleanup(
136
+ self.openstack, f'user delete --domain {domain_name_A} {username}'
137
+ )
138
+ self.openstack(f'user create --domain {domain_name_B} {username}')
139
+ self.addCleanup(
140
+ self.openstack, f'user delete --domain {domain_name_B} {username}'
141
+ )
142
+ raw_output = self.openstack(
143
+ 'role add '
144
+ f'--project {self.project_name} '
145
+ f'--user {username} --user-domain {domain_name_A} '
146
+ f'{role_name}'
147
+ )
148
+ self.addCleanup(
149
+ self.openstack,
150
+ 'role remove '
151
+ f'--project {self.project_name} '
152
+ f'--user {username} --user-domain {domain_name_A} '
153
+ f'{role_name}',
154
+ )
155
+ self.assertEqual('', raw_output.strip())
156
+ raw_output = self.openstack(
157
+ f'role assignment list '
158
+ f'--user {username} --user-domain {domain_name_A} '
159
+ )
160
+ items = self.parse_listing(raw_output)
161
+ self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
162
+ raw_output = self.openstack(
163
+ f'role assignment list '
164
+ f'--user {username} --user-domain {domain_name_B} '
165
+ )
166
+ self.assertEqual('', raw_output.strip())
167
+
168
+ def test_role_assignment_list_role_domain(self):
169
+ domain_name_A = self._create_dummy_domain()
170
+ domain_name_B = self._create_dummy_domain()
171
+ role_name = 'role_name'
172
+ username = 'username'
173
+ self.openstack(f'role create --domain {domain_name_A} {role_name}')
174
+ self.addCleanup(
175
+ self.openstack, f'role delete --domain {domain_name_A} {role_name}'
176
+ )
177
+ self.openstack(f'role create --domain {domain_name_B} {role_name}')
178
+ self.addCleanup(
179
+ self.openstack, f'role delete --domain {domain_name_B} {role_name}'
180
+ )
181
+ self.openstack(f'user create --domain {domain_name_A} {username}')
182
+ self.addCleanup(
183
+ self.openstack, f'user delete --domain {domain_name_A} {username}'
184
+ )
185
+ raw_output = self.openstack(
186
+ 'role add '
187
+ f'--user {username} --domain {domain_name_A} '
188
+ f'--role-domain {domain_name_A} '
189
+ f'{role_name}'
190
+ )
191
+ self.addCleanup(
192
+ self.openstack,
193
+ 'role remove '
194
+ f'--user {username} --domain {domain_name_A} '
195
+ f'--role-domain {domain_name_A} '
196
+ f'{role_name}',
197
+ )
198
+ self.assertEqual('', raw_output.strip())
199
+ raw_output = self.openstack(
200
+ f'role assignment list '
201
+ f'--role {role_name} --role-domain {domain_name_A}'
202
+ )
203
+ items = self.parse_listing(raw_output)
204
+ self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
205
+ raw_output = self.openstack(
206
+ f'role assignment list '
207
+ f'--role {role_name} --role-domain {domain_name_B}'
208
+ )
209
+ items = self.parse_listing(raw_output)
210
+ self.assertEqual('', raw_output.strip())
211
+
88
212
  def test_role_assignment_list_project(self):
89
213
  role_name = self._create_dummy_role()
90
214
  username = self._create_dummy_user()
@@ -108,6 +232,56 @@ class RoleAssignmentTests(common.IdentityTests):
108
232
  items = self.parse_listing(raw_output)
109
233
  self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
110
234
 
235
+ def test_role_assignment_list_project_domain(self):
236
+ domain_name_A = self._create_dummy_domain()
237
+ domain_name_B = self._create_dummy_domain()
238
+ role_name = self._create_dummy_role()
239
+ project_name = 'project_name'
240
+ username = 'username'
241
+ self.openstack(
242
+ f'project create --domain {domain_name_A} {project_name}'
243
+ )
244
+ self.addCleanup(
245
+ self.openstack,
246
+ f'project delete --domain {domain_name_A} {project_name}',
247
+ )
248
+ self.openstack(
249
+ f'project create --domain {domain_name_B} {project_name}'
250
+ )
251
+ self.addCleanup(
252
+ self.openstack,
253
+ f'project delete --domain {domain_name_B} {project_name}',
254
+ )
255
+ self.openstack(f'user create --domain {domain_name_A} {username}')
256
+ self.addCleanup(
257
+ self.openstack, f'user delete --domain {domain_name_A} {username}'
258
+ )
259
+ raw_output = self.openstack(
260
+ 'role add '
261
+ f'--project {project_name} --project-domain {domain_name_A} '
262
+ f'--user {username} --user-domain {domain_name_A} '
263
+ f'{role_name}'
264
+ )
265
+ self.addCleanup(
266
+ self.openstack,
267
+ 'role remove '
268
+ f'--project {project_name} --project-domain {domain_name_A} '
269
+ f'--user {username} --user-domain {domain_name_A} '
270
+ f'{role_name}',
271
+ )
272
+ self.assertEqual('', raw_output.strip())
273
+ raw_output = self.openstack(
274
+ f'role assignment list '
275
+ f'--project {project_name} --project-domain {domain_name_A} '
276
+ )
277
+ items = self.parse_listing(raw_output)
278
+ self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
279
+ raw_output = self.openstack(
280
+ f'role assignment list '
281
+ f'--project {project_name} --project-domain {domain_name_B} '
282
+ )
283
+ self.assertEqual('', raw_output.strip())
284
+
111
285
  def test_role_assignment_list_effective(self):
112
286
  raw_output = self.openstack('role assignment list --effective')
113
287
  items = self.parse_listing(raw_output)
@@ -0,0 +1,54 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
2
+ # not use this file except in compliance with the License. You may obtain
3
+ # a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
+ # License for the specific language governing permissions and limitations
11
+ # under the License.
12
+
13
+ import uuid
14
+
15
+ from openstackclient.tests.functional.image import base
16
+
17
+
18
+ class CacheTests(base.BaseImageTests):
19
+ """Functional tests for Cache commands"""
20
+
21
+ def test_cached_image(self):
22
+ """Test cached image operations including queue and clear"""
23
+ # Create test image
24
+ name = uuid.uuid4().hex
25
+ output = self.openstack(
26
+ f'image create {name}',
27
+ parse_output=True,
28
+ )
29
+ image_id = output["id"]
30
+ self.assertOutput(name, output['name'])
31
+
32
+ # Register cleanup for created image
33
+ self.addCleanup(
34
+ self.openstack, 'cached image delete ' + image_id, fail_ok=True
35
+ )
36
+ self.addCleanup(self.openstack, 'image delete ' + image_id)
37
+
38
+ # Queue image for caching
39
+ self.openstack('cached image queue ' + image_id)
40
+
41
+ # Verify queuing worked
42
+ cache_output = self.openstack('cached image list', parse_output=True)
43
+ self.assertIsInstance(cache_output, list)
44
+ image_ids = [img['ID'] for img in cache_output]
45
+ self.assertIn(image_id, image_ids)
46
+
47
+ # Clear cached images
48
+ self.openstack('cached image clear')
49
+
50
+ # Verify clearing worked
51
+ output = self.openstack('cached image list', parse_output=True)
52
+ if output:
53
+ image_ids = [img['ID'] for img in output]
54
+ self.assertNotIn(image_id, image_ids)
@@ -0,0 +1,69 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ from openstackclient.tests.functional import base
14
+
15
+
16
+ class MetadefObjectTests(base.TestCase):
17
+ def setUp(self):
18
+ super().setUp()
19
+ self.obj_name = self.getUniqueString('metadef-obj')
20
+ self.ns_name = self.getUniqueString('metadef-ns')
21
+ self.openstack(f"image metadef namespace create {self.ns_name}")
22
+ self.addCleanup(
23
+ lambda: self.openstack(
24
+ f"image metadef namespace delete {self.ns_name}"
25
+ )
26
+ )
27
+
28
+ def test_metadef_objects(self):
29
+ # CREATE
30
+ created = self.openstack(
31
+ (
32
+ "image metadef object create "
33
+ f"--namespace {self.ns_name} "
34
+ f"{self.obj_name}"
35
+ ),
36
+ parse_output=True,
37
+ )
38
+ self.addCleanup(
39
+ lambda: self.openstack(
40
+ f"image metadef object delete {self.ns_name} {self.obj_name}"
41
+ )
42
+ )
43
+ self.assertEqual(self.obj_name, created["name"])
44
+ self.assertEqual(self.ns_name, created["namespace_name"])
45
+
46
+ # UPDATE
47
+ new_name = f"{self.obj_name}-updated"
48
+ self.openstack(
49
+ "image metadef object update "
50
+ f"{self.ns_name} {self.obj_name} "
51
+ f"--name {new_name}"
52
+ )
53
+ self.obj_name = new_name
54
+
55
+ # READ (get)
56
+ shown = self.openstack(
57
+ f"image metadef object show {self.ns_name} {self.obj_name}",
58
+ parse_output=True,
59
+ )
60
+ self.assertEqual(self.obj_name, shown["name"])
61
+ self.assertEqual(self.ns_name, shown["namespace_name"])
62
+
63
+ # READ (list)
64
+ rows = self.openstack(
65
+ f"image metadef object list {self.ns_name}",
66
+ parse_output=True,
67
+ )
68
+ names = {row["name"] for row in rows}
69
+ self.assertIn(self.obj_name, names)
@@ -0,0 +1,55 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
2
+ # not use this file except in compliance with the License. You may obtain
3
+ # a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
+ # License for the specific language governing permissions and limitations
11
+ # under the License.
12
+
13
+ import uuid
14
+
15
+ from openstackclient.tests.functional.image import base
16
+
17
+
18
+ class ImageMetadefResourceTypeTests(base.BaseImageTests):
19
+ """Functional tests for image metadef resource type commands."""
20
+
21
+ def setUp(self):
22
+ super().setUp()
23
+
24
+ # Create unique namespace name using UUID
25
+ self.namespace_name = 'test-mdef-ns-' + uuid.uuid4().hex
26
+ self.resource_type_name = 'test-mdef-rt-' + uuid.uuid4().hex
27
+
28
+ # Create namespace
29
+ self.openstack('image metadef namespace create ' + self.namespace_name)
30
+ self.addCleanup(
31
+ self.openstack,
32
+ 'image metadef namespace delete ' + self.namespace_name,
33
+ )
34
+
35
+ def test_metadef_resource_type(self):
36
+ """Test image metadef resource type commands"""
37
+
38
+ self.openstack(
39
+ 'image metadef resource type association create '
40
+ f'{self.namespace_name} {self.resource_type_name}',
41
+ )
42
+ self.addCleanup(
43
+ self.openstack,
44
+ 'image metadef resource type association delete '
45
+ f'{self.namespace_name} {self.resource_type_name}',
46
+ )
47
+
48
+ output = self.openstack(
49
+ 'image metadef resource type list',
50
+ parse_output=True,
51
+ )
52
+
53
+ self.assertIn(
54
+ self.resource_type_name, [item['Name'] for item in output]
55
+ )
@@ -23,7 +23,7 @@ class VolumeSnapshotTests(common.BaseVolumeTests):
23
23
  @classmethod
24
24
  def setUpClass(cls):
25
25
  super().setUpClass()
26
- # create a volume for all tests to create snapshot
26
+ # create a test volume used by all snapshot tests
27
27
  cmd_output = cls.openstack(
28
28
  'volume create ' + '--size 1 ' + cls.VOLLY,
29
29
  parse_output=True,
@@ -40,147 +40,57 @@ class VolumeSnapshotTests(common.BaseVolumeTests):
40
40
  finally:
41
41
  super().tearDownClass()
42
42
 
43
- def test_volume_snapshot_delete(self):
44
- """Test create, delete multiple"""
45
- name1 = uuid.uuid4().hex
46
- cmd_output = self.openstack(
47
- 'volume snapshot create ' + name1 + ' --volume ' + self.VOLLY,
48
- parse_output=True,
49
- )
50
- self.assertEqual(
51
- name1,
52
- cmd_output["name"],
53
- )
43
+ def test_volume_snapshot(self):
44
+ # create volume snapshot
45
+ name = uuid.uuid4().hex
54
46
 
55
- name2 = uuid.uuid4().hex
56
47
  cmd_output = self.openstack(
57
- 'volume snapshot create ' + name2 + ' --volume ' + self.VOLLY,
48
+ 'volume snapshot create '
49
+ + '--volume '
50
+ + self.VOLLY
51
+ + ' --description aaaa '
52
+ + '--property Alpha=a '
53
+ + name,
58
54
  parse_output=True,
59
55
  )
60
- self.assertEqual(
61
- name2,
62
- cmd_output["name"],
63
- )
64
-
65
- self.wait_for_status('volume snapshot', name1, 'available')
66
- self.wait_for_status('volume snapshot', name2, 'available')
56
+ snap_id = cmd_output['id']
67
57
 
68
- del_output = self.openstack(
69
- 'volume snapshot delete ' + name1 + ' ' + name2
58
+ self.addCleanup(self.wait_for_delete, 'volume snapshot', snap_id)
59
+ # delete volume snapshot
60
+ self.addCleanup(
61
+ self.openstack,
62
+ 'volume snapshot delete ' + snap_id,
70
63
  )
71
- self.assertOutput('', del_output)
72
- self.wait_for_delete('volume snapshot', name1)
73
- self.wait_for_delete('volume snapshot', name2)
64
+ self.wait_for_status('volume snapshot', snap_id, 'available')
74
65
 
75
- def test_volume_snapshot_list(self):
76
- """Test create, list filter"""
77
- name1 = uuid.uuid4().hex
78
- cmd_output = self.openstack(
79
- 'volume snapshot create ' + name1 + ' --volume ' + self.VOLLY,
66
+ # show volume snapshot
67
+ snapshot_info = self.openstack(
68
+ 'volume snapshot show ' + name,
80
69
  parse_output=True,
81
70
  )
82
- self.addCleanup(self.wait_for_delete, 'volume snapshot', name1)
83
- self.addCleanup(self.openstack, 'volume snapshot delete ' + name1)
84
- self.assertEqual(
85
- name1,
86
- cmd_output["name"],
87
- )
88
- self.assertEqual(
89
- self.VOLUME_ID,
90
- cmd_output["volume_id"],
91
- )
92
- self.assertEqual(
93
- 1,
94
- cmd_output["size"],
95
- )
96
- self.wait_for_status('volume snapshot', name1, 'available')
97
71
 
98
- name2 = uuid.uuid4().hex
99
- cmd_output = self.openstack(
100
- 'volume snapshot create ' + name2 + ' --volume ' + self.VOLLY,
101
- parse_output=True,
102
- )
103
- self.addCleanup(self.wait_for_delete, 'volume snapshot', name2)
104
- self.addCleanup(self.openstack, 'volume snapshot delete ' + name2)
105
- self.assertEqual(
106
- name2,
107
- cmd_output["name"],
108
- )
109
- self.assertEqual(
110
- self.VOLUME_ID,
111
- cmd_output["volume_id"],
112
- )
113
- self.assertEqual(
114
- 1,
115
- cmd_output["size"],
116
- )
117
- self.wait_for_status('volume snapshot', name2, 'available')
118
- raw_output = self.openstack(
119
- 'volume snapshot set ' + '--state error ' + name2
120
- )
121
- self.assertOutput('', raw_output)
72
+ self.assertEqual(name, snapshot_info['name'])
73
+ self.assertEqual('aaaa', snapshot_info["description"])
74
+ self.assertEqual({'Alpha': 'a'}, snapshot_info["properties"])
122
75
 
123
- # Test list --long, --status
76
+ # list volume snapshot --name
124
77
  cmd_output = self.openstack(
125
- 'volume snapshot list ' + '--long ' + '--status error',
78
+ 'volume snapshot list --name ' + name,
126
79
  parse_output=True,
127
80
  )
128
- names = [x["Name"] for x in cmd_output]
129
- self.assertNotIn(name1, names)
130
- self.assertIn(name2, names)
81
+ names = [x['Name'] for x in cmd_output]
82
+ self.assertIn(name, names)
131
83
 
132
- # Test list --volume
84
+ # list volume snapshot --volume
133
85
  cmd_output = self.openstack(
134
86
  'volume snapshot list ' + '--volume ' + self.VOLLY,
135
87
  parse_output=True,
136
88
  )
137
89
  names = [x["Name"] for x in cmd_output]
138
- self.assertIn(name1, names)
139
- self.assertIn(name2, names)
90
+ self.assertIn(name, names)
140
91
 
141
- # Test list --name
142
- cmd_output = self.openstack(
143
- 'volume snapshot list ' + '--name ' + name1,
144
- parse_output=True,
145
- )
146
- names = [x["Name"] for x in cmd_output]
147
- self.assertIn(name1, names)
148
- self.assertNotIn(name2, names)
149
-
150
- def test_volume_snapshot_set(self):
151
- """Test create, set, unset, show, delete volume snapshot"""
152
- name = uuid.uuid4().hex
92
+ # set volume snapshot
153
93
  new_name = name + "_"
154
- cmd_output = self.openstack(
155
- 'volume snapshot create '
156
- + '--volume '
157
- + self.VOLLY
158
- + ' --description aaaa '
159
- + '--property Alpha=a '
160
- + name,
161
- parse_output=True,
162
- )
163
- self.addCleanup(self.wait_for_delete, 'volume snapshot', new_name)
164
- self.addCleanup(self.openstack, 'volume snapshot delete ' + new_name)
165
- self.assertEqual(
166
- name,
167
- cmd_output["name"],
168
- )
169
- self.assertEqual(
170
- 1,
171
- cmd_output["size"],
172
- )
173
- self.assertEqual(
174
- 'aaaa',
175
- cmd_output["description"],
176
- )
177
- self.assertEqual(
178
- {'Alpha': 'a'},
179
- cmd_output["properties"],
180
- )
181
- self.wait_for_status('volume snapshot', name, 'available')
182
-
183
- # Test volume snapshot set
184
94
  raw_output = self.openstack(
185
95
  'volume snapshot set '
186
96
  + '--name '
@@ -188,11 +98,10 @@ class VolumeSnapshotTests(common.BaseVolumeTests):
188
98
  + ' --description bbbb '
189
99
  + '--property Alpha=c '
190
100
  + '--property Beta=b '
191
- + name,
101
+ + snap_id,
192
102
  )
193
103
  self.assertOutput('', raw_output)
194
104
 
195
- # Show snapshot set result
196
105
  cmd_output = self.openstack(
197
106
  'volume snapshot show ' + new_name,
198
107
  parse_output=True,
@@ -201,10 +110,6 @@ class VolumeSnapshotTests(common.BaseVolumeTests):
201
110
  new_name,
202
111
  cmd_output["name"],
203
112
  )
204
- self.assertEqual(
205
- 1,
206
- cmd_output["size"],
207
- )
208
113
  self.assertEqual(
209
114
  'bbbb',
210
115
  cmd_output["description"],
@@ -214,7 +119,7 @@ class VolumeSnapshotTests(common.BaseVolumeTests):
214
119
  cmd_output["properties"],
215
120
  )
216
121
 
217
- # Test volume snapshot unset
122
+ # unset volume snapshot
218
123
  raw_output = self.openstack(
219
124
  'volume snapshot unset ' + '--property Alpha ' + new_name,
220
125
  )
@@ -229,16 +134,25 @@ class VolumeSnapshotTests(common.BaseVolumeTests):
229
134
  cmd_output["properties"],
230
135
  )
231
136
 
232
- # Test volume snapshot set --no-property
137
+ # set volume snapshot --no-property, --state error
233
138
  raw_output = self.openstack(
234
- 'volume snapshot set ' + '--no-property ' + new_name,
139
+ 'volume snapshot set '
140
+ + '--no-property '
141
+ + '--state error '
142
+ + new_name,
235
143
  )
236
144
  self.assertOutput('', raw_output)
145
+
237
146
  cmd_output = self.openstack(
238
147
  'volume snapshot show ' + new_name,
239
148
  parse_output=True,
240
149
  )
241
- self.assertNotIn(
242
- {'Beta': 'b'},
243
- cmd_output["properties"],
150
+ self.assertEqual({}, cmd_output["properties"])
151
+
152
+ # list volume snapshot --long --status
153
+ cmd_output = self.openstack(
154
+ 'volume snapshot list ' + '--long ' + '--status error',
155
+ parse_output=True,
244
156
  )
157
+ names = [x["Name"] for x in cmd_output]
158
+ self.assertIn(new_name, names)
@@ -14,9 +14,9 @@
14
14
 
15
15
  from unittest import mock
16
16
 
17
- from osc_lib.command import command
18
17
  from osc_lib import exceptions
19
18
 
19
+ from openstackclient import command
20
20
  from openstackclient.tests.unit import fakes as test_fakes
21
21
  from openstackclient.tests.unit import utils as test_utils
22
22
 
@@ -10,7 +10,6 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
- from unittest import mock
14
13
 
15
14
  from openstackclient.common import extension
16
15
  from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
@@ -295,8 +294,8 @@ class TestExtensionShow(TestExtension):
295
294
 
296
295
  self.cmd = extension.ShowExtension(self.app, None)
297
296
 
298
- self.app.client_manager.network.find_extension = mock.Mock(
299
- return_value=self.extension_details
297
+ self.app.client_manager.network.find_extension.return_value = (
298
+ self.extension_details
300
299
  )
301
300
 
302
301
  def test_show_no_options(self):