python-openstackclient 9.0.0__py3-none-any.whl → 10.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/__init__.py +2 -6
- openstackclient/api/api.py +41 -23
- openstackclient/api/compute_v2.py +44 -25
- openstackclient/api/object_store_v1.py +75 -97
- openstackclient/api/volume_v2.py +2 -1
- openstackclient/api/volume_v3.py +2 -1
- openstackclient/common/availability_zone.py +59 -43
- openstackclient/common/clientmanager.py +56 -29
- openstackclient/common/configuration.py +10 -3
- openstackclient/common/envvars.py +2 -2
- openstackclient/common/extension.py +14 -5
- openstackclient/common/limits.py +10 -5
- openstackclient/common/module.py +36 -34
- openstackclient/common/pagination.py +50 -6
- openstackclient/common/progressbar.py +7 -6
- openstackclient/common/project_cleanup.py +11 -6
- openstackclient/common/quota.py +105 -103
- openstackclient/common/versions.py +8 -2
- openstackclient/compute/client.py +7 -3
- openstackclient/compute/v2/agent.py +17 -10
- openstackclient/compute/v2/aggregate.py +36 -22
- openstackclient/compute/v2/console.py +14 -8
- openstackclient/compute/v2/console_connection.py +11 -3
- openstackclient/compute/v2/flavor.py +42 -22
- openstackclient/compute/v2/host.py +14 -6
- openstackclient/compute/v2/hypervisor.py +16 -5
- openstackclient/compute/v2/hypervisor_stats.py +10 -2
- openstackclient/compute/v2/keypair.py +35 -16
- openstackclient/compute/v2/server.py +268 -179
- openstackclient/compute/v2/server_backup.py +10 -4
- openstackclient/compute/v2/server_event.py +28 -12
- openstackclient/compute/v2/server_group.py +23 -11
- openstackclient/compute/v2/server_image.py +19 -10
- openstackclient/compute/v2/server_migration.py +27 -10
- openstackclient/compute/v2/server_share.py +274 -0
- openstackclient/compute/v2/server_volume.py +13 -5
- openstackclient/compute/v2/service.py +17 -8
- openstackclient/compute/v2/usage.py +28 -23
- openstackclient/identity/client.py +8 -3
- openstackclient/identity/common.py +82 -47
- openstackclient/identity/v2_0/catalog.py +14 -7
- openstackclient/identity/v2_0/ec2creds.py +21 -10
- openstackclient/identity/v2_0/endpoint.py +23 -11
- openstackclient/identity/v2_0/project.py +25 -14
- openstackclient/identity/v2_0/role.py +28 -14
- openstackclient/identity/v2_0/role_assignment.py +9 -3
- openstackclient/identity/v2_0/service.py +23 -11
- openstackclient/identity/v2_0/token.py +12 -5
- openstackclient/identity/v2_0/user.py +26 -15
- openstackclient/identity/v3/access_rule.py +32 -12
- openstackclient/identity/v3/application_credential.py +66 -24
- openstackclient/identity/v3/catalog.py +14 -7
- openstackclient/identity/v3/consumer.py +22 -11
- openstackclient/identity/v3/credential.py +39 -17
- openstackclient/identity/v3/domain.py +40 -19
- openstackclient/identity/v3/ec2creds.py +25 -12
- openstackclient/identity/v3/endpoint.py +98 -64
- openstackclient/identity/v3/endpoint_group.py +28 -17
- openstackclient/identity/v3/federation_protocol.py +44 -20
- openstackclient/identity/v3/group.py +64 -40
- openstackclient/identity/v3/identity_provider.py +95 -57
- openstackclient/identity/v3/implied_role.py +21 -9
- openstackclient/identity/v3/limit.py +42 -17
- openstackclient/identity/v3/mapping.py +58 -28
- openstackclient/identity/v3/policy.py +23 -12
- openstackclient/identity/v3/project.py +59 -26
- openstackclient/identity/v3/region.py +39 -17
- openstackclient/identity/v3/registered_limit.py +41 -16
- openstackclient/identity/v3/role.py +62 -31
- openstackclient/identity/v3/role_assignment.py +25 -7
- openstackclient/identity/v3/service.py +39 -17
- openstackclient/identity/v3/service_provider.py +40 -16
- openstackclient/identity/v3/tag.py +23 -6
- openstackclient/identity/v3/token.py +30 -14
- openstackclient/identity/v3/trust.py +39 -18
- openstackclient/identity/v3/unscoped_saml.py +10 -2
- openstackclient/identity/v3/user.py +86 -36
- openstackclient/image/client.py +7 -3
- openstackclient/image/v1/image.py +33 -26
- openstackclient/image/v2/cache.py +16 -11
- openstackclient/image/v2/image.py +88 -56
- openstackclient/image/v2/info.py +7 -1
- openstackclient/image/v2/metadef_namespaces.py +117 -20
- openstackclient/image/v2/metadef_objects.py +32 -19
- openstackclient/image/v2/metadef_properties.py +30 -16
- openstackclient/image/v2/metadef_resource_type_association.py +14 -7
- openstackclient/image/v2/metadef_resource_types.py +7 -1
- openstackclient/image/v2/task.py +25 -27
- openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +7 -192
- openstackclient/network/client.py +7 -2
- openstackclient/network/common.py +16 -241
- openstackclient/network/utils.py +27 -54
- openstackclient/network/v2/address_group.py +39 -16
- openstackclient/network/v2/address_scope.py +36 -20
- openstackclient/network/v2/bgpvpn/bgpvpn.py +477 -0
- openstackclient/network/v2/bgpvpn/constants.py +30 -0
- openstackclient/network/v2/bgpvpn/network_association.py +226 -0
- openstackclient/network/v2/bgpvpn/port_association.py +504 -0
- openstackclient/network/v2/bgpvpn/router_association.py +301 -0
- openstackclient/network/v2/default_security_group_rule.py +31 -14
- openstackclient/network/v2/floating_ip.py +121 -162
- openstackclient/network/v2/floating_ip_port_forwarding.py +41 -19
- openstackclient/network/v2/fwaas/__init__.py +0 -0
- openstackclient/network/v2/fwaas/group.py +499 -0
- openstackclient/network/v2/fwaas/policy.py +518 -0
- openstackclient/network/v2/fwaas/rule.py +610 -0
- openstackclient/network/v2/ip_availability.py +25 -8
- openstackclient/network/v2/l3_conntrack_helper.py +35 -13
- openstackclient/network/v2/local_ip.py +27 -13
- openstackclient/network/v2/local_ip_association.py +17 -7
- openstackclient/network/v2/ndp_proxy.py +23 -11
- openstackclient/network/v2/network.py +213 -213
- openstackclient/network/v2/network_agent.py +77 -34
- openstackclient/network/v2/network_auto_allocated_topology.py +27 -15
- openstackclient/network/v2/network_flavor.py +45 -21
- openstackclient/network/v2/network_flavor_profile.py +42 -17
- openstackclient/network/v2/network_meter.py +39 -15
- openstackclient/network/v2/network_meter_rule.py +40 -12
- openstackclient/network/v2/network_qos_policy.py +39 -21
- openstackclient/network/v2/network_qos_rule.py +48 -18
- openstackclient/network/v2/network_qos_rule_type.py +28 -9
- openstackclient/network/v2/network_rbac.py +34 -16
- openstackclient/network/v2/network_segment.py +32 -11
- openstackclient/network/v2/network_segment_range.py +70 -31
- openstackclient/network/v2/network_service_provider.py +7 -1
- openstackclient/network/v2/network_trunk.py +41 -22
- openstackclient/network/v2/port.py +141 -40
- openstackclient/network/v2/router.py +101 -67
- openstackclient/network/v2/security_group.py +97 -198
- openstackclient/network/v2/security_group_rule.py +115 -282
- openstackclient/network/v2/subnet.py +63 -34
- openstackclient/network/v2/subnet_pool.py +42 -24
- openstackclient/network/v2/taas/tap_flow.py +35 -14
- openstackclient/network/v2/taas/tap_mirror.py +28 -14
- openstackclient/network/v2/taas/tap_service.py +26 -12
- openstackclient/object/client.py +7 -2
- openstackclient/object/v1/account.py +13 -6
- openstackclient/object/v1/container.py +28 -16
- openstackclient/object/v1/object.py +28 -16
- openstackclient/py.typed +0 -0
- openstackclient/shell.py +46 -10
- openstackclient/tests/functional/base.py +55 -20
- openstackclient/tests/functional/common/test_extension.py +4 -0
- openstackclient/tests/functional/common/test_quota.py +3 -1
- openstackclient/tests/functional/compute/v2/common.py +14 -13
- openstackclient/tests/functional/compute/v2/test_flavor.py +3 -1
- openstackclient/tests/functional/compute/v2/test_server.py +3 -0
- openstackclient/tests/functional/identity/v2/common.py +10 -6
- openstackclient/tests/functional/identity/v2/test_role.py +4 -4
- openstackclient/tests/functional/identity/v3/common.py +59 -19
- openstackclient/tests/functional/identity/v3/test_application_credential.py +1 -1
- openstackclient/tests/functional/identity/v3/test_group.py +20 -20
- openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
- openstackclient/tests/functional/identity/v3/test_mapping.py +81 -0
- openstackclient/tests/functional/identity/v3/test_project.py +10 -10
- openstackclient/tests/functional/identity/v3/test_role.py +18 -18
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
- openstackclient/tests/functional/identity/v3/test_user.py +8 -8
- openstackclient/tests/functional/image/base.py +1 -6
- openstackclient/tests/functional/network/v2/common.py +5 -2
- openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
- openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
- openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
- openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
- openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
- openstackclient/tests/functional/object/v1/common.py +4 -0
- openstackclient/tests/functional/volume/v2/common.py +4 -0
- openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
- openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
- openstackclient/tests/functional/volume/v3/common.py +4 -0
- openstackclient/tests/functional/volume/v3/test_volume_group.py +163 -0
- openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +11 -7
- openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
- openstackclient/tests/unit/common/test_availability_zone.py +35 -49
- openstackclient/tests/unit/common/test_extension.py +2 -2
- openstackclient/tests/unit/common/test_limits.py +1 -1
- openstackclient/tests/unit/common/test_module.py +82 -44
- openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
- openstackclient/tests/unit/common/test_quota.py +15 -26
- openstackclient/tests/unit/compute/v2/fakes.py +26 -57
- openstackclient/tests/unit/compute/v2/test_agent.py +4 -4
- openstackclient/tests/unit/compute/v2/test_aggregate.py +1 -1
- openstackclient/tests/unit/compute/v2/test_console.py +2 -2
- openstackclient/tests/unit/compute/v2/test_console_connection.py +1 -1
- openstackclient/tests/unit/compute/v2/test_flavor.py +29 -3
- openstackclient/tests/unit/compute/v2/test_host.py +3 -3
- openstackclient/tests/unit/compute/v2/test_hypervisor.py +2 -2
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -1
- openstackclient/tests/unit/compute/v2/test_keypair.py +7 -7
- openstackclient/tests/unit/compute/v2/test_server.py +26 -111
- openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -1
- openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
- openstackclient/tests/unit/compute/v2/test_server_group.py +1 -1
- openstackclient/tests/unit/compute/v2/test_server_image.py +1 -1
- openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
- openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
- openstackclient/tests/unit/compute/v2/test_server_volume.py +2 -2
- openstackclient/tests/unit/compute/v2/test_service.py +3 -3
- openstackclient/tests/unit/compute/v2/test_usage.py +1 -1
- openstackclient/tests/unit/identity/v2_0/fakes.py +3 -7
- openstackclient/tests/unit/identity/v2_0/test_endpoint.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_project.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_role.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_role_assignment.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_service.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_token.py +2 -2
- openstackclient/tests/unit/identity/v2_0/test_user.py +1 -1
- openstackclient/tests/unit/identity/v3/fakes.py +8 -38
- openstackclient/tests/unit/identity/v3/test_access_rule.py +3 -3
- openstackclient/tests/unit/identity/v3/test_application_credential.py +4 -4
- openstackclient/tests/unit/identity/v3/test_credential.py +5 -5
- openstackclient/tests/unit/identity/v3/test_domain.py +5 -5
- openstackclient/tests/unit/identity/v3/test_endpoint.py +6 -6
- openstackclient/tests/unit/identity/v3/test_endpoint_group.py +1 -1
- openstackclient/tests/unit/identity/v3/test_group.py +12 -22
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
- openstackclient/tests/unit/identity/v3/test_implied_role.py +1 -1
- openstackclient/tests/unit/identity/v3/test_limit.py +5 -5
- openstackclient/tests/unit/identity/v3/test_mappings.py +163 -79
- openstackclient/tests/unit/identity/v3/test_project.py +28 -5
- openstackclient/tests/unit/identity/v3/test_protocol.py +3 -3
- openstackclient/tests/unit/identity/v3/test_region.py +5 -5
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +5 -5
- openstackclient/tests/unit/identity/v3/test_role.py +8 -8
- openstackclient/tests/unit/identity/v3/test_role_assignment.py +1 -1
- openstackclient/tests/unit/identity/v3/test_service.py +5 -5
- openstackclient/tests/unit/identity/v3/test_token.py +2 -2
- openstackclient/tests/unit/identity/v3/test_trust.py +4 -4
- openstackclient/tests/unit/identity/v3/test_user.py +77 -10
- openstackclient/tests/unit/image/v2/test_image.py +11 -11
- openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
- openstackclient/tests/unit/network/test_common.py +0 -155
- openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
- openstackclient/tests/unit/network/v2/fakes.py +5 -77
- openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/fwaas/test_group.py +923 -0
- openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
- openstackclient/tests/unit/network/v2/fwaas/test_rule.py +1005 -0
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
- openstackclient/tests/unit/network/v2/test_address_group.py +26 -2
- openstackclient/tests/unit/network/v2/test_address_scope.py +24 -0
- openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +27 -2
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +37 -13
- openstackclient/tests/unit/network/v2/test_ip_availability.py +25 -0
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +29 -3
- openstackclient/tests/unit/network/v2/test_network.py +74 -12
- openstackclient/tests/unit/network/v2/test_network_agent.py +58 -5
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
- openstackclient/tests/unit/network/v2/test_network_flavor.py +26 -2
- openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +24 -0
- openstackclient/tests/unit/network/v2/test_network_meter.py +24 -0
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +25 -1
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +24 -0
- openstackclient/tests/unit/network/v2/test_network_rbac.py +25 -1
- openstackclient/tests/unit/network/v2/test_network_segment.py +25 -1
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +31 -10
- openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
- openstackclient/tests/unit/network/v2/test_port.py +166 -0
- openstackclient/tests/unit/network/v2/test_router.py +36 -16
- openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +11 -8
- openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +28 -37
- openstackclient/tests/unit/network/v2/test_subnet.py +30 -5
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +26 -1
- openstackclient/tests/unit/object/v1/fakes.py +8 -7
- openstackclient/tests/unit/object/v1/test_container.py +65 -101
- openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
- openstackclient/tests/unit/object/v1/test_object.py +44 -84
- openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
- openstackclient/tests/unit/test_hacking.py +108 -0
- openstackclient/tests/unit/volume/v2/fakes.py +21 -140
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +6 -14
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +8 -1
- openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
- openstackclient/tests/unit/volume/v3/fakes.py +205 -100
- openstackclient/tests/unit/volume/v3/test_backup_record.py +114 -0
- openstackclient/tests/unit/volume/v3/test_consistency_group.py +720 -0
- openstackclient/tests/unit/volume/v3/test_consistency_group_snapshot.py +354 -0
- openstackclient/tests/unit/volume/v3/test_qos_specs.py +455 -0
- openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume_backend.py +158 -0
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +6 -14
- openstackclient/tests/unit/volume/v3/test_volume_group_type.py +65 -0
- openstackclient/tests/unit/volume/v3/test_volume_host.py +115 -0
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +61 -1
- openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
- openstackclient/volume/client.py +7 -3
- openstackclient/volume/v2/backup_record.py +15 -6
- openstackclient/volume/v2/consistency_group.py +29 -17
- openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
- openstackclient/volume/v2/qos_specs.py +28 -17
- openstackclient/volume/v2/service.py +17 -6
- openstackclient/volume/v2/volume.py +60 -30
- openstackclient/volume/v2/volume_backend.py +19 -6
- openstackclient/volume/v2/volume_backup.py +48 -23
- openstackclient/volume/v2/volume_host.py +6 -4
- openstackclient/volume/v2/volume_snapshot.py +49 -24
- openstackclient/volume/v2/volume_transfer_request.py +31 -13
- openstackclient/volume/v2/volume_type.py +43 -24
- openstackclient/volume/v3/backup_record.py +94 -0
- openstackclient/volume/v3/block_storage_cleanup.py +11 -3
- openstackclient/volume/v3/block_storage_cluster.py +19 -7
- openstackclient/volume/v3/block_storage_log_level.py +15 -6
- openstackclient/volume/v3/block_storage_manage.py +10 -4
- openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
- openstackclient/volume/v3/consistency_group.py +400 -0
- openstackclient/volume/v3/consistency_group_snapshot.py +225 -0
- openstackclient/volume/v3/qos_specs.py +389 -0
- openstackclient/volume/v3/service.py +16 -6
- openstackclient/volume/v3/volume.py +92 -40
- openstackclient/volume/v3/volume_attachment.py +47 -21
- openstackclient/volume/v3/volume_backend.py +130 -0
- openstackclient/volume/v3/volume_backup.py +55 -27
- openstackclient/volume/v3/volume_group.py +23 -13
- openstackclient/volume/v3/volume_group_snapshot.py +34 -17
- openstackclient/volume/v3/volume_group_type.py +27 -14
- openstackclient/volume/v3/volume_host.py +74 -0
- openstackclient/volume/v3/volume_message.py +18 -8
- openstackclient/volume/v3/volume_snapshot.py +70 -32
- openstackclient/volume/v3/volume_transfer_request.py +31 -13
- openstackclient/volume/v3/volume_type.py +42 -24
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/METADATA +7 -8
- python_openstackclient-10.1.0.dist-info/RECORD +524 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/entry_points.txt +77 -25
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/AUTHORS +9 -0
- python_openstackclient-10.1.0.dist-info/pbr.json +1 -0
- openstackclient/api/image_v1.py +0 -69
- openstackclient/api/image_v2.py +0 -79
- openstackclient/network/v2/floating_ip_pool.py +0 -38
- openstackclient/tests/functional/image/v1/test_image.py +0 -97
- openstackclient/tests/unit/api/test_image_v1.py +0 -96
- openstackclient/tests/unit/api/test_image_v2.py +0 -96
- openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
- openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
- openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
- python_openstackclient-9.0.0.dist-info/RECORD +0 -499
- python_openstackclient-9.0.0.dist-info/pbr.json +0 -1
- /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/LICENSE +0 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/top_level.txt +0 -0
|
@@ -17,11 +17,12 @@
|
|
|
17
17
|
|
|
18
18
|
import argparse
|
|
19
19
|
import base64
|
|
20
|
+
from collections.abc import Iterable, Sequence
|
|
20
21
|
import getpass
|
|
21
22
|
import json
|
|
22
23
|
import logging
|
|
23
24
|
import os
|
|
24
|
-
|
|
25
|
+
from typing import Any
|
|
25
26
|
|
|
26
27
|
from cliff import columns as cliff_columns
|
|
27
28
|
import iso8601
|
|
@@ -38,7 +39,6 @@ from openstackclient.common import envvars
|
|
|
38
39
|
from openstackclient.common import pagination
|
|
39
40
|
from openstackclient.i18n import _
|
|
40
41
|
from openstackclient.identity import common as identity_common
|
|
41
|
-
from openstackclient.network import common as network_common
|
|
42
42
|
|
|
43
43
|
LOG = logging.getLogger(__name__)
|
|
44
44
|
|
|
@@ -59,28 +59,31 @@ class PowerStateColumn(cliff_columns.FormattableColumn[int]):
|
|
|
59
59
|
'Suspended', # 0x07
|
|
60
60
|
]
|
|
61
61
|
|
|
62
|
-
def human_readable(self):
|
|
62
|
+
def human_readable(self) -> str:
|
|
63
63
|
try:
|
|
64
64
|
return self.power_states[self._value]
|
|
65
65
|
except Exception:
|
|
66
66
|
return 'N/A'
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
class AddressesColumn(cliff_columns.FormattableColumn[
|
|
69
|
+
class AddressesColumn(cliff_columns.FormattableColumn[Any]):
|
|
70
70
|
"""Generate a formatted string of a server's addresses."""
|
|
71
71
|
|
|
72
|
-
def human_readable(self):
|
|
72
|
+
def human_readable(self) -> str:
|
|
73
73
|
try:
|
|
74
|
-
return
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
74
|
+
return (
|
|
75
|
+
utils.format_dict_of_list(
|
|
76
|
+
{
|
|
77
|
+
k: [i['addr'] for i in v if 'addr' in i]
|
|
78
|
+
for k, v in self._value.items()
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
or ''
|
|
79
82
|
)
|
|
80
83
|
except Exception:
|
|
81
84
|
return 'N/A'
|
|
82
85
|
|
|
83
|
-
def machine_readable(self):
|
|
86
|
+
def machine_readable(self) -> Any:
|
|
84
87
|
return {
|
|
85
88
|
k: [i['addr'] for i in v if 'addr' in i]
|
|
86
89
|
for k, v in (self._value.items() if self._value else [])
|
|
@@ -90,14 +93,16 @@ class AddressesColumn(cliff_columns.FormattableColumn[ty.Any]):
|
|
|
90
93
|
class HostColumn(cliff_columns.FormattableColumn[str | None]):
|
|
91
94
|
"""Generate a formatted string of a hostname."""
|
|
92
95
|
|
|
93
|
-
def human_readable(self):
|
|
96
|
+
def human_readable(self) -> str:
|
|
94
97
|
if self._value is None:
|
|
95
98
|
return ''
|
|
96
99
|
|
|
97
100
|
return self._value
|
|
98
101
|
|
|
99
102
|
|
|
100
|
-
def _get_ip_address(
|
|
103
|
+
def _get_ip_address(
|
|
104
|
+
addresses: Any, address_type: str, ip_address_family: list[int]
|
|
105
|
+
) -> Any:
|
|
101
106
|
# Old style addresses
|
|
102
107
|
if address_type in addresses:
|
|
103
108
|
for addy in addresses[address_type]:
|
|
@@ -130,7 +135,13 @@ def _get_ip_address(addresses, address_type, ip_address_family):
|
|
|
130
135
|
)
|
|
131
136
|
|
|
132
137
|
|
|
133
|
-
def _prep_server_detail(
|
|
138
|
+
def _prep_server_detail(
|
|
139
|
+
compute_client: Any,
|
|
140
|
+
image_client: Any,
|
|
141
|
+
server: Any,
|
|
142
|
+
*,
|
|
143
|
+
refresh: bool = True,
|
|
144
|
+
) -> dict[str, Any]:
|
|
134
145
|
"""Prepare the detailed server dict for printing
|
|
135
146
|
|
|
136
147
|
:param compute_client: a compute client instance
|
|
@@ -352,7 +363,7 @@ def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
|
|
|
352
363
|
class AddFixedIP(command.ShowOne):
|
|
353
364
|
_description = _("Add fixed IP address to server")
|
|
354
365
|
|
|
355
|
-
def get_parser(self, prog_name):
|
|
366
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
356
367
|
parser = super().get_parser(prog_name)
|
|
357
368
|
parser.add_argument(
|
|
358
369
|
"server",
|
|
@@ -381,7 +392,9 @@ class AddFixedIP(command.ShowOne):
|
|
|
381
392
|
)
|
|
382
393
|
return parser
|
|
383
394
|
|
|
384
|
-
def take_action(
|
|
395
|
+
def take_action(
|
|
396
|
+
self, parsed_args: argparse.Namespace
|
|
397
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
385
398
|
compute_client = self.app.client_manager.compute
|
|
386
399
|
server = compute_client.find_server(
|
|
387
400
|
parsed_args.server, ignore_missing=False
|
|
@@ -403,7 +416,7 @@ class AddFixedIP(command.ShowOne):
|
|
|
403
416
|
else:
|
|
404
417
|
net_id = parsed_args.network
|
|
405
418
|
|
|
406
|
-
kwargs = {'net_id': net_id}
|
|
419
|
+
kwargs: dict[str, Any] = {'net_id': net_id}
|
|
407
420
|
if parsed_args.fixed_ip_address:
|
|
408
421
|
kwargs['fixed_ips'] = [
|
|
409
422
|
{"ip_address": parsed_args.fixed_ip_address}
|
|
@@ -447,10 +460,11 @@ class AddFixedIP(command.ShowOne):
|
|
|
447
460
|
)
|
|
448
461
|
|
|
449
462
|
|
|
450
|
-
class AddFloatingIP(
|
|
463
|
+
class AddFloatingIP(command.Command):
|
|
451
464
|
_description = _("Add floating IP address to server")
|
|
452
465
|
|
|
453
|
-
def
|
|
466
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
467
|
+
parser = super().get_parser(prog_name)
|
|
454
468
|
parser.add_argument(
|
|
455
469
|
"server",
|
|
456
470
|
metavar="<server>",
|
|
@@ -475,7 +489,8 @@ class AddFloatingIP(network_common.NetworkAndComputeCommand):
|
|
|
475
489
|
)
|
|
476
490
|
return parser
|
|
477
491
|
|
|
478
|
-
def
|
|
492
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
493
|
+
client = self.app.client_manager.network
|
|
479
494
|
compute_client = self.app.client_manager.compute
|
|
480
495
|
|
|
481
496
|
attrs = {}
|
|
@@ -534,19 +549,11 @@ class AddFloatingIP(network_common.NetworkAndComputeCommand):
|
|
|
534
549
|
if error:
|
|
535
550
|
raise error
|
|
536
551
|
|
|
537
|
-
def take_action_compute(self, client, parsed_args):
|
|
538
|
-
server = client.find_server(parsed_args.server, ignore_missing=False)
|
|
539
|
-
client.add_floating_ip_to_server(
|
|
540
|
-
server,
|
|
541
|
-
parsed_args.ip_address,
|
|
542
|
-
fixed_address=parsed_args.fixed_ip_address,
|
|
543
|
-
)
|
|
544
|
-
|
|
545
552
|
|
|
546
553
|
class AddPort(command.Command):
|
|
547
554
|
_description = _("Add port to server")
|
|
548
555
|
|
|
549
|
-
def get_parser(self, prog_name):
|
|
556
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
550
557
|
parser = super().get_parser(prog_name)
|
|
551
558
|
parser.add_argument(
|
|
552
559
|
"server",
|
|
@@ -568,7 +575,7 @@ class AddPort(command.Command):
|
|
|
568
575
|
)
|
|
569
576
|
return parser
|
|
570
577
|
|
|
571
|
-
def take_action(self, parsed_args):
|
|
578
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
572
579
|
compute_client = self.app.client_manager.compute
|
|
573
580
|
|
|
574
581
|
server = compute_client.find_server(
|
|
@@ -600,7 +607,7 @@ class AddPort(command.Command):
|
|
|
600
607
|
class AddNetwork(command.Command):
|
|
601
608
|
_description = _("Add network to server")
|
|
602
609
|
|
|
603
|
-
def get_parser(self, prog_name):
|
|
610
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
604
611
|
parser = super().get_parser(prog_name)
|
|
605
612
|
parser.add_argument(
|
|
606
613
|
"server",
|
|
@@ -622,7 +629,7 @@ class AddNetwork(command.Command):
|
|
|
622
629
|
)
|
|
623
630
|
return parser
|
|
624
631
|
|
|
625
|
-
def take_action(self, parsed_args):
|
|
632
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
626
633
|
compute_client = self.app.client_manager.compute
|
|
627
634
|
|
|
628
635
|
server = compute_client.find_server(
|
|
@@ -655,7 +662,7 @@ class AddNetwork(command.Command):
|
|
|
655
662
|
class AddServerSecurityGroup(command.Command):
|
|
656
663
|
_description = _("Add security group(s) to server")
|
|
657
664
|
|
|
658
|
-
def get_parser(self, prog_name):
|
|
665
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
659
666
|
parser = super().get_parser(prog_name)
|
|
660
667
|
parser.add_argument(
|
|
661
668
|
'server',
|
|
@@ -673,7 +680,7 @@ class AddServerSecurityGroup(command.Command):
|
|
|
673
680
|
)
|
|
674
681
|
return parser
|
|
675
682
|
|
|
676
|
-
def take_action(self, parsed_args):
|
|
683
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
677
684
|
compute_client = self.app.client_manager.compute
|
|
678
685
|
|
|
679
686
|
server = compute_client.find_server(
|
|
@@ -729,7 +736,7 @@ Specify ``--os-compute-api-version 2.20`` or higher to add a volume to a server
|
|
|
729
736
|
with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
|
|
730
737
|
)
|
|
731
738
|
|
|
732
|
-
def get_parser(self, prog_name):
|
|
739
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
733
740
|
parser = super().get_parser(prog_name)
|
|
734
741
|
parser.add_argument(
|
|
735
742
|
'server',
|
|
@@ -775,7 +782,9 @@ with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
|
|
|
775
782
|
)
|
|
776
783
|
return parser
|
|
777
784
|
|
|
778
|
-
def take_action(
|
|
785
|
+
def take_action(
|
|
786
|
+
self, parsed_args: argparse.Namespace
|
|
787
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
779
788
|
compute_client = self.app.client_manager.compute
|
|
780
789
|
volume_client = self.app.client_manager.sdk_connection.volume
|
|
781
790
|
|
|
@@ -849,7 +858,12 @@ with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
|
|
|
849
858
|
|
|
850
859
|
|
|
851
860
|
class NoneNICAction(argparse.Action):
|
|
852
|
-
def __init__(
|
|
861
|
+
def __init__(
|
|
862
|
+
self,
|
|
863
|
+
option_strings: list[str],
|
|
864
|
+
dest: str,
|
|
865
|
+
help: str | None = None,
|
|
866
|
+
) -> None:
|
|
853
867
|
super().__init__(
|
|
854
868
|
option_strings=option_strings,
|
|
855
869
|
dest=dest,
|
|
@@ -859,7 +873,13 @@ class NoneNICAction(argparse.Action):
|
|
|
859
873
|
help=help,
|
|
860
874
|
)
|
|
861
875
|
|
|
862
|
-
def __call__(
|
|
876
|
+
def __call__(
|
|
877
|
+
self,
|
|
878
|
+
parser: argparse.ArgumentParser,
|
|
879
|
+
namespace: argparse.Namespace,
|
|
880
|
+
values: Any,
|
|
881
|
+
option_string: str | None = None,
|
|
882
|
+
) -> None:
|
|
863
883
|
# Make sure we have an empty dict rather than None
|
|
864
884
|
if getattr(namespace, self.dest, None) is None:
|
|
865
885
|
setattr(namespace, self.dest, [])
|
|
@@ -868,7 +888,12 @@ class NoneNICAction(argparse.Action):
|
|
|
868
888
|
|
|
869
889
|
|
|
870
890
|
class AutoNICAction(argparse.Action):
|
|
871
|
-
def __init__(
|
|
891
|
+
def __init__(
|
|
892
|
+
self,
|
|
893
|
+
option_strings: list[str],
|
|
894
|
+
dest: str,
|
|
895
|
+
help: str | None = None,
|
|
896
|
+
) -> None:
|
|
872
897
|
super().__init__(
|
|
873
898
|
option_strings=option_strings,
|
|
874
899
|
dest=dest,
|
|
@@ -878,7 +903,13 @@ class AutoNICAction(argparse.Action):
|
|
|
878
903
|
help=help,
|
|
879
904
|
)
|
|
880
905
|
|
|
881
|
-
def __call__(
|
|
906
|
+
def __call__(
|
|
907
|
+
self,
|
|
908
|
+
parser: argparse.ArgumentParser,
|
|
909
|
+
namespace: argparse.Namespace,
|
|
910
|
+
values: Any,
|
|
911
|
+
option_string: str | None = None,
|
|
912
|
+
) -> None:
|
|
882
913
|
# Make sure we have an empty dict rather than None
|
|
883
914
|
if getattr(namespace, self.dest, None) is None:
|
|
884
915
|
setattr(namespace, self.dest, [])
|
|
@@ -889,12 +920,12 @@ class AutoNICAction(argparse.Action):
|
|
|
889
920
|
class NICAction(argparse.Action):
|
|
890
921
|
def __init__(
|
|
891
922
|
self,
|
|
892
|
-
option_strings,
|
|
893
|
-
dest,
|
|
894
|
-
help=None,
|
|
895
|
-
metavar=None,
|
|
896
|
-
key=None,
|
|
897
|
-
):
|
|
923
|
+
option_strings: list[str],
|
|
924
|
+
dest: str,
|
|
925
|
+
help: str | None = None,
|
|
926
|
+
metavar: str | None = None,
|
|
927
|
+
key: str | None = None,
|
|
928
|
+
) -> None:
|
|
898
929
|
self.key = key
|
|
899
930
|
super().__init__(
|
|
900
931
|
option_strings=option_strings,
|
|
@@ -909,7 +940,13 @@ class NICAction(argparse.Action):
|
|
|
909
940
|
metavar=metavar,
|
|
910
941
|
)
|
|
911
942
|
|
|
912
|
-
def __call__(
|
|
943
|
+
def __call__(
|
|
944
|
+
self,
|
|
945
|
+
parser: argparse.ArgumentParser,
|
|
946
|
+
namespace: argparse.Namespace,
|
|
947
|
+
values: Any,
|
|
948
|
+
option_string: str | None = None,
|
|
949
|
+
) -> None:
|
|
913
950
|
# Make sure we have an empty dict rather than None
|
|
914
951
|
if getattr(namespace, self.dest, None) is None:
|
|
915
952
|
setattr(namespace, self.dest, [])
|
|
@@ -940,9 +977,9 @@ class NICAction(argparse.Action):
|
|
|
940
977
|
}
|
|
941
978
|
|
|
942
979
|
for kv_str in values.split(','):
|
|
943
|
-
k,
|
|
980
|
+
k, _sep, v = kv_str.partition('=')
|
|
944
981
|
|
|
945
|
-
if k not in list(info)
|
|
982
|
+
if k not in [*list(info), 'tag'] or not v:
|
|
946
983
|
msg = _(
|
|
947
984
|
"Invalid argument %s; argument must be of form "
|
|
948
985
|
"'net-id=net-uuid,port-id=port-uuid,v4-fixed-ip=ip-addr,"
|
|
@@ -970,12 +1007,18 @@ class NICAction(argparse.Action):
|
|
|
970
1007
|
|
|
971
1008
|
|
|
972
1009
|
class BDMLegacyAction(argparse.Action):
|
|
973
|
-
def __call__(
|
|
1010
|
+
def __call__(
|
|
1011
|
+
self,
|
|
1012
|
+
parser: argparse.ArgumentParser,
|
|
1013
|
+
namespace: argparse.Namespace,
|
|
1014
|
+
values: Any,
|
|
1015
|
+
option_string: str | None = None,
|
|
1016
|
+
) -> None:
|
|
974
1017
|
# Make sure we have an empty list rather than None
|
|
975
1018
|
if getattr(namespace, self.dest, None) is None:
|
|
976
1019
|
setattr(namespace, self.dest, [])
|
|
977
1020
|
|
|
978
|
-
dev_name,
|
|
1021
|
+
dev_name, _sep, dev_map = values.partition('=')
|
|
979
1022
|
dev_map = dev_map.split(':') if dev_map else dev_map
|
|
980
1023
|
if not dev_name or not dev_map or len(dev_map) > 4:
|
|
981
1024
|
msg = _(
|
|
@@ -1014,7 +1057,9 @@ class BDMLegacyAction(argparse.Action):
|
|
|
1014
1057
|
|
|
1015
1058
|
|
|
1016
1059
|
class BDMAction(parseractions.MultiKeyValueAction):
|
|
1017
|
-
def __init__(
|
|
1060
|
+
def __init__(
|
|
1061
|
+
self, option_strings: list[str], dest: str, **kwargs: Any
|
|
1062
|
+
) -> None:
|
|
1018
1063
|
optional_keys = [
|
|
1019
1064
|
'uuid',
|
|
1020
1065
|
'source_type',
|
|
@@ -1039,7 +1084,7 @@ class BDMAction(parseractions.MultiKeyValueAction):
|
|
|
1039
1084
|
|
|
1040
1085
|
# TODO(stephenfin): Remove once I549d0897ef3704b7f47000f867d6731ad15d3f2b
|
|
1041
1086
|
# or similar lands in a release
|
|
1042
|
-
def validate_keys(self, keys):
|
|
1087
|
+
def validate_keys(self, keys: Sequence[str]) -> None:
|
|
1043
1088
|
"""Validate the provided keys.
|
|
1044
1089
|
|
|
1045
1090
|
:param keys: A list of keys to validate.
|
|
@@ -1075,7 +1120,13 @@ class BDMAction(parseractions.MultiKeyValueAction):
|
|
|
1075
1120
|
},
|
|
1076
1121
|
)
|
|
1077
1122
|
|
|
1078
|
-
def __call__(
|
|
1123
|
+
def __call__(
|
|
1124
|
+
self,
|
|
1125
|
+
parser: argparse.ArgumentParser,
|
|
1126
|
+
namespace: argparse.Namespace,
|
|
1127
|
+
values: Any,
|
|
1128
|
+
option_string: str | None = None,
|
|
1129
|
+
) -> None:
|
|
1079
1130
|
if getattr(namespace, self.dest, None) is None:
|
|
1080
1131
|
setattr(namespace, self.dest, [])
|
|
1081
1132
|
|
|
@@ -1094,7 +1145,7 @@ class BDMAction(parseractions.MultiKeyValueAction):
|
|
|
1094
1145
|
class CreateServer(command.ShowOne):
|
|
1095
1146
|
_description = _("Create a new server")
|
|
1096
1147
|
|
|
1097
|
-
def get_parser(self, prog_name):
|
|
1148
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1098
1149
|
parser = super().get_parser(prog_name)
|
|
1099
1150
|
parser.add_argument(
|
|
1100
1151
|
'server_name',
|
|
@@ -1535,8 +1586,10 @@ class CreateServer(command.ShowOne):
|
|
|
1535
1586
|
)
|
|
1536
1587
|
return parser
|
|
1537
1588
|
|
|
1538
|
-
def take_action(
|
|
1539
|
-
|
|
1589
|
+
def take_action(
|
|
1590
|
+
self, parsed_args: argparse.Namespace
|
|
1591
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
1592
|
+
def _show_progress(progress: int | None) -> None:
|
|
1540
1593
|
if progress:
|
|
1541
1594
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
1542
1595
|
self.app.stdout.flush()
|
|
@@ -1554,7 +1607,7 @@ class CreateServer(command.ShowOne):
|
|
|
1554
1607
|
|
|
1555
1608
|
if not image and parsed_args.image_properties:
|
|
1556
1609
|
|
|
1557
|
-
def _match_image(image_api, wanted_properties):
|
|
1610
|
+
def _match_image(image_api: Any, wanted_properties: Any) -> Any:
|
|
1558
1611
|
image_list = image_api.images()
|
|
1559
1612
|
images_matched = []
|
|
1560
1613
|
for img in image_list:
|
|
@@ -1909,6 +1962,7 @@ class CreateServer(command.ShowOne):
|
|
|
1909
1962
|
|
|
1910
1963
|
networks = parsed_args.nics[0]
|
|
1911
1964
|
else:
|
|
1965
|
+
_networks = []
|
|
1912
1966
|
for nic in parsed_args.nics:
|
|
1913
1967
|
if 'tag' in nic:
|
|
1914
1968
|
if not sdk_utils.supports_microversion(
|
|
@@ -1969,7 +2023,8 @@ class CreateServer(command.ShowOne):
|
|
|
1969
2023
|
if nic.get('tag'): # tags are optional
|
|
1970
2024
|
network['tag'] = nic['tag']
|
|
1971
2025
|
|
|
1972
|
-
|
|
2026
|
+
_networks.append(network)
|
|
2027
|
+
networks = _networks
|
|
1973
2028
|
|
|
1974
2029
|
if not parsed_args.nics and sdk_utils.supports_microversion(
|
|
1975
2030
|
compute_client, '2.37'
|
|
@@ -2153,7 +2208,8 @@ class CreateServer(command.ShowOne):
|
|
|
2153
2208
|
raise exceptions.CommandError(msg)
|
|
2154
2209
|
|
|
2155
2210
|
data = _prep_server_detail(compute_client, image_client, server)
|
|
2156
|
-
|
|
2211
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
2212
|
+
return col_headers, col_data
|
|
2157
2213
|
|
|
2158
2214
|
|
|
2159
2215
|
class CreateServerDump(command.Command):
|
|
@@ -2168,7 +2224,7 @@ class CreateServerDump(command.Command):
|
|
|
2168
2224
|
This command requires ``--os-compute-api-version`` 2.17 or greater.
|
|
2169
2225
|
"""
|
|
2170
2226
|
|
|
2171
|
-
def get_parser(self, prog_name):
|
|
2227
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
2172
2228
|
parser = super().get_parser(prog_name)
|
|
2173
2229
|
parser.add_argument(
|
|
2174
2230
|
'server',
|
|
@@ -2178,7 +2234,7 @@ class CreateServerDump(command.Command):
|
|
|
2178
2234
|
)
|
|
2179
2235
|
return parser
|
|
2180
2236
|
|
|
2181
|
-
def take_action(self, parsed_args):
|
|
2237
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
2182
2238
|
compute_client = self.app.client_manager.compute
|
|
2183
2239
|
for name_or_id in parsed_args.server:
|
|
2184
2240
|
server = compute_client.find_server(
|
|
@@ -2190,7 +2246,7 @@ class CreateServerDump(command.Command):
|
|
|
2190
2246
|
class DeleteServer(command.Command):
|
|
2191
2247
|
_description = _("Delete server(s)")
|
|
2192
2248
|
|
|
2193
|
-
def get_parser(self, prog_name):
|
|
2249
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
2194
2250
|
parser = super().get_parser(prog_name)
|
|
2195
2251
|
parser.add_argument(
|
|
2196
2252
|
'server',
|
|
@@ -2219,8 +2275,8 @@ class DeleteServer(command.Command):
|
|
|
2219
2275
|
)
|
|
2220
2276
|
return parser
|
|
2221
2277
|
|
|
2222
|
-
def take_action(self, parsed_args):
|
|
2223
|
-
def _show_progress(progress):
|
|
2278
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
2279
|
+
def _show_progress(progress: int | None) -> None:
|
|
2224
2280
|
if progress:
|
|
2225
2281
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
2226
2282
|
self.app.stdout.flush()
|
|
@@ -2273,17 +2329,17 @@ class DeleteServer(command.Command):
|
|
|
2273
2329
|
class PercentAction(argparse.Action):
|
|
2274
2330
|
def __init__(
|
|
2275
2331
|
self,
|
|
2276
|
-
option_strings,
|
|
2277
|
-
dest,
|
|
2278
|
-
nargs=None,
|
|
2279
|
-
const=None,
|
|
2280
|
-
default=None,
|
|
2281
|
-
type=None,
|
|
2282
|
-
choices=None,
|
|
2283
|
-
required=False,
|
|
2284
|
-
help=None,
|
|
2285
|
-
metavar=None,
|
|
2286
|
-
):
|
|
2332
|
+
option_strings: list[str],
|
|
2333
|
+
dest: str,
|
|
2334
|
+
nargs: int | str | None = None,
|
|
2335
|
+
const: Any = None,
|
|
2336
|
+
default: Any = None,
|
|
2337
|
+
type: Any = None,
|
|
2338
|
+
choices: Any = None,
|
|
2339
|
+
required: bool = False,
|
|
2340
|
+
help: str | None = None,
|
|
2341
|
+
metavar: str | tuple[str, ...] | None = None,
|
|
2342
|
+
) -> None:
|
|
2287
2343
|
if nargs == 0:
|
|
2288
2344
|
raise ValueError(
|
|
2289
2345
|
'nargs for store actions must be != 0; if you '
|
|
@@ -2307,7 +2363,13 @@ class PercentAction(argparse.Action):
|
|
|
2307
2363
|
metavar=metavar,
|
|
2308
2364
|
)
|
|
2309
2365
|
|
|
2310
|
-
def __call__(
|
|
2366
|
+
def __call__(
|
|
2367
|
+
self,
|
|
2368
|
+
parser: argparse.ArgumentParser,
|
|
2369
|
+
namespace: argparse.Namespace,
|
|
2370
|
+
values: Any,
|
|
2371
|
+
option_string: str | None = None,
|
|
2372
|
+
) -> None:
|
|
2311
2373
|
x = int(values)
|
|
2312
2374
|
if not 0 < x <= 100:
|
|
2313
2375
|
raise argparse.ArgumentError(self, "Must be between 0 and 100")
|
|
@@ -2317,7 +2379,7 @@ class PercentAction(argparse.Action):
|
|
|
2317
2379
|
class ListServer(command.Lister):
|
|
2318
2380
|
_description = _("List servers")
|
|
2319
2381
|
|
|
2320
|
-
def get_parser(self, prog_name):
|
|
2382
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
2321
2383
|
parser = super().get_parser(prog_name)
|
|
2322
2384
|
parser.add_argument(
|
|
2323
2385
|
'--reservation-id',
|
|
@@ -2657,7 +2719,9 @@ class ListServer(command.Lister):
|
|
|
2657
2719
|
)
|
|
2658
2720
|
return parser
|
|
2659
2721
|
|
|
2660
|
-
def take_action(
|
|
2722
|
+
def take_action(
|
|
2723
|
+
self, parsed_args: argparse.Namespace
|
|
2724
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
2661
2725
|
compute_client = self.app.client_manager.compute
|
|
2662
2726
|
identity_client = self.app.client_manager.identity
|
|
2663
2727
|
image_client = self.app.client_manager.image
|
|
@@ -2790,6 +2854,9 @@ class ListServer(command.Lister):
|
|
|
2790
2854
|
search_opts['limit'] = parsed_args.limit
|
|
2791
2855
|
search_opts['paginated'] = False
|
|
2792
2856
|
|
|
2857
|
+
if parsed_args.max_items is not None:
|
|
2858
|
+
search_opts['max_items'] = parsed_args.max_items
|
|
2859
|
+
|
|
2793
2860
|
LOG.debug('search options: %s', search_opts)
|
|
2794
2861
|
|
|
2795
2862
|
if search_opts['changes-before']:
|
|
@@ -3038,8 +3105,8 @@ class ListServer(command.Lister):
|
|
|
3038
3105
|
else:
|
|
3039
3106
|
try:
|
|
3040
3107
|
flavors_list = compute_client.flavors(is_public=None)
|
|
3041
|
-
for
|
|
3042
|
-
flavors[
|
|
3108
|
+
for f in flavors_list:
|
|
3109
|
+
flavors[f.id] = f
|
|
3043
3110
|
except Exception: # noqa: S110
|
|
3044
3111
|
# retrieving flavor names is not crucial, so we swallow any
|
|
3045
3112
|
# exceptions
|
|
@@ -3060,30 +3127,33 @@ class ListServer(command.Lister):
|
|
|
3060
3127
|
if 'id' in s.image and s.image.id is not None:
|
|
3061
3128
|
image = images.get(s.image['id'])
|
|
3062
3129
|
if image:
|
|
3063
|
-
s
|
|
3130
|
+
setattr(s, 'image_name', image.name)
|
|
3064
3131
|
s.image_id = s.image['id']
|
|
3065
3132
|
else:
|
|
3066
3133
|
# NOTE(melwitt): An server booted from a volume will have no
|
|
3067
3134
|
# image associated with it. We fill in the Image Name and ID
|
|
3068
3135
|
# with "N/A (booted from volume)" to help users who want to be
|
|
3069
3136
|
# able to grep for boot-from-volume servers when using the CLI.
|
|
3070
|
-
s
|
|
3137
|
+
setattr(s, 'image_name', IMAGE_STRING_FOR_BFV)
|
|
3071
3138
|
s.image_id = IMAGE_STRING_FOR_BFV
|
|
3072
3139
|
|
|
3073
3140
|
if not sdk_utils.supports_microversion(compute_client, '2.47'):
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
s.flavor_name = flavor.name
|
|
3141
|
+
if s.flavor['id'] in flavors:
|
|
3142
|
+
setattr(s, 'flavor_name', flavors[s.flavor['id']].name)
|
|
3077
3143
|
s.flavor_id = s.flavor['id']
|
|
3078
3144
|
else:
|
|
3079
|
-
s
|
|
3145
|
+
setattr(s, 'flavor_name', s.flavor['original_name'])
|
|
3080
3146
|
|
|
3081
3147
|
# Add a list with security group name as attribute
|
|
3082
3148
|
for s in data:
|
|
3083
3149
|
if hasattr(s, 'security_groups') and s.security_groups is not None:
|
|
3084
|
-
|
|
3150
|
+
setattr(
|
|
3151
|
+
s,
|
|
3152
|
+
'security_groups_name',
|
|
3153
|
+
[x["name"] for x in s.security_groups],
|
|
3154
|
+
)
|
|
3085
3155
|
else:
|
|
3086
|
-
s
|
|
3156
|
+
setattr(s, 'security_groups_name', [])
|
|
3087
3157
|
|
|
3088
3158
|
# The host_status field contains the status of the compute host the
|
|
3089
3159
|
# server is on. It is only returned by the API when the nova-api
|
|
@@ -3134,7 +3204,7 @@ class LockServer(command.Command):
|
|
|
3134
3204
|
A non-admin user will not be able to execute actions."""
|
|
3135
3205
|
)
|
|
3136
3206
|
|
|
3137
|
-
def get_parser(self, prog_name):
|
|
3207
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
3138
3208
|
parser = super().get_parser(prog_name)
|
|
3139
3209
|
parser.add_argument(
|
|
3140
3210
|
'server',
|
|
@@ -3153,7 +3223,7 @@ A non-admin user will not be able to execute actions."""
|
|
|
3153
3223
|
)
|
|
3154
3224
|
return parser
|
|
3155
3225
|
|
|
3156
|
-
def take_action(self, parsed_args):
|
|
3226
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
3157
3227
|
compute_client = self.app.client_manager.compute
|
|
3158
3228
|
|
|
3159
3229
|
kwargs = {}
|
|
@@ -3189,16 +3259,25 @@ class MigrateServer(command.Command):
|
|
|
3189
3259
|
_description = _(
|
|
3190
3260
|
"""Migrate server to different host.
|
|
3191
3261
|
|
|
3192
|
-
|
|
3193
|
-
|
|
3194
|
-
|
|
3195
|
-
|
|
3196
|
-
the
|
|
3197
|
-
|
|
3198
|
-
|
|
3262
|
+
There are two types of migration operation: a cold migration and a live
|
|
3263
|
+
migration.
|
|
3264
|
+
|
|
3265
|
+
A cold migration operation is implemented as a resize operation
|
|
3266
|
+
using the same flavor as the old server. This means that, like resize, migrate
|
|
3267
|
+
works by shutting down the original server, creating a new server using the
|
|
3268
|
+
same flavor and copying the contents of the original disk into a new one.
|
|
3269
|
+
As with resize, the migrate operation is a two-step process for the user:
|
|
3270
|
+
the first step is to perform the migrate, and the second step is to either
|
|
3271
|
+
confirm (verify) success and release the old server, or to declare a revert
|
|
3272
|
+
to release the new server and restart the old one.
|
|
3273
|
+
|
|
3274
|
+
By comparison, a live migration operation does not involve shutting the server
|
|
3275
|
+
down, and is a one-step process that does not require a confirmation or revert
|
|
3276
|
+
to finish.
|
|
3277
|
+
"""
|
|
3199
3278
|
)
|
|
3200
3279
|
|
|
3201
|
-
def get_parser(self, prog_name):
|
|
3280
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
3202
3281
|
parser = super().get_parser(prog_name)
|
|
3203
3282
|
parser.add_argument(
|
|
3204
3283
|
'server',
|
|
@@ -3272,8 +3351,8 @@ revert to release the new server and restart the old one."""
|
|
|
3272
3351
|
)
|
|
3273
3352
|
return parser
|
|
3274
3353
|
|
|
3275
|
-
def take_action(self, parsed_args):
|
|
3276
|
-
def _show_progress(progress):
|
|
3354
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
3355
|
+
def _show_progress(progress: int | None) -> None:
|
|
3277
3356
|
if progress:
|
|
3278
3357
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
3279
3358
|
self.app.stdout.flush()
|
|
@@ -3370,7 +3449,7 @@ revert to release the new server and restart the old one."""
|
|
|
3370
3449
|
class PauseServer(command.Command):
|
|
3371
3450
|
_description = _("Pause server(s)")
|
|
3372
3451
|
|
|
3373
|
-
def get_parser(self, prog_name):
|
|
3452
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
3374
3453
|
parser = super().get_parser(prog_name)
|
|
3375
3454
|
parser.add_argument(
|
|
3376
3455
|
'server',
|
|
@@ -3380,7 +3459,7 @@ class PauseServer(command.Command):
|
|
|
3380
3459
|
)
|
|
3381
3460
|
return parser
|
|
3382
3461
|
|
|
3383
|
-
def take_action(self, parsed_args):
|
|
3462
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
3384
3463
|
compute_client = self.app.client_manager.compute
|
|
3385
3464
|
for server in parsed_args.server:
|
|
3386
3465
|
server_id = compute_client.find_server(
|
|
@@ -3393,7 +3472,7 @@ class PauseServer(command.Command):
|
|
|
3393
3472
|
class RebootServer(command.Command):
|
|
3394
3473
|
_description = _("Perform a hard or soft server reboot")
|
|
3395
3474
|
|
|
3396
|
-
def get_parser(self, prog_name):
|
|
3475
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
3397
3476
|
parser = super().get_parser(prog_name)
|
|
3398
3477
|
parser.add_argument(
|
|
3399
3478
|
'server',
|
|
@@ -3424,8 +3503,8 @@ class RebootServer(command.Command):
|
|
|
3424
3503
|
)
|
|
3425
3504
|
return parser
|
|
3426
3505
|
|
|
3427
|
-
def take_action(self, parsed_args):
|
|
3428
|
-
def _show_progress(progress):
|
|
3506
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
3507
|
+
def _show_progress(progress: int | None) -> None:
|
|
3429
3508
|
if progress:
|
|
3430
3509
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
3431
3510
|
self.app.stdout.flush()
|
|
@@ -3453,7 +3532,7 @@ class RebootServer(command.Command):
|
|
|
3453
3532
|
class RebuildServer(command.ShowOne):
|
|
3454
3533
|
_description = _("Rebuild server")
|
|
3455
3534
|
|
|
3456
|
-
def get_parser(self, prog_name):
|
|
3535
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
3457
3536
|
parser = super().get_parser(prog_name)
|
|
3458
3537
|
parser.add_argument(
|
|
3459
3538
|
'server',
|
|
@@ -3629,8 +3708,10 @@ class RebuildServer(command.ShowOne):
|
|
|
3629
3708
|
)
|
|
3630
3709
|
return parser
|
|
3631
3710
|
|
|
3632
|
-
def take_action(
|
|
3633
|
-
|
|
3711
|
+
def take_action(
|
|
3712
|
+
self, parsed_args: argparse.Namespace
|
|
3713
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
3714
|
+
def _show_progress(progress: int | None) -> None:
|
|
3634
3715
|
if progress:
|
|
3635
3716
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
3636
3717
|
self.app.stdout.flush()
|
|
@@ -3822,7 +3903,8 @@ class RebuildServer(command.ShowOne):
|
|
|
3822
3903
|
data = _prep_server_detail(
|
|
3823
3904
|
compute_client, image_client, server, refresh=False
|
|
3824
3905
|
)
|
|
3825
|
-
|
|
3906
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
3907
|
+
return col_headers, col_data
|
|
3826
3908
|
|
|
3827
3909
|
|
|
3828
3910
|
class EvacuateServer(command.ShowOne):
|
|
@@ -3843,7 +3925,7 @@ root disk will be preserved and reused for the evacuated instance on the new
|
|
|
3843
3925
|
host."""
|
|
3844
3926
|
)
|
|
3845
3927
|
|
|
3846
|
-
def get_parser(self, prog_name):
|
|
3928
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
3847
3929
|
parser = super().get_parser(prog_name)
|
|
3848
3930
|
parser.add_argument(
|
|
3849
3931
|
'server',
|
|
@@ -3890,8 +3972,10 @@ host."""
|
|
|
3890
3972
|
)
|
|
3891
3973
|
return parser
|
|
3892
3974
|
|
|
3893
|
-
def take_action(
|
|
3894
|
-
|
|
3975
|
+
def take_action(
|
|
3976
|
+
self, parsed_args: argparse.Namespace
|
|
3977
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
3978
|
+
def _show_progress(progress: int | None) -> None:
|
|
3895
3979
|
if progress:
|
|
3896
3980
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
3897
3981
|
self.app.stdout.flush()
|
|
@@ -3946,13 +4030,14 @@ host."""
|
|
|
3946
4030
|
raise exceptions.CommandError(msg)
|
|
3947
4031
|
|
|
3948
4032
|
data = _prep_server_detail(compute_client, image_client, server)
|
|
3949
|
-
|
|
4033
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
4034
|
+
return col_headers, col_data
|
|
3950
4035
|
|
|
3951
4036
|
|
|
3952
4037
|
class RemoveFixedIP(command.Command):
|
|
3953
4038
|
_description = _("Remove fixed IP address from server")
|
|
3954
4039
|
|
|
3955
|
-
def get_parser(self, prog_name):
|
|
4040
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
3956
4041
|
parser = super().get_parser(prog_name)
|
|
3957
4042
|
parser.add_argument(
|
|
3958
4043
|
"server",
|
|
@@ -3966,7 +4051,7 @@ class RemoveFixedIP(command.Command):
|
|
|
3966
4051
|
)
|
|
3967
4052
|
return parser
|
|
3968
4053
|
|
|
3969
|
-
def take_action(self, parsed_args):
|
|
4054
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
3970
4055
|
compute_client = self.app.client_manager.compute
|
|
3971
4056
|
|
|
3972
4057
|
server = compute_client.find_server(
|
|
@@ -3977,10 +4062,11 @@ class RemoveFixedIP(command.Command):
|
|
|
3977
4062
|
)
|
|
3978
4063
|
|
|
3979
4064
|
|
|
3980
|
-
class RemoveFloatingIP(
|
|
4065
|
+
class RemoveFloatingIP(command.Command):
|
|
3981
4066
|
_description = _("Remove floating IP address from server")
|
|
3982
4067
|
|
|
3983
|
-
def
|
|
4068
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4069
|
+
parser = super().get_parser(prog_name)
|
|
3984
4070
|
parser.add_argument(
|
|
3985
4071
|
"server",
|
|
3986
4072
|
metavar="<server>",
|
|
@@ -3995,7 +4081,8 @@ class RemoveFloatingIP(network_common.NetworkAndComputeCommand):
|
|
|
3995
4081
|
)
|
|
3996
4082
|
return parser
|
|
3997
4083
|
|
|
3998
|
-
def
|
|
4084
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4085
|
+
client = self.app.client_manager.network
|
|
3999
4086
|
obj = client.find_ip(
|
|
4000
4087
|
parsed_args.ip_address,
|
|
4001
4088
|
ignore_missing=False,
|
|
@@ -4003,15 +4090,11 @@ class RemoveFloatingIP(network_common.NetworkAndComputeCommand):
|
|
|
4003
4090
|
|
|
4004
4091
|
client.update_ip(obj, port_id=None)
|
|
4005
4092
|
|
|
4006
|
-
def take_action_compute(self, client, parsed_args):
|
|
4007
|
-
server = client.find_server(parsed_args.server, ignore_missing=False)
|
|
4008
|
-
client.remove_floating_ip_from_server(server, parsed_args.ip_address)
|
|
4009
|
-
|
|
4010
4093
|
|
|
4011
4094
|
class RemovePort(command.Command):
|
|
4012
4095
|
_description = _("Remove port from server")
|
|
4013
4096
|
|
|
4014
|
-
def get_parser(self, prog_name):
|
|
4097
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4015
4098
|
parser = super().get_parser(prog_name)
|
|
4016
4099
|
parser.add_argument(
|
|
4017
4100
|
"server",
|
|
@@ -4025,7 +4108,7 @@ class RemovePort(command.Command):
|
|
|
4025
4108
|
)
|
|
4026
4109
|
return parser
|
|
4027
4110
|
|
|
4028
|
-
def take_action(self, parsed_args):
|
|
4111
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4029
4112
|
compute_client = self.app.client_manager.compute
|
|
4030
4113
|
|
|
4031
4114
|
server = compute_client.find_server(
|
|
@@ -4050,7 +4133,7 @@ class RemovePort(command.Command):
|
|
|
4050
4133
|
class RemoveNetwork(command.Command):
|
|
4051
4134
|
_description = _("Remove all ports of a network from server")
|
|
4052
4135
|
|
|
4053
|
-
def get_parser(self, prog_name):
|
|
4136
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4054
4137
|
parser = super().get_parser(prog_name)
|
|
4055
4138
|
parser.add_argument(
|
|
4056
4139
|
"server",
|
|
@@ -4064,7 +4147,7 @@ class RemoveNetwork(command.Command):
|
|
|
4064
4147
|
)
|
|
4065
4148
|
return parser
|
|
4066
4149
|
|
|
4067
|
-
def take_action(self, parsed_args):
|
|
4150
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4068
4151
|
compute_client = self.app.client_manager.compute
|
|
4069
4152
|
|
|
4070
4153
|
server = compute_client.find_server(
|
|
@@ -4090,7 +4173,7 @@ class RemoveNetwork(command.Command):
|
|
|
4090
4173
|
class RemoveServerSecurityGroup(command.Command):
|
|
4091
4174
|
_description = _("Remove security group from server")
|
|
4092
4175
|
|
|
4093
|
-
def get_parser(self, prog_name):
|
|
4176
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4094
4177
|
parser = super().get_parser(prog_name)
|
|
4095
4178
|
parser.add_argument(
|
|
4096
4179
|
'server',
|
|
@@ -4108,7 +4191,7 @@ class RemoveServerSecurityGroup(command.Command):
|
|
|
4108
4191
|
)
|
|
4109
4192
|
return parser
|
|
4110
4193
|
|
|
4111
|
-
def take_action(self, parsed_args):
|
|
4194
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4112
4195
|
compute_client = self.app.client_manager.compute
|
|
4113
4196
|
|
|
4114
4197
|
server = compute_client.find_server(
|
|
@@ -4164,7 +4247,7 @@ Specify ``--os-compute-api-version 2.20`` or higher to remove a
|
|
|
4164
4247
|
volume from a server with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
|
|
4165
4248
|
)
|
|
4166
4249
|
|
|
4167
|
-
def get_parser(self, prog_name):
|
|
4250
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4168
4251
|
parser = super().get_parser(prog_name)
|
|
4169
4252
|
parser.add_argument(
|
|
4170
4253
|
'server',
|
|
@@ -4178,9 +4261,11 @@ volume from a server with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
|
|
|
4178
4261
|
)
|
|
4179
4262
|
return parser
|
|
4180
4263
|
|
|
4181
|
-
def take_action(self, parsed_args):
|
|
4264
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4182
4265
|
compute_client = self.app.client_manager.compute
|
|
4183
|
-
volume_client =
|
|
4266
|
+
volume_client = sdk_utils.ensure_service_version(
|
|
4267
|
+
self.app.client_manager.sdk_connection.volume, '3'
|
|
4268
|
+
)
|
|
4184
4269
|
|
|
4185
4270
|
server = compute_client.find_server(
|
|
4186
4271
|
parsed_args.server,
|
|
@@ -4192,8 +4277,8 @@ volume from a server with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
|
|
|
4192
4277
|
)
|
|
4193
4278
|
|
|
4194
4279
|
compute_client.delete_volume_attachment(
|
|
4195
|
-
volume,
|
|
4196
4280
|
server,
|
|
4281
|
+
volume,
|
|
4197
4282
|
ignore_missing=False,
|
|
4198
4283
|
)
|
|
4199
4284
|
|
|
@@ -4206,7 +4291,7 @@ Specify ``--os-compute-api-version 2.87`` or higher to rescue a
|
|
|
4206
4291
|
server booted from a volume."""
|
|
4207
4292
|
)
|
|
4208
4293
|
|
|
4209
|
-
def get_parser(self, prog_name):
|
|
4294
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4210
4295
|
parser = super().get_parser(prog_name)
|
|
4211
4296
|
parser.add_argument(
|
|
4212
4297
|
'server',
|
|
@@ -4231,7 +4316,7 @@ server booted from a volume."""
|
|
|
4231
4316
|
)
|
|
4232
4317
|
return parser
|
|
4233
4318
|
|
|
4234
|
-
def take_action(self, parsed_args):
|
|
4319
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4235
4320
|
compute_client = self.app.client_manager.compute
|
|
4236
4321
|
image_client = self.app.client_manager.image
|
|
4237
4322
|
|
|
@@ -4260,7 +4345,7 @@ confirm (verify) success and release the old server or to declare a revert to
|
|
|
4260
4345
|
release the new server and restart the old one."""
|
|
4261
4346
|
)
|
|
4262
4347
|
|
|
4263
|
-
def get_parser(self, prog_name):
|
|
4348
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4264
4349
|
parser = super().get_parser(prog_name)
|
|
4265
4350
|
parser.add_argument(
|
|
4266
4351
|
'server',
|
|
@@ -4298,8 +4383,8 @@ release the new server and restart the old one."""
|
|
|
4298
4383
|
)
|
|
4299
4384
|
return parser
|
|
4300
4385
|
|
|
4301
|
-
def take_action(self, parsed_args):
|
|
4302
|
-
def _show_progress(progress):
|
|
4386
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4387
|
+
def _show_progress(progress: int | None) -> None:
|
|
4303
4388
|
if progress:
|
|
4304
4389
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
4305
4390
|
self.app.stdout.flush()
|
|
@@ -4356,7 +4441,7 @@ class ResizeConfirm(command.Command):
|
|
|
4356
4441
|
Confirm (verify) success of resize operation and release the old server."""
|
|
4357
4442
|
)
|
|
4358
4443
|
|
|
4359
|
-
def get_parser(self, prog_name):
|
|
4444
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4360
4445
|
parser = super().get_parser(prog_name)
|
|
4361
4446
|
parser.add_argument(
|
|
4362
4447
|
'server',
|
|
@@ -4365,7 +4450,7 @@ Confirm (verify) success of resize operation and release the old server."""
|
|
|
4365
4450
|
)
|
|
4366
4451
|
return parser
|
|
4367
4452
|
|
|
4368
|
-
def take_action(self, parsed_args):
|
|
4453
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4369
4454
|
compute_client = self.app.client_manager.compute
|
|
4370
4455
|
server = compute_client.find_server(
|
|
4371
4456
|
parsed_args.server, ignore_missing=False
|
|
@@ -4377,7 +4462,7 @@ Confirm (verify) success of resize operation and release the old server."""
|
|
|
4377
4462
|
class MigrateConfirm(ResizeConfirm):
|
|
4378
4463
|
_description = _("DEPRECATED: Use 'server migration confirm' instead.")
|
|
4379
4464
|
|
|
4380
|
-
def take_action(self, parsed_args):
|
|
4465
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4381
4466
|
msg = _(
|
|
4382
4467
|
"The 'server migrate confirm' command has been deprecated in "
|
|
4383
4468
|
"favour of the 'server migration confirm' command."
|
|
@@ -4404,7 +4489,7 @@ Revert the resize operation. Release the new server and restart the old
|
|
|
4404
4489
|
one."""
|
|
4405
4490
|
)
|
|
4406
4491
|
|
|
4407
|
-
def get_parser(self, prog_name):
|
|
4492
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4408
4493
|
parser = super().get_parser(prog_name)
|
|
4409
4494
|
parser.add_argument(
|
|
4410
4495
|
'server',
|
|
@@ -4413,7 +4498,7 @@ one."""
|
|
|
4413
4498
|
)
|
|
4414
4499
|
return parser
|
|
4415
4500
|
|
|
4416
|
-
def take_action(self, parsed_args):
|
|
4501
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4417
4502
|
compute_client = self.app.client_manager.compute
|
|
4418
4503
|
server = compute_client.find_server(
|
|
4419
4504
|
parsed_args.server, ignore_missing=False
|
|
@@ -4425,7 +4510,7 @@ one."""
|
|
|
4425
4510
|
class MigrateRevert(ResizeRevert):
|
|
4426
4511
|
_description = _("DEPRECATED: Use 'server migration revert' instead.")
|
|
4427
4512
|
|
|
4428
|
-
def take_action(self, parsed_args):
|
|
4513
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4429
4514
|
msg = _(
|
|
4430
4515
|
"The 'server migrate revert' command has been deprecated in "
|
|
4431
4516
|
"favour of the 'server migration revert' command."
|
|
@@ -4447,7 +4532,7 @@ one."""
|
|
|
4447
4532
|
class RestoreServer(command.Command):
|
|
4448
4533
|
_description = _("Restore server(s)")
|
|
4449
4534
|
|
|
4450
|
-
def get_parser(self, prog_name):
|
|
4535
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4451
4536
|
parser = super().get_parser(prog_name)
|
|
4452
4537
|
parser.add_argument(
|
|
4453
4538
|
'server',
|
|
@@ -4457,7 +4542,7 @@ class RestoreServer(command.Command):
|
|
|
4457
4542
|
)
|
|
4458
4543
|
return parser
|
|
4459
4544
|
|
|
4460
|
-
def take_action(self, parsed_args):
|
|
4545
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4461
4546
|
compute_client = self.app.client_manager.compute
|
|
4462
4547
|
for server in parsed_args.server:
|
|
4463
4548
|
server_id = compute_client.find_server(
|
|
@@ -4470,7 +4555,7 @@ class RestoreServer(command.Command):
|
|
|
4470
4555
|
class ResumeServer(command.Command):
|
|
4471
4556
|
_description = _("Resume server(s)")
|
|
4472
4557
|
|
|
4473
|
-
def get_parser(self, prog_name):
|
|
4558
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4474
4559
|
parser = super().get_parser(prog_name)
|
|
4475
4560
|
parser.add_argument(
|
|
4476
4561
|
'server',
|
|
@@ -4480,7 +4565,7 @@ class ResumeServer(command.Command):
|
|
|
4480
4565
|
)
|
|
4481
4566
|
return parser
|
|
4482
4567
|
|
|
4483
|
-
def take_action(self, parsed_args):
|
|
4568
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4484
4569
|
compute_client = self.app.client_manager.compute
|
|
4485
4570
|
for server in parsed_args.server:
|
|
4486
4571
|
server_id = compute_client.find_server(
|
|
@@ -4493,7 +4578,7 @@ class ResumeServer(command.Command):
|
|
|
4493
4578
|
class SetServer(command.Command):
|
|
4494
4579
|
_description = _("Set server properties")
|
|
4495
4580
|
|
|
4496
|
-
def get_parser(self, prog_name):
|
|
4581
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4497
4582
|
parser = super().get_parser(prog_name)
|
|
4498
4583
|
parser.add_argument(
|
|
4499
4584
|
'server',
|
|
@@ -4593,7 +4678,7 @@ class SetServer(command.Command):
|
|
|
4593
4678
|
return parser
|
|
4594
4679
|
|
|
4595
4680
|
@staticmethod
|
|
4596
|
-
def ask_user_yesno(msg):
|
|
4681
|
+
def ask_user_yesno(msg: str) -> bool:
|
|
4597
4682
|
"""Ask user Y/N question
|
|
4598
4683
|
|
|
4599
4684
|
:param str msg: question text
|
|
@@ -4606,7 +4691,7 @@ class SetServer(command.Command):
|
|
|
4606
4691
|
elif answer in ('n', 'N', 'no'):
|
|
4607
4692
|
return False
|
|
4608
4693
|
|
|
4609
|
-
def take_action(self, parsed_args):
|
|
4694
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4610
4695
|
compute_client = self.app.client_manager.compute
|
|
4611
4696
|
server = compute_client.find_server(
|
|
4612
4697
|
parsed_args.server, ignore_missing=False
|
|
@@ -4704,7 +4789,7 @@ class ShelveServer(command.Command):
|
|
|
4704
4789
|
specified. This is an admin-only operation by default.
|
|
4705
4790
|
"""
|
|
4706
4791
|
|
|
4707
|
-
def get_parser(self, prog_name):
|
|
4792
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4708
4793
|
parser = super().get_parser(prog_name)
|
|
4709
4794
|
parser.add_argument(
|
|
4710
4795
|
'servers',
|
|
@@ -4730,8 +4815,8 @@ class ShelveServer(command.Command):
|
|
|
4730
4815
|
)
|
|
4731
4816
|
return parser
|
|
4732
4817
|
|
|
4733
|
-
def take_action(self, parsed_args):
|
|
4734
|
-
def _show_progress(progress):
|
|
4818
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4819
|
+
def _show_progress(progress: int | None) -> None:
|
|
4735
4820
|
if progress:
|
|
4736
4821
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
4737
4822
|
self.app.stdout.flush()
|
|
@@ -4804,7 +4889,7 @@ Specify ``--os-compute-api-version 2.47`` or higher to see the embedded flavor
|
|
|
4804
4889
|
information for the server."""
|
|
4805
4890
|
)
|
|
4806
4891
|
|
|
4807
|
-
def get_parser(self, prog_name):
|
|
4892
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4808
4893
|
parser = super().get_parser(prog_name)
|
|
4809
4894
|
parser.add_argument(
|
|
4810
4895
|
'server',
|
|
@@ -4830,7 +4915,9 @@ information for the server."""
|
|
|
4830
4915
|
)
|
|
4831
4916
|
return parser
|
|
4832
4917
|
|
|
4833
|
-
def take_action(
|
|
4918
|
+
def take_action(
|
|
4919
|
+
self, parsed_args: argparse.Namespace
|
|
4920
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
4834
4921
|
compute_client = self.app.client_manager.compute
|
|
4835
4922
|
image_client = self.app.client_manager.image
|
|
4836
4923
|
|
|
@@ -4841,8 +4928,9 @@ information for the server."""
|
|
|
4841
4928
|
)
|
|
4842
4929
|
|
|
4843
4930
|
if parsed_args.diagnostics:
|
|
4844
|
-
|
|
4845
|
-
|
|
4931
|
+
diagnostics = compute_client.get_server_diagnostics(server)
|
|
4932
|
+
col_headers, col_data = zip(*sorted(diagnostics.items()))
|
|
4933
|
+
return col_headers, col_data
|
|
4846
4934
|
|
|
4847
4935
|
topology = None
|
|
4848
4936
|
if parsed_args.topology:
|
|
@@ -4860,13 +4948,14 @@ information for the server."""
|
|
|
4860
4948
|
)
|
|
4861
4949
|
if topology:
|
|
4862
4950
|
data['topology'] = format_columns.DictColumn(topology)
|
|
4863
|
-
|
|
4951
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
4952
|
+
return col_headers, col_data
|
|
4864
4953
|
|
|
4865
4954
|
|
|
4866
4955
|
class SshServer(command.Command):
|
|
4867
4956
|
_description = _("SSH to server")
|
|
4868
4957
|
|
|
4869
|
-
def get_parser(self, prog_name):
|
|
4958
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
4870
4959
|
parser = super().get_parser(prog_name)
|
|
4871
4960
|
parser.add_argument(
|
|
4872
4961
|
'server',
|
|
@@ -4960,7 +5049,7 @@ class SshServer(command.Command):
|
|
|
4960
5049
|
)
|
|
4961
5050
|
return parser
|
|
4962
5051
|
|
|
4963
|
-
def take_action(self, parsed_args):
|
|
5052
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
4964
5053
|
compute_client = self.app.client_manager.compute
|
|
4965
5054
|
|
|
4966
5055
|
server = compute_client.find_server(
|
|
@@ -5017,7 +5106,7 @@ class SshServer(command.Command):
|
|
|
5017
5106
|
ip_address_family,
|
|
5018
5107
|
)
|
|
5019
5108
|
|
|
5020
|
-
cmd = ' '.join(['ssh', ip_address
|
|
5109
|
+
cmd = ' '.join(['ssh', ip_address, *args])
|
|
5021
5110
|
LOG.debug('ssh command: %s', cmd)
|
|
5022
5111
|
# we intentionally pass through user-provided arguments and run this in
|
|
5023
5112
|
# the user's shell
|
|
@@ -5027,7 +5116,7 @@ class SshServer(command.Command):
|
|
|
5027
5116
|
class StartServer(command.Command):
|
|
5028
5117
|
_description = _("Start server(s)")
|
|
5029
5118
|
|
|
5030
|
-
def get_parser(self, prog_name):
|
|
5119
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
5031
5120
|
parser = super().get_parser(prog_name)
|
|
5032
5121
|
parser.add_argument(
|
|
5033
5122
|
'server',
|
|
@@ -5046,7 +5135,7 @@ class StartServer(command.Command):
|
|
|
5046
5135
|
)
|
|
5047
5136
|
return parser
|
|
5048
5137
|
|
|
5049
|
-
def take_action(self, parsed_args):
|
|
5138
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
5050
5139
|
compute_client = self.app.client_manager.compute
|
|
5051
5140
|
for server in parsed_args.server:
|
|
5052
5141
|
server_id = compute_client.find_server(
|
|
@@ -5062,7 +5151,7 @@ class StartServer(command.Command):
|
|
|
5062
5151
|
class StopServer(command.Command):
|
|
5063
5152
|
_description = _("Stop server(s)")
|
|
5064
5153
|
|
|
5065
|
-
def get_parser(self, prog_name):
|
|
5154
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
5066
5155
|
parser = super().get_parser(prog_name)
|
|
5067
5156
|
parser.add_argument(
|
|
5068
5157
|
'server',
|
|
@@ -5081,7 +5170,7 @@ class StopServer(command.Command):
|
|
|
5081
5170
|
)
|
|
5082
5171
|
return parser
|
|
5083
5172
|
|
|
5084
|
-
def take_action(self, parsed_args):
|
|
5173
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
5085
5174
|
compute_client = self.app.client_manager.compute
|
|
5086
5175
|
for server in parsed_args.server:
|
|
5087
5176
|
server_id = compute_client.find_server(
|
|
@@ -5096,7 +5185,7 @@ class StopServer(command.Command):
|
|
|
5096
5185
|
class SuspendServer(command.Command):
|
|
5097
5186
|
_description = _("Suspend server(s)")
|
|
5098
5187
|
|
|
5099
|
-
def get_parser(self, prog_name):
|
|
5188
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
5100
5189
|
parser = super().get_parser(prog_name)
|
|
5101
5190
|
parser.add_argument(
|
|
5102
5191
|
'server',
|
|
@@ -5106,7 +5195,7 @@ class SuspendServer(command.Command):
|
|
|
5106
5195
|
)
|
|
5107
5196
|
return parser
|
|
5108
5197
|
|
|
5109
|
-
def take_action(self, parsed_args):
|
|
5198
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
5110
5199
|
compute_client = self.app.client_manager.compute
|
|
5111
5200
|
for server in parsed_args.server:
|
|
5112
5201
|
server_id = compute_client.find_server(
|
|
@@ -5119,7 +5208,7 @@ class SuspendServer(command.Command):
|
|
|
5119
5208
|
class UnlockServer(command.Command):
|
|
5120
5209
|
_description = _("Unlock server(s)")
|
|
5121
5210
|
|
|
5122
|
-
def get_parser(self, prog_name):
|
|
5211
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
5123
5212
|
parser = super().get_parser(prog_name)
|
|
5124
5213
|
parser.add_argument(
|
|
5125
5214
|
'server',
|
|
@@ -5129,7 +5218,7 @@ class UnlockServer(command.Command):
|
|
|
5129
5218
|
)
|
|
5130
5219
|
return parser
|
|
5131
5220
|
|
|
5132
|
-
def take_action(self, parsed_args):
|
|
5221
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
5133
5222
|
compute_client = self.app.client_manager.compute
|
|
5134
5223
|
for server in parsed_args.server:
|
|
5135
5224
|
server_id = compute_client.find_server(
|
|
@@ -5142,7 +5231,7 @@ class UnlockServer(command.Command):
|
|
|
5142
5231
|
class UnpauseServer(command.Command):
|
|
5143
5232
|
_description = _("Unpause server(s)")
|
|
5144
5233
|
|
|
5145
|
-
def get_parser(self, prog_name):
|
|
5234
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
5146
5235
|
parser = super().get_parser(prog_name)
|
|
5147
5236
|
parser.add_argument(
|
|
5148
5237
|
'server',
|
|
@@ -5152,7 +5241,7 @@ class UnpauseServer(command.Command):
|
|
|
5152
5241
|
)
|
|
5153
5242
|
return parser
|
|
5154
5243
|
|
|
5155
|
-
def take_action(self, parsed_args):
|
|
5244
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
5156
5245
|
compute_client = self.app.client_manager.compute
|
|
5157
5246
|
for server in parsed_args.server:
|
|
5158
5247
|
server_id = compute_client.find_server(
|
|
@@ -5165,7 +5254,7 @@ class UnpauseServer(command.Command):
|
|
|
5165
5254
|
class UnrescueServer(command.Command):
|
|
5166
5255
|
_description = _("Restore server from rescue mode")
|
|
5167
5256
|
|
|
5168
|
-
def get_parser(self, prog_name):
|
|
5257
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
5169
5258
|
parser = super().get_parser(prog_name)
|
|
5170
5259
|
parser.add_argument(
|
|
5171
5260
|
'server',
|
|
@@ -5174,7 +5263,7 @@ class UnrescueServer(command.Command):
|
|
|
5174
5263
|
)
|
|
5175
5264
|
return parser
|
|
5176
5265
|
|
|
5177
|
-
def take_action(self, parsed_args):
|
|
5266
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
5178
5267
|
compute_client = self.app.client_manager.compute
|
|
5179
5268
|
server = compute_client.find_server(
|
|
5180
5269
|
parsed_args.server, ignore_missing=False
|
|
@@ -5185,7 +5274,7 @@ class UnrescueServer(command.Command):
|
|
|
5185
5274
|
class UnsetServer(command.Command):
|
|
5186
5275
|
_description = _("Unset server properties and tags")
|
|
5187
5276
|
|
|
5188
|
-
def get_parser(self, prog_name):
|
|
5277
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
5189
5278
|
parser = super().get_parser(prog_name)
|
|
5190
5279
|
parser.add_argument(
|
|
5191
5280
|
'server',
|
|
@@ -5241,7 +5330,7 @@ class UnsetServer(command.Command):
|
|
|
5241
5330
|
)
|
|
5242
5331
|
return parser
|
|
5243
5332
|
|
|
5244
|
-
def take_action(self, parsed_args):
|
|
5333
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
5245
5334
|
compute_client = self.app.client_manager.compute
|
|
5246
5335
|
|
|
5247
5336
|
server = compute_client.find_server(
|
|
@@ -5281,7 +5370,7 @@ class UnsetServer(command.Command):
|
|
|
5281
5370
|
class UnshelveServer(command.Command):
|
|
5282
5371
|
_description = _("Unshelve server(s)")
|
|
5283
5372
|
|
|
5284
|
-
def get_parser(self, prog_name):
|
|
5373
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
5285
5374
|
parser = super().get_parser(prog_name)
|
|
5286
5375
|
parser.add_argument(
|
|
5287
5376
|
'server',
|
|
@@ -5327,8 +5416,8 @@ class UnshelveServer(command.Command):
|
|
|
5327
5416
|
)
|
|
5328
5417
|
return parser
|
|
5329
5418
|
|
|
5330
|
-
def take_action(self, parsed_args):
|
|
5331
|
-
def _show_progress(progress):
|
|
5419
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
5420
|
+
def _show_progress(progress: int | None) -> None:
|
|
5332
5421
|
if progress:
|
|
5333
5422
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
5334
5423
|
self.app.stdout.flush()
|