python-openstackclient 8.2.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.
- 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 +4 -2
- openstackclient/common/project_cleanup.py +10 -8
- openstackclient/common/quota.py +23 -6
- 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 +76 -27
- 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 +2 -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 +1 -1
- 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 +1 -1
- 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 +1 -1
- openstackclient/identity/v3/mapping.py +1 -1
- openstackclient/identity/v3/policy.py +1 -1
- openstackclient/identity/v3/project.py +10 -3
- openstackclient/identity/v3/region.py +1 -1
- openstackclient/identity/v3/registered_limit.py +16 -11
- 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 +3 -2
- 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 +14 -11
- 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_role_assignment.py +174 -0
- openstackclient/tests/functional/image/v2/test_cache.py +54 -0
- openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
- 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 +20 -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 +364 -30
- 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_oauth.py +1 -1
- openstackclient/tests/unit/identity/v3/test_project.py +1 -1
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
- 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 +111 -0
- 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_volume_backup.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume.py +4 -0
- 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 +1 -1
- openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
- openstackclient/volume/v2/qos_specs.py +1 -1
- openstackclient/volume/v2/service.py +1 -1
- openstackclient/volume/v2/volume.py +2 -2
- openstackclient/volume/v2/volume_backend.py +1 -1
- openstackclient/volume/v2/volume_backup.py +5 -3
- openstackclient/volume/v2/volume_host.py +1 -2
- openstackclient/volume/v2/volume_snapshot.py +2 -2
- openstackclient/volume/v2/volume_transfer_request.py +1 -1
- openstackclient/volume/v2/volume_type.py +11 -6
- 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 +2 -2
- openstackclient/volume/v3/volume_attachment.py +6 -5
- openstackclient/volume/v3/volume_backup.py +18 -3
- 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 +2 -2
- openstackclient/volume/v3/volume_transfer_request.py +1 -1
- openstackclient/volume/v3/volume_type.py +15 -9
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +15 -13
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +224 -213
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +10 -0
- python_openstackclient-8.3.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-8.3.0.dist-info/licenses}/LICENSE +0 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
# under the License.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
-
from unittest import mock
|
|
15
14
|
from unittest.mock import call
|
|
16
15
|
|
|
17
16
|
from osc_lib.cli import format_columns
|
|
@@ -266,19 +265,14 @@ class TestCreateSubnet(TestSubnet):
|
|
|
266
265
|
self.domains_mock.get.return_value = self.domain
|
|
267
266
|
|
|
268
267
|
# Mock SDK calls for all tests.
|
|
269
|
-
self.network_client.create_subnet =
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
self.network_client.
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
self.network_client.
|
|
277
|
-
return_value=self._network_segment
|
|
278
|
-
)
|
|
279
|
-
self.network_client.find_subnet_pool = mock.Mock(
|
|
280
|
-
return_value=self._subnet_pool
|
|
281
|
-
)
|
|
268
|
+
self.network_client.create_subnet.return_value = self._subnet
|
|
269
|
+
|
|
270
|
+
self.network_client.set_tags.return_value = None
|
|
271
|
+
self.network_client.find_network.return_value = self._network
|
|
272
|
+
|
|
273
|
+
self.network_client.find_segment.return_value = self._network_segment
|
|
274
|
+
|
|
275
|
+
self.network_client.find_subnet_pool.return_value = self._subnet_pool
|
|
282
276
|
|
|
283
277
|
def test_create_no_options(self):
|
|
284
278
|
arglist = []
|
|
@@ -333,7 +327,7 @@ class TestCreateSubnet(TestSubnet):
|
|
|
333
327
|
def test_create_from_subnet_pool_options(self):
|
|
334
328
|
# Mock SDK calls for this test.
|
|
335
329
|
self.network_client.create_subnet.return_value = self._subnet_from_pool
|
|
336
|
-
self.network_client.set_tags =
|
|
330
|
+
self.network_client.set_tags.return_value = None
|
|
337
331
|
self._network.id = self._subnet_from_pool.network_id
|
|
338
332
|
|
|
339
333
|
arglist = [
|
|
@@ -721,7 +715,7 @@ class TestDeleteSubnet(TestSubnet):
|
|
|
721
715
|
def setUp(self):
|
|
722
716
|
super().setUp()
|
|
723
717
|
|
|
724
|
-
self.network_client.delete_subnet =
|
|
718
|
+
self.network_client.delete_subnet.return_value = None
|
|
725
719
|
|
|
726
720
|
self.network_client.find_subnet = network_fakes.FakeSubnet.get_subnets(
|
|
727
721
|
self._subnets
|
|
@@ -775,9 +769,7 @@ class TestDeleteSubnet(TestSubnet):
|
|
|
775
769
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
776
770
|
|
|
777
771
|
find_mock_result = [self._subnets[0], exceptions.CommandError]
|
|
778
|
-
self.network_client.find_subnet =
|
|
779
|
-
side_effect=find_mock_result
|
|
780
|
-
)
|
|
772
|
+
self.network_client.find_subnet.side_effect = find_mock_result
|
|
781
773
|
|
|
782
774
|
try:
|
|
783
775
|
self.cmd.take_action(parsed_args)
|
|
@@ -855,7 +847,7 @@ class TestListSubnet(TestSubnet):
|
|
|
855
847
|
# Get the command object to test
|
|
856
848
|
self.cmd = subnet_v2.ListSubnet(self.app, None)
|
|
857
849
|
|
|
858
|
-
self.network_client.subnets =
|
|
850
|
+
self.network_client.subnets.return_value = self._subnet
|
|
859
851
|
|
|
860
852
|
def test_subnet_list_no_options(self):
|
|
861
853
|
arglist = []
|
|
@@ -1019,7 +1011,7 @@ class TestListSubnet(TestSubnet):
|
|
|
1019
1011
|
|
|
1020
1012
|
def test_subnet_list_network(self):
|
|
1021
1013
|
network = network_fakes.create_one_network()
|
|
1022
|
-
self.network_client.find_network =
|
|
1014
|
+
self.network_client.find_network.return_value = network
|
|
1023
1015
|
arglist = [
|
|
1024
1016
|
'--network',
|
|
1025
1017
|
network.id,
|
|
@@ -1038,7 +1030,7 @@ class TestListSubnet(TestSubnet):
|
|
|
1038
1030
|
|
|
1039
1031
|
def test_subnet_list_gateway(self):
|
|
1040
1032
|
subnet = network_fakes.FakeSubnet.create_one_subnet()
|
|
1041
|
-
self.network_client.find_network =
|
|
1033
|
+
self.network_client.find_network.return_value = subnet
|
|
1042
1034
|
arglist = [
|
|
1043
1035
|
'--gateway',
|
|
1044
1036
|
subnet.gateway_ip,
|
|
@@ -1057,7 +1049,7 @@ class TestListSubnet(TestSubnet):
|
|
|
1057
1049
|
|
|
1058
1050
|
def test_subnet_list_name(self):
|
|
1059
1051
|
subnet = network_fakes.FakeSubnet.create_one_subnet()
|
|
1060
|
-
self.network_client.find_network =
|
|
1052
|
+
self.network_client.find_network.return_value = subnet
|
|
1061
1053
|
arglist = [
|
|
1062
1054
|
'--name',
|
|
1063
1055
|
subnet.name,
|
|
@@ -1076,7 +1068,7 @@ class TestListSubnet(TestSubnet):
|
|
|
1076
1068
|
|
|
1077
1069
|
def test_subnet_list_subnet_range(self):
|
|
1078
1070
|
subnet = network_fakes.FakeSubnet.create_one_subnet()
|
|
1079
|
-
self.network_client.find_network =
|
|
1071
|
+
self.network_client.find_network.return_value = subnet
|
|
1080
1072
|
arglist = [
|
|
1081
1073
|
'--subnet-range',
|
|
1082
1074
|
subnet.cidr,
|
|
@@ -1098,10 +1090,9 @@ class TestListSubnet(TestSubnet):
|
|
|
1098
1090
|
subnet = network_fakes.FakeSubnet.create_one_subnet(
|
|
1099
1091
|
{'subnetpool_id': subnet_pool.id}
|
|
1100
1092
|
)
|
|
1101
|
-
self.network_client.find_network =
|
|
1102
|
-
self.network_client.find_subnet_pool =
|
|
1103
|
-
|
|
1104
|
-
)
|
|
1093
|
+
self.network_client.find_network.return_value = subnet
|
|
1094
|
+
self.network_client.find_subnet_pool.return_value = subnet_pool
|
|
1095
|
+
|
|
1105
1096
|
arglist = [
|
|
1106
1097
|
'--subnet-pool',
|
|
1107
1098
|
subnet_pool.name,
|
|
@@ -1123,10 +1114,9 @@ class TestListSubnet(TestSubnet):
|
|
|
1123
1114
|
subnet = network_fakes.FakeSubnet.create_one_subnet(
|
|
1124
1115
|
{'subnetpool_id': subnet_pool.id}
|
|
1125
1116
|
)
|
|
1126
|
-
self.network_client.find_network =
|
|
1127
|
-
self.network_client.find_subnet_pool =
|
|
1128
|
-
|
|
1129
|
-
)
|
|
1117
|
+
self.network_client.find_network.return_value = subnet
|
|
1118
|
+
self.network_client.find_subnet_pool.return_value = subnet_pool
|
|
1119
|
+
|
|
1130
1120
|
arglist = [
|
|
1131
1121
|
'--subnet-pool',
|
|
1132
1122
|
subnet_pool.id,
|
|
@@ -1182,9 +1172,9 @@ class TestSetSubnet(TestSubnet):
|
|
|
1182
1172
|
|
|
1183
1173
|
def setUp(self):
|
|
1184
1174
|
super().setUp()
|
|
1185
|
-
self.network_client.update_subnet =
|
|
1186
|
-
self.network_client.set_tags =
|
|
1187
|
-
self.network_client.find_subnet =
|
|
1175
|
+
self.network_client.update_subnet.return_value = None
|
|
1176
|
+
self.network_client.set_tags.return_value = None
|
|
1177
|
+
self.network_client.find_subnet.return_value = self._subnet
|
|
1188
1178
|
self.cmd = subnet_v2.SetSubnet(self.app, None)
|
|
1189
1179
|
|
|
1190
1180
|
def test_set_this(self):
|
|
@@ -1263,7 +1253,7 @@ class TestSetSubnet(TestSubnet):
|
|
|
1263
1253
|
'service_types': ["network:router_gateway"],
|
|
1264
1254
|
}
|
|
1265
1255
|
)
|
|
1266
|
-
self.network_client.find_subnet =
|
|
1256
|
+
self.network_client.find_subnet.return_value = _testsubnet
|
|
1267
1257
|
arglist = [
|
|
1268
1258
|
'--dns-nameserver',
|
|
1269
1259
|
'10.0.0.2',
|
|
@@ -1329,7 +1319,7 @@ class TestSetSubnet(TestSubnet):
|
|
|
1329
1319
|
'dns_nameservers': ["10.0.0.1"],
|
|
1330
1320
|
}
|
|
1331
1321
|
)
|
|
1332
|
-
self.network_client.find_subnet =
|
|
1322
|
+
self.network_client.find_subnet.return_value = _testsubnet
|
|
1333
1323
|
arglist = [
|
|
1334
1324
|
'--host-route',
|
|
1335
1325
|
'destination=10.30.30.30/24,gateway=10.30.30.1',
|
|
@@ -1379,7 +1369,7 @@ class TestSetSubnet(TestSubnet):
|
|
|
1379
1369
|
'dns_nameservers': ['10.0.0.1'],
|
|
1380
1370
|
}
|
|
1381
1371
|
)
|
|
1382
|
-
self.network_client.find_subnet =
|
|
1372
|
+
self.network_client.find_subnet.return_value = _testsubnet
|
|
1383
1373
|
arglist = [
|
|
1384
1374
|
'--no-host-route',
|
|
1385
1375
|
'--no-allocation-pool',
|
|
@@ -1448,8 +1438,8 @@ class TestSetSubnet(TestSubnet):
|
|
|
1448
1438
|
'segment_id': None,
|
|
1449
1439
|
}
|
|
1450
1440
|
)
|
|
1451
|
-
self.network_client.find_subnet =
|
|
1452
|
-
self.network_client.find_segment =
|
|
1441
|
+
self.network_client.find_subnet.return_value = _subnet
|
|
1442
|
+
self.network_client.find_segment.return_value = _segment
|
|
1453
1443
|
arglist = ['--network-segment', _segment.id, _subnet.name]
|
|
1454
1444
|
verifylist = [('network_segment', _segment.id)]
|
|
1455
1445
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -1514,7 +1504,7 @@ class TestShowSubnet(TestSubnet):
|
|
|
1514
1504
|
# Get the command object to test
|
|
1515
1505
|
self.cmd = subnet_v2.ShowSubnet(self.app, None)
|
|
1516
1506
|
|
|
1517
|
-
self.network_client.find_subnet =
|
|
1507
|
+
self.network_client.find_subnet.return_value = self._subnet
|
|
1518
1508
|
|
|
1519
1509
|
def test_show_no_options(self):
|
|
1520
1510
|
arglist = []
|
|
@@ -1572,11 +1562,10 @@ class TestUnsetSubnet(TestSubnet):
|
|
|
1572
1562
|
'tags': ['green', 'red'],
|
|
1573
1563
|
}
|
|
1574
1564
|
)
|
|
1575
|
-
self.network_client.find_subnet =
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
self.network_client.
|
|
1579
|
-
self.network_client.set_tags = mock.Mock(return_value=None)
|
|
1565
|
+
self.network_client.find_subnet.return_value = self._testsubnet
|
|
1566
|
+
|
|
1567
|
+
self.network_client.update_subnet.return_value = None
|
|
1568
|
+
self.network_client.set_tags.return_value = None
|
|
1580
1569
|
# Get the command object to test
|
|
1581
1570
|
self.cmd = subnet_v2.UnsetSubnet(self.app, None)
|
|
1582
1571
|
|
|
@@ -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
|
from unittest.mock import call
|
|
15
14
|
|
|
16
15
|
from osc_lib.cli import format_columns
|
|
@@ -76,16 +75,15 @@ class TestCreateSubnetPool(TestSubnetPool):
|
|
|
76
75
|
def setUp(self):
|
|
77
76
|
super().setUp()
|
|
78
77
|
|
|
79
|
-
self.network_client.create_subnet_pool =
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
self.network_client.set_tags = mock.Mock(return_value=None)
|
|
78
|
+
self.network_client.create_subnet_pool.return_value = self._subnet_pool
|
|
79
|
+
|
|
80
|
+
self.network_client.set_tags.return_value = None
|
|
83
81
|
|
|
84
82
|
# Get the command object to test
|
|
85
83
|
self.cmd = subnet_pool.CreateSubnetPool(self.app, None)
|
|
86
84
|
|
|
87
|
-
self.network_client.find_address_scope =
|
|
88
|
-
|
|
85
|
+
self.network_client.find_address_scope.return_value = (
|
|
86
|
+
self._address_scope
|
|
89
87
|
)
|
|
90
88
|
|
|
91
89
|
self.projects_mock.get.return_value = self.project
|
|
@@ -387,7 +385,7 @@ class TestDeleteSubnetPool(TestSubnetPool):
|
|
|
387
385
|
def setUp(self):
|
|
388
386
|
super().setUp()
|
|
389
387
|
|
|
390
|
-
self.network_client.delete_subnet_pool =
|
|
388
|
+
self.network_client.delete_subnet_pool.return_value = None
|
|
391
389
|
|
|
392
390
|
self.network_client.find_subnet_pool = (
|
|
393
391
|
network_fakes.FakeSubnetPool.get_subnet_pools(self._subnet_pools)
|
|
@@ -445,9 +443,7 @@ class TestDeleteSubnetPool(TestSubnetPool):
|
|
|
445
443
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
446
444
|
|
|
447
445
|
find_mock_result = [self._subnet_pools[0], exceptions.CommandError]
|
|
448
|
-
self.network_client.find_subnet_pool =
|
|
449
|
-
side_effect=find_mock_result
|
|
450
|
-
)
|
|
446
|
+
self.network_client.find_subnet_pool.side_effect = find_mock_result
|
|
451
447
|
|
|
452
448
|
try:
|
|
453
449
|
self.cmd.take_action(parsed_args)
|
|
@@ -514,9 +510,7 @@ class TestListSubnetPool(TestSubnetPool):
|
|
|
514
510
|
# Get the command object to test
|
|
515
511
|
self.cmd = subnet_pool.ListSubnetPool(self.app, None)
|
|
516
512
|
|
|
517
|
-
self.network_client.subnet_pools =
|
|
518
|
-
return_value=self._subnet_pools
|
|
519
|
-
)
|
|
513
|
+
self.network_client.subnet_pools.return_value = self._subnet_pools
|
|
520
514
|
|
|
521
515
|
def test_subnet_pool_list_no_option(self):
|
|
522
516
|
arglist = []
|
|
@@ -653,7 +647,7 @@ class TestListSubnetPool(TestSubnetPool):
|
|
|
653
647
|
|
|
654
648
|
def test_subnet_pool_list_name(self):
|
|
655
649
|
subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool()
|
|
656
|
-
self.network_client.find_network =
|
|
650
|
+
self.network_client.find_network.return_value = subnet_pool
|
|
657
651
|
arglist = [
|
|
658
652
|
'--name',
|
|
659
653
|
subnet_pool.name,
|
|
@@ -672,9 +666,8 @@ class TestListSubnetPool(TestSubnetPool):
|
|
|
672
666
|
|
|
673
667
|
def test_subnet_pool_list_address_scope(self):
|
|
674
668
|
addr_scope = network_fakes.create_one_address_scope()
|
|
675
|
-
self.network_client.find_address_scope =
|
|
676
|
-
|
|
677
|
-
)
|
|
669
|
+
self.network_client.find_address_scope.return_value = addr_scope
|
|
670
|
+
|
|
678
671
|
arglist = [
|
|
679
672
|
'--address-scope',
|
|
680
673
|
addr_scope.id,
|
|
@@ -734,15 +727,13 @@ class TestSetSubnetPool(TestSubnetPool):
|
|
|
734
727
|
def setUp(self):
|
|
735
728
|
super().setUp()
|
|
736
729
|
|
|
737
|
-
self.network_client.update_subnet_pool =
|
|
738
|
-
self.network_client.set_tags =
|
|
730
|
+
self.network_client.update_subnet_pool.return_value = None
|
|
731
|
+
self.network_client.set_tags.return_value = None
|
|
739
732
|
|
|
740
|
-
self.network_client.find_subnet_pool =
|
|
741
|
-
return_value=self._subnet_pool
|
|
742
|
-
)
|
|
733
|
+
self.network_client.find_subnet_pool.return_value = self._subnet_pool
|
|
743
734
|
|
|
744
|
-
self.network_client.find_address_scope =
|
|
745
|
-
|
|
735
|
+
self.network_client.find_address_scope.return_value = (
|
|
736
|
+
self._address_scope
|
|
746
737
|
)
|
|
747
738
|
|
|
748
739
|
# Get the command object to test
|
|
@@ -1079,9 +1070,7 @@ class TestShowSubnetPool(TestSubnetPool):
|
|
|
1079
1070
|
def setUp(self):
|
|
1080
1071
|
super().setUp()
|
|
1081
1072
|
|
|
1082
|
-
self.network_client.find_subnet_pool =
|
|
1083
|
-
return_value=self._subnet_pool
|
|
1084
|
-
)
|
|
1073
|
+
self.network_client.find_subnet_pool.return_value = self._subnet_pool
|
|
1085
1074
|
|
|
1086
1075
|
# Get the command object to test
|
|
1087
1076
|
self.cmd = subnet_pool.ShowSubnetPool(self.app, None)
|
|
@@ -1122,11 +1111,10 @@ class TestUnsetSubnetPool(TestSubnetPool):
|
|
|
1122
1111
|
self._subnetpool = network_fakes.FakeSubnetPool.create_one_subnet_pool(
|
|
1123
1112
|
{'tags': ['green', 'red']}
|
|
1124
1113
|
)
|
|
1125
|
-
self.network_client.find_subnet_pool =
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
self.network_client.
|
|
1129
|
-
self.network_client.set_tags = mock.Mock(return_value=None)
|
|
1114
|
+
self.network_client.find_subnet_pool.return_value = self._subnetpool
|
|
1115
|
+
|
|
1116
|
+
self.network_client.update_subnet_pool.return_value = None
|
|
1117
|
+
self.network_client.set_tags.return_value = None
|
|
1130
1118
|
# Get the command object to test
|
|
1131
1119
|
self.cmd = subnet_pool.UnsetSubnetPool(self.app, None)
|
|
1132
1120
|
|
|
@@ -21,15 +21,6 @@ from osc_lib import exceptions
|
|
|
21
21
|
from osc_lib import utils
|
|
22
22
|
|
|
23
23
|
from openstackclient.tests.unit import utils as test_utils
|
|
24
|
-
from openstackclient.volume import client # noqa
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# Monkey patch for v1 cinderclient
|
|
28
|
-
# NOTE(dtroyer): Do here because openstackclient.volume.client
|
|
29
|
-
# doesn't do it until the client object is created now.
|
|
30
|
-
volumes.Volume.NAME_ATTR = 'display_name'
|
|
31
|
-
volume_snapshots.Snapshot.NAME_ATTR = 'display_name'
|
|
32
|
-
|
|
33
24
|
|
|
34
25
|
ID = '1after909'
|
|
35
26
|
NAME = 'PhilSpector'
|
|
@@ -42,14 +33,14 @@ class TestFindResourceVolumes(test_utils.TestCase):
|
|
|
42
33
|
api.client = mock.Mock()
|
|
43
34
|
api.client.get = mock.Mock()
|
|
44
35
|
resp = mock.Mock()
|
|
45
|
-
body = {"volumes": [{"id": ID, '
|
|
36
|
+
body = {"volumes": [{"id": ID, 'name': NAME}]}
|
|
46
37
|
api.client.get.side_effect = [Exception("Not found"), (resp, body)]
|
|
47
38
|
self.manager = volumes.VolumeManager(api)
|
|
48
39
|
|
|
49
40
|
def test_find(self):
|
|
50
41
|
result = utils.find_resource(self.manager, NAME)
|
|
51
42
|
self.assertEqual(ID, result.id)
|
|
52
|
-
self.assertEqual(NAME, result.
|
|
43
|
+
self.assertEqual(NAME, result.name)
|
|
53
44
|
|
|
54
45
|
def test_not_find(self):
|
|
55
46
|
self.assertRaises(
|
|
@@ -67,14 +58,14 @@ class TestFindResourceVolumeSnapshots(test_utils.TestCase):
|
|
|
67
58
|
api.client = mock.Mock()
|
|
68
59
|
api.client.get = mock.Mock()
|
|
69
60
|
resp = mock.Mock()
|
|
70
|
-
body = {"snapshots": [{"id": ID, '
|
|
61
|
+
body = {"snapshots": [{"id": ID, 'name': NAME}]}
|
|
71
62
|
api.client.get.side_effect = [Exception("Not found"), (resp, body)]
|
|
72
63
|
self.manager = volume_snapshots.SnapshotManager(api)
|
|
73
64
|
|
|
74
65
|
def test_find(self):
|
|
75
66
|
result = utils.find_resource(self.manager, NAME)
|
|
76
67
|
self.assertEqual(ID, result.id)
|
|
77
|
-
self.assertEqual(NAME, result.
|
|
68
|
+
self.assertEqual(NAME, result.name)
|
|
78
69
|
|
|
79
70
|
def test_not_find(self):
|
|
80
71
|
self.assertRaises(
|
|
@@ -565,7 +565,9 @@ class TestBackupShow(volume_fakes.TestVolume):
|
|
|
565
565
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
566
566
|
|
|
567
567
|
columns, data = self.cmd.take_action(parsed_args)
|
|
568
|
-
self.volume_sdk_client.find_backup.assert_called_with(
|
|
568
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
569
|
+
self.backup.id, ignore_missing=False
|
|
570
|
+
)
|
|
569
571
|
|
|
570
572
|
self.assertEqual(self.columns, columns)
|
|
571
573
|
self.assertEqual(self.data, data)
|
|
@@ -37,6 +37,7 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
37
37
|
columns = (
|
|
38
38
|
'attachments',
|
|
39
39
|
'availability_zone',
|
|
40
|
+
'backup_id',
|
|
40
41
|
'bootable',
|
|
41
42
|
'cluster_name',
|
|
42
43
|
'consistencygroup_id',
|
|
@@ -78,6 +79,7 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
78
79
|
self.datalist = (
|
|
79
80
|
self.volume.attachments,
|
|
80
81
|
self.volume.availability_zone,
|
|
82
|
+
self.volume.backup_id,
|
|
81
83
|
self.volume.is_bootable,
|
|
82
84
|
self.volume.cluster_name,
|
|
83
85
|
self.volume.consistency_group_id,
|
|
@@ -2011,6 +2013,7 @@ class TestVolumeShow(volume_fakes.TestVolume):
|
|
|
2011
2013
|
self.columns = (
|
|
2012
2014
|
'attachments',
|
|
2013
2015
|
'availability_zone',
|
|
2016
|
+
'backup_id',
|
|
2014
2017
|
'bootable',
|
|
2015
2018
|
'cluster_name',
|
|
2016
2019
|
'consistencygroup_id',
|
|
@@ -2045,6 +2048,7 @@ class TestVolumeShow(volume_fakes.TestVolume):
|
|
|
2045
2048
|
self.data = (
|
|
2046
2049
|
self.volume.attachments,
|
|
2047
2050
|
self.volume.availability_zone,
|
|
2051
|
+
self.volume.backup_id,
|
|
2048
2052
|
self.volume.is_bootable,
|
|
2049
2053
|
self.volume.cluster_name,
|
|
2050
2054
|
self.volume.consistency_group_id,
|
|
@@ -17,6 +17,7 @@ from openstack.block_storage.v3 import backup as _backup
|
|
|
17
17
|
from openstack.block_storage.v3 import snapshot as _snapshot
|
|
18
18
|
from openstack.block_storage.v3 import volume as _volume
|
|
19
19
|
from openstack import exceptions as sdk_exceptions
|
|
20
|
+
from openstack.identity.v3 import project as _project
|
|
20
21
|
from openstack.test import fakes as sdk_fakes
|
|
21
22
|
from osc_lib import exceptions
|
|
22
23
|
|
|
@@ -381,6 +382,7 @@ class TestBackupList(volume_fakes.TestVolume):
|
|
|
381
382
|
("marker", None),
|
|
382
383
|
("limit", None),
|
|
383
384
|
('all_projects', False),
|
|
385
|
+
("project", None),
|
|
384
386
|
]
|
|
385
387
|
|
|
386
388
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -395,11 +397,14 @@ class TestBackupList(volume_fakes.TestVolume):
|
|
|
395
397
|
all_tenants=False,
|
|
396
398
|
marker=None,
|
|
397
399
|
limit=None,
|
|
400
|
+
project_id=None,
|
|
398
401
|
)
|
|
399
402
|
self.assertEqual(self.columns, columns)
|
|
400
403
|
self.assertCountEqual(self.data, list(data))
|
|
401
404
|
|
|
402
405
|
def test_backup_list_with_options(self):
|
|
406
|
+
project = sdk_fakes.generate_fake_resource(_project.Project)
|
|
407
|
+
self.identity_sdk_client.find_project.return_value = project
|
|
403
408
|
arglist = [
|
|
404
409
|
"--long",
|
|
405
410
|
"--name",
|
|
@@ -413,6 +418,8 @@ class TestBackupList(volume_fakes.TestVolume):
|
|
|
413
418
|
"--all-projects",
|
|
414
419
|
"--limit",
|
|
415
420
|
"3",
|
|
421
|
+
"--project",
|
|
422
|
+
project.id,
|
|
416
423
|
]
|
|
417
424
|
verifylist = [
|
|
418
425
|
("long", True),
|
|
@@ -422,6 +429,7 @@ class TestBackupList(volume_fakes.TestVolume):
|
|
|
422
429
|
("marker", self.backups[0].id),
|
|
423
430
|
('all_projects', True),
|
|
424
431
|
("limit", 3),
|
|
432
|
+
("project", project.id),
|
|
425
433
|
]
|
|
426
434
|
|
|
427
435
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -440,6 +448,7 @@ class TestBackupList(volume_fakes.TestVolume):
|
|
|
440
448
|
all_tenants=True,
|
|
441
449
|
marker=self.backups[0].id,
|
|
442
450
|
limit=3,
|
|
451
|
+
project_id=project.id,
|
|
443
452
|
)
|
|
444
453
|
self.assertEqual(self.columns_long, columns)
|
|
445
454
|
self.assertCountEqual(self.data_long, list(data))
|
openstackclient/volume/client.py
CHANGED
|
@@ -20,16 +20,14 @@ from osc_lib import utils
|
|
|
20
20
|
|
|
21
21
|
from openstackclient.i18n import _
|
|
22
22
|
|
|
23
|
-
|
|
24
23
|
LOG = logging.getLogger(__name__)
|
|
25
24
|
|
|
26
25
|
DEFAULT_API_VERSION = '3'
|
|
27
26
|
API_VERSION_OPTION = 'os_volume_api_version'
|
|
28
|
-
API_NAME =
|
|
27
|
+
API_NAME = 'volume'
|
|
29
28
|
API_VERSIONS = {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"3": "cinderclient.v3.client.Client",
|
|
29
|
+
'2': 'cinderclient.v2.client.Client',
|
|
30
|
+
'3': 'cinderclient.v3.client.Client',
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
# Save the microversion if in use
|
|
@@ -45,11 +43,6 @@ def make_client(instance):
|
|
|
45
43
|
from cinderclient.v3 import volume_snapshots
|
|
46
44
|
from cinderclient.v3 import volumes
|
|
47
45
|
|
|
48
|
-
# Check whether the available cinderclient supports v1 or v2
|
|
49
|
-
try:
|
|
50
|
-
from cinderclient.v1 import services # noqa
|
|
51
|
-
except Exception:
|
|
52
|
-
del API_VERSIONS['1']
|
|
53
46
|
try:
|
|
54
47
|
from cinderclient.v2 import services # noqa
|
|
55
48
|
except Exception:
|
|
@@ -127,21 +120,18 @@ def check_api_version(check_version):
|
|
|
127
120
|
|
|
128
121
|
global _volume_api_version
|
|
129
122
|
|
|
130
|
-
# Copy some logic from novaclient 3.3.0 for basic version detection
|
|
131
|
-
# NOTE(dtroyer): This is only enough to resume operations using API
|
|
132
|
-
# version 3.0 or any valid version supplied by the user.
|
|
133
123
|
_volume_api_version = api_versions.get_api_version(check_version)
|
|
134
124
|
|
|
135
125
|
# Bypass X.latest format microversion
|
|
136
126
|
if not _volume_api_version.is_latest():
|
|
137
|
-
if _volume_api_version > api_versions.APIVersion(
|
|
127
|
+
if _volume_api_version > api_versions.APIVersion('3.0'):
|
|
138
128
|
if not _volume_api_version.matches(
|
|
139
129
|
api_versions.MIN_VERSION,
|
|
140
130
|
api_versions.MAX_VERSION,
|
|
141
131
|
):
|
|
142
|
-
msg = _(
|
|
143
|
-
|
|
144
|
-
|
|
132
|
+
msg = _('versions supported by client: %(min)s - %(max)s') % {
|
|
133
|
+
'min': api_versions.MIN_VERSION,
|
|
134
|
+
'max': api_versions.MAX_VERSION,
|
|
145
135
|
}
|
|
146
136
|
raise exceptions.CommandError(msg)
|
|
147
137
|
|
|
@@ -18,10 +18,10 @@ import argparse
|
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
20
|
from osc_lib.cli import format_columns
|
|
21
|
-
from osc_lib.command import command
|
|
22
21
|
from osc_lib import exceptions
|
|
23
22
|
from osc_lib import utils
|
|
24
23
|
|
|
24
|
+
from openstackclient import command
|
|
25
25
|
from openstackclient.i18n import _
|
|
26
26
|
|
|
27
27
|
|
|
@@ -19,10 +19,10 @@ import logging
|
|
|
19
19
|
|
|
20
20
|
from osc_lib.cli import format_columns
|
|
21
21
|
from osc_lib.cli import parseractions
|
|
22
|
-
from osc_lib.command import command
|
|
23
22
|
from osc_lib import exceptions
|
|
24
23
|
from osc_lib import utils
|
|
25
24
|
|
|
25
|
+
from openstackclient import command
|
|
26
26
|
from openstackclient.i18n import _
|
|
27
27
|
|
|
28
28
|
|
|
@@ -25,11 +25,11 @@ from openstack.block_storage.v2 import volume as _volume
|
|
|
25
25
|
from openstack import exceptions as sdk_exceptions
|
|
26
26
|
from osc_lib.cli import format_columns
|
|
27
27
|
from osc_lib.cli import parseractions
|
|
28
|
-
from osc_lib.command import command
|
|
29
28
|
from osc_lib import exceptions
|
|
30
29
|
from osc_lib import utils
|
|
31
30
|
|
|
32
31
|
from openstackclient.api import volume_v2
|
|
32
|
+
from openstackclient import command
|
|
33
33
|
from openstackclient.common import pagination
|
|
34
34
|
from openstackclient.i18n import _
|
|
35
35
|
from openstackclient.identity import common as identity_common
|
|
@@ -61,7 +61,7 @@ class KeyValueHintAction(argparse.Action):
|
|
|
61
61
|
)
|
|
62
62
|
|
|
63
63
|
|
|
64
|
-
class AttachmentsColumn(cliff_columns.FormattableColumn):
|
|
64
|
+
class AttachmentsColumn(cliff_columns.FormattableColumn[list[ty.Any]]):
|
|
65
65
|
"""Formattable column for attachments column.
|
|
66
66
|
|
|
67
67
|
Unlike the parent FormattableColumn class, the initializer of the
|
|
@@ -18,17 +18,17 @@ import functools
|
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
20
|
from cliff import columns as cliff_columns
|
|
21
|
-
from osc_lib.command import command
|
|
22
21
|
from osc_lib import exceptions
|
|
23
22
|
from osc_lib import utils
|
|
24
23
|
|
|
24
|
+
from openstackclient import command
|
|
25
25
|
from openstackclient.common import pagination
|
|
26
26
|
from openstackclient.i18n import _
|
|
27
27
|
|
|
28
28
|
LOG = logging.getLogger(__name__)
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
class VolumeIdColumn(cliff_columns.FormattableColumn):
|
|
31
|
+
class VolumeIdColumn(cliff_columns.FormattableColumn[str]):
|
|
32
32
|
"""Formattable column for volume ID column.
|
|
33
33
|
|
|
34
34
|
Unlike the parent FormattableColumn class, the initializer of the
|
|
@@ -453,7 +453,9 @@ class ShowVolumeBackup(command.ShowOne):
|
|
|
453
453
|
|
|
454
454
|
def take_action(self, parsed_args):
|
|
455
455
|
volume_client = self.app.client_manager.sdk_connection.volume
|
|
456
|
-
backup = volume_client.find_backup(
|
|
456
|
+
backup = volume_client.find_backup(
|
|
457
|
+
parsed_args.backup, ignore_missing=False
|
|
458
|
+
)
|
|
457
459
|
columns: tuple[str, ...] = (
|
|
458
460
|
"availability_zone",
|
|
459
461
|
"container",
|