python-openstackclient 6.6.1__py3-none-any.whl → 7.1.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 +4 -4
- 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 +24 -20
- openstackclient/common/configuration.py +1 -1
- openstackclient/common/extension.py +1 -1
- openstackclient/common/limits.py +67 -34
- openstackclient/common/module.py +3 -3
- openstackclient/common/progressbar.py +2 -2
- openstackclient/common/project_cleanup.py +5 -2
- openstackclient/common/quota.py +299 -423
- openstackclient/common/versions.py +1 -1
- openstackclient/compute/client.py +7 -116
- openstackclient/compute/v2/agent.py +75 -49
- openstackclient/compute/v2/aggregate.py +38 -32
- 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 +9 -6
- openstackclient/compute/v2/keypair.py +7 -8
- openstackclient/compute/v2/server.py +479 -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 +125 -43
- 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/releasenotes/notes/volume-backup-created-at-list-b49ec893ae1f6b0d.yaml +4 -0
- 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 +12 -4
- openstackclient/tests/functional/identity/v3/test_application_credential.py +6 -12
- 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_region.py +1 -3
- 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 +1 -3
- 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 +87 -57
- 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 +57 -34
- 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 +2850 -2453
- 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 +12 -12
- 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 +207 -230
- 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 +90 -94
- 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 +10 -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 +9 -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.1.dist-info → python_openstackclient-7.1.0.dist-info}/AUTHORS +6 -0
- {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/METADATA +4 -4
- python_openstackclient-7.1.0.dist-info/RECORD +503 -0
- {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/entry_points.txt +33 -27
- python_openstackclient-7.1.0.dist-info/pbr.json +1 -0
- python_openstackclient-6.6.1.dist-info/RECORD +0 -489
- python_openstackclient-6.6.1.dist-info/pbr.json +0 -1
- {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/WHEEL +0 -0
- {python_openstackclient-6.6.1.dist-info → python_openstackclient-7.1.0.dist-info}/top_level.txt +0 -0
|
@@ -13,22 +13,62 @@
|
|
|
13
13
|
|
|
14
14
|
"""Identity v3 Assignment action implementations"""
|
|
15
15
|
|
|
16
|
+
from openstack import exceptions as sdk_exceptions
|
|
16
17
|
from osc_lib.command import command
|
|
17
|
-
from osc_lib import utils
|
|
18
18
|
|
|
19
19
|
from openstackclient.i18n import _
|
|
20
20
|
from openstackclient.identity import common
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
def _format_role_assignment_(assignment, include_names):
|
|
24
|
+
def _get_names(attr):
|
|
25
|
+
return (
|
|
26
|
+
(
|
|
27
|
+
attr['name']
|
|
28
|
+
+ (
|
|
29
|
+
"@" + domain['name']
|
|
30
|
+
if (domain := attr.get('domain'))
|
|
31
|
+
else ''
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
or ''
|
|
35
|
+
if attr
|
|
36
|
+
else ''
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def _get_ids(attr):
|
|
40
|
+
return attr['id'] or '' if attr else ''
|
|
41
|
+
|
|
42
|
+
func = _get_names if include_names else _get_ids
|
|
43
|
+
return (
|
|
44
|
+
func(assignment.role),
|
|
45
|
+
func(assignment.user),
|
|
46
|
+
func(assignment.group),
|
|
47
|
+
func(assignment.scope.get('project')),
|
|
48
|
+
func(assignment.scope.get('domain')),
|
|
49
|
+
'all' if assignment.scope.get("system") else '',
|
|
50
|
+
assignment.scope.get("OS-INHERIT:inherited_to") == 'projects',
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _find_sdk_id(find_command, name_or_id, **kwargs):
|
|
55
|
+
try:
|
|
56
|
+
return find_command(
|
|
57
|
+
name_or_id=name_or_id, ignore_missing=False, **kwargs
|
|
58
|
+
).id
|
|
59
|
+
except sdk_exceptions.ForbiddenException:
|
|
60
|
+
return name_or_id
|
|
61
|
+
|
|
62
|
+
|
|
23
63
|
class ListRoleAssignment(command.Lister):
|
|
24
64
|
_description = _("List role assignments")
|
|
25
65
|
|
|
26
66
|
def get_parser(self, prog_name):
|
|
27
|
-
parser = super(
|
|
67
|
+
parser = super().get_parser(prog_name)
|
|
28
68
|
parser.add_argument(
|
|
29
69
|
'--effective',
|
|
30
70
|
action="store_true",
|
|
31
|
-
default=
|
|
71
|
+
default=None,
|
|
32
72
|
help=_('Returns only effective role assignments'),
|
|
33
73
|
)
|
|
34
74
|
parser.add_argument(
|
|
@@ -88,81 +128,74 @@ class ListRoleAssignment(command.Lister):
|
|
|
88
128
|
)
|
|
89
129
|
return parser
|
|
90
130
|
|
|
91
|
-
def _as_tuple(self, assignment):
|
|
92
|
-
return (
|
|
93
|
-
assignment.role,
|
|
94
|
-
assignment.user,
|
|
95
|
-
assignment.group,
|
|
96
|
-
assignment.project,
|
|
97
|
-
assignment.domain,
|
|
98
|
-
assignment.system,
|
|
99
|
-
assignment.inherited,
|
|
100
|
-
)
|
|
101
|
-
|
|
102
131
|
def take_action(self, parsed_args):
|
|
103
|
-
identity_client = self.app.client_manager.identity
|
|
132
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
104
133
|
auth_ref = self.app.client_manager.auth_ref
|
|
105
134
|
|
|
106
|
-
|
|
135
|
+
role_id = None
|
|
107
136
|
role_domain_id = None
|
|
108
137
|
if parsed_args.role_domain:
|
|
109
|
-
role_domain_id =
|
|
110
|
-
identity_client,
|
|
111
|
-
|
|
138
|
+
role_domain_id = _find_sdk_id(
|
|
139
|
+
identity_client.find_domain,
|
|
140
|
+
name_or_id=parsed_args.role_domain,
|
|
141
|
+
)
|
|
112
142
|
if parsed_args.role:
|
|
113
|
-
|
|
114
|
-
identity_client.
|
|
115
|
-
parsed_args.role,
|
|
143
|
+
role_id = _find_sdk_id(
|
|
144
|
+
identity_client.find_role,
|
|
145
|
+
name_or_id=parsed_args.role,
|
|
116
146
|
domain_id=role_domain_id,
|
|
117
147
|
)
|
|
118
148
|
|
|
119
|
-
|
|
149
|
+
user_id = None
|
|
120
150
|
if parsed_args.user:
|
|
121
|
-
|
|
122
|
-
identity_client,
|
|
123
|
-
parsed_args.user,
|
|
124
|
-
parsed_args.user_domain,
|
|
151
|
+
user_id = _find_sdk_id(
|
|
152
|
+
identity_client.find_user,
|
|
153
|
+
name_or_id=parsed_args.user,
|
|
154
|
+
domain_id=parsed_args.user_domain,
|
|
125
155
|
)
|
|
126
156
|
elif parsed_args.authuser:
|
|
127
157
|
if auth_ref:
|
|
128
|
-
|
|
158
|
+
user_id = _find_sdk_id(
|
|
159
|
+
identity_client.find_user,
|
|
160
|
+
name_or_id=auth_ref.user_id,
|
|
161
|
+
)
|
|
129
162
|
|
|
130
163
|
system = None
|
|
131
164
|
if parsed_args.system:
|
|
132
165
|
system = parsed_args.system
|
|
133
166
|
|
|
134
|
-
|
|
167
|
+
domain_id = None
|
|
135
168
|
if parsed_args.domain:
|
|
136
|
-
|
|
137
|
-
identity_client,
|
|
138
|
-
parsed_args.domain,
|
|
169
|
+
domain_id = _find_sdk_id(
|
|
170
|
+
identity_client.find_domain,
|
|
171
|
+
name_or_id=parsed_args.domain,
|
|
139
172
|
)
|
|
140
173
|
|
|
141
|
-
|
|
174
|
+
project_id = None
|
|
142
175
|
if parsed_args.project:
|
|
143
|
-
|
|
144
|
-
identity_client,
|
|
145
|
-
common._get_token_resource(
|
|
176
|
+
project_id = _find_sdk_id(
|
|
177
|
+
identity_client.find_project,
|
|
178
|
+
name_or_id=common._get_token_resource(
|
|
146
179
|
identity_client, 'project', parsed_args.project
|
|
147
180
|
),
|
|
148
|
-
parsed_args.project_domain,
|
|
181
|
+
domain_id=parsed_args.project_domain,
|
|
149
182
|
)
|
|
150
183
|
elif parsed_args.authproject:
|
|
151
184
|
if auth_ref:
|
|
152
|
-
|
|
153
|
-
identity_client,
|
|
185
|
+
project_id = _find_sdk_id(
|
|
186
|
+
identity_client.find_project,
|
|
187
|
+
name_or_id=auth_ref.project_id,
|
|
154
188
|
)
|
|
155
189
|
|
|
156
|
-
|
|
190
|
+
group_id = None
|
|
157
191
|
if parsed_args.group:
|
|
158
|
-
|
|
159
|
-
identity_client,
|
|
160
|
-
parsed_args.group,
|
|
161
|
-
parsed_args.group_domain,
|
|
192
|
+
group_id = _find_sdk_id(
|
|
193
|
+
identity_client.find_group,
|
|
194
|
+
name_or_id=parsed_args.group,
|
|
195
|
+
domain_id=parsed_args.group_domain,
|
|
162
196
|
)
|
|
163
197
|
|
|
164
|
-
include_names = True if parsed_args.names else
|
|
165
|
-
effective = True if parsed_args.effective else False
|
|
198
|
+
include_names = True if parsed_args.names else None
|
|
166
199
|
columns = (
|
|
167
200
|
'Role',
|
|
168
201
|
'User',
|
|
@@ -174,104 +207,23 @@ class ListRoleAssignment(command.Lister):
|
|
|
174
207
|
)
|
|
175
208
|
|
|
176
209
|
inherited_to = 'projects' if parsed_args.inherited else None
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
210
|
+
|
|
211
|
+
data = identity_client.role_assignments(
|
|
212
|
+
role_id=role_id,
|
|
213
|
+
user_id=user_id,
|
|
214
|
+
group_id=group_id,
|
|
215
|
+
scope_project_id=project_id,
|
|
216
|
+
scope_domain_id=domain_id,
|
|
217
|
+
scope_system=system,
|
|
218
|
+
effective=parsed_args.effective,
|
|
186
219
|
include_names=include_names,
|
|
220
|
+
inherited_to=inherited_to,
|
|
187
221
|
)
|
|
188
222
|
|
|
189
223
|
data_parsed = []
|
|
190
224
|
for assignment in data:
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
if include_names:
|
|
195
|
-
prj = '@'.join(
|
|
196
|
-
[
|
|
197
|
-
scope['project']['name'],
|
|
198
|
-
scope['project']['domain']['name'],
|
|
199
|
-
]
|
|
200
|
-
)
|
|
201
|
-
setattr(assignment, 'project', prj)
|
|
202
|
-
else:
|
|
203
|
-
setattr(assignment, 'project', scope['project']['id'])
|
|
204
|
-
assignment.domain = ''
|
|
205
|
-
assignment.system = ''
|
|
206
|
-
elif 'domain' in scope:
|
|
207
|
-
if include_names:
|
|
208
|
-
setattr(assignment, 'domain', scope['domain']['name'])
|
|
209
|
-
else:
|
|
210
|
-
setattr(assignment, 'domain', scope['domain']['id'])
|
|
211
|
-
assignment.project = ''
|
|
212
|
-
assignment.system = ''
|
|
213
|
-
elif 'system' in scope:
|
|
214
|
-
# NOTE(lbragstad): If, or when, keystone supports role
|
|
215
|
-
# assignments on subsets of a system, this will have to evolve
|
|
216
|
-
# to handle that case instead of hardcoding to the entire
|
|
217
|
-
# system.
|
|
218
|
-
setattr(assignment, 'system', 'all')
|
|
219
|
-
assignment.domain = ''
|
|
220
|
-
assignment.project = ''
|
|
221
|
-
else:
|
|
222
|
-
assignment.system = ''
|
|
223
|
-
assignment.domain = ''
|
|
224
|
-
assignment.project = ''
|
|
225
|
-
|
|
226
|
-
inherited = scope.get('OS-INHERIT:inherited_to') == 'projects'
|
|
227
|
-
assignment.inherited = inherited
|
|
228
|
-
|
|
229
|
-
del assignment.scope
|
|
230
|
-
|
|
231
|
-
if hasattr(assignment, 'user'):
|
|
232
|
-
if include_names:
|
|
233
|
-
usr = '@'.join(
|
|
234
|
-
[
|
|
235
|
-
assignment.user['name'],
|
|
236
|
-
assignment.user['domain']['name'],
|
|
237
|
-
]
|
|
238
|
-
)
|
|
239
|
-
setattr(assignment, 'user', usr)
|
|
240
|
-
else:
|
|
241
|
-
setattr(assignment, 'user', assignment.user['id'])
|
|
242
|
-
assignment.group = ''
|
|
243
|
-
elif hasattr(assignment, 'group'):
|
|
244
|
-
if include_names:
|
|
245
|
-
grp = '@'.join(
|
|
246
|
-
[
|
|
247
|
-
assignment.group['name'],
|
|
248
|
-
assignment.group['domain']['name'],
|
|
249
|
-
]
|
|
250
|
-
)
|
|
251
|
-
setattr(assignment, 'group', grp)
|
|
252
|
-
else:
|
|
253
|
-
setattr(assignment, 'group', assignment.group['id'])
|
|
254
|
-
assignment.user = ''
|
|
255
|
-
else:
|
|
256
|
-
assignment.user = ''
|
|
257
|
-
assignment.group = ''
|
|
258
|
-
|
|
259
|
-
if hasattr(assignment, 'role'):
|
|
260
|
-
if include_names:
|
|
261
|
-
# TODO(henry-nash): If this is a domain specific role it
|
|
262
|
-
# would be good show this as role@domain, although this
|
|
263
|
-
# domain info is not yet included in the response from the
|
|
264
|
-
# server. Although we could get it by re-reading the role
|
|
265
|
-
# from the ID, let's wait until the server does the right
|
|
266
|
-
# thing.
|
|
267
|
-
setattr(assignment, 'role', assignment.role['name'])
|
|
268
|
-
else:
|
|
269
|
-
setattr(assignment, 'role', assignment.role['id'])
|
|
270
|
-
else:
|
|
271
|
-
assignment.role = ''
|
|
272
|
-
|
|
273
|
-
# Creating a tuple from data object fields
|
|
274
|
-
# (including the blank ones)
|
|
275
|
-
data_parsed.append(self._as_tuple(assignment))
|
|
225
|
+
data_parsed.append(
|
|
226
|
+
_format_role_assignment_(assignment, include_names)
|
|
227
|
+
)
|
|
276
228
|
|
|
277
229
|
return columns, tuple(data_parsed)
|
|
@@ -28,11 +28,36 @@ from openstackclient.identity import common
|
|
|
28
28
|
LOG = logging.getLogger(__name__)
|
|
29
29
|
|
|
30
30
|
|
|
31
|
+
def _format_service(service):
|
|
32
|
+
columns = (
|
|
33
|
+
'id',
|
|
34
|
+
'name',
|
|
35
|
+
'type',
|
|
36
|
+
'is_enabled',
|
|
37
|
+
'description',
|
|
38
|
+
)
|
|
39
|
+
column_headers = (
|
|
40
|
+
'id',
|
|
41
|
+
'name',
|
|
42
|
+
'type',
|
|
43
|
+
'enabled',
|
|
44
|
+
'description',
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
column_headers,
|
|
49
|
+
utils.get_item_properties(
|
|
50
|
+
service,
|
|
51
|
+
columns,
|
|
52
|
+
),
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
31
56
|
class CreateService(command.ShowOne):
|
|
32
57
|
_description = _("Create new service")
|
|
33
58
|
|
|
34
59
|
def get_parser(self, prog_name):
|
|
35
|
-
parser = super(
|
|
60
|
+
parser = super().get_parser(prog_name)
|
|
36
61
|
parser.add_argument(
|
|
37
62
|
'type',
|
|
38
63
|
metavar='<type>',
|
|
@@ -52,38 +77,37 @@ class CreateService(command.ShowOne):
|
|
|
52
77
|
enable_group.add_argument(
|
|
53
78
|
'--enable',
|
|
54
79
|
action='store_true',
|
|
80
|
+
dest='is_enabled',
|
|
81
|
+
default=True,
|
|
55
82
|
help=_('Enable service (default)'),
|
|
56
83
|
)
|
|
57
84
|
enable_group.add_argument(
|
|
58
85
|
'--disable',
|
|
59
|
-
action='
|
|
86
|
+
action='store_false',
|
|
87
|
+
dest='is_enabled',
|
|
88
|
+
default=True,
|
|
60
89
|
help=_('Disable service'),
|
|
61
90
|
)
|
|
62
91
|
return parser
|
|
63
92
|
|
|
64
93
|
def take_action(self, parsed_args):
|
|
65
|
-
identity_client = self.app.client_manager.identity
|
|
66
|
-
|
|
67
|
-
enabled = True
|
|
68
|
-
if parsed_args.disable:
|
|
69
|
-
enabled = False
|
|
94
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
70
95
|
|
|
71
|
-
service = identity_client.
|
|
96
|
+
service = identity_client.create_service(
|
|
72
97
|
name=parsed_args.name,
|
|
73
98
|
type=parsed_args.type,
|
|
74
99
|
description=parsed_args.description,
|
|
75
|
-
|
|
100
|
+
is_enabled=parsed_args.is_enabled,
|
|
76
101
|
)
|
|
77
102
|
|
|
78
|
-
service
|
|
79
|
-
return zip(*sorted(service._info.items()))
|
|
103
|
+
return _format_service(service)
|
|
80
104
|
|
|
81
105
|
|
|
82
106
|
class DeleteService(command.Command):
|
|
83
107
|
_description = _("Delete service(s)")
|
|
84
108
|
|
|
85
109
|
def get_parser(self, prog_name):
|
|
86
|
-
parser = super(
|
|
110
|
+
parser = super().get_parser(prog_name)
|
|
87
111
|
parser.add_argument(
|
|
88
112
|
'service',
|
|
89
113
|
metavar='<service>',
|
|
@@ -93,12 +117,12 @@ class DeleteService(command.Command):
|
|
|
93
117
|
return parser
|
|
94
118
|
|
|
95
119
|
def take_action(self, parsed_args):
|
|
96
|
-
identity_client = self.app.client_manager.identity
|
|
120
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
97
121
|
result = 0
|
|
98
122
|
for i in parsed_args.service:
|
|
99
123
|
try:
|
|
100
|
-
service = common.
|
|
101
|
-
identity_client.
|
|
124
|
+
service = common.find_service_sdk(identity_client, i)
|
|
125
|
+
identity_client.delete_service(service.id)
|
|
102
126
|
except Exception as e:
|
|
103
127
|
result += 1
|
|
104
128
|
LOG.error(
|
|
@@ -121,7 +145,7 @@ class ListService(command.Lister):
|
|
|
121
145
|
_description = _("List services")
|
|
122
146
|
|
|
123
147
|
def get_parser(self, prog_name):
|
|
124
|
-
parser = super(
|
|
148
|
+
parser = super().get_parser(prog_name)
|
|
125
149
|
parser.add_argument(
|
|
126
150
|
'--long',
|
|
127
151
|
action='store_true',
|
|
@@ -131,13 +155,19 @@ class ListService(command.Lister):
|
|
|
131
155
|
return parser
|
|
132
156
|
|
|
133
157
|
def take_action(self, parsed_args):
|
|
158
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
159
|
+
|
|
134
160
|
if parsed_args.long:
|
|
135
|
-
columns = ('
|
|
161
|
+
columns = ('id', 'name', 'type', 'description', 'is_enabled')
|
|
162
|
+
column_headers = ('ID', 'Name', 'Type', 'Description', 'Enabled')
|
|
136
163
|
else:
|
|
137
|
-
columns = ('
|
|
138
|
-
|
|
164
|
+
columns = ('id', 'name', 'type')
|
|
165
|
+
column_headers = ('ID', 'Name', 'Type')
|
|
166
|
+
|
|
167
|
+
data = identity_client.services()
|
|
168
|
+
|
|
139
169
|
return (
|
|
140
|
-
|
|
170
|
+
column_headers,
|
|
141
171
|
(utils.get_item_properties(s, columns) for s in data),
|
|
142
172
|
)
|
|
143
173
|
|
|
@@ -146,7 +176,7 @@ class SetService(command.Command):
|
|
|
146
176
|
_description = _("Set service properties")
|
|
147
177
|
|
|
148
178
|
def get_parser(self, prog_name):
|
|
149
|
-
parser = super(
|
|
179
|
+
parser = super().get_parser(prog_name)
|
|
150
180
|
parser.add_argument(
|
|
151
181
|
'service',
|
|
152
182
|
metavar='<service>',
|
|
@@ -171,19 +201,23 @@ class SetService(command.Command):
|
|
|
171
201
|
enable_group.add_argument(
|
|
172
202
|
'--enable',
|
|
173
203
|
action='store_true',
|
|
204
|
+
dest='is_enabled',
|
|
205
|
+
default=None,
|
|
174
206
|
help=_('Enable service'),
|
|
175
207
|
)
|
|
176
208
|
enable_group.add_argument(
|
|
177
209
|
'--disable',
|
|
178
|
-
action='
|
|
210
|
+
action='store_false',
|
|
211
|
+
dest='is_enabled',
|
|
212
|
+
default=None,
|
|
179
213
|
help=_('Disable service'),
|
|
180
214
|
)
|
|
181
215
|
return parser
|
|
182
216
|
|
|
183
217
|
def take_action(self, parsed_args):
|
|
184
|
-
identity_client = self.app.client_manager.identity
|
|
218
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
185
219
|
|
|
186
|
-
service = common.
|
|
220
|
+
service = common.find_service_sdk(identity_client, parsed_args.service)
|
|
187
221
|
kwargs = {}
|
|
188
222
|
if parsed_args.type:
|
|
189
223
|
kwargs['type'] = parsed_args.type
|
|
@@ -191,19 +225,16 @@ class SetService(command.Command):
|
|
|
191
225
|
kwargs['name'] = parsed_args.name
|
|
192
226
|
if parsed_args.description:
|
|
193
227
|
kwargs['description'] = parsed_args.description
|
|
194
|
-
|
|
195
|
-
kwargs['enabled'] = True
|
|
196
|
-
if parsed_args.disable:
|
|
197
|
-
kwargs['enabled'] = False
|
|
228
|
+
kwargs['is_enabled'] = parsed_args.is_enabled
|
|
198
229
|
|
|
199
|
-
identity_client.
|
|
230
|
+
identity_client.update_service(service.id, **kwargs)
|
|
200
231
|
|
|
201
232
|
|
|
202
233
|
class ShowService(command.ShowOne):
|
|
203
234
|
_description = _("Display service details")
|
|
204
235
|
|
|
205
236
|
def get_parser(self, prog_name):
|
|
206
|
-
parser = super(
|
|
237
|
+
parser = super().get_parser(prog_name)
|
|
207
238
|
parser.add_argument(
|
|
208
239
|
'service',
|
|
209
240
|
metavar='<service>',
|
|
@@ -212,9 +243,8 @@ class ShowService(command.ShowOne):
|
|
|
212
243
|
return parser
|
|
213
244
|
|
|
214
245
|
def take_action(self, parsed_args):
|
|
215
|
-
identity_client = self.app.client_manager.identity
|
|
246
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
216
247
|
|
|
217
|
-
service = common.
|
|
248
|
+
service = common.find_service_sdk(identity_client, parsed_args.service)
|
|
218
249
|
|
|
219
|
-
service
|
|
220
|
-
return zip(*sorted(service._info.items()))
|
|
250
|
+
return _format_service(service)
|
|
@@ -29,7 +29,7 @@ class CreateServiceProvider(command.ShowOne):
|
|
|
29
29
|
_description = _("Create new service provider")
|
|
30
30
|
|
|
31
31
|
def get_parser(self, prog_name):
|
|
32
|
-
parser = super(
|
|
32
|
+
parser = super().get_parser(prog_name)
|
|
33
33
|
parser.add_argument(
|
|
34
34
|
'service_provider_id',
|
|
35
35
|
metavar='<name>',
|
|
@@ -94,7 +94,7 @@ class DeleteServiceProvider(command.Command):
|
|
|
94
94
|
_description = _("Delete service provider(s)")
|
|
95
95
|
|
|
96
96
|
def get_parser(self, prog_name):
|
|
97
|
-
parser = super(
|
|
97
|
+
parser = super().get_parser(prog_name)
|
|
98
98
|
parser.add_argument(
|
|
99
99
|
'service_provider',
|
|
100
100
|
metavar='<service-provider>',
|
|
@@ -153,7 +153,7 @@ class SetServiceProvider(command.Command):
|
|
|
153
153
|
_description = _("Set service provider properties")
|
|
154
154
|
|
|
155
155
|
def get_parser(self, prog_name):
|
|
156
|
-
parser = super(
|
|
156
|
+
parser = super().get_parser(prog_name)
|
|
157
157
|
parser.add_argument(
|
|
158
158
|
'service_provider',
|
|
159
159
|
metavar='<service-provider>',
|
|
@@ -213,7 +213,7 @@ class ShowServiceProvider(command.ShowOne):
|
|
|
213
213
|
_description = _("Display service provider details")
|
|
214
214
|
|
|
215
215
|
def get_parser(self, prog_name):
|
|
216
|
-
parser = super(
|
|
216
|
+
parser = super().get_parser(prog_name)
|
|
217
217
|
parser.add_argument(
|
|
218
218
|
'service_provider',
|
|
219
219
|
metavar='<service-provider>',
|
|
@@ -129,7 +129,7 @@ def update_tags_in_args(parsed_args, obj, args):
|
|
|
129
129
|
args['tags'] = []
|
|
130
130
|
obj.tags = []
|
|
131
131
|
if parsed_args.remove_tag:
|
|
132
|
-
args['tags'] =
|
|
132
|
+
args['tags'] = sorted(set(obj.tags) - set(parsed_args.remove_tag))
|
|
133
133
|
return
|
|
134
134
|
if parsed_args.tags:
|
|
135
|
-
args['tags'] =
|
|
135
|
+
args['tags'] = sorted(set(obj.tags).union(set(parsed_args.tags)))
|
|
@@ -27,7 +27,7 @@ class AuthorizeRequestToken(command.ShowOne):
|
|
|
27
27
|
_description = _("Authorize a request token")
|
|
28
28
|
|
|
29
29
|
def get_parser(self, prog_name):
|
|
30
|
-
parser = super(
|
|
30
|
+
parser = super().get_parser(prog_name)
|
|
31
31
|
parser.add_argument(
|
|
32
32
|
'--request-key',
|
|
33
33
|
metavar='<request-key>',
|
|
@@ -70,7 +70,7 @@ class CreateAccessToken(command.ShowOne):
|
|
|
70
70
|
_description = _("Create an access token")
|
|
71
71
|
|
|
72
72
|
def get_parser(self, prog_name):
|
|
73
|
-
parser = super(
|
|
73
|
+
parser = super().get_parser(prog_name)
|
|
74
74
|
parser.add_argument(
|
|
75
75
|
'--consumer-key',
|
|
76
76
|
metavar='<consumer-key>',
|
|
@@ -119,7 +119,7 @@ class CreateRequestToken(command.ShowOne):
|
|
|
119
119
|
_description = _("Create a request token")
|
|
120
120
|
|
|
121
121
|
def get_parser(self, prog_name):
|
|
122
|
-
parser = super(
|
|
122
|
+
parser = super().get_parser(prog_name)
|
|
123
123
|
parser.add_argument(
|
|
124
124
|
'--consumer-key',
|
|
125
125
|
metavar='<consumer-key>',
|
|
@@ -178,7 +178,7 @@ class IssueToken(command.ShowOne):
|
|
|
178
178
|
required_scope = False
|
|
179
179
|
|
|
180
180
|
def get_parser(self, prog_name):
|
|
181
|
-
parser = super(
|
|
181
|
+
parser = super().get_parser(prog_name)
|
|
182
182
|
return parser
|
|
183
183
|
|
|
184
184
|
def take_action(self, parsed_args):
|
|
@@ -214,7 +214,7 @@ class RevokeToken(command.Command):
|
|
|
214
214
|
_description = _("Revoke existing token")
|
|
215
215
|
|
|
216
216
|
def get_parser(self, prog_name):
|
|
217
|
-
parser = super(
|
|
217
|
+
parser = super().get_parser(prog_name)
|
|
218
218
|
parser.add_argument(
|
|
219
219
|
'token',
|
|
220
220
|
metavar='<token>',
|
|
@@ -32,7 +32,7 @@ class CreateTrust(command.ShowOne):
|
|
|
32
32
|
_description = _("Create new trust")
|
|
33
33
|
|
|
34
34
|
def get_parser(self, prog_name):
|
|
35
|
-
parser = super(
|
|
35
|
+
parser = super().get_parser(prog_name)
|
|
36
36
|
parser.add_argument(
|
|
37
37
|
'trustor',
|
|
38
38
|
metavar='<trustor-user>',
|
|
@@ -150,7 +150,7 @@ class DeleteTrust(command.Command):
|
|
|
150
150
|
_description = _("Delete trust(s)")
|
|
151
151
|
|
|
152
152
|
def get_parser(self, prog_name):
|
|
153
|
-
parser = super(
|
|
153
|
+
parser = super().get_parser(prog_name)
|
|
154
154
|
parser.add_argument(
|
|
155
155
|
'trust',
|
|
156
156
|
metavar='<trust>',
|
|
@@ -300,7 +300,7 @@ class ShowTrust(command.ShowOne):
|
|
|
300
300
|
_description = _("Display trust details")
|
|
301
301
|
|
|
302
302
|
def get_parser(self, prog_name):
|
|
303
|
-
parser = super(
|
|
303
|
+
parser = super().get_parser(prog_name)
|
|
304
304
|
parser.add_argument(
|
|
305
305
|
'trust',
|
|
306
306
|
metavar='<trust>',
|