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.
- openstackclient/api/object_store_v1.py +4 -1
- openstackclient/command.py +27 -0
- openstackclient/common/availability_zone.py +1 -1
- openstackclient/common/clientmanager.py +59 -21
- openstackclient/common/configuration.py +1 -1
- openstackclient/common/extension.py +1 -1
- openstackclient/common/limits.py +1 -1
- openstackclient/common/module.py +5 -3
- openstackclient/common/project_cleanup.py +10 -8
- openstackclient/common/quota.py +54 -23
- openstackclient/common/versions.py +1 -2
- openstackclient/compute/v2/agent.py +1 -1
- openstackclient/compute/v2/aggregate.py +6 -5
- openstackclient/compute/v2/console.py +5 -3
- openstackclient/compute/v2/console_connection.py +1 -1
- openstackclient/compute/v2/flavor.py +1 -1
- openstackclient/compute/v2/host.py +1 -1
- openstackclient/compute/v2/hypervisor.py +1 -1
- openstackclient/compute/v2/hypervisor_stats.py +1 -1
- openstackclient/compute/v2/keypair.py +1 -1
- openstackclient/compute/v2/server.py +78 -29
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_event.py +1 -1
- openstackclient/compute/v2/server_group.py +4 -2
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +1 -1
- openstackclient/compute/v2/server_volume.py +1 -1
- openstackclient/compute/v2/service.py +1 -1
- openstackclient/compute/v2/usage.py +6 -4
- openstackclient/identity/common.py +33 -1
- openstackclient/identity/v2_0/catalog.py +3 -2
- openstackclient/identity/v2_0/ec2creds.py +1 -1
- openstackclient/identity/v2_0/endpoint.py +1 -1
- openstackclient/identity/v2_0/project.py +17 -7
- openstackclient/identity/v2_0/role.py +1 -1
- openstackclient/identity/v2_0/role_assignment.py +3 -3
- openstackclient/identity/v2_0/service.py +4 -2
- openstackclient/identity/v2_0/token.py +1 -1
- openstackclient/identity/v2_0/user.py +2 -2
- openstackclient/identity/v3/access_rule.py +16 -4
- openstackclient/identity/v3/application_credential.py +30 -10
- openstackclient/identity/v3/catalog.py +3 -3
- openstackclient/identity/v3/consumer.py +1 -1
- openstackclient/identity/v3/credential.py +1 -1
- openstackclient/identity/v3/domain.py +10 -4
- openstackclient/identity/v3/ec2creds.py +1 -1
- openstackclient/identity/v3/endpoint.py +33 -12
- openstackclient/identity/v3/endpoint_group.py +1 -1
- openstackclient/identity/v3/federation_protocol.py +40 -41
- openstackclient/identity/v3/group.py +11 -5
- openstackclient/identity/v3/identity_provider.py +12 -10
- openstackclient/identity/v3/implied_role.py +1 -1
- openstackclient/identity/v3/limit.py +86 -85
- openstackclient/identity/v3/mapping.py +1 -1
- openstackclient/identity/v3/policy.py +1 -1
- openstackclient/identity/v3/project.py +191 -115
- openstackclient/identity/v3/region.py +1 -1
- openstackclient/identity/v3/registered_limit.py +97 -109
- openstackclient/identity/v3/role.py +20 -39
- openstackclient/identity/v3/role_assignment.py +12 -23
- openstackclient/identity/v3/service.py +1 -1
- openstackclient/identity/v3/service_provider.py +1 -1
- openstackclient/identity/v3/tag.py +1 -11
- openstackclient/identity/v3/token.py +3 -2
- openstackclient/identity/v3/trust.py +4 -2
- openstackclient/identity/v3/unscoped_saml.py +1 -1
- openstackclient/identity/v3/user.py +22 -13
- openstackclient/image/v1/image.py +19 -16
- openstackclient/image/v2/cache.py +1 -1
- openstackclient/image/v2/image.py +16 -12
- openstackclient/image/v2/info.py +1 -1
- openstackclient/image/v2/metadef_namespaces.py +1 -1
- openstackclient/image/v2/metadef_objects.py +1 -1
- openstackclient/image/v2/metadef_properties.py +3 -2
- openstackclient/image/v2/metadef_resource_type_association.py +1 -1
- openstackclient/image/v2/metadef_resource_types.py +1 -1
- openstackclient/image/v2/task.py +1 -1
- openstackclient/network/common.py +10 -9
- openstackclient/network/v2/address_group.py +4 -3
- openstackclient/network/v2/address_scope.py +8 -6
- openstackclient/network/v2/default_security_group_rule.py +9 -8
- openstackclient/network/v2/floating_ip.py +16 -9
- openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
- openstackclient/network/v2/ip_availability.py +7 -4
- openstackclient/network/v2/l3_conntrack_helper.py +11 -4
- openstackclient/network/v2/local_ip.py +13 -7
- openstackclient/network/v2/local_ip_association.py +7 -4
- openstackclient/network/v2/ndp_proxy.py +13 -6
- openstackclient/network/v2/network.py +33 -16
- openstackclient/network/v2/network_agent.py +5 -5
- openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
- openstackclient/network/v2/network_flavor.py +1 -1
- openstackclient/network/v2/network_flavor_profile.py +1 -1
- openstackclient/network/v2/network_meter.py +1 -1
- openstackclient/network/v2/network_meter_rule.py +1 -1
- openstackclient/network/v2/network_qos_policy.py +7 -5
- openstackclient/network/v2/network_qos_rule.py +1 -1
- openstackclient/network/v2/network_qos_rule_type.py +1 -1
- openstackclient/network/v2/network_rbac.py +8 -5
- openstackclient/network/v2/network_segment.py +2 -2
- openstackclient/network/v2/network_segment_range.py +13 -6
- openstackclient/network/v2/network_service_provider.py +1 -1
- openstackclient/network/v2/network_trunk.py +65 -42
- openstackclient/network/v2/port.py +22 -20
- openstackclient/network/v2/router.py +19 -8
- openstackclient/network/v2/security_group.py +10 -6
- openstackclient/network/v2/security_group_rule.py +11 -5
- openstackclient/network/v2/subnet.py +17 -18
- openstackclient/network/v2/subnet_pool.py +11 -9
- openstackclient/network/v2/taas/__init__.py +0 -0
- openstackclient/network/v2/taas/tap_flow.py +245 -0
- openstackclient/network/v2/taas/tap_mirror.py +237 -0
- openstackclient/network/v2/taas/tap_service.py +211 -0
- openstackclient/object/v1/account.py +1 -1
- openstackclient/object/v1/container.py +1 -1
- openstackclient/object/v1/object.py +1 -1
- openstackclient/shell.py +18 -8
- openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
- openstackclient/tests/functional/identity/v3/test_limit.py +47 -0
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
- openstackclient/tests/functional/image/v2/test_cache.py +54 -0
- openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
- openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
- openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +46 -132
- openstackclient/tests/unit/common/test_command.py +1 -1
- openstackclient/tests/unit/common/test_extension.py +2 -3
- openstackclient/tests/unit/common/test_module.py +14 -7
- openstackclient/tests/unit/common/test_quota.py +79 -0
- openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
- openstackclient/tests/unit/compute/v2/test_console.py +1 -4
- openstackclient/tests/unit/compute/v2/test_flavor.py +1 -3
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
- openstackclient/tests/unit/compute/v2/test_server.py +370 -38
- openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
- openstackclient/tests/unit/compute/v2/test_service.py +1 -3
- openstackclient/tests/unit/fakes.py +35 -134
- openstackclient/tests/unit/identity/test_common.py +100 -0
- openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
- openstackclient/tests/unit/identity/v3/fakes.py +10 -2
- openstackclient/tests/unit/identity/v3/test_application_credential.py +3 -3
- openstackclient/tests/unit/identity/v3/test_domain.py +1 -1
- openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
- openstackclient/tests/unit/identity/v3/test_group.py +4 -2
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
- openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
- openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
- openstackclient/tests/unit/identity/v3/test_project.py +832 -513
- openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +356 -221
- openstackclient/tests/unit/identity/v3/test_role.py +1 -82
- openstackclient/tests/unit/identity/v3/test_user.py +7 -51
- openstackclient/tests/unit/image/v2/test_image.py +116 -5
- openstackclient/tests/unit/network/test_common.py +9 -13
- openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
- openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
- openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
- openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
- openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
- openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
- openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +11 -21
- openstackclient/tests/unit/network/v2/test_network.py +41 -37
- openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
- openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
- openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
- openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
- openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
- openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
- openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
- openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
- openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
- openstackclient/tests/unit/network/v2/test_port.py +75 -86
- openstackclient/tests/unit/network/v2/test_router.py +104 -126
- openstackclient/tests/unit/network/v2/test_security_group_network.py +19 -26
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +17 -18
- openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
- openstackclient/tests/unit/volume/test_find_resource.py +4 -13
- openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
- openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume.py +38 -12
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
- openstackclient/volume/client.py +7 -17
- openstackclient/volume/v2/backup_record.py +1 -1
- openstackclient/volume/v2/consistency_group.py +9 -9
- openstackclient/volume/v2/consistency_group_snapshot.py +3 -3
- openstackclient/volume/v2/qos_specs.py +3 -3
- openstackclient/volume/v2/service.py +1 -1
- openstackclient/volume/v2/volume.py +14 -7
- openstackclient/volume/v2/volume_backend.py +1 -1
- openstackclient/volume/v2/volume_backup.py +7 -5
- openstackclient/volume/v2/volume_host.py +1 -2
- openstackclient/volume/v2/volume_snapshot.py +4 -4
- openstackclient/volume/v2/volume_transfer_request.py +3 -3
- openstackclient/volume/v2/volume_type.py +16 -11
- openstackclient/volume/v3/block_storage_cleanup.py +1 -1
- openstackclient/volume/v3/block_storage_cluster.py +1 -1
- openstackclient/volume/v3/block_storage_log_level.py +1 -1
- openstackclient/volume/v3/block_storage_manage.py +1 -1
- openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
- openstackclient/volume/v3/service.py +1 -1
- openstackclient/volume/v3/volume.py +16 -9
- openstackclient/volume/v3/volume_attachment.py +6 -5
- openstackclient/volume/v3/volume_backup.py +20 -5
- openstackclient/volume/v3/volume_group.py +1 -1
- openstackclient/volume/v3/volume_group_snapshot.py +1 -1
- openstackclient/volume/v3/volume_group_type.py +1 -1
- openstackclient/volume/v3/volume_message.py +1 -1
- openstackclient/volume/v3/volume_snapshot.py +4 -4
- openstackclient/volume/v3/volume_transfer_request.py +3 -3
- openstackclient/volume/v3/volume_type.py +20 -14
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/METADATA +15 -13
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/RECORD +231 -219
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/entry_points.txt +15 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/AUTHORS +15 -0
- python_openstackclient-9.0.0.dist-info/pbr.json +1 -0
- openstackclient/tests/unit/common/test_logs.py +0 -221
- python_openstackclient-8.2.0.dist-info/pbr.json +0 -1
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/LICENSE +0 -0
- {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
|
|
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
|
|
44
|
-
|
|
45
|
-
|
|
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 '
|
|
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
|
-
|
|
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
|
-
|
|
69
|
-
|
|
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.
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
#
|
|
76
|
+
# list volume snapshot --name
|
|
124
77
|
cmd_output = self.openstack(
|
|
125
|
-
'volume snapshot list
|
|
78
|
+
'volume snapshot list --name ' + name,
|
|
126
79
|
parse_output=True,
|
|
127
80
|
)
|
|
128
|
-
names = [x[
|
|
129
|
-
self.
|
|
130
|
-
self.assertIn(name2, names)
|
|
81
|
+
names = [x['Name'] for x in cmd_output]
|
|
82
|
+
self.assertIn(name, names)
|
|
131
83
|
|
|
132
|
-
#
|
|
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(
|
|
139
|
-
self.assertIn(name2, names)
|
|
90
|
+
self.assertIn(name, names)
|
|
140
91
|
|
|
141
|
-
#
|
|
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
|
-
+
|
|
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
|
-
#
|
|
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
|
-
#
|
|
137
|
+
# set volume snapshot --no-property, --state error
|
|
233
138
|
raw_output = self.openstack(
|
|
234
|
-
'volume snapshot set '
|
|
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.
|
|
242
|
-
|
|
243
|
-
|
|
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 =
|
|
299
|
-
|
|
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):
|