python-openstackclient 6.6.0__py3-none-any.whl → 7.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/api.py +7 -8
- openstackclient/api/compute_v2.py +352 -638
- openstackclient/api/image_v1.py +1 -1
- openstackclient/api/object_store_v1.py +3 -4
- openstackclient/common/availability_zone.py +1 -1
- openstackclient/common/clientmanager.py +16 -4
- openstackclient/common/configuration.py +1 -1
- openstackclient/common/extension.py +1 -1
- openstackclient/common/limits.py +66 -32
- openstackclient/common/module.py +3 -3
- openstackclient/common/progressbar.py +2 -2
- openstackclient/common/project_cleanup.py +5 -2
- openstackclient/common/quota.py +281 -410
- openstackclient/common/versions.py +1 -1
- openstackclient/compute/client.py +7 -116
- openstackclient/compute/v2/agent.py +75 -49
- openstackclient/compute/v2/aggregate.py +9 -9
- openstackclient/compute/v2/console.py +2 -2
- openstackclient/compute/v2/flavor.py +6 -6
- openstackclient/compute/v2/host.py +38 -33
- openstackclient/compute/v2/hypervisor.py +4 -3
- openstackclient/compute/v2/keypair.py +7 -8
- openstackclient/compute/v2/server.py +478 -396
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_group.py +4 -4
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +3 -4
- openstackclient/compute/v2/service.py +4 -4
- openstackclient/compute/v2/usage.py +3 -3
- openstackclient/identity/common.py +34 -0
- openstackclient/identity/v2_0/catalog.py +2 -2
- openstackclient/identity/v2_0/ec2creds.py +4 -4
- openstackclient/identity/v2_0/endpoint.py +4 -4
- openstackclient/identity/v2_0/project.py +6 -6
- openstackclient/identity/v2_0/role.py +5 -5
- openstackclient/identity/v2_0/role_assignment.py +1 -1
- openstackclient/identity/v2_0/service.py +4 -4
- openstackclient/identity/v2_0/token.py +2 -2
- openstackclient/identity/v2_0/user.py +7 -7
- openstackclient/identity/v3/access_rule.py +3 -3
- openstackclient/identity/v3/application_credential.py +127 -45
- openstackclient/identity/v3/catalog.py +2 -2
- openstackclient/identity/v3/consumer.py +4 -4
- openstackclient/identity/v3/credential.py +5 -5
- openstackclient/identity/v3/domain.py +5 -5
- openstackclient/identity/v3/ec2creds.py +4 -4
- openstackclient/identity/v3/endpoint.py +7 -7
- openstackclient/identity/v3/endpoint_group.py +8 -10
- openstackclient/identity/v3/federation_protocol.py +5 -5
- openstackclient/identity/v3/group.py +8 -8
- openstackclient/identity/v3/identity_provider.py +5 -5
- openstackclient/identity/v3/implied_role.py +3 -3
- openstackclient/identity/v3/limit.py +5 -5
- openstackclient/identity/v3/mapping.py +5 -5
- openstackclient/identity/v3/policy.py +5 -5
- openstackclient/identity/v3/project.py +5 -5
- openstackclient/identity/v3/region.py +5 -5
- openstackclient/identity/v3/registered_limit.py +5 -5
- openstackclient/identity/v3/role.py +7 -7
- openstackclient/identity/v3/role_assignment.py +92 -140
- openstackclient/identity/v3/service.py +64 -34
- openstackclient/identity/v3/service_provider.py +4 -4
- openstackclient/identity/v3/tag.py +2 -2
- openstackclient/identity/v3/token.py +5 -5
- openstackclient/identity/v3/trust.py +3 -3
- openstackclient/identity/v3/user.py +144 -80
- openstackclient/image/client.py +4 -4
- openstackclient/image/v1/image.py +8 -9
- openstackclient/image/v2/cache.py +12 -10
- openstackclient/image/v2/metadef_objects.py +44 -0
- openstackclient/image/v2/metadef_resource_type_association.py +189 -0
- openstackclient/image/v2/task.py +1 -1
- openstackclient/network/common.py +6 -5
- openstackclient/network/utils.py +2 -2
- openstackclient/network/v2/address_group.py +6 -6
- openstackclient/network/v2/address_scope.py +5 -5
- openstackclient/network/v2/default_security_group_rule.py +1 -1
- openstackclient/network/v2/floating_ip.py +8 -10
- openstackclient/network/v2/floating_ip_pool.py +6 -15
- openstackclient/network/v2/floating_ip_port_forwarding.py +5 -13
- openstackclient/network/v2/ip_availability.py +2 -2
- openstackclient/network/v2/l3_conntrack_helper.py +5 -5
- openstackclient/network/v2/network.py +8 -8
- openstackclient/network/v2/network_agent.py +8 -8
- openstackclient/network/v2/network_auto_allocated_topology.py +2 -2
- openstackclient/network/v2/network_flavor.py +6 -8
- openstackclient/network/v2/network_flavor_profile.py +4 -4
- openstackclient/network/v2/network_meter.py +3 -3
- openstackclient/network/v2/network_meter_rule.py +3 -3
- openstackclient/network/v2/network_qos_policy.py +5 -5
- openstackclient/network/v2/network_qos_rule.py +9 -9
- openstackclient/network/v2/network_qos_rule_type.py +1 -1
- openstackclient/network/v2/network_rbac.py +5 -5
- openstackclient/network/v2/network_segment.py +5 -5
- openstackclient/network/v2/network_segment_range.py +7 -7
- openstackclient/network/v2/network_trunk.py +7 -7
- openstackclient/network/v2/port.py +26 -12
- openstackclient/network/v2/router.py +403 -54
- openstackclient/network/v2/security_group.py +18 -14
- openstackclient/network/v2/security_group_rule.py +18 -15
- openstackclient/network/v2/subnet.py +15 -8
- openstackclient/network/v2/subnet_pool.py +6 -6
- openstackclient/object/v1/account.py +2 -2
- openstackclient/object/v1/container.py +7 -7
- openstackclient/object/v1/object.py +7 -7
- openstackclient/shell.py +4 -6
- openstackclient/tests/functional/base.py +1 -1
- openstackclient/tests/functional/common/test_extension.py +1 -1
- openstackclient/tests/functional/common/test_help.py +2 -2
- openstackclient/tests/functional/common/test_module.py +1 -1
- openstackclient/tests/functional/common/test_quota.py +43 -61
- openstackclient/tests/functional/compute/v2/common.py +2 -2
- openstackclient/tests/functional/compute/v2/test_flavor.py +2 -2
- openstackclient/tests/functional/compute/v2/test_keypair.py +1 -1
- openstackclient/tests/functional/compute/v2/test_server.py +5 -5
- openstackclient/tests/functional/compute/v2/test_server_event.py +1 -1
- openstackclient/tests/functional/identity/v2/common.py +3 -3
- openstackclient/tests/functional/identity/v3/common.py +14 -6
- openstackclient/tests/functional/identity/v3/test_application_credential.py +13 -19
- openstackclient/tests/functional/identity/v3/test_domain.py +1 -3
- openstackclient/tests/functional/identity/v3/test_endpoint.py +1 -1
- openstackclient/tests/functional/identity/v3/test_idp.py +1 -1
- openstackclient/tests/functional/identity/v3/test_limit.py +2 -2
- openstackclient/tests/functional/identity/v3/test_region.py +1 -3
- openstackclient/tests/functional/identity/v3/test_registered_limit.py +1 -1
- openstackclient/tests/functional/identity/v3/test_role.py +2 -2
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +210 -0
- openstackclient/tests/functional/identity/v3/test_service.py +4 -6
- openstackclient/tests/functional/identity/v3/test_service_provider.py +1 -3
- openstackclient/tests/functional/image/base.py +1 -1
- openstackclient/tests/functional/image/v2/test_image.py +1 -1
- openstackclient/tests/functional/image/v2/test_info.py +1 -1
- openstackclient/tests/functional/network/v2/common.py +4 -6
- openstackclient/tests/functional/network/v2/test_network.py +5 -3
- openstackclient/tests/functional/network/v2/test_network_agent.py +7 -5
- openstackclient/tests/functional/network/v2/test_network_qos_rule.py +4 -4
- openstackclient/tests/functional/network/v2/test_port.py +11 -7
- openstackclient/tests/functional/network/v2/test_router.py +2 -2
- openstackclient/tests/functional/object/v1/common.py +1 -1
- openstackclient/tests/functional/object/v1/test_container.py +3 -3
- openstackclient/tests/functional/object/v1/test_object.py +9 -13
- openstackclient/tests/functional/volume/base.py +1 -1
- openstackclient/tests/functional/volume/v1/test_service.py +1 -1
- openstackclient/tests/functional/volume/v1/test_snapshot.py +2 -2
- openstackclient/tests/functional/volume/v1/test_transfer_request.py +2 -2
- openstackclient/tests/functional/volume/v1/test_volume_type.py +1 -1
- openstackclient/tests/functional/volume/v2/test_service.py +2 -2
- openstackclient/tests/functional/volume/v2/test_volume_backup.py +2 -2
- openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +2 -2
- openstackclient/tests/functional/volume/v2/test_volume_type.py +1 -1
- openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +2 -2
- openstackclient/tests/functional/volume/v3/test_volume_type.py +1 -1
- openstackclient/tests/unit/api/fakes.py +1 -1
- openstackclient/tests/unit/api/test_api.py +2 -2
- openstackclient/tests/unit/api/test_compute_v2.py +522 -707
- openstackclient/tests/unit/api/test_image_v1.py +1 -1
- openstackclient/tests/unit/api/test_image_v2.py +1 -1
- openstackclient/tests/unit/api/test_object_store_v1.py +4 -4
- openstackclient/tests/unit/common/test_limits.py +73 -35
- openstackclient/tests/unit/common/test_logs.py +2 -2
- openstackclient/tests/unit/common/test_module.py +4 -2
- openstackclient/tests/unit/common/test_project_cleanup.py +31 -6
- openstackclient/tests/unit/common/test_quota.py +490 -630
- openstackclient/tests/unit/compute/v2/fakes.py +37 -286
- openstackclient/tests/unit/compute/v2/test_agent.py +189 -147
- openstackclient/tests/unit/compute/v2/test_aggregate.py +18 -16
- openstackclient/tests/unit/compute/v2/test_console.py +4 -5
- openstackclient/tests/unit/compute/v2/test_flavor.py +59 -68
- openstackclient/tests/unit/compute/v2/test_host.py +83 -54
- openstackclient/tests/unit/compute/v2/test_hypervisor.py +28 -31
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -2
- openstackclient/tests/unit/compute/v2/test_keypair.py +65 -50
- openstackclient/tests/unit/compute/v2/test_server.py +2895 -2459
- openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -1
- openstackclient/tests/unit/compute/v2/test_server_event.py +14 -39
- openstackclient/tests/unit/compute/v2/test_server_group.py +28 -29
- openstackclient/tests/unit/compute/v2/test_server_migration.py +43 -68
- openstackclient/tests/unit/compute/v2/test_server_volume.py +17 -34
- openstackclient/tests/unit/compute/v2/test_service.py +34 -52
- openstackclient/tests/unit/compute/v2/test_usage.py +4 -4
- openstackclient/tests/unit/fakes.py +11 -11
- openstackclient/tests/unit/identity/v2_0/fakes.py +27 -10
- openstackclient/tests/unit/identity/v2_0/test_catalog.py +3 -3
- openstackclient/tests/unit/identity/v2_0/test_endpoint.py +7 -7
- openstackclient/tests/unit/identity/v2_0/test_project.py +8 -8
- openstackclient/tests/unit/identity/v2_0/test_role.py +10 -10
- openstackclient/tests/unit/identity/v2_0/test_role_assignment.py +4 -4
- openstackclient/tests/unit/identity/v2_0/test_service.py +6 -6
- openstackclient/tests/unit/identity/v2_0/test_token.py +4 -4
- openstackclient/tests/unit/identity/v2_0/test_user.py +8 -8
- openstackclient/tests/unit/identity/v3/fakes.py +59 -20
- openstackclient/tests/unit/identity/v3/test_access_rule.py +5 -5
- openstackclient/tests/unit/identity/v3/test_application_credential.py +212 -235
- openstackclient/tests/unit/identity/v3/test_catalog.py +3 -3
- openstackclient/tests/unit/identity/v3/test_consumer.py +7 -8
- openstackclient/tests/unit/identity/v3/test_credential.py +9 -9
- openstackclient/tests/unit/identity/v3/test_domain.py +8 -8
- openstackclient/tests/unit/identity/v3/test_endpoint.py +13 -13
- openstackclient/tests/unit/identity/v3/test_endpoint_group.py +12 -14
- openstackclient/tests/unit/identity/v3/test_group.py +12 -12
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +8 -8
- openstackclient/tests/unit/identity/v3/test_implied_role.py +5 -5
- openstackclient/tests/unit/identity/v3/test_limit.py +7 -7
- openstackclient/tests/unit/identity/v3/test_mappings.py +7 -7
- openstackclient/tests/unit/identity/v3/test_oauth.py +5 -5
- openstackclient/tests/unit/identity/v3/test_project.py +16 -16
- openstackclient/tests/unit/identity/v3/test_protocol.py +7 -7
- openstackclient/tests/unit/identity/v3/test_region.py +7 -7
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +12 -13
- openstackclient/tests/unit/identity/v3/test_role.py +13 -13
- openstackclient/tests/unit/identity/v3/test_role_assignment.py +410 -331
- openstackclient/tests/unit/identity/v3/test_service.py +93 -97
- openstackclient/tests/unit/identity/v3/test_service_provider.py +7 -7
- openstackclient/tests/unit/identity/v3/test_token.py +4 -4
- openstackclient/tests/unit/identity/v3/test_trust.py +9 -9
- openstackclient/tests/unit/identity/v3/test_unscoped_saml.py +4 -4
- openstackclient/tests/unit/identity/v3/test_user.py +299 -327
- openstackclient/tests/unit/image/v1/test_image.py +6 -6
- openstackclient/tests/unit/image/v2/fakes.py +46 -9
- openstackclient/tests/unit/image/v2/test_cache.py +2 -2
- openstackclient/tests/unit/image/v2/test_image.py +3 -3
- openstackclient/tests/unit/image/v2/test_metadef_objects.py +62 -0
- openstackclient/tests/unit/image/v2/test_metadef_resource_type_association.py +131 -0
- openstackclient/tests/unit/integ/base.py +1 -1
- openstackclient/tests/unit/integ/cli/test_project.py +4 -4
- openstackclient/tests/unit/integ/cli/test_shell.py +7 -7
- openstackclient/tests/unit/network/test_common.py +12 -21
- openstackclient/tests/unit/network/v2/fakes.py +64 -130
- openstackclient/tests/unit/network/v2/test_address_group.py +15 -15
- openstackclient/tests/unit/network/v2/test_address_scope.py +13 -13
- openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +49 -27
- openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +40 -38
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +15 -15
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +4 -7
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +3 -5
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +11 -11
- openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -6
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +11 -21
- openstackclient/tests/unit/network/v2/test_local_ip.py +7 -7
- openstackclient/tests/unit/network/v2/test_local_ip_association.py +3 -5
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -13
- openstackclient/tests/unit/network/v2/test_network.py +23 -28
- openstackclient/tests/unit/network/v2/test_network_agent.py +17 -21
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +8 -8
- openstackclient/tests/unit/network/v2/test_network_compute.py +66 -65
- openstackclient/tests/unit/network/v2/test_network_flavor.py +17 -19
- openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +13 -13
- openstackclient/tests/unit/network/v2/test_network_meter.py +11 -11
- openstackclient/tests/unit/network/v2/test_network_meter_rule.py +11 -11
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +11 -21
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +51 -77
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +5 -9
- openstackclient/tests/unit/network/v2/test_network_rbac.py +12 -12
- openstackclient/tests/unit/network/v2/test_network_segment.py +11 -15
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +11 -13
- openstackclient/tests/unit/network/v2/test_network_service_provider.py +3 -5
- openstackclient/tests/unit/network/v2/test_network_trunk.py +11 -11
- openstackclient/tests/unit/network/v2/test_port.py +22 -25
- openstackclient/tests/unit/network/v2/test_router.py +721 -51
- openstackclient/tests/unit/network/v2/test_security_group_compute.py +65 -49
- openstackclient/tests/unit/network/v2/test_security_group_network.py +15 -15
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +57 -45
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +11 -19
- openstackclient/tests/unit/network/v2/test_subnet.py +29 -25
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +15 -15
- openstackclient/tests/unit/object/v1/fakes.py +1 -1
- openstackclient/tests/unit/object/v1/test_container.py +5 -5
- openstackclient/tests/unit/object/v1/test_container_all.py +6 -6
- openstackclient/tests/unit/object/v1/test_object.py +3 -3
- openstackclient/tests/unit/object/v1/test_object_all.py +5 -5
- openstackclient/tests/unit/test_shell.py +5 -5
- openstackclient/tests/unit/utils.py +4 -1
- openstackclient/tests/unit/volume/test_find_resource.py +2 -2
- openstackclient/tests/unit/volume/v1/fakes.py +5 -6
- openstackclient/tests/unit/volume/v1/test_volume.py +5 -4
- openstackclient/tests/unit/volume/v2/fakes.py +39 -259
- openstackclient/tests/unit/volume/v2/test_consistency_group_snapshot.py +5 -5
- openstackclient/tests/unit/volume/v2/test_qos_specs.py +9 -9
- openstackclient/tests/unit/volume/v2/test_volume.py +21 -87
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +7 -368
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +1 -1
- openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +0 -44
- openstackclient/tests/unit/volume/v2/test_volume_type.py +6 -87
- openstackclient/tests/unit/volume/v3/fakes.py +505 -22
- openstackclient/tests/unit/volume/v3/test_block_storage_cleanup.py +2 -3
- openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py +10 -11
- openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +10 -6
- openstackclient/tests/unit/volume/v3/test_block_storage_manage.py +25 -17
- openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py +6 -32
- openstackclient/tests/unit/volume/v3/test_service.py +271 -0
- openstackclient/tests/unit/volume/v3/test_volume.py +2177 -33
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +48 -52
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +892 -0
- openstackclient/tests/unit/volume/v3/test_volume_group.py +19 -20
- openstackclient/tests/unit/volume/v3/test_volume_group_snapshot.py +14 -34
- openstackclient/tests/unit/volume/v3/test_volume_group_type.py +13 -16
- openstackclient/tests/unit/volume/v3/test_volume_message.py +10 -11
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +161 -0
- openstackclient/tests/unit/volume/v3/test_volume_transfer_request.py +425 -0
- openstackclient/tests/unit/volume/v3/test_volume_type.py +1109 -0
- openstackclient/volume/v1/qos_specs.py +7 -7
- openstackclient/volume/v1/service.py +2 -2
- openstackclient/volume/v1/volume.py +12 -12
- openstackclient/volume/v1/volume_backup.py +7 -7
- openstackclient/volume/v1/volume_snapshot.py +8 -8
- openstackclient/volume/v1/volume_transfer_request.py +5 -5
- openstackclient/volume/v1/volume_type.py +7 -7
- openstackclient/volume/v2/backup_record.py +2 -2
- openstackclient/volume/v2/consistency_group.py +7 -9
- openstackclient/volume/v2/consistency_group_snapshot.py +4 -12
- openstackclient/volume/v2/qos_specs.py +7 -7
- openstackclient/volume/v2/service.py +2 -2
- openstackclient/volume/v2/volume.py +80 -80
- openstackclient/volume/v2/volume_backend.py +2 -2
- openstackclient/volume/v2/volume_backup.py +7 -217
- openstackclient/volume/v2/volume_host.py +2 -2
- openstackclient/volume/v2/volume_snapshot.py +8 -8
- openstackclient/volume/v2/volume_transfer_request.py +5 -37
- openstackclient/volume/v2/volume_type.py +7 -89
- openstackclient/volume/v3/service.py +56 -0
- openstackclient/volume/v3/volume.py +971 -0
- openstackclient/volume/v3/volume_attachment.py +31 -29
- openstackclient/volume/v3/volume_backup.py +670 -0
- openstackclient/volume/v3/volume_message.py +1 -1
- openstackclient/volume/v3/volume_snapshot.py +97 -0
- openstackclient/volume/v3/volume_transfer_request.py +233 -0
- openstackclient/volume/v3/volume_type.py +967 -0
- {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/AUTHORS +4 -0
- {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/METADATA +3 -3
- python_openstackclient-7.0.0.dist-info/RECORD +502 -0
- {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/entry_points.txt +33 -27
- python_openstackclient-7.0.0.dist-info/pbr.json +1 -0
- python_openstackclient-6.6.0.dist-info/RECORD +0 -489
- python_openstackclient-6.6.0.dist-info/pbr.json +0 -1
- {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/WHEEL +0 -0
- {python_openstackclient-6.6.0.dist-info → python_openstackclient-7.0.0.dist-info}/top_level.txt +0 -0
|
@@ -10,16 +10,23 @@
|
|
|
10
10
|
# License for the specific language governing permissions and limitations
|
|
11
11
|
# under the License.
|
|
12
12
|
|
|
13
|
+
import copy
|
|
13
14
|
import random
|
|
15
|
+
import re
|
|
14
16
|
from unittest import mock
|
|
15
17
|
import uuid
|
|
16
18
|
|
|
17
19
|
from cinderclient import api_versions
|
|
20
|
+
from keystoneauth1 import discover
|
|
18
21
|
from openstack.block_storage.v3 import _proxy
|
|
19
22
|
from openstack.block_storage.v3 import availability_zone as _availability_zone
|
|
23
|
+
from openstack.block_storage.v3 import backup as _backup
|
|
20
24
|
from openstack.block_storage.v3 import extension as _extension
|
|
25
|
+
from openstack.block_storage.v3 import limits as _limits
|
|
21
26
|
from openstack.block_storage.v3 import resource_filter as _filters
|
|
22
27
|
from openstack.block_storage.v3 import volume as _volume
|
|
28
|
+
from openstack.compute.v2 import _proxy as _compute_proxy
|
|
29
|
+
from openstack.image.v2 import _proxy as _image_proxy
|
|
23
30
|
|
|
24
31
|
from openstackclient.tests.unit import fakes
|
|
25
32
|
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
|
|
@@ -33,10 +40,14 @@ class FakeVolumeClient:
|
|
|
33
40
|
self.management_url = kwargs['endpoint']
|
|
34
41
|
self.api_version = api_versions.APIVersion('3.0')
|
|
35
42
|
|
|
36
|
-
self.availability_zones = mock.Mock()
|
|
37
|
-
self.availability_zones.resource_class = fakes.FakeResource(None, {})
|
|
38
43
|
self.attachments = mock.Mock()
|
|
39
44
|
self.attachments.resource_class = fakes.FakeResource(None, {})
|
|
45
|
+
self.availability_zones = mock.Mock()
|
|
46
|
+
self.availability_zones.resource_class = fakes.FakeResource(None, {})
|
|
47
|
+
self.backups = mock.Mock()
|
|
48
|
+
self.backups.resource_class = fakes.FakeResource(None, {})
|
|
49
|
+
self.consistencygroups = mock.Mock()
|
|
50
|
+
self.consistencygroups.resource_class = fakes.FakeResource(None, {})
|
|
40
51
|
self.clusters = mock.Mock()
|
|
41
52
|
self.clusters.resource_class = fakes.FakeResource(None, {})
|
|
42
53
|
self.groups = mock.Mock()
|
|
@@ -47,18 +58,24 @@ class FakeVolumeClient:
|
|
|
47
58
|
self.group_types.resource_class = fakes.FakeResource(None, {})
|
|
48
59
|
self.messages = mock.Mock()
|
|
49
60
|
self.messages.resource_class = fakes.FakeResource(None, {})
|
|
50
|
-
self.quota_classes = mock.Mock()
|
|
51
|
-
self.quota_classes.resource_class = fakes.FakeResource(None, {})
|
|
52
|
-
self.quotas = mock.Mock()
|
|
53
|
-
self.quotas.resource_class = fakes.FakeResource(None, {})
|
|
54
61
|
self.resource_filters = mock.Mock()
|
|
55
62
|
self.resource_filters.resource_class = fakes.FakeResource(None, {})
|
|
56
|
-
self.
|
|
57
|
-
self.
|
|
63
|
+
self.restores = mock.Mock()
|
|
64
|
+
self.restores.resource_class = fakes.FakeResource(None, {})
|
|
65
|
+
self.transfers = mock.Mock()
|
|
66
|
+
self.transfers.resource_class = fakes.FakeResource(None, {})
|
|
67
|
+
self.volume_encryption_types = mock.Mock()
|
|
68
|
+
self.volume_encryption_types.resource_class = fakes.FakeResource(
|
|
69
|
+
None, {}
|
|
70
|
+
)
|
|
58
71
|
self.volume_snapshots = mock.Mock()
|
|
59
72
|
self.volume_snapshots.resource_class = fakes.FakeResource(None, {})
|
|
73
|
+
self.volume_type_access = mock.Mock()
|
|
74
|
+
self.volume_type_access.resource_class = fakes.FakeResource(None, {})
|
|
60
75
|
self.volume_types = mock.Mock()
|
|
61
76
|
self.volume_types.resource_class = fakes.FakeResource(None, {})
|
|
77
|
+
self.volumes = mock.Mock()
|
|
78
|
+
self.volumes.resource_class = fakes.FakeResource(None, {})
|
|
62
79
|
self.services = mock.Mock()
|
|
63
80
|
self.services.resource_class = fakes.FakeResource(None, {})
|
|
64
81
|
self.workers = mock.Mock()
|
|
@@ -80,32 +97,56 @@ class FakeClientMixin:
|
|
|
80
97
|
spec=_proxy.Proxy,
|
|
81
98
|
)
|
|
82
99
|
self.volume_sdk_client = self.app.client_manager.sdk_connection.volume
|
|
100
|
+
self.set_volume_api_version() # default to the lowest
|
|
101
|
+
|
|
102
|
+
def set_volume_api_version(self, version: str = '3.0'):
|
|
103
|
+
"""Set a fake block storage API version.
|
|
83
104
|
|
|
105
|
+
:param version: The fake microversion to "support". This should be a
|
|
106
|
+
string of format '3.xx'.
|
|
107
|
+
:returns: None
|
|
108
|
+
"""
|
|
109
|
+
assert re.match(r'3.\d+', version)
|
|
84
110
|
|
|
85
|
-
|
|
111
|
+
self.volume_client.api_version = api_versions.APIVersion(version)
|
|
112
|
+
|
|
113
|
+
self.volume_sdk_client.default_microversion = version
|
|
114
|
+
self.volume_sdk_client.get_endpoint_data.return_value = (
|
|
115
|
+
discover.EndpointData(
|
|
116
|
+
min_microversion='3.0', # cinder has not bumped this yet
|
|
117
|
+
max_microversion=version,
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class TestVolume(
|
|
123
|
+
identity_fakes.FakeClientMixin,
|
|
124
|
+
FakeClientMixin,
|
|
125
|
+
utils.TestCommand,
|
|
126
|
+
):
|
|
86
127
|
def setUp(self):
|
|
87
128
|
super().setUp()
|
|
88
129
|
|
|
89
|
-
|
|
90
|
-
|
|
130
|
+
# avoid circular imports by defining this manually rather than using
|
|
131
|
+
# openstackclient.tests.unit.compute.v2.fakes.FakeClientMixin
|
|
132
|
+
# TODO(stephenfin): Rename to 'compute_client' once all commands are
|
|
133
|
+
# migrated to SDK
|
|
134
|
+
self.app.client_manager.sdk_connection.compute = mock.Mock(
|
|
135
|
+
_compute_proxy.Proxy
|
|
91
136
|
)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
from openstackclient.tests.unit.compute.v2 import (
|
|
95
|
-
fakes as compute_fakes,
|
|
137
|
+
self.compute_sdk_client = (
|
|
138
|
+
self.app.client_manager.sdk_connection.compute
|
|
96
139
|
)
|
|
97
140
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
self.compute_client = self.app.client_manager.compute
|
|
141
|
+
# avoid circular imports by defining this manually rather than using
|
|
142
|
+
# openstackclient.tests.unit.image.v2.fakes.FakeClientMixin
|
|
143
|
+
self.app.client_manager.image = mock.Mock(spec=_image_proxy.Proxy)
|
|
144
|
+
self.image_client = self.app.client_manager.image
|
|
103
145
|
|
|
104
146
|
|
|
105
147
|
# TODO(stephenfin): Check if the responses are actually the same
|
|
106
148
|
create_one_snapshot = volume_v2_fakes.create_one_snapshot
|
|
107
|
-
|
|
108
|
-
create_one_volume_type = volume_v2_fakes.create_one_volume_type
|
|
149
|
+
create_one_service = volume_v2_fakes.create_one_service
|
|
109
150
|
|
|
110
151
|
|
|
111
152
|
def create_one_availability_zone(attrs=None):
|
|
@@ -148,6 +189,54 @@ def create_availability_zones(attrs=None, count=2):
|
|
|
148
189
|
return availability_zones
|
|
149
190
|
|
|
150
191
|
|
|
192
|
+
def create_one_consistency_group(attrs=None):
|
|
193
|
+
"""Create a fake consistency group.
|
|
194
|
+
|
|
195
|
+
:param dict attrs:
|
|
196
|
+
A dictionary with all attributes
|
|
197
|
+
:return:
|
|
198
|
+
A FakeResource object with id, name, description, etc.
|
|
199
|
+
"""
|
|
200
|
+
attrs = attrs or {}
|
|
201
|
+
|
|
202
|
+
# Set default attributes.
|
|
203
|
+
consistency_group_info = {
|
|
204
|
+
"id": 'backup-id-' + uuid.uuid4().hex,
|
|
205
|
+
"name": 'backup-name-' + uuid.uuid4().hex,
|
|
206
|
+
"description": 'description-' + uuid.uuid4().hex,
|
|
207
|
+
"status": "error",
|
|
208
|
+
"availability_zone": 'zone' + uuid.uuid4().hex,
|
|
209
|
+
"created_at": 'time-' + uuid.uuid4().hex,
|
|
210
|
+
"volume_types": ['volume-type1'],
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
# Overwrite default attributes.
|
|
214
|
+
consistency_group_info.update(attrs)
|
|
215
|
+
|
|
216
|
+
consistency_group = fakes.FakeResource(
|
|
217
|
+
info=copy.deepcopy(consistency_group_info), loaded=True
|
|
218
|
+
)
|
|
219
|
+
return consistency_group
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def create_consistency_groups(attrs=None, count=2):
|
|
223
|
+
"""Create multiple fake consistency groups.
|
|
224
|
+
|
|
225
|
+
:param dict attrs:
|
|
226
|
+
A dictionary with all attributes
|
|
227
|
+
:param int count:
|
|
228
|
+
The number of consistency groups to fake
|
|
229
|
+
:return:
|
|
230
|
+
A list of FakeResource objects faking the consistency groups
|
|
231
|
+
"""
|
|
232
|
+
consistency_groups = []
|
|
233
|
+
for i in range(0, count):
|
|
234
|
+
consistency_group = create_one_consistency_group(attrs)
|
|
235
|
+
consistency_groups.append(consistency_group)
|
|
236
|
+
|
|
237
|
+
return consistency_groups
|
|
238
|
+
|
|
239
|
+
|
|
151
240
|
def create_one_extension(attrs=None):
|
|
152
241
|
"""Create a fake extension.
|
|
153
242
|
|
|
@@ -179,6 +268,85 @@ def create_one_extension(attrs=None):
|
|
|
179
268
|
return extension
|
|
180
269
|
|
|
181
270
|
|
|
271
|
+
def create_one_backup(attrs=None):
|
|
272
|
+
"""Create a fake backup.
|
|
273
|
+
|
|
274
|
+
:param dict attrs:
|
|
275
|
+
A dictionary with all attributes
|
|
276
|
+
:return: A fake
|
|
277
|
+
openstack.block_storage.v3.backup.Backup object
|
|
278
|
+
"""
|
|
279
|
+
attrs = attrs or {}
|
|
280
|
+
|
|
281
|
+
# Set default attributes.
|
|
282
|
+
backup_info = {
|
|
283
|
+
"availability_zone": 'zone' + uuid.uuid4().hex,
|
|
284
|
+
"container": 'container-' + uuid.uuid4().hex,
|
|
285
|
+
"created_at": 'time-' + uuid.uuid4().hex,
|
|
286
|
+
"data_timestamp": 'time-' + uuid.uuid4().hex,
|
|
287
|
+
"description": 'description-' + uuid.uuid4().hex,
|
|
288
|
+
"encryption_key_id": None,
|
|
289
|
+
"fail_reason": "Service not found for creating backup.",
|
|
290
|
+
"has_dependent_backups": False,
|
|
291
|
+
"id": 'backup-id-' + uuid.uuid4().hex,
|
|
292
|
+
"is_incremental": False,
|
|
293
|
+
"metadata": {},
|
|
294
|
+
"name": 'backup-name-' + uuid.uuid4().hex,
|
|
295
|
+
"object_count": None,
|
|
296
|
+
"project_id": uuid.uuid4().hex,
|
|
297
|
+
"size": random.randint(1, 20),
|
|
298
|
+
"snapshot_id": 'snapshot-id' + uuid.uuid4().hex,
|
|
299
|
+
"status": "error",
|
|
300
|
+
"updated_at": 'time-' + uuid.uuid4().hex,
|
|
301
|
+
"user_id": uuid.uuid4().hex,
|
|
302
|
+
"volume_id": 'volume-id-' + uuid.uuid4().hex,
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
# Overwrite default attributes.
|
|
306
|
+
backup_info.update(attrs)
|
|
307
|
+
|
|
308
|
+
backup = _backup.Backup(**backup_info)
|
|
309
|
+
return backup
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def create_backups(attrs=None, count=2):
|
|
313
|
+
"""Create multiple fake backups.
|
|
314
|
+
|
|
315
|
+
:param dict attrs:
|
|
316
|
+
A dictionary with all attributes
|
|
317
|
+
:param int count:
|
|
318
|
+
The number of backups to fake
|
|
319
|
+
:return: A list of fake
|
|
320
|
+
openstack.block_storage.v3.backup.Backup objects
|
|
321
|
+
"""
|
|
322
|
+
backups = []
|
|
323
|
+
for i in range(0, count):
|
|
324
|
+
backup = create_one_backup(attrs)
|
|
325
|
+
backups.append(backup)
|
|
326
|
+
|
|
327
|
+
return backups
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def get_backups(backups=None, count=2):
|
|
331
|
+
"""Get an iterable MagicMock object with a list of faked backups.
|
|
332
|
+
|
|
333
|
+
If backups list is provided, then initialize the Mock object with the
|
|
334
|
+
list. Otherwise create one.
|
|
335
|
+
|
|
336
|
+
:param List backups:
|
|
337
|
+
A list of FakeResource objects faking backups
|
|
338
|
+
:param Integer count:
|
|
339
|
+
The number of backups to be faked
|
|
340
|
+
:return
|
|
341
|
+
An iterable Mock object with side_effect set to a list of faked
|
|
342
|
+
backups
|
|
343
|
+
"""
|
|
344
|
+
if backups is None:
|
|
345
|
+
backups = create_backups(count)
|
|
346
|
+
|
|
347
|
+
return mock.Mock(side_effect=backups)
|
|
348
|
+
|
|
349
|
+
|
|
182
350
|
def create_one_cluster(attrs=None):
|
|
183
351
|
"""Create a fake service cluster.
|
|
184
352
|
|
|
@@ -224,6 +392,86 @@ def create_clusters(attrs=None, count=2):
|
|
|
224
392
|
return clusters
|
|
225
393
|
|
|
226
394
|
|
|
395
|
+
def create_one_encryption_volume_type(attrs=None):
|
|
396
|
+
"""Create a fake encryption volume type.
|
|
397
|
+
|
|
398
|
+
:param dict attrs:
|
|
399
|
+
A dictionary with all attributes
|
|
400
|
+
:return:
|
|
401
|
+
A FakeResource object with volume_type_id etc.
|
|
402
|
+
"""
|
|
403
|
+
attrs = attrs or {}
|
|
404
|
+
|
|
405
|
+
# Set default attributes.
|
|
406
|
+
encryption_info = {
|
|
407
|
+
"volume_type_id": 'type-id-' + uuid.uuid4().hex,
|
|
408
|
+
'provider': 'LuksEncryptor',
|
|
409
|
+
'cipher': None,
|
|
410
|
+
'key_size': None,
|
|
411
|
+
'control_location': 'front-end',
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
# Overwrite default attributes.
|
|
415
|
+
encryption_info.update(attrs)
|
|
416
|
+
|
|
417
|
+
encryption_type = fakes.FakeResource(
|
|
418
|
+
info=copy.deepcopy(encryption_info), loaded=True
|
|
419
|
+
)
|
|
420
|
+
return encryption_type
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def create_limits(attrs=None):
|
|
424
|
+
"""Create a fake limits object."""
|
|
425
|
+
attrs = attrs or {}
|
|
426
|
+
|
|
427
|
+
limits_attrs = {
|
|
428
|
+
'absolute': {
|
|
429
|
+
'totalSnapshotsUsed': 1,
|
|
430
|
+
'maxTotalBackups': 10,
|
|
431
|
+
'maxTotalVolumeGigabytes': 1000,
|
|
432
|
+
'maxTotalSnapshots': 10,
|
|
433
|
+
'maxTotalBackupGigabytes': 1000,
|
|
434
|
+
'totalBackupGigabytesUsed': 0,
|
|
435
|
+
'maxTotalVolumes': 10,
|
|
436
|
+
'totalVolumesUsed': 4,
|
|
437
|
+
'totalBackupsUsed': 0,
|
|
438
|
+
'totalGigabytesUsed': 35,
|
|
439
|
+
},
|
|
440
|
+
'rate': [
|
|
441
|
+
{
|
|
442
|
+
"uri": "*",
|
|
443
|
+
"limit": [
|
|
444
|
+
{
|
|
445
|
+
"value": 10,
|
|
446
|
+
"verb": "POST",
|
|
447
|
+
"remaining": 2,
|
|
448
|
+
"unit": "MINUTE",
|
|
449
|
+
"next-available": "2011-12-15T22:42:45Z",
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"value": 10,
|
|
453
|
+
"verb": "PUT",
|
|
454
|
+
"remaining": 2,
|
|
455
|
+
"unit": "MINUTE",
|
|
456
|
+
"next-available": "2011-12-15T22:42:45Z",
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
"value": 100,
|
|
460
|
+
"verb": "DELETE",
|
|
461
|
+
"remaining": 100,
|
|
462
|
+
"unit": "MINUTE",
|
|
463
|
+
"next-available": "2011-12-15T22:42:45Z",
|
|
464
|
+
},
|
|
465
|
+
],
|
|
466
|
+
}
|
|
467
|
+
],
|
|
468
|
+
}
|
|
469
|
+
limits_attrs.update(attrs)
|
|
470
|
+
|
|
471
|
+
limits = _limits.Limit(**limits_attrs)
|
|
472
|
+
return limits
|
|
473
|
+
|
|
474
|
+
|
|
227
475
|
def create_one_resource_filter(attrs=None):
|
|
228
476
|
"""Create a fake resource filter.
|
|
229
477
|
|
|
@@ -265,6 +513,172 @@ def create_resource_filters(attrs=None, count=2):
|
|
|
265
513
|
return resource_filters
|
|
266
514
|
|
|
267
515
|
|
|
516
|
+
def create_one_transfer(attrs=None):
|
|
517
|
+
"""Create a fake transfer.
|
|
518
|
+
|
|
519
|
+
:param dict attrs:
|
|
520
|
+
A dictionary with all attributes of Transfer Request
|
|
521
|
+
:return:
|
|
522
|
+
A FakeResource object with volume_id, name, id.
|
|
523
|
+
"""
|
|
524
|
+
# Set default attribute
|
|
525
|
+
transfer_info = {
|
|
526
|
+
'volume_id': 'volume-id-' + uuid.uuid4().hex,
|
|
527
|
+
'name': 'fake_transfer_name',
|
|
528
|
+
'id': 'id-' + uuid.uuid4().hex,
|
|
529
|
+
'links': 'links-' + uuid.uuid4().hex,
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
# Overwrite default attributes if there are some attributes set
|
|
533
|
+
attrs = attrs or {}
|
|
534
|
+
|
|
535
|
+
transfer_info.update(attrs)
|
|
536
|
+
|
|
537
|
+
transfer = fakes.FakeResource(None, transfer_info, loaded=True)
|
|
538
|
+
|
|
539
|
+
return transfer
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
def create_transfers(attrs=None, count=2):
|
|
543
|
+
"""Create multiple fake transfers.
|
|
544
|
+
|
|
545
|
+
:param dict attrs:
|
|
546
|
+
A dictionary with all attributes of transfer
|
|
547
|
+
:param Integer count:
|
|
548
|
+
The number of transfers to be faked
|
|
549
|
+
:return:
|
|
550
|
+
A list of FakeResource objects
|
|
551
|
+
"""
|
|
552
|
+
transfers = []
|
|
553
|
+
for n in range(0, count):
|
|
554
|
+
transfers.append(create_one_transfer(attrs))
|
|
555
|
+
|
|
556
|
+
return transfers
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
def get_transfers(transfers=None, count=2):
|
|
560
|
+
"""Get an iterable MagicMock object with a list of faked transfers.
|
|
561
|
+
|
|
562
|
+
If transfers list is provided, then initialize the Mock object with the
|
|
563
|
+
list. Otherwise create one.
|
|
564
|
+
|
|
565
|
+
:param List transfers:
|
|
566
|
+
A list of FakeResource objects faking transfers
|
|
567
|
+
:param Integer count:
|
|
568
|
+
The number of transfers to be faked
|
|
569
|
+
:return
|
|
570
|
+
An iterable Mock object with side_effect set to a list of faked
|
|
571
|
+
transfers
|
|
572
|
+
"""
|
|
573
|
+
if transfers is None:
|
|
574
|
+
transfers = create_transfers(count)
|
|
575
|
+
|
|
576
|
+
return mock.Mock(side_effect=transfers)
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
def create_one_type_access(attrs=None):
|
|
580
|
+
"""Create a fake volume type access for project.
|
|
581
|
+
|
|
582
|
+
:param dict attrs:
|
|
583
|
+
A dictionary with all attributes
|
|
584
|
+
:return:
|
|
585
|
+
A FakeResource object, with Volume_type_ID and Project_ID.
|
|
586
|
+
"""
|
|
587
|
+
if attrs is None:
|
|
588
|
+
attrs = {}
|
|
589
|
+
|
|
590
|
+
# Set default attributes.
|
|
591
|
+
type_access_attrs = {
|
|
592
|
+
'volume_type_id': 'volume-type-id-' + uuid.uuid4().hex,
|
|
593
|
+
'project_id': 'project-id-' + uuid.uuid4().hex,
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
# Overwrite default attributes.
|
|
597
|
+
type_access_attrs.update(attrs)
|
|
598
|
+
|
|
599
|
+
type_access = fakes.FakeResource(None, type_access_attrs, loaded=True)
|
|
600
|
+
|
|
601
|
+
return type_access
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
def create_one_volume(attrs=None):
|
|
605
|
+
"""Create a fake volume.
|
|
606
|
+
|
|
607
|
+
:param dict attrs:
|
|
608
|
+
A dictionary with all attributes of volume
|
|
609
|
+
:return:
|
|
610
|
+
A FakeResource object with id, name, status, etc.
|
|
611
|
+
"""
|
|
612
|
+
attrs = attrs or {}
|
|
613
|
+
|
|
614
|
+
# Set default attribute
|
|
615
|
+
volume_info = {
|
|
616
|
+
'id': 'volume-id' + uuid.uuid4().hex,
|
|
617
|
+
'name': 'volume-name' + uuid.uuid4().hex,
|
|
618
|
+
'description': 'description' + uuid.uuid4().hex,
|
|
619
|
+
'status': random.choice(['available', 'in_use']),
|
|
620
|
+
'size': random.randint(1, 20),
|
|
621
|
+
'volume_type': random.choice(['fake_lvmdriver-1', 'fake_lvmdriver-2']),
|
|
622
|
+
'bootable': random.randint(0, 1),
|
|
623
|
+
'metadata': {
|
|
624
|
+
'key' + uuid.uuid4().hex: 'val' + uuid.uuid4().hex,
|
|
625
|
+
'key' + uuid.uuid4().hex: 'val' + uuid.uuid4().hex,
|
|
626
|
+
'key' + uuid.uuid4().hex: 'val' + uuid.uuid4().hex,
|
|
627
|
+
},
|
|
628
|
+
'snapshot_id': random.randint(1, 5),
|
|
629
|
+
'availability_zone': 'zone' + uuid.uuid4().hex,
|
|
630
|
+
'attachments': [
|
|
631
|
+
{
|
|
632
|
+
'device': '/dev/' + uuid.uuid4().hex,
|
|
633
|
+
'server_id': uuid.uuid4().hex,
|
|
634
|
+
},
|
|
635
|
+
],
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
# Overwrite default attributes if there are some attributes set
|
|
639
|
+
volume_info.update(attrs)
|
|
640
|
+
|
|
641
|
+
volume = fakes.FakeResource(None, volume_info, loaded=True)
|
|
642
|
+
return volume
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
def create_volumes(attrs=None, count=2):
|
|
646
|
+
"""Create multiple fake volumes.
|
|
647
|
+
|
|
648
|
+
:param dict attrs:
|
|
649
|
+
A dictionary with all attributes of volume
|
|
650
|
+
:param Integer count:
|
|
651
|
+
The number of volumes to be faked
|
|
652
|
+
:return:
|
|
653
|
+
A list of FakeResource objects
|
|
654
|
+
"""
|
|
655
|
+
volumes = []
|
|
656
|
+
for n in range(0, count):
|
|
657
|
+
volumes.append(create_one_volume(attrs))
|
|
658
|
+
|
|
659
|
+
return volumes
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
def get_volumes(volumes=None, count=2):
|
|
663
|
+
"""Get an iterable MagicMock object with a list of faked volumes.
|
|
664
|
+
|
|
665
|
+
If volumes list is provided, then initialize the Mock object with the
|
|
666
|
+
list. Otherwise create one.
|
|
667
|
+
|
|
668
|
+
:param List volumes:
|
|
669
|
+
A list of FakeResource objects faking volumes
|
|
670
|
+
:param Integer count:
|
|
671
|
+
The number of volumes to be faked
|
|
672
|
+
:return
|
|
673
|
+
An iterable Mock object with side_effect set to a list of faked
|
|
674
|
+
volumes
|
|
675
|
+
"""
|
|
676
|
+
if volumes is None:
|
|
677
|
+
volumes = create_volumes(count)
|
|
678
|
+
|
|
679
|
+
return mock.Mock(side_effect=volumes)
|
|
680
|
+
|
|
681
|
+
|
|
268
682
|
def create_one_sdk_volume(attrs=None):
|
|
269
683
|
"""Create a fake volume.
|
|
270
684
|
|
|
@@ -603,6 +1017,75 @@ def get_volume_attachments(attachments=None, count=2):
|
|
|
603
1017
|
return mock.Mock(side_effect=attachments)
|
|
604
1018
|
|
|
605
1019
|
|
|
1020
|
+
def create_one_volume_type(attrs=None, methods=None):
|
|
1021
|
+
"""Create a fake volume type.
|
|
1022
|
+
|
|
1023
|
+
:param dict attrs:
|
|
1024
|
+
A dictionary with all attributes
|
|
1025
|
+
:param dict methods:
|
|
1026
|
+
A dictionary with all methods
|
|
1027
|
+
:return:
|
|
1028
|
+
A FakeResource object with id, name, description, etc.
|
|
1029
|
+
"""
|
|
1030
|
+
attrs = attrs or {}
|
|
1031
|
+
methods = methods or {}
|
|
1032
|
+
|
|
1033
|
+
# Set default attributes.
|
|
1034
|
+
volume_type_info = {
|
|
1035
|
+
"id": 'type-id-' + uuid.uuid4().hex,
|
|
1036
|
+
"name": 'type-name-' + uuid.uuid4().hex,
|
|
1037
|
+
"description": 'type-description-' + uuid.uuid4().hex,
|
|
1038
|
+
"extra_specs": {"foo": "bar"},
|
|
1039
|
+
"is_public": True,
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
# Overwrite default attributes.
|
|
1043
|
+
volume_type_info.update(attrs)
|
|
1044
|
+
|
|
1045
|
+
volume_type = fakes.FakeResource(
|
|
1046
|
+
info=copy.deepcopy(volume_type_info), methods=methods, loaded=True
|
|
1047
|
+
)
|
|
1048
|
+
return volume_type
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
def create_volume_types(attrs=None, count=2):
|
|
1052
|
+
"""Create multiple fake volume_types.
|
|
1053
|
+
|
|
1054
|
+
:param dict attrs:
|
|
1055
|
+
A dictionary with all attributes
|
|
1056
|
+
:param int count:
|
|
1057
|
+
The number of types to fake
|
|
1058
|
+
:return:
|
|
1059
|
+
A list of FakeResource objects faking the types
|
|
1060
|
+
"""
|
|
1061
|
+
volume_types = []
|
|
1062
|
+
for i in range(0, count):
|
|
1063
|
+
volume_type = create_one_volume_type(attrs)
|
|
1064
|
+
volume_types.append(volume_type)
|
|
1065
|
+
|
|
1066
|
+
return volume_types
|
|
1067
|
+
|
|
1068
|
+
|
|
1069
|
+
def get_volume_types(volume_types=None, count=2):
|
|
1070
|
+
"""Get an iterable MagicMock object with a list of faked volume types.
|
|
1071
|
+
|
|
1072
|
+
If volume_types list is provided, then initialize the Mock object with
|
|
1073
|
+
the list. Otherwise create one.
|
|
1074
|
+
|
|
1075
|
+
:param List volume_types:
|
|
1076
|
+
A list of FakeResource objects faking volume types
|
|
1077
|
+
:param Integer count:
|
|
1078
|
+
The number of volume types to be faked
|
|
1079
|
+
:return
|
|
1080
|
+
An iterable Mock object with side_effect set to a list of faked
|
|
1081
|
+
volume types
|
|
1082
|
+
"""
|
|
1083
|
+
if volume_types is None:
|
|
1084
|
+
volume_types = create_volume_types(count)
|
|
1085
|
+
|
|
1086
|
+
return mock.Mock(side_effect=volume_types)
|
|
1087
|
+
|
|
1088
|
+
|
|
606
1089
|
def create_service_log_level_entry(attrs=None):
|
|
607
1090
|
service_log_level_info = {
|
|
608
1091
|
'host': 'host_test',
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
|
|
13
13
|
import uuid
|
|
14
14
|
|
|
15
|
-
from cinderclient import api_versions
|
|
16
15
|
from osc_lib import exceptions
|
|
17
16
|
|
|
18
17
|
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
|
|
@@ -40,7 +39,7 @@ class TestBlockStorageCleanup(TestBlockStorage):
|
|
|
40
39
|
self.cmd = block_storage_cleanup.BlockStorageCleanup(self.app, None)
|
|
41
40
|
|
|
42
41
|
def test_cleanup(self):
|
|
43
|
-
self.
|
|
42
|
+
self.set_volume_api_version('3.24')
|
|
44
43
|
|
|
45
44
|
arglist = []
|
|
46
45
|
verifylist = [
|
|
@@ -96,7 +95,7 @@ class TestBlockStorageCleanup(TestBlockStorage):
|
|
|
96
95
|
)
|
|
97
96
|
|
|
98
97
|
def test_cleanup_with_args(self):
|
|
99
|
-
self.
|
|
98
|
+
self.set_volume_api_version('3.24')
|
|
100
99
|
|
|
101
100
|
fake_cluster = 'fake-cluster'
|
|
102
101
|
fake_host = 'fake-host'
|