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
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import copy
|
|
19
19
|
import logging
|
|
20
20
|
|
|
21
|
-
from
|
|
21
|
+
from openstack import exceptions as sdk_exc
|
|
22
22
|
from osc_lib.command import command
|
|
23
23
|
from osc_lib import exceptions
|
|
24
24
|
from osc_lib import utils
|
|
@@ -30,6 +30,33 @@ from openstackclient.identity import common
|
|
|
30
30
|
LOG = logging.getLogger(__name__)
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
def _format_user(user):
|
|
34
|
+
columns = (
|
|
35
|
+
'default_project_id',
|
|
36
|
+
'domain_id',
|
|
37
|
+
'email',
|
|
38
|
+
'is_enabled',
|
|
39
|
+
'id',
|
|
40
|
+
'name',
|
|
41
|
+
'description',
|
|
42
|
+
'password_expires_at',
|
|
43
|
+
)
|
|
44
|
+
column_headers = (
|
|
45
|
+
'default_project_id',
|
|
46
|
+
'domain_id',
|
|
47
|
+
'email',
|
|
48
|
+
'enabled',
|
|
49
|
+
'id',
|
|
50
|
+
'name',
|
|
51
|
+
'description',
|
|
52
|
+
'password_expires_at',
|
|
53
|
+
)
|
|
54
|
+
return (
|
|
55
|
+
column_headers,
|
|
56
|
+
utils.get_item_properties(user, columns),
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
33
60
|
def _get_options_for_user(identity_client, parsed_args):
|
|
34
61
|
options = {}
|
|
35
62
|
if parsed_args.ignore_lockout_failure_attempts:
|
|
@@ -161,7 +188,7 @@ class CreateUser(command.ShowOne):
|
|
|
161
188
|
_description = _("Create new user")
|
|
162
189
|
|
|
163
190
|
def get_parser(self, prog_name):
|
|
164
|
-
parser = super(
|
|
191
|
+
parser = super().get_parser(prog_name)
|
|
165
192
|
parser.add_argument(
|
|
166
193
|
'name',
|
|
167
194
|
metavar='<name>',
|
|
@@ -220,25 +247,26 @@ class CreateUser(command.ShowOne):
|
|
|
220
247
|
return parser
|
|
221
248
|
|
|
222
249
|
def take_action(self, parsed_args):
|
|
223
|
-
identity_client = self.app.client_manager.identity
|
|
224
|
-
|
|
225
|
-
project_id = None
|
|
226
|
-
if parsed_args.project:
|
|
227
|
-
project_id = common.find_project(
|
|
228
|
-
identity_client,
|
|
229
|
-
parsed_args.project,
|
|
230
|
-
parsed_args.project_domain,
|
|
231
|
-
).id
|
|
250
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
232
251
|
|
|
233
252
|
domain_id = None
|
|
234
253
|
if parsed_args.domain:
|
|
235
|
-
domain_id =
|
|
236
|
-
|
|
254
|
+
domain_id = identity_client.find_domain(
|
|
255
|
+
name_or_id=parsed_args.domain,
|
|
256
|
+
ignore_missing=False,
|
|
237
257
|
).id
|
|
238
258
|
|
|
239
|
-
|
|
259
|
+
project_id = None
|
|
260
|
+
if parsed_args.project:
|
|
261
|
+
project_id = identity_client.find_project(
|
|
262
|
+
name_or_id=parsed_args.project,
|
|
263
|
+
ignore_missing=False,
|
|
264
|
+
domain_id=domain_id,
|
|
265
|
+
).id
|
|
266
|
+
|
|
267
|
+
is_enabled = True
|
|
240
268
|
if parsed_args.disable:
|
|
241
|
-
|
|
269
|
+
is_enabled = False
|
|
242
270
|
if parsed_args.password_prompt:
|
|
243
271
|
parsed_args.password = utils.get_password(self.app.stdin)
|
|
244
272
|
|
|
@@ -252,36 +280,35 @@ class CreateUser(command.ShowOne):
|
|
|
252
280
|
options = _get_options_for_user(identity_client, parsed_args)
|
|
253
281
|
|
|
254
282
|
try:
|
|
255
|
-
user = identity_client.
|
|
283
|
+
user = identity_client.create_user(
|
|
284
|
+
default_project_id=project_id,
|
|
285
|
+
description=parsed_args.description,
|
|
286
|
+
domain_id=domain_id,
|
|
287
|
+
email=parsed_args.email,
|
|
288
|
+
is_enabled=is_enabled,
|
|
256
289
|
name=parsed_args.name,
|
|
257
|
-
domain=domain_id,
|
|
258
|
-
default_project=project_id,
|
|
259
290
|
password=parsed_args.password,
|
|
260
|
-
email=parsed_args.email,
|
|
261
|
-
description=parsed_args.description,
|
|
262
|
-
enabled=enabled,
|
|
263
291
|
options=options,
|
|
264
292
|
)
|
|
265
|
-
except
|
|
293
|
+
except sdk_exc.ConflictException:
|
|
266
294
|
if parsed_args.or_show:
|
|
267
|
-
user =
|
|
268
|
-
|
|
269
|
-
parsed_args.name,
|
|
295
|
+
user = identity_client.find_user(
|
|
296
|
+
name_or_id=parsed_args.name,
|
|
270
297
|
domain_id=domain_id,
|
|
298
|
+
ignore_missing=False,
|
|
271
299
|
)
|
|
272
300
|
LOG.info(_('Returning existing user %s'), user.name)
|
|
273
301
|
else:
|
|
274
302
|
raise
|
|
275
303
|
|
|
276
|
-
user
|
|
277
|
-
return zip(*sorted(user._info.items()))
|
|
304
|
+
return _format_user(user)
|
|
278
305
|
|
|
279
306
|
|
|
280
307
|
class DeleteUser(command.Command):
|
|
281
308
|
_description = _("Delete user(s)")
|
|
282
309
|
|
|
283
310
|
def get_parser(self, prog_name):
|
|
284
|
-
parser = super(
|
|
311
|
+
parser = super().get_parser(prog_name)
|
|
285
312
|
parser.add_argument(
|
|
286
313
|
'users',
|
|
287
314
|
metavar='<user>',
|
|
@@ -296,21 +323,28 @@ class DeleteUser(command.Command):
|
|
|
296
323
|
return parser
|
|
297
324
|
|
|
298
325
|
def take_action(self, parsed_args):
|
|
299
|
-
identity_client = self.app.client_manager.identity
|
|
326
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
300
327
|
|
|
301
328
|
domain = None
|
|
302
329
|
if parsed_args.domain:
|
|
303
|
-
domain =
|
|
330
|
+
domain = identity_client.find_domain(
|
|
331
|
+
name_or_id=parsed_args.domain,
|
|
332
|
+
ignore_missing=True,
|
|
333
|
+
)
|
|
304
334
|
errors = 0
|
|
305
335
|
for user in parsed_args.users:
|
|
306
336
|
try:
|
|
307
337
|
if domain is not None:
|
|
308
|
-
user_obj =
|
|
309
|
-
|
|
338
|
+
user_obj = identity_client.find_user(
|
|
339
|
+
name_or_id=user,
|
|
340
|
+
domain_id=domain.id,
|
|
341
|
+
ignore_missing=False,
|
|
310
342
|
)
|
|
311
343
|
else:
|
|
312
|
-
user_obj =
|
|
313
|
-
|
|
344
|
+
user_obj = identity_client.find_user(
|
|
345
|
+
name_or_id=user, ignore_missing=False
|
|
346
|
+
)
|
|
347
|
+
identity_client.delete_user(user_obj.id, ignore_missing=False)
|
|
314
348
|
except Exception as e:
|
|
315
349
|
errors += 1
|
|
316
350
|
LOG.error(
|
|
@@ -334,7 +368,7 @@ class ListUser(command.Lister):
|
|
|
334
368
|
_description = _("List users")
|
|
335
369
|
|
|
336
370
|
def get_parser(self, prog_name):
|
|
337
|
-
parser = super(
|
|
371
|
+
parser = super().get_parser(prog_name)
|
|
338
372
|
parser.add_argument(
|
|
339
373
|
'--domain',
|
|
340
374
|
metavar='<domain>',
|
|
@@ -360,32 +394,36 @@ class ListUser(command.Lister):
|
|
|
360
394
|
return parser
|
|
361
395
|
|
|
362
396
|
def take_action(self, parsed_args):
|
|
363
|
-
identity_client = self.app.client_manager.identity
|
|
397
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
364
398
|
|
|
365
399
|
domain = None
|
|
366
400
|
if parsed_args.domain:
|
|
367
|
-
domain =
|
|
401
|
+
domain = identity_client.find_domain(
|
|
402
|
+
name_or_id=parsed_args.domain,
|
|
403
|
+
).id
|
|
368
404
|
|
|
369
405
|
group = None
|
|
370
406
|
if parsed_args.group:
|
|
371
|
-
group =
|
|
372
|
-
|
|
407
|
+
group = identity_client.find_group(
|
|
408
|
+
name_or_id=parsed_args.group,
|
|
409
|
+
domain_id=parsed_args.domain,
|
|
410
|
+
ignore_missing=False,
|
|
373
411
|
).id
|
|
374
412
|
|
|
375
413
|
if parsed_args.project:
|
|
376
414
|
if domain is not None:
|
|
377
|
-
project =
|
|
378
|
-
|
|
379
|
-
parsed_args.project,
|
|
415
|
+
project = identity_client.find_project(
|
|
416
|
+
name_or_id=parsed_args.project,
|
|
380
417
|
domain_id=domain,
|
|
418
|
+
ignore_missing=False,
|
|
381
419
|
).id
|
|
382
420
|
else:
|
|
383
|
-
project =
|
|
384
|
-
|
|
385
|
-
|
|
421
|
+
project = identity_client.find_project(
|
|
422
|
+
name_or_id=parsed_args.project,
|
|
423
|
+
ignore_missing=False,
|
|
386
424
|
).id
|
|
387
425
|
|
|
388
|
-
assignments = identity_client.
|
|
426
|
+
assignments = identity_client.role_assignments_filter(
|
|
389
427
|
project=project
|
|
390
428
|
)
|
|
391
429
|
|
|
@@ -394,21 +432,25 @@ class ListUser(command.Lister):
|
|
|
394
432
|
# are looking for any role, let's just track unique user IDs.
|
|
395
433
|
user_ids = set()
|
|
396
434
|
for assignment in assignments:
|
|
397
|
-
if
|
|
435
|
+
if assignment.user:
|
|
398
436
|
user_ids.add(assignment.user['id'])
|
|
399
437
|
|
|
400
438
|
# NOTE(stevemar): Call find_resource once we have unique IDs, so
|
|
401
439
|
# it's fewer trips to the Identity API, then collect the data.
|
|
402
440
|
data = []
|
|
403
441
|
for user_id in user_ids:
|
|
404
|
-
user =
|
|
442
|
+
user = identity_client.find_user(user_id, ignore_missing=False)
|
|
405
443
|
data.append(user)
|
|
406
444
|
|
|
407
|
-
|
|
408
|
-
data = identity_client.
|
|
409
|
-
|
|
445
|
+
elif parsed_args.group:
|
|
446
|
+
data = identity_client.group_users(
|
|
447
|
+
domain_id=domain,
|
|
410
448
|
group=group,
|
|
411
449
|
)
|
|
450
|
+
else:
|
|
451
|
+
data = identity_client.users(
|
|
452
|
+
domain_id=domain,
|
|
453
|
+
)
|
|
412
454
|
|
|
413
455
|
# Column handling
|
|
414
456
|
if parsed_args.long:
|
|
@@ -419,11 +461,12 @@ class ListUser(command.Lister):
|
|
|
419
461
|
'Domain Id',
|
|
420
462
|
'Description',
|
|
421
463
|
'Email',
|
|
422
|
-
'Enabled',
|
|
464
|
+
'Is Enabled',
|
|
423
465
|
]
|
|
424
466
|
column_headers = copy.deepcopy(columns)
|
|
425
467
|
column_headers[2] = 'Project'
|
|
426
468
|
column_headers[3] = 'Domain'
|
|
469
|
+
column_headers[6] = 'Enabled'
|
|
427
470
|
else:
|
|
428
471
|
columns = ['ID', 'Name']
|
|
429
472
|
column_headers = columns
|
|
@@ -445,7 +488,7 @@ class SetUser(command.Command):
|
|
|
445
488
|
_description = _("Set user properties")
|
|
446
489
|
|
|
447
490
|
def get_parser(self, prog_name):
|
|
448
|
-
parser = super(
|
|
491
|
+
parser = super().get_parser(prog_name)
|
|
449
492
|
parser.add_argument(
|
|
450
493
|
'user',
|
|
451
494
|
metavar='<user>',
|
|
@@ -507,7 +550,7 @@ class SetUser(command.Command):
|
|
|
507
550
|
return parser
|
|
508
551
|
|
|
509
552
|
def take_action(self, parsed_args):
|
|
510
|
-
identity_client = self.app.client_manager.identity
|
|
553
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
511
554
|
|
|
512
555
|
if parsed_args.password_prompt:
|
|
513
556
|
parsed_args.password = utils.get_password(self.app.stdin)
|
|
@@ -524,14 +567,19 @@ class SetUser(command.Command):
|
|
|
524
567
|
identity_client, 'user', parsed_args.user, parsed_args.domain
|
|
525
568
|
)
|
|
526
569
|
if parsed_args.domain:
|
|
527
|
-
domain =
|
|
528
|
-
|
|
529
|
-
|
|
570
|
+
domain = identity_client.find_domain(
|
|
571
|
+
name_or_id=parsed_args.domain,
|
|
572
|
+
ignore_missing=False,
|
|
573
|
+
)
|
|
574
|
+
user = identity_client.find_user(
|
|
575
|
+
name_or_id=user_str,
|
|
576
|
+
domain_id=domain.id,
|
|
577
|
+
ignore_missing=False,
|
|
530
578
|
)
|
|
531
579
|
else:
|
|
532
|
-
user =
|
|
533
|
-
|
|
534
|
-
|
|
580
|
+
user = identity_client.find_user(
|
|
581
|
+
name_or_id=parsed_args.user,
|
|
582
|
+
ignore_missing=False,
|
|
535
583
|
)
|
|
536
584
|
|
|
537
585
|
kwargs = {}
|
|
@@ -544,23 +592,27 @@ class SetUser(command.Command):
|
|
|
544
592
|
if parsed_args.description:
|
|
545
593
|
kwargs['description'] = parsed_args.description
|
|
546
594
|
if parsed_args.project:
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
595
|
+
project_domain_id = identity_client.find_domain(
|
|
596
|
+
name_or_id=parsed_args.project_domain,
|
|
597
|
+
ignore_missing=False,
|
|
598
|
+
).id
|
|
599
|
+
project_id = identity_client.find_project(
|
|
600
|
+
name_or_id=parsed_args.project,
|
|
601
|
+
ignore_missing=False,
|
|
602
|
+
domain_id=project_domain_id,
|
|
551
603
|
).id
|
|
552
|
-
kwargs['
|
|
553
|
-
kwargs['
|
|
604
|
+
kwargs['default_project_id'] = project_id
|
|
605
|
+
kwargs['is_enabled'] = user.is_enabled
|
|
554
606
|
if parsed_args.enable:
|
|
555
|
-
kwargs['
|
|
607
|
+
kwargs['is_enabled'] = True
|
|
556
608
|
if parsed_args.disable:
|
|
557
|
-
kwargs['
|
|
609
|
+
kwargs['is_enabled'] = False
|
|
558
610
|
|
|
559
611
|
options = _get_options_for_user(identity_client, parsed_args)
|
|
560
612
|
if options:
|
|
561
613
|
kwargs['options'] = options
|
|
562
614
|
|
|
563
|
-
identity_client.
|
|
615
|
+
identity_client.update_user(user=user, **kwargs)
|
|
564
616
|
|
|
565
617
|
|
|
566
618
|
class SetPasswordUser(command.Command):
|
|
@@ -569,7 +621,7 @@ class SetPasswordUser(command.Command):
|
|
|
569
621
|
required_scope = False
|
|
570
622
|
|
|
571
623
|
def get_parser(self, prog_name):
|
|
572
|
-
parser = super(
|
|
624
|
+
parser = super().get_parser(prog_name)
|
|
573
625
|
parser.add_argument(
|
|
574
626
|
'--password',
|
|
575
627
|
metavar='<new-password>',
|
|
@@ -583,7 +635,7 @@ class SetPasswordUser(command.Command):
|
|
|
583
635
|
return parser
|
|
584
636
|
|
|
585
637
|
def take_action(self, parsed_args):
|
|
586
|
-
identity_client = self.app.client_manager.identity
|
|
638
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
587
639
|
|
|
588
640
|
# FIXME(gyee): there are two scenarios:
|
|
589
641
|
#
|
|
@@ -625,14 +677,16 @@ class SetPasswordUser(command.Command):
|
|
|
625
677
|
)
|
|
626
678
|
)
|
|
627
679
|
|
|
628
|
-
identity_client.
|
|
680
|
+
identity_client.update_user(
|
|
681
|
+
current_password=current_password, password=password
|
|
682
|
+
)
|
|
629
683
|
|
|
630
684
|
|
|
631
685
|
class ShowUser(command.ShowOne):
|
|
632
686
|
_description = _("Display user details")
|
|
633
687
|
|
|
634
688
|
def get_parser(self, prog_name):
|
|
635
|
-
parser = super(
|
|
689
|
+
parser = super().get_parser(prog_name)
|
|
636
690
|
parser.add_argument(
|
|
637
691
|
'user',
|
|
638
692
|
metavar='<user>',
|
|
@@ -646,18 +700,28 @@ class ShowUser(command.ShowOne):
|
|
|
646
700
|
return parser
|
|
647
701
|
|
|
648
702
|
def take_action(self, parsed_args):
|
|
649
|
-
identity_client = self.app.client_manager.identity
|
|
703
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
650
704
|
|
|
651
705
|
user_str = common._get_token_resource(
|
|
652
706
|
identity_client, 'user', parsed_args.user, parsed_args.domain
|
|
653
707
|
)
|
|
708
|
+
|
|
709
|
+
domain = None
|
|
654
710
|
if parsed_args.domain:
|
|
655
|
-
domain =
|
|
656
|
-
|
|
657
|
-
|
|
711
|
+
domain = identity_client.find_domain(
|
|
712
|
+
name_or_id=parsed_args.domain,
|
|
713
|
+
ignore_missing=True,
|
|
714
|
+
)
|
|
715
|
+
if domain:
|
|
716
|
+
user = identity_client.find_user(
|
|
717
|
+
name_or_id=user_str,
|
|
718
|
+
domain_id=domain.id,
|
|
719
|
+
ignore_missing=False,
|
|
658
720
|
)
|
|
659
721
|
else:
|
|
660
|
-
user =
|
|
722
|
+
user = identity_client.find_user(
|
|
723
|
+
name_or_id=user_str,
|
|
724
|
+
ignore_missing=False,
|
|
725
|
+
)
|
|
661
726
|
|
|
662
|
-
user
|
|
663
|
-
return zip(*sorted(user._info.items()))
|
|
727
|
+
return _format_user(user)
|
openstackclient/image/client.py
CHANGED
|
@@ -19,19 +19,19 @@ from osc_lib import utils
|
|
|
19
19
|
|
|
20
20
|
from openstackclient.i18n import _
|
|
21
21
|
|
|
22
|
-
|
|
23
22
|
LOG = logging.getLogger(__name__)
|
|
24
23
|
|
|
25
24
|
DEFAULT_API_VERSION = '2'
|
|
26
25
|
API_VERSION_OPTION = 'os_image_api_version'
|
|
27
|
-
API_NAME =
|
|
26
|
+
API_NAME = 'image'
|
|
28
27
|
API_VERSIONS = {
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
'1': 'openstack.connection.Connection',
|
|
29
|
+
'2': 'openstack.connection.Connection',
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
|
|
34
33
|
def make_client(instance):
|
|
34
|
+
"""Returns an image service client."""
|
|
35
35
|
LOG.debug(
|
|
36
36
|
'Image client initialized using OpenStack SDK: %s',
|
|
37
37
|
instance.sdk_connection.image,
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
"""Image V1 Action Implementations"""
|
|
17
17
|
|
|
18
18
|
import argparse
|
|
19
|
-
import io
|
|
20
19
|
import logging
|
|
21
20
|
import os
|
|
22
21
|
import sys
|
|
@@ -110,7 +109,7 @@ class CreateImage(command.ShowOne):
|
|
|
110
109
|
_description = _("Create/upload an image")
|
|
111
110
|
|
|
112
111
|
def get_parser(self, prog_name):
|
|
113
|
-
parser = super(
|
|
112
|
+
parser = super().get_parser(prog_name)
|
|
114
113
|
parser.add_argument(
|
|
115
114
|
"name",
|
|
116
115
|
metavar="<image-name>",
|
|
@@ -320,7 +319,7 @@ class CreateImage(command.ShowOne):
|
|
|
320
319
|
elif parsed_args.file:
|
|
321
320
|
# Send an open file handle to glanceclient so it will
|
|
322
321
|
# do a chunked transfer
|
|
323
|
-
kwargs["data"] =
|
|
322
|
+
kwargs["data"] = open(parsed_args.file, "rb")
|
|
324
323
|
else:
|
|
325
324
|
# Read file from stdin
|
|
326
325
|
if not sys.stdin.isatty():
|
|
@@ -363,7 +362,7 @@ class DeleteImage(command.Command):
|
|
|
363
362
|
_description = _("Delete image(s)")
|
|
364
363
|
|
|
365
364
|
def get_parser(self, prog_name):
|
|
366
|
-
parser = super(
|
|
365
|
+
parser = super().get_parser(prog_name)
|
|
367
366
|
parser.add_argument(
|
|
368
367
|
"images",
|
|
369
368
|
metavar="<image>",
|
|
@@ -403,7 +402,7 @@ class ListImage(command.Lister):
|
|
|
403
402
|
_description = _("List available images")
|
|
404
403
|
|
|
405
404
|
def get_parser(self, prog_name):
|
|
406
|
-
parser = super(
|
|
405
|
+
parser = super().get_parser(prog_name)
|
|
407
406
|
public_group = parser.add_mutually_exclusive_group()
|
|
408
407
|
public_group.add_argument(
|
|
409
408
|
"--public",
|
|
@@ -534,7 +533,7 @@ class SaveImage(command.Command):
|
|
|
534
533
|
_description = _("Save an image locally")
|
|
535
534
|
|
|
536
535
|
def get_parser(self, prog_name):
|
|
537
|
-
parser = super(
|
|
536
|
+
parser = super().get_parser(prog_name)
|
|
538
537
|
parser.add_argument(
|
|
539
538
|
"--file",
|
|
540
539
|
metavar="<filename>",
|
|
@@ -564,7 +563,7 @@ class SetImage(command.Command):
|
|
|
564
563
|
_description = _("Set image properties")
|
|
565
564
|
|
|
566
565
|
def get_parser(self, prog_name):
|
|
567
|
-
parser = super(
|
|
566
|
+
parser = super().get_parser(prog_name)
|
|
568
567
|
parser.add_argument(
|
|
569
568
|
"image",
|
|
570
569
|
metavar="<image>",
|
|
@@ -771,7 +770,7 @@ class SetImage(command.Command):
|
|
|
771
770
|
elif parsed_args.file:
|
|
772
771
|
# Send an open file handle to glanceclient so it will
|
|
773
772
|
# do a chunked transfer
|
|
774
|
-
kwargs["data"] =
|
|
773
|
+
kwargs["data"] = open(parsed_args.file, "rb")
|
|
775
774
|
else:
|
|
776
775
|
# Read file from stdin
|
|
777
776
|
if sys.stdin.isatty() is not True:
|
|
@@ -809,7 +808,7 @@ class ShowImage(command.ShowOne):
|
|
|
809
808
|
_description = _("Display image details")
|
|
810
809
|
|
|
811
810
|
def get_parser(self, prog_name):
|
|
812
|
-
parser = super(
|
|
811
|
+
parser = super().get_parser(prog_name)
|
|
813
812
|
parser.add_argument(
|
|
814
813
|
"--human-readable",
|
|
815
814
|
default=False,
|
|
@@ -36,16 +36,16 @@ def _format_image_cache(cached_images):
|
|
|
36
36
|
for image in cached_images[item]:
|
|
37
37
|
image_obj = copy.deepcopy(image)
|
|
38
38
|
image_obj['state'] = 'cached'
|
|
39
|
-
image_obj[
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
)
|
|
44
|
-
image_obj[
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
)
|
|
39
|
+
image_obj['last_accessed'] = (
|
|
40
|
+
datetime.datetime.utcfromtimestamp(
|
|
41
|
+
image['last_accessed']
|
|
42
|
+
).isoformat()
|
|
43
|
+
)
|
|
44
|
+
image_obj['last_modified'] = (
|
|
45
|
+
datetime.datetime.utcfromtimestamp(
|
|
46
|
+
image['last_modified']
|
|
47
|
+
).isoformat()
|
|
48
|
+
)
|
|
49
49
|
image_list.append(image_obj)
|
|
50
50
|
elif item == "queued_images":
|
|
51
51
|
for image in cached_images[item]:
|
|
@@ -194,6 +194,7 @@ class ClearCachedImage(command.Command):
|
|
|
194
194
|
"--cache",
|
|
195
195
|
action="store_const",
|
|
196
196
|
const="cache",
|
|
197
|
+
default="both",
|
|
197
198
|
dest="target",
|
|
198
199
|
help=_("Clears all the cached images"),
|
|
199
200
|
)
|
|
@@ -201,6 +202,7 @@ class ClearCachedImage(command.Command):
|
|
|
201
202
|
"--queue",
|
|
202
203
|
action="store_const",
|
|
203
204
|
const="queue",
|
|
205
|
+
default="both",
|
|
204
206
|
dest="target",
|
|
205
207
|
help=_("Clears all the queued images"),
|
|
206
208
|
)
|
|
@@ -223,3 +223,47 @@ class SetMetadefObject(command.Command):
|
|
|
223
223
|
image_client.update_metadef_object(
|
|
224
224
|
object, parsed_args.namespace, **kwargs
|
|
225
225
|
)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class ShowMetadefObjectProperty(command.ShowOne):
|
|
229
|
+
_description = _(
|
|
230
|
+
"Describe a specific metadata definitions property inside an object."
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
def get_parser(self, prog_name):
|
|
234
|
+
parser = super().get_parser(prog_name)
|
|
235
|
+
parser.add_argument(
|
|
236
|
+
"namespace",
|
|
237
|
+
metavar="<namespace_name>",
|
|
238
|
+
help=_("Namespace (name) for the namespace"),
|
|
239
|
+
)
|
|
240
|
+
parser.add_argument(
|
|
241
|
+
"object",
|
|
242
|
+
metavar="<object_name>",
|
|
243
|
+
help=_("Name of an object."),
|
|
244
|
+
)
|
|
245
|
+
parser.add_argument(
|
|
246
|
+
"property",
|
|
247
|
+
help=_("Name of the property."),
|
|
248
|
+
)
|
|
249
|
+
return parser
|
|
250
|
+
|
|
251
|
+
def take_action(self, parsed_args):
|
|
252
|
+
image_client = self.app.client_manager.image
|
|
253
|
+
|
|
254
|
+
namespace_name = parsed_args.namespace
|
|
255
|
+
object_name = parsed_args.object
|
|
256
|
+
|
|
257
|
+
obj = image_client.get_metadef_object(object_name, namespace_name)
|
|
258
|
+
try:
|
|
259
|
+
prop = obj['properties'][parsed_args.property]
|
|
260
|
+
prop['name'] = parsed_args.property
|
|
261
|
+
|
|
262
|
+
except KeyError:
|
|
263
|
+
msg = _('Property %s not found in object %s.') % (
|
|
264
|
+
parsed_args.property,
|
|
265
|
+
parsed_args.object,
|
|
266
|
+
)
|
|
267
|
+
raise exceptions.CommandError(msg)
|
|
268
|
+
|
|
269
|
+
return zip(*sorted(prop.items()))
|