python-openstackclient 8.1.0__py3-none-any.whl → 8.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openstackclient/api/compute_v2.py +2 -2
- openstackclient/api/object_store_v1.py +4 -1
- openstackclient/api/volume_v2.py +60 -0
- openstackclient/api/volume_v3.py +60 -0
- openstackclient/command.py +27 -0
- openstackclient/common/availability_zone.py +1 -1
- openstackclient/common/clientmanager.py +59 -21
- openstackclient/common/configuration.py +1 -1
- openstackclient/common/extension.py +1 -1
- openstackclient/common/limits.py +1 -1
- openstackclient/common/module.py +4 -2
- openstackclient/common/project_cleanup.py +10 -8
- openstackclient/common/quota.py +23 -6
- openstackclient/common/versions.py +1 -2
- openstackclient/compute/v2/agent.py +1 -1
- openstackclient/compute/v2/aggregate.py +6 -5
- openstackclient/compute/v2/console.py +5 -3
- openstackclient/compute/v2/console_connection.py +1 -1
- openstackclient/compute/v2/flavor.py +15 -2
- openstackclient/compute/v2/host.py +1 -1
- openstackclient/compute/v2/hypervisor.py +1 -1
- openstackclient/compute/v2/hypervisor_stats.py +1 -1
- openstackclient/compute/v2/keypair.py +1 -1
- openstackclient/compute/v2/server.py +77 -30
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_event.py +1 -1
- openstackclient/compute/v2/server_group.py +4 -2
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +1 -1
- openstackclient/compute/v2/server_volume.py +1 -1
- openstackclient/compute/v2/service.py +1 -1
- openstackclient/compute/v2/usage.py +6 -4
- openstackclient/identity/common.py +10 -14
- openstackclient/identity/v2_0/catalog.py +3 -2
- openstackclient/identity/v2_0/ec2creds.py +1 -1
- openstackclient/identity/v2_0/endpoint.py +1 -1
- openstackclient/identity/v2_0/project.py +17 -7
- openstackclient/identity/v2_0/role.py +1 -1
- openstackclient/identity/v2_0/role_assignment.py +3 -3
- openstackclient/identity/v2_0/service.py +1 -1
- openstackclient/identity/v2_0/token.py +1 -1
- openstackclient/identity/v2_0/user.py +2 -2
- openstackclient/identity/v3/access_rule.py +16 -4
- openstackclient/identity/v3/application_credential.py +116 -95
- openstackclient/identity/v3/catalog.py +3 -3
- openstackclient/identity/v3/consumer.py +1 -1
- openstackclient/identity/v3/credential.py +1 -1
- openstackclient/identity/v3/domain.py +15 -10
- openstackclient/identity/v3/ec2creds.py +1 -1
- openstackclient/identity/v3/endpoint.py +33 -12
- openstackclient/identity/v3/endpoint_group.py +1 -1
- openstackclient/identity/v3/federation_protocol.py +1 -1
- openstackclient/identity/v3/group.py +11 -5
- openstackclient/identity/v3/identity_provider.py +12 -10
- openstackclient/identity/v3/implied_role.py +1 -1
- openstackclient/identity/v3/limit.py +1 -1
- openstackclient/identity/v3/mapping.py +1 -1
- openstackclient/identity/v3/policy.py +1 -1
- openstackclient/identity/v3/project.py +34 -22
- openstackclient/identity/v3/region.py +1 -1
- openstackclient/identity/v3/registered_limit.py +16 -11
- openstackclient/identity/v3/role.py +27 -41
- openstackclient/identity/v3/role_assignment.py +12 -23
- openstackclient/identity/v3/service.py +1 -1
- openstackclient/identity/v3/service_provider.py +1 -1
- openstackclient/identity/v3/tag.py +3 -2
- openstackclient/identity/v3/token.py +3 -2
- openstackclient/identity/v3/trust.py +4 -2
- openstackclient/identity/v3/unscoped_saml.py +1 -1
- openstackclient/identity/v3/user.py +22 -13
- openstackclient/image/v1/image.py +35 -17
- openstackclient/image/v2/cache.py +11 -7
- openstackclient/image/v2/image.py +62 -12
- openstackclient/image/v2/info.py +1 -1
- openstackclient/image/v2/metadef_namespaces.py +1 -1
- openstackclient/image/v2/metadef_objects.py +9 -3
- openstackclient/image/v2/metadef_properties.py +11 -3
- openstackclient/image/v2/metadef_resource_type_association.py +1 -1
- openstackclient/image/v2/metadef_resource_types.py +1 -1
- openstackclient/image/v2/task.py +1 -1
- openstackclient/network/common.py +10 -9
- openstackclient/network/v2/address_group.py +4 -3
- openstackclient/network/v2/address_scope.py +8 -6
- openstackclient/network/v2/default_security_group_rule.py +9 -8
- openstackclient/network/v2/floating_ip.py +16 -9
- openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
- openstackclient/network/v2/ip_availability.py +7 -4
- openstackclient/network/v2/l3_conntrack_helper.py +11 -4
- openstackclient/network/v2/local_ip.py +13 -7
- openstackclient/network/v2/local_ip_association.py +7 -4
- openstackclient/network/v2/ndp_proxy.py +13 -6
- openstackclient/network/v2/network.py +33 -16
- openstackclient/network/v2/network_agent.py +5 -5
- openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
- openstackclient/network/v2/network_flavor.py +1 -1
- openstackclient/network/v2/network_flavor_profile.py +1 -1
- openstackclient/network/v2/network_meter.py +1 -1
- openstackclient/network/v2/network_meter_rule.py +1 -1
- openstackclient/network/v2/network_qos_policy.py +7 -5
- openstackclient/network/v2/network_qos_rule.py +1 -1
- openstackclient/network/v2/network_qos_rule_type.py +1 -1
- openstackclient/network/v2/network_rbac.py +8 -5
- openstackclient/network/v2/network_segment.py +2 -2
- openstackclient/network/v2/network_segment_range.py +13 -6
- openstackclient/network/v2/network_service_provider.py +1 -1
- openstackclient/network/v2/network_trunk.py +65 -42
- openstackclient/network/v2/port.py +38 -20
- openstackclient/network/v2/router.py +19 -8
- openstackclient/network/v2/security_group.py +52 -7
- openstackclient/network/v2/security_group_rule.py +27 -4
- openstackclient/network/v2/subnet.py +17 -18
- openstackclient/network/v2/subnet_pool.py +11 -9
- openstackclient/network/v2/taas/__init__.py +0 -0
- openstackclient/network/v2/taas/tap_flow.py +245 -0
- openstackclient/network/v2/taas/tap_mirror.py +237 -0
- openstackclient/network/v2/taas/tap_service.py +211 -0
- openstackclient/object/v1/account.py +1 -1
- openstackclient/object/v1/container.py +1 -1
- openstackclient/object/v1/object.py +1 -1
- openstackclient/shell.py +18 -8
- openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
- openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
- openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
- openstackclient/tests/functional/image/v2/test_cache.py +54 -0
- openstackclient/tests/functional/image/v2/test_image.py +36 -14
- openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
- openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
- openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
- openstackclient/tests/unit/api/test_volume_v2.py +124 -0
- openstackclient/tests/unit/api/test_volume_v3.py +124 -0
- openstackclient/tests/unit/common/test_command.py +1 -1
- openstackclient/tests/unit/common/test_extension.py +2 -3
- openstackclient/tests/unit/common/test_module.py +14 -7
- openstackclient/tests/unit/common/test_quota.py +20 -0
- openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
- openstackclient/tests/unit/compute/v2/test_console.py +1 -4
- openstackclient/tests/unit/compute/v2/test_flavor.py +160 -177
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
- openstackclient/tests/unit/compute/v2/test_server.py +406 -81
- openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
- openstackclient/tests/unit/compute/v2/test_service.py +1 -3
- openstackclient/tests/unit/fakes.py +35 -134
- openstackclient/tests/unit/identity/test_common.py +100 -0
- openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
- openstackclient/tests/unit/identity/v3/fakes.py +10 -2
- openstackclient/tests/unit/identity/v3/test_application_credential.py +50 -44
- openstackclient/tests/unit/identity/v3/test_domain.py +3 -3
- openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
- openstackclient/tests/unit/identity/v3/test_group.py +4 -2
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
- openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
- openstackclient/tests/unit/identity/v3/test_project.py +31 -54
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
- openstackclient/tests/unit/identity/v3/test_role.py +3 -90
- openstackclient/tests/unit/identity/v3/test_user.py +7 -51
- openstackclient/tests/unit/image/v1/test_image.py +47 -0
- openstackclient/tests/unit/image/v2/test_image.py +190 -9
- openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
- openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
- openstackclient/tests/unit/network/test_common.py +9 -13
- openstackclient/tests/unit/network/v2/fakes.py +1 -0
- openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
- openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
- openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
- openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
- openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
- openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
- openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -23
- openstackclient/tests/unit/network/v2/test_network.py +41 -37
- openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
- openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
- openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
- openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
- openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
- openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
- openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
- openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
- openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
- openstackclient/tests/unit/network/v2/test_port.py +113 -84
- openstackclient/tests/unit/network/v2/test_router.py +104 -126
- openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -26
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +66 -18
- openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
- openstackclient/tests/unit/volume/test_find_resource.py +4 -13
- openstackclient/tests/unit/volume/v2/test_volume.py +358 -305
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume.py +443 -415
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
- openstackclient/volume/client.py +7 -17
- openstackclient/volume/v2/backup_record.py +1 -1
- openstackclient/volume/v2/consistency_group.py +1 -1
- openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
- openstackclient/volume/v2/qos_specs.py +1 -1
- openstackclient/volume/v2/service.py +2 -2
- openstackclient/volume/v2/volume.py +80 -54
- openstackclient/volume/v2/volume_backend.py +1 -1
- openstackclient/volume/v2/volume_backup.py +5 -3
- openstackclient/volume/v2/volume_host.py +1 -2
- openstackclient/volume/v2/volume_snapshot.py +2 -2
- openstackclient/volume/v2/volume_transfer_request.py +1 -1
- openstackclient/volume/v2/volume_type.py +11 -6
- openstackclient/volume/v3/block_storage_cleanup.py +1 -1
- openstackclient/volume/v3/block_storage_cluster.py +1 -1
- openstackclient/volume/v3/block_storage_log_level.py +1 -1
- openstackclient/volume/v3/block_storage_manage.py +1 -1
- openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
- openstackclient/volume/v3/service.py +2 -2
- openstackclient/volume/v3/volume.py +104 -77
- openstackclient/volume/v3/volume_attachment.py +6 -5
- openstackclient/volume/v3/volume_backup.py +18 -3
- openstackclient/volume/v3/volume_group.py +2 -2
- openstackclient/volume/v3/volume_group_snapshot.py +1 -1
- openstackclient/volume/v3/volume_group_type.py +1 -1
- openstackclient/volume/v3/volume_message.py +1 -1
- openstackclient/volume/v3/volume_snapshot.py +2 -2
- openstackclient/volume/v3/volume_transfer_request.py +1 -1
- openstackclient/volume/v3/volume_type.py +15 -9
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +19 -17
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +239 -224
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +15 -0
- python_openstackclient-8.3.0.dist-info/pbr.json +1 -0
- openstackclient/tests/unit/common/test_logs.py +0 -221
- python_openstackclient-8.1.0.dist-info/pbr.json +0 -1
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/LICENSE +0 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
# under the License.
|
|
14
14
|
|
|
15
15
|
import base64
|
|
16
|
-
import collections
|
|
17
16
|
import getpass
|
|
18
17
|
import json
|
|
19
18
|
import tempfile
|
|
@@ -21,9 +20,11 @@ from unittest import mock
|
|
|
21
20
|
import uuid
|
|
22
21
|
|
|
23
22
|
import iso8601
|
|
23
|
+
from openstack.compute.v2 import flavor as _flavor
|
|
24
24
|
from openstack.compute.v2 import server as _server
|
|
25
25
|
from openstack.compute.v2 import server_group as _server_group
|
|
26
26
|
from openstack import exceptions as sdk_exceptions
|
|
27
|
+
from openstack.image.v2 import image as _image
|
|
27
28
|
from openstack.test import fakes as sdk_fakes
|
|
28
29
|
from osc_lib.cli import format_columns
|
|
29
30
|
from osc_lib import exceptions
|
|
@@ -89,10 +90,6 @@ class TestServerAddFixedIP(TestServer):
|
|
|
89
90
|
# Get the command object to test
|
|
90
91
|
self.cmd = server.AddFixedIP(self.app, None)
|
|
91
92
|
|
|
92
|
-
# Mock network methods
|
|
93
|
-
self.find_network = mock.Mock()
|
|
94
|
-
self.app.client_manager.network.find_network = self.find_network
|
|
95
|
-
|
|
96
93
|
def test_server_add_fixed_ip_pre_v249_with_tag(self):
|
|
97
94
|
self.set_compute_api_version('2.48')
|
|
98
95
|
|
|
@@ -408,7 +405,7 @@ class TestServerAddFloatingIPNetwork(
|
|
|
408
405
|
self.server = compute_fakes.create_one_server()
|
|
409
406
|
self.compute_client.find_server.return_value = self.server
|
|
410
407
|
|
|
411
|
-
self.network_client.update_ip =
|
|
408
|
+
self.network_client.update_ip.return_value = None
|
|
412
409
|
|
|
413
410
|
# Get the command object to test
|
|
414
411
|
self.cmd = server.AddFloatingIP(self.app, None)
|
|
@@ -416,8 +413,8 @@ class TestServerAddFloatingIPNetwork(
|
|
|
416
413
|
def test_server_add_floating_ip(self):
|
|
417
414
|
_port = network_fakes.create_one_port()
|
|
418
415
|
_floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
|
|
419
|
-
self.network_client.find_ip =
|
|
420
|
-
self.network_client.ports =
|
|
416
|
+
self.network_client.find_ip.return_value = _floating_ip
|
|
417
|
+
self.network_client.ports.return_value = [_port]
|
|
421
418
|
arglist = [
|
|
422
419
|
self.server.id,
|
|
423
420
|
_floating_ip['floating_ip_address'],
|
|
@@ -448,8 +445,8 @@ class TestServerAddFloatingIPNetwork(
|
|
|
448
445
|
def test_server_add_floating_ip_no_ports(self):
|
|
449
446
|
floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
|
|
450
447
|
|
|
451
|
-
self.network_client.find_ip =
|
|
452
|
-
self.network_client.ports =
|
|
448
|
+
self.network_client.find_ip.return_value = floating_ip
|
|
449
|
+
self.network_client.ports.return_value = []
|
|
453
450
|
|
|
454
451
|
arglist = [
|
|
455
452
|
self.server.id,
|
|
@@ -479,17 +476,17 @@ class TestServerAddFloatingIPNetwork(
|
|
|
479
476
|
def test_server_add_floating_ip_no_external_gateway(self, success=False):
|
|
480
477
|
_port = network_fakes.create_one_port()
|
|
481
478
|
_floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
|
|
482
|
-
self.network_client.find_ip =
|
|
479
|
+
self.network_client.find_ip.return_value = _floating_ip
|
|
483
480
|
return_value = [_port]
|
|
484
481
|
# In the success case, we'll have two ports, where the first port is
|
|
485
482
|
# not attached to an external gateway but the second port is.
|
|
486
483
|
if success:
|
|
487
484
|
return_value.append(_port)
|
|
488
|
-
self.network_client.ports =
|
|
485
|
+
self.network_client.ports.return_value = return_value
|
|
489
486
|
side_effect = [sdk_exceptions.NotFoundException()]
|
|
490
487
|
if success:
|
|
491
488
|
side_effect.append(None)
|
|
492
|
-
self.network_client.update_ip =
|
|
489
|
+
self.network_client.update_ip.side_effect = side_effect
|
|
493
490
|
arglist = [
|
|
494
491
|
self.server.id,
|
|
495
492
|
_floating_ip['floating_ip_address'],
|
|
@@ -535,8 +532,8 @@ class TestServerAddFloatingIPNetwork(
|
|
|
535
532
|
def test_server_add_floating_ip_with_fixed_ip(self):
|
|
536
533
|
_port = network_fakes.create_one_port()
|
|
537
534
|
_floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
|
|
538
|
-
self.network_client.find_ip =
|
|
539
|
-
self.network_client.ports =
|
|
535
|
+
self.network_client.find_ip.return_value = _floating_ip
|
|
536
|
+
self.network_client.ports.return_value = [_port]
|
|
540
537
|
# The user has specified a fixed ip that matches one of the ports
|
|
541
538
|
# already attached to the instance.
|
|
542
539
|
arglist = [
|
|
@@ -575,8 +572,8 @@ class TestServerAddFloatingIPNetwork(
|
|
|
575
572
|
def test_server_add_floating_ip_with_fixed_ip_no_port_found(self):
|
|
576
573
|
_port = network_fakes.create_one_port()
|
|
577
574
|
_floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
|
|
578
|
-
self.network_client.find_ip =
|
|
579
|
-
self.network_client.ports =
|
|
575
|
+
self.network_client.find_ip.return_value = _floating_ip
|
|
576
|
+
self.network_client.ports.return_value = [_port]
|
|
580
577
|
# The user has specified a fixed ip that does not match any of the
|
|
581
578
|
# ports already attached to the instance.
|
|
582
579
|
nonexistent_ip = '10.0.0.9'
|
|
@@ -614,9 +611,6 @@ class TestServerAddPort(TestServer):
|
|
|
614
611
|
# Get the command object to test
|
|
615
612
|
self.cmd = server.AddPort(self.app, None)
|
|
616
613
|
|
|
617
|
-
self.find_port = mock.Mock()
|
|
618
|
-
self.app.client_manager.network.find_port = self.find_port
|
|
619
|
-
|
|
620
614
|
def _test_server_add_port(self, port_id):
|
|
621
615
|
servers = self.setup_sdk_servers_mock(count=1)
|
|
622
616
|
port = 'fake-port'
|
|
@@ -636,21 +630,23 @@ class TestServerAddPort(TestServer):
|
|
|
636
630
|
self.assertIsNone(result)
|
|
637
631
|
|
|
638
632
|
def test_server_add_port(self):
|
|
639
|
-
self._test_server_add_port(
|
|
640
|
-
|
|
633
|
+
self._test_server_add_port(
|
|
634
|
+
self.network_client.find_port.return_value.id
|
|
635
|
+
)
|
|
636
|
+
self.network_client.find_port.assert_called_once_with(
|
|
641
637
|
'fake-port', ignore_missing=False
|
|
642
638
|
)
|
|
643
639
|
|
|
644
640
|
def test_server_add_port_no_neutron(self):
|
|
645
641
|
self.app.client_manager.network_endpoint_enabled = False
|
|
646
642
|
self._test_server_add_port('fake-port')
|
|
647
|
-
self.find_port.assert_not_called()
|
|
643
|
+
self.network_client.find_port.assert_not_called()
|
|
648
644
|
|
|
649
645
|
def test_server_add_port_with_tag(self):
|
|
650
646
|
self.set_compute_api_version('2.49')
|
|
651
647
|
|
|
652
648
|
servers = self.setup_sdk_servers_mock(count=1)
|
|
653
|
-
self.find_port.return_value.id = 'fake-port'
|
|
649
|
+
self.network_client.find_port.return_value.id = 'fake-port'
|
|
654
650
|
arglist = [
|
|
655
651
|
servers[0].id,
|
|
656
652
|
'fake-port',
|
|
@@ -675,7 +671,7 @@ class TestServerAddPort(TestServer):
|
|
|
675
671
|
self.set_compute_api_version('2.48')
|
|
676
672
|
|
|
677
673
|
servers = self.setup_sdk_servers_mock(count=1)
|
|
678
|
-
self.find_port.return_value.id = 'fake-port'
|
|
674
|
+
self.network_client.find_port.return_value.id = 'fake-port'
|
|
679
675
|
arglist = [
|
|
680
676
|
servers[0].id,
|
|
681
677
|
'fake-port',
|
|
@@ -1038,9 +1034,6 @@ class TestServerAddNetwork(TestServer):
|
|
|
1038
1034
|
# Get the command object to test
|
|
1039
1035
|
self.cmd = server.AddNetwork(self.app, None)
|
|
1040
1036
|
|
|
1041
|
-
self.find_network = mock.Mock()
|
|
1042
|
-
self.app.client_manager.network.find_network = self.find_network
|
|
1043
|
-
|
|
1044
1037
|
def _test_server_add_network(self, net_id):
|
|
1045
1038
|
servers = self.setup_sdk_servers_mock(count=1)
|
|
1046
1039
|
network = 'fake-network'
|
|
@@ -1060,21 +1053,23 @@ class TestServerAddNetwork(TestServer):
|
|
|
1060
1053
|
self.assertIsNone(result)
|
|
1061
1054
|
|
|
1062
1055
|
def test_server_add_network(self):
|
|
1063
|
-
self._test_server_add_network(
|
|
1064
|
-
|
|
1056
|
+
self._test_server_add_network(
|
|
1057
|
+
self.network_client.find_network.return_value.id
|
|
1058
|
+
)
|
|
1059
|
+
self.network_client.find_network.assert_called_once_with(
|
|
1065
1060
|
'fake-network', ignore_missing=False
|
|
1066
1061
|
)
|
|
1067
1062
|
|
|
1068
1063
|
def test_server_add_network_no_neutron(self):
|
|
1069
1064
|
self.app.client_manager.network_endpoint_enabled = False
|
|
1070
1065
|
self._test_server_add_network('fake-network')
|
|
1071
|
-
self.find_network.assert_not_called()
|
|
1066
|
+
self.network_client.find_network.assert_not_called()
|
|
1072
1067
|
|
|
1073
1068
|
def test_server_add_network_with_tag(self):
|
|
1074
1069
|
self.set_compute_api_version('2.49')
|
|
1075
1070
|
|
|
1076
1071
|
servers = self.setup_sdk_servers_mock(count=1)
|
|
1077
|
-
self.find_network.return_value.id = 'fake-network'
|
|
1072
|
+
self.network_client.find_network.return_value.id = 'fake-network'
|
|
1078
1073
|
|
|
1079
1074
|
arglist = [
|
|
1080
1075
|
servers[0].id,
|
|
@@ -1100,7 +1095,7 @@ class TestServerAddNetwork(TestServer):
|
|
|
1100
1095
|
self.set_compute_api_version('2.48')
|
|
1101
1096
|
|
|
1102
1097
|
servers = self.setup_sdk_servers_mock(count=1)
|
|
1103
|
-
self.find_network.return_value.id = 'fake-network'
|
|
1098
|
+
self.network_client.find_network.return_value.id = 'fake-network'
|
|
1104
1099
|
|
|
1105
1100
|
arglist = [
|
|
1106
1101
|
servers[0].id,
|
|
@@ -1218,7 +1213,6 @@ class TestServerCreate(TestServer):
|
|
|
1218
1213
|
'locked',
|
|
1219
1214
|
'locked_reason',
|
|
1220
1215
|
'name',
|
|
1221
|
-
'pinned_availability_zone',
|
|
1222
1216
|
'progress',
|
|
1223
1217
|
'project_id',
|
|
1224
1218
|
'properties',
|
|
@@ -1267,7 +1261,6 @@ class TestServerCreate(TestServer):
|
|
|
1267
1261
|
None, # locked
|
|
1268
1262
|
None, # locked_reason
|
|
1269
1263
|
self.server.name,
|
|
1270
|
-
None, # pinned_availability_zone
|
|
1271
1264
|
None, # progress
|
|
1272
1265
|
None, # project_id
|
|
1273
1266
|
format_columns.DictColumn({}), # properties
|
|
@@ -4456,6 +4449,55 @@ class TestServerDelete(compute_fakes.TestComputev2):
|
|
|
4456
4449
|
)
|
|
4457
4450
|
self.assertIsNone(result)
|
|
4458
4451
|
|
|
4452
|
+
def test_server_delete_multi_servers_with_exceptions(self):
|
|
4453
|
+
servers = compute_fakes.create_servers(count=2)
|
|
4454
|
+
self.compute_client.find_server.side_effect = [
|
|
4455
|
+
servers[0],
|
|
4456
|
+
sdk_exceptions.ResourceNotFound(),
|
|
4457
|
+
servers[1],
|
|
4458
|
+
]
|
|
4459
|
+
|
|
4460
|
+
arglist = [servers[0].id, 'unexist_server', servers[1].id]
|
|
4461
|
+
|
|
4462
|
+
verifylist = [
|
|
4463
|
+
('force', False),
|
|
4464
|
+
('all_projects', False),
|
|
4465
|
+
('wait', False),
|
|
4466
|
+
(
|
|
4467
|
+
'server',
|
|
4468
|
+
[servers[0].id, 'unexist_server', servers[1].id],
|
|
4469
|
+
),
|
|
4470
|
+
]
|
|
4471
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
4472
|
+
|
|
4473
|
+
exc = self.assertRaises(
|
|
4474
|
+
exceptions.CommandError,
|
|
4475
|
+
self.cmd.take_action,
|
|
4476
|
+
parsed_args,
|
|
4477
|
+
)
|
|
4478
|
+
self.assertEqual('1 of 3 servers failed to delete.', str(exc))
|
|
4479
|
+
|
|
4480
|
+
self.compute_client.find_server.assert_has_calls(
|
|
4481
|
+
[
|
|
4482
|
+
mock.call(
|
|
4483
|
+
servers[0].id, ignore_missing=False, all_projects=False
|
|
4484
|
+
),
|
|
4485
|
+
mock.call(
|
|
4486
|
+
'unexist_server', ignore_missing=False, all_projects=False
|
|
4487
|
+
),
|
|
4488
|
+
mock.call(
|
|
4489
|
+
servers[1].id, ignore_missing=False, all_projects=False
|
|
4490
|
+
),
|
|
4491
|
+
]
|
|
4492
|
+
)
|
|
4493
|
+
|
|
4494
|
+
self.compute_client.delete_server.assert_has_calls(
|
|
4495
|
+
[
|
|
4496
|
+
mock.call(servers[0], force=False),
|
|
4497
|
+
mock.call(servers[1], force=False),
|
|
4498
|
+
]
|
|
4499
|
+
)
|
|
4500
|
+
|
|
4459
4501
|
def test_server_delete_with_all_projects(self):
|
|
4460
4502
|
arglist = [
|
|
4461
4503
|
self.server.id,
|
|
@@ -4589,10 +4631,8 @@ class _TestServerList(TestServer):
|
|
|
4589
4631
|
'Flavor Name',
|
|
4590
4632
|
'Flavor ID',
|
|
4591
4633
|
'Availability Zone',
|
|
4592
|
-
'Pinned Availability Zone',
|
|
4593
4634
|
'Host',
|
|
4594
4635
|
'Properties',
|
|
4595
|
-
'Scheduler Hints',
|
|
4596
4636
|
)
|
|
4597
4637
|
columns_all_projects = (
|
|
4598
4638
|
'ID',
|
|
@@ -4659,17 +4699,19 @@ class TestServerList(_TestServerList):
|
|
|
4659
4699
|
def setUp(self):
|
|
4660
4700
|
super().setUp()
|
|
4661
4701
|
|
|
4662
|
-
Image = collections.namedtuple('Image', 'id name')
|
|
4663
4702
|
self.image_client.images.return_value = [
|
|
4664
|
-
|
|
4703
|
+
sdk_fakes.generate_fake_resource(
|
|
4704
|
+
_image.Image, id=s.image['id'], name=self.image.name
|
|
4705
|
+
)
|
|
4665
4706
|
# Image will be an empty string if boot-from-volume
|
|
4666
4707
|
for s in self.servers
|
|
4667
4708
|
if s.image
|
|
4668
4709
|
]
|
|
4669
4710
|
|
|
4670
|
-
Flavor = collections.namedtuple('Flavor', 'id name')
|
|
4671
4711
|
self.compute_client.flavors.return_value = [
|
|
4672
|
-
|
|
4712
|
+
sdk_fakes.generate_fake_resource(
|
|
4713
|
+
_flavor.Flavor, id=s.flavor['id'], name=self.flavor.name
|
|
4714
|
+
)
|
|
4673
4715
|
for s in self.servers
|
|
4674
4716
|
]
|
|
4675
4717
|
|
|
@@ -4738,10 +4780,8 @@ class TestServerList(_TestServerList):
|
|
|
4738
4780
|
self.flavor.name,
|
|
4739
4781
|
s.flavor['id'],
|
|
4740
4782
|
getattr(s, 'availability_zone'),
|
|
4741
|
-
getattr(s, 'pinned_availability_zone', ''),
|
|
4742
4783
|
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
|
4743
4784
|
format_columns.DictColumn(s.metadata),
|
|
4744
|
-
format_columns.DictListColumn(None),
|
|
4745
4785
|
)
|
|
4746
4786
|
for s in self.servers
|
|
4747
4787
|
)
|
|
@@ -4815,13 +4855,9 @@ class TestServerList(_TestServerList):
|
|
|
4815
4855
|
'-c',
|
|
4816
4856
|
'Availability Zone',
|
|
4817
4857
|
'-c',
|
|
4818
|
-
'Pinned Availability Zone',
|
|
4819
|
-
'-c',
|
|
4820
4858
|
'Host',
|
|
4821
4859
|
'-c',
|
|
4822
4860
|
'Properties',
|
|
4823
|
-
'-c',
|
|
4824
|
-
'Scheduler Hints',
|
|
4825
4861
|
'--long',
|
|
4826
4862
|
]
|
|
4827
4863
|
verifylist = [
|
|
@@ -4841,10 +4877,8 @@ class TestServerList(_TestServerList):
|
|
|
4841
4877
|
self.assertIn('Image ID', columns)
|
|
4842
4878
|
self.assertIn('Flavor ID', columns)
|
|
4843
4879
|
self.assertIn('Availability Zone', columns)
|
|
4844
|
-
self.assertIn('Pinned Availability Zone', columns)
|
|
4845
4880
|
self.assertIn('Host', columns)
|
|
4846
4881
|
self.assertIn('Properties', columns)
|
|
4847
|
-
self.assertIn('Scheduler Hints', columns)
|
|
4848
4882
|
self.assertCountEqual(columns, set(columns))
|
|
4849
4883
|
|
|
4850
4884
|
def test_server_list_no_name_lookup_option(self):
|
|
@@ -5255,10 +5289,8 @@ class TestServerList(_TestServerList):
|
|
|
5255
5289
|
self.flavor.name,
|
|
5256
5290
|
s.flavor['id'],
|
|
5257
5291
|
getattr(s, 'availability_zone'),
|
|
5258
|
-
getattr(s, 'pinned_availability_zone', ''),
|
|
5259
5292
|
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
|
5260
5293
|
format_columns.DictColumn(s.metadata),
|
|
5261
|
-
format_columns.DictListColumn(s.scheduler_hints),
|
|
5262
5294
|
)
|
|
5263
5295
|
for s in self.servers
|
|
5264
5296
|
)
|
|
@@ -5287,9 +5319,10 @@ class TestServerList(_TestServerList):
|
|
|
5287
5319
|
self.compute_client.servers.return_value = servers
|
|
5288
5320
|
|
|
5289
5321
|
# Make sure the returned image and flavor IDs match the servers.
|
|
5290
|
-
Image = collections.namedtuple('Image', 'id name')
|
|
5291
5322
|
self.image_client.images.return_value = [
|
|
5292
|
-
|
|
5323
|
+
sdk_fakes.generate_fake_resource(
|
|
5324
|
+
_image.Image, id=s.image['id'], name=self.image.name
|
|
5325
|
+
)
|
|
5293
5326
|
# Image will be an empty string if boot-from-volume
|
|
5294
5327
|
for s in servers
|
|
5295
5328
|
if s.image
|
|
@@ -5311,10 +5344,8 @@ class TestServerList(_TestServerList):
|
|
|
5311
5344
|
self.flavor.name,
|
|
5312
5345
|
s.flavor['id'],
|
|
5313
5346
|
getattr(s, 'availability_zone'),
|
|
5314
|
-
getattr(s, 'pinned_availability_zone', ''),
|
|
5315
5347
|
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
|
5316
5348
|
format_columns.DictColumn(s.metadata),
|
|
5317
|
-
format_columns.DictListColumn(s.scheduler_hints),
|
|
5318
5349
|
s.host_status,
|
|
5319
5350
|
)
|
|
5320
5351
|
for s in servers
|
|
@@ -5349,7 +5380,6 @@ class TestServerListV273(_TestServerList):
|
|
|
5349
5380
|
'Image ID',
|
|
5350
5381
|
'Flavor',
|
|
5351
5382
|
'Availability Zone',
|
|
5352
|
-
'Pinned Availability Zone',
|
|
5353
5383
|
'Host',
|
|
5354
5384
|
'Properties',
|
|
5355
5385
|
'Scheduler Hints',
|
|
@@ -5374,9 +5404,10 @@ class TestServerListV273(_TestServerList):
|
|
|
5374
5404
|
self.servers = self.setup_sdk_servers_mock(3)
|
|
5375
5405
|
self.compute_client.servers.return_value = self.servers
|
|
5376
5406
|
|
|
5377
|
-
Image = collections.namedtuple('Image', 'id name')
|
|
5378
5407
|
self.image_client.images.return_value = [
|
|
5379
|
-
|
|
5408
|
+
sdk_fakes.generate_fake_resource(
|
|
5409
|
+
_image.Image, id=s.image['id'], name=self.image.name
|
|
5410
|
+
)
|
|
5380
5411
|
# Image will be an empty string if boot-from-volume
|
|
5381
5412
|
for s in self.servers
|
|
5382
5413
|
if s.image
|
|
@@ -5547,6 +5578,307 @@ class TestServerListV273(_TestServerList):
|
|
|
5547
5578
|
self.assertEqual(expected_row, partial_server)
|
|
5548
5579
|
|
|
5549
5580
|
|
|
5581
|
+
class TestServerListV296(_TestServerList):
|
|
5582
|
+
columns = (
|
|
5583
|
+
'ID',
|
|
5584
|
+
'Name',
|
|
5585
|
+
'Status',
|
|
5586
|
+
'Networks',
|
|
5587
|
+
'Image',
|
|
5588
|
+
'Flavor',
|
|
5589
|
+
)
|
|
5590
|
+
columns_long = (
|
|
5591
|
+
'ID',
|
|
5592
|
+
'Name',
|
|
5593
|
+
'Status',
|
|
5594
|
+
'Task State',
|
|
5595
|
+
'Power State',
|
|
5596
|
+
'Networks',
|
|
5597
|
+
'Image Name',
|
|
5598
|
+
'Image ID',
|
|
5599
|
+
'Flavor',
|
|
5600
|
+
'Availability Zone',
|
|
5601
|
+
'Host',
|
|
5602
|
+
'Properties',
|
|
5603
|
+
'Pinned Availability Zone',
|
|
5604
|
+
)
|
|
5605
|
+
|
|
5606
|
+
def setUp(self):
|
|
5607
|
+
super().setUp()
|
|
5608
|
+
self.set_compute_api_version('2.96')
|
|
5609
|
+
|
|
5610
|
+
self.image_client.images.return_value = [
|
|
5611
|
+
sdk_fakes.generate_fake_resource(
|
|
5612
|
+
_image.Image, id=s.image['id'], name=self.image.name
|
|
5613
|
+
)
|
|
5614
|
+
# Image will be an empty string if boot-from-volume
|
|
5615
|
+
for s in self.servers
|
|
5616
|
+
if s.image
|
|
5617
|
+
]
|
|
5618
|
+
|
|
5619
|
+
self.compute_client.flavors.return_value = [
|
|
5620
|
+
sdk_fakes.generate_fake_resource(
|
|
5621
|
+
_flavor.Flavor, id=s.flavor['id'], name=self.flavor.name
|
|
5622
|
+
)
|
|
5623
|
+
for s in self.servers
|
|
5624
|
+
]
|
|
5625
|
+
|
|
5626
|
+
self.data = tuple(
|
|
5627
|
+
(
|
|
5628
|
+
s.id,
|
|
5629
|
+
s.name,
|
|
5630
|
+
s.status,
|
|
5631
|
+
server.AddressesColumn(s.addresses),
|
|
5632
|
+
# Image will be an empty string if boot-from-volume
|
|
5633
|
+
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
|
|
5634
|
+
self.flavor.name,
|
|
5635
|
+
)
|
|
5636
|
+
for s in self.servers
|
|
5637
|
+
)
|
|
5638
|
+
|
|
5639
|
+
def test_server_list_long_option(self):
|
|
5640
|
+
self.data = tuple(
|
|
5641
|
+
(
|
|
5642
|
+
s.id,
|
|
5643
|
+
s.name,
|
|
5644
|
+
s.status,
|
|
5645
|
+
getattr(s, 'task_state'),
|
|
5646
|
+
server.PowerStateColumn(getattr(s, 'power_state')),
|
|
5647
|
+
server.AddressesColumn(s.addresses),
|
|
5648
|
+
# Image will be an empty string if boot-from-volume
|
|
5649
|
+
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
|
|
5650
|
+
s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
|
|
5651
|
+
self.flavor.name,
|
|
5652
|
+
getattr(s, 'availability_zone'),
|
|
5653
|
+
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
|
5654
|
+
format_columns.DictColumn(s.metadata),
|
|
5655
|
+
getattr(s, 'pinned_availability_zone', ''),
|
|
5656
|
+
)
|
|
5657
|
+
for s in self.servers
|
|
5658
|
+
)
|
|
5659
|
+
arglist = [
|
|
5660
|
+
'--long',
|
|
5661
|
+
]
|
|
5662
|
+
verifylist = [
|
|
5663
|
+
('all_projects', False),
|
|
5664
|
+
('long', True),
|
|
5665
|
+
]
|
|
5666
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
5667
|
+
|
|
5668
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
5669
|
+
self.compute_client.servers.assert_called_with(**self.kwargs)
|
|
5670
|
+
image_ids = {s.image['id'] for s in self.servers if s.image}
|
|
5671
|
+
self.image_client.images.assert_called_once_with(
|
|
5672
|
+
id=f'in:{",".join(image_ids)}',
|
|
5673
|
+
)
|
|
5674
|
+
self.compute_client.flavors.assert_called_once_with(is_public=None)
|
|
5675
|
+
self.assertEqual(self.columns_long, columns)
|
|
5676
|
+
self.assertEqual(self.data, tuple(data))
|
|
5677
|
+
|
|
5678
|
+
def test_server_list_column_option(self):
|
|
5679
|
+
arglist = [
|
|
5680
|
+
'-c',
|
|
5681
|
+
'Project ID',
|
|
5682
|
+
'-c',
|
|
5683
|
+
'User ID',
|
|
5684
|
+
'-c',
|
|
5685
|
+
'Created At',
|
|
5686
|
+
'-c',
|
|
5687
|
+
'Security Groups',
|
|
5688
|
+
'-c',
|
|
5689
|
+
'Task State',
|
|
5690
|
+
'-c',
|
|
5691
|
+
'Power State',
|
|
5692
|
+
'-c',
|
|
5693
|
+
'Image ID',
|
|
5694
|
+
'-c',
|
|
5695
|
+
'Flavor ID',
|
|
5696
|
+
'-c',
|
|
5697
|
+
'Availability Zone',
|
|
5698
|
+
'-c',
|
|
5699
|
+
'Host',
|
|
5700
|
+
'-c',
|
|
5701
|
+
'Properties',
|
|
5702
|
+
'-c',
|
|
5703
|
+
'Pinned Availability Zone',
|
|
5704
|
+
'--long',
|
|
5705
|
+
]
|
|
5706
|
+
verifylist = [
|
|
5707
|
+
('long', True),
|
|
5708
|
+
]
|
|
5709
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
5710
|
+
|
|
5711
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
5712
|
+
|
|
5713
|
+
self.compute_client.servers.assert_called_with(**self.kwargs)
|
|
5714
|
+
self.assertIn('Project ID', columns)
|
|
5715
|
+
self.assertIn('User ID', columns)
|
|
5716
|
+
self.assertIn('Created At', columns)
|
|
5717
|
+
self.assertIn('Security Groups', columns)
|
|
5718
|
+
self.assertIn('Task State', columns)
|
|
5719
|
+
self.assertIn('Power State', columns)
|
|
5720
|
+
self.assertIn('Image ID', columns)
|
|
5721
|
+
self.assertIn('Flavor ID', columns)
|
|
5722
|
+
self.assertIn('Availability Zone', columns)
|
|
5723
|
+
self.assertIn('Pinned Availability Zone', columns)
|
|
5724
|
+
self.assertIn('Host', columns)
|
|
5725
|
+
self.assertIn('Properties', columns)
|
|
5726
|
+
self.assertCountEqual(columns, set(columns))
|
|
5727
|
+
|
|
5728
|
+
|
|
5729
|
+
class TestServerListV2100(_TestServerList):
|
|
5730
|
+
columns = (
|
|
5731
|
+
'ID',
|
|
5732
|
+
'Name',
|
|
5733
|
+
'Status',
|
|
5734
|
+
'Networks',
|
|
5735
|
+
'Image',
|
|
5736
|
+
'Flavor',
|
|
5737
|
+
)
|
|
5738
|
+
columns_long = (
|
|
5739
|
+
'ID',
|
|
5740
|
+
'Name',
|
|
5741
|
+
'Status',
|
|
5742
|
+
'Task State',
|
|
5743
|
+
'Power State',
|
|
5744
|
+
'Networks',
|
|
5745
|
+
'Image Name',
|
|
5746
|
+
'Image ID',
|
|
5747
|
+
'Flavor',
|
|
5748
|
+
'Availability Zone',
|
|
5749
|
+
'Host',
|
|
5750
|
+
'Properties',
|
|
5751
|
+
'Pinned Availability Zone',
|
|
5752
|
+
'Scheduler Hints',
|
|
5753
|
+
)
|
|
5754
|
+
|
|
5755
|
+
def setUp(self):
|
|
5756
|
+
super().setUp()
|
|
5757
|
+
self.set_compute_api_version('2.100')
|
|
5758
|
+
|
|
5759
|
+
self.image_client.images.return_value = [
|
|
5760
|
+
sdk_fakes.generate_fake_resource(
|
|
5761
|
+
_image.Image, id=s.image['id'], name=self.image.name
|
|
5762
|
+
)
|
|
5763
|
+
# Image will be an empty string if boot-from-volume
|
|
5764
|
+
for s in self.servers
|
|
5765
|
+
if s.image
|
|
5766
|
+
]
|
|
5767
|
+
|
|
5768
|
+
self.compute_client.flavors.return_value = [
|
|
5769
|
+
sdk_fakes.generate_fake_resource(
|
|
5770
|
+
_flavor.Flavor, id=s.flavor['id'], name=self.flavor.name
|
|
5771
|
+
)
|
|
5772
|
+
for s in self.servers
|
|
5773
|
+
]
|
|
5774
|
+
|
|
5775
|
+
self.data = tuple(
|
|
5776
|
+
(
|
|
5777
|
+
s.id,
|
|
5778
|
+
s.name,
|
|
5779
|
+
s.status,
|
|
5780
|
+
server.AddressesColumn(s.addresses),
|
|
5781
|
+
# Image will be an empty string if boot-from-volume
|
|
5782
|
+
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
|
|
5783
|
+
self.flavor.name,
|
|
5784
|
+
)
|
|
5785
|
+
for s in self.servers
|
|
5786
|
+
)
|
|
5787
|
+
|
|
5788
|
+
def test_server_list_long_option(self):
|
|
5789
|
+
self.data = tuple(
|
|
5790
|
+
(
|
|
5791
|
+
s.id,
|
|
5792
|
+
s.name,
|
|
5793
|
+
s.status,
|
|
5794
|
+
getattr(s, 'task_state'),
|
|
5795
|
+
server.PowerStateColumn(getattr(s, 'power_state')),
|
|
5796
|
+
server.AddressesColumn(s.addresses),
|
|
5797
|
+
# Image will be an empty string if boot-from-volume
|
|
5798
|
+
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
|
|
5799
|
+
s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
|
|
5800
|
+
self.flavor.name,
|
|
5801
|
+
getattr(s, 'availability_zone'),
|
|
5802
|
+
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
|
5803
|
+
format_columns.DictColumn(s.metadata),
|
|
5804
|
+
getattr(s, 'pinned_availability_zone', ''),
|
|
5805
|
+
format_columns.DictListColumn(None),
|
|
5806
|
+
)
|
|
5807
|
+
for s in self.servers
|
|
5808
|
+
)
|
|
5809
|
+
arglist = [
|
|
5810
|
+
'--long',
|
|
5811
|
+
]
|
|
5812
|
+
verifylist = [
|
|
5813
|
+
('all_projects', False),
|
|
5814
|
+
('long', True),
|
|
5815
|
+
]
|
|
5816
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
5817
|
+
|
|
5818
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
5819
|
+
self.compute_client.servers.assert_called_with(**self.kwargs)
|
|
5820
|
+
image_ids = {s.image['id'] for s in self.servers if s.image}
|
|
5821
|
+
self.image_client.images.assert_called_once_with(
|
|
5822
|
+
id=f'in:{",".join(image_ids)}',
|
|
5823
|
+
)
|
|
5824
|
+
self.compute_client.flavors.assert_called_once_with(is_public=None)
|
|
5825
|
+
self.assertEqual(self.columns_long, columns)
|
|
5826
|
+
self.assertEqual(self.data, tuple(data))
|
|
5827
|
+
|
|
5828
|
+
def test_server_list_column_option(self):
|
|
5829
|
+
arglist = [
|
|
5830
|
+
'-c',
|
|
5831
|
+
'Project ID',
|
|
5832
|
+
'-c',
|
|
5833
|
+
'User ID',
|
|
5834
|
+
'-c',
|
|
5835
|
+
'Created At',
|
|
5836
|
+
'-c',
|
|
5837
|
+
'Security Groups',
|
|
5838
|
+
'-c',
|
|
5839
|
+
'Task State',
|
|
5840
|
+
'-c',
|
|
5841
|
+
'Power State',
|
|
5842
|
+
'-c',
|
|
5843
|
+
'Image ID',
|
|
5844
|
+
'-c',
|
|
5845
|
+
'Flavor ID',
|
|
5846
|
+
'-c',
|
|
5847
|
+
'Availability Zone',
|
|
5848
|
+
'-c',
|
|
5849
|
+
'Host',
|
|
5850
|
+
'-c',
|
|
5851
|
+
'Properties',
|
|
5852
|
+
'-c',
|
|
5853
|
+
'Pinned Availability Zone',
|
|
5854
|
+
'-c',
|
|
5855
|
+
'Scheduler Hints',
|
|
5856
|
+
'--long',
|
|
5857
|
+
]
|
|
5858
|
+
verifylist = [
|
|
5859
|
+
('long', True),
|
|
5860
|
+
]
|
|
5861
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
5862
|
+
|
|
5863
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
5864
|
+
|
|
5865
|
+
self.compute_client.servers.assert_called_with(**self.kwargs)
|
|
5866
|
+
self.assertIn('Project ID', columns)
|
|
5867
|
+
self.assertIn('User ID', columns)
|
|
5868
|
+
self.assertIn('Created At', columns)
|
|
5869
|
+
self.assertIn('Security Groups', columns)
|
|
5870
|
+
self.assertIn('Task State', columns)
|
|
5871
|
+
self.assertIn('Power State', columns)
|
|
5872
|
+
self.assertIn('Image ID', columns)
|
|
5873
|
+
self.assertIn('Flavor ID', columns)
|
|
5874
|
+
self.assertIn('Availability Zone', columns)
|
|
5875
|
+
self.assertIn('Pinned Availability Zone', columns)
|
|
5876
|
+
self.assertIn('Host', columns)
|
|
5877
|
+
self.assertIn('Properties', columns)
|
|
5878
|
+
self.assertIn('Scheduler Hints', columns)
|
|
5879
|
+
self.assertCountEqual(columns, set(columns))
|
|
5880
|
+
|
|
5881
|
+
|
|
5550
5882
|
class TestServerAction(compute_fakes.TestComputev2):
|
|
5551
5883
|
def run_method_with_sdk_servers(self, method_name, server_count):
|
|
5552
5884
|
servers = compute_fakes.create_servers(count=server_count)
|
|
@@ -7351,14 +7683,14 @@ class TestServerRemoveFloatingIPNetwork(network_fakes.TestNetworkV2):
|
|
|
7351
7683
|
def setUp(self):
|
|
7352
7684
|
super().setUp()
|
|
7353
7685
|
|
|
7354
|
-
self.network_client.update_ip =
|
|
7686
|
+
self.network_client.update_ip.return_value = None
|
|
7355
7687
|
|
|
7356
7688
|
# Get the command object to test
|
|
7357
7689
|
self.cmd = server.RemoveFloatingIP(self.app, None)
|
|
7358
7690
|
|
|
7359
7691
|
def test_server_remove_floating_ip_default(self):
|
|
7360
7692
|
_floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
|
|
7361
|
-
self.network_client.find_ip =
|
|
7693
|
+
self.network_client.find_ip.return_value = _floating_ip
|
|
7362
7694
|
arglist = [
|
|
7363
7695
|
'fake_server',
|
|
7364
7696
|
_floating_ip['ip'],
|
|
@@ -7391,9 +7723,6 @@ class TestServerRemovePort(TestServer):
|
|
|
7391
7723
|
# Get the command object to test
|
|
7392
7724
|
self.cmd = server.RemovePort(self.app, None)
|
|
7393
7725
|
|
|
7394
|
-
self.find_port = mock.Mock()
|
|
7395
|
-
self.app.client_manager.network.find_port = self.find_port
|
|
7396
|
-
|
|
7397
7726
|
def _test_server_remove_port(self, port_id):
|
|
7398
7727
|
servers = self.setup_sdk_servers_mock(count=1)
|
|
7399
7728
|
port = 'fake-port'
|
|
@@ -7416,15 +7745,17 @@ class TestServerRemovePort(TestServer):
|
|
|
7416
7745
|
self.assertIsNone(result)
|
|
7417
7746
|
|
|
7418
7747
|
def test_server_remove_port(self):
|
|
7419
|
-
self._test_server_remove_port(
|
|
7420
|
-
|
|
7748
|
+
self._test_server_remove_port(
|
|
7749
|
+
self.network_client.find_port.return_value.id
|
|
7750
|
+
)
|
|
7751
|
+
self.network_client.find_port.assert_called_once_with(
|
|
7421
7752
|
'fake-port', ignore_missing=False
|
|
7422
7753
|
)
|
|
7423
7754
|
|
|
7424
7755
|
def test_server_remove_port_no_neutron(self):
|
|
7425
7756
|
self.app.client_manager.network_endpoint_enabled = False
|
|
7426
7757
|
self._test_server_remove_port('fake-port')
|
|
7427
|
-
self.find_port.assert_not_called()
|
|
7758
|
+
self.network_client.find_port.assert_not_called()
|
|
7428
7759
|
|
|
7429
7760
|
|
|
7430
7761
|
class TestServerRemoveNetwork(TestServer):
|
|
@@ -7434,16 +7765,12 @@ class TestServerRemoveNetwork(TestServer):
|
|
|
7434
7765
|
# Get the command object to test
|
|
7435
7766
|
self.cmd = server.RemoveNetwork(self.app, None)
|
|
7436
7767
|
|
|
7437
|
-
|
|
7438
|
-
self.
|
|
7439
|
-
|
|
7440
|
-
self.find_network = mock.Mock()
|
|
7441
|
-
self.app.client_manager.network.find_network = self.find_network
|
|
7442
|
-
self.compute_client.server_interfaces.return_value = [self.fake_inf]
|
|
7768
|
+
self.fake_if = mock.Mock()
|
|
7769
|
+
self.compute_client.server_interfaces.return_value = [self.fake_if]
|
|
7443
7770
|
|
|
7444
7771
|
def _test_server_remove_network(self, network_id):
|
|
7445
|
-
self.
|
|
7446
|
-
self.
|
|
7772
|
+
self.fake_if.net_id = network_id
|
|
7773
|
+
self.fake_if.port_id = 'fake-port'
|
|
7447
7774
|
servers = self.setup_sdk_servers_mock(count=1)
|
|
7448
7775
|
network = 'fake-network'
|
|
7449
7776
|
|
|
@@ -7468,15 +7795,17 @@ class TestServerRemoveNetwork(TestServer):
|
|
|
7468
7795
|
self.assertIsNone(result)
|
|
7469
7796
|
|
|
7470
7797
|
def test_server_remove_network(self):
|
|
7471
|
-
self._test_server_remove_network(
|
|
7472
|
-
|
|
7798
|
+
self._test_server_remove_network(
|
|
7799
|
+
self.network_client.find_network.return_value.id
|
|
7800
|
+
)
|
|
7801
|
+
self.network_client.find_network.assert_called_once_with(
|
|
7473
7802
|
'fake-network', ignore_missing=False
|
|
7474
7803
|
)
|
|
7475
7804
|
|
|
7476
7805
|
def test_server_remove_network_no_neutron(self):
|
|
7477
7806
|
self.app.client_manager.network_endpoint_enabled = False
|
|
7478
7807
|
self._test_server_remove_network('fake-network')
|
|
7479
|
-
self.find_network.assert_not_called()
|
|
7808
|
+
self.network_client.find_network.assert_not_called()
|
|
7480
7809
|
|
|
7481
7810
|
|
|
7482
7811
|
class TestServerRemoveSecurityGroup(TestServer):
|
|
@@ -8542,7 +8871,6 @@ class TestServerShow(TestServer):
|
|
|
8542
8871
|
'locked',
|
|
8543
8872
|
'locked_reason',
|
|
8544
8873
|
'name',
|
|
8545
|
-
'pinned_availability_zone',
|
|
8546
8874
|
'progress',
|
|
8547
8875
|
'project_id',
|
|
8548
8876
|
'properties',
|
|
@@ -8592,7 +8920,6 @@ class TestServerShow(TestServer):
|
|
|
8592
8920
|
None, # locked
|
|
8593
8921
|
None, # locked_reason
|
|
8594
8922
|
self.server.name,
|
|
8595
|
-
None, # pinned_availability_zone
|
|
8596
8923
|
None, # progress
|
|
8597
8924
|
'tenant-id-xxx', # project_id
|
|
8598
8925
|
format_columns.DictColumn({}), # properties
|
|
@@ -9531,7 +9858,6 @@ class TestServerGeneral(TestServer):
|
|
|
9531
9858
|
'locked': None,
|
|
9532
9859
|
'locked_reason': None,
|
|
9533
9860
|
'name': _server.name,
|
|
9534
|
-
'pinned_availability_zone': None,
|
|
9535
9861
|
'progress': None,
|
|
9536
9862
|
'project_id': 'tenant-id-xxx',
|
|
9537
9863
|
'properties': format_columns.DictColumn({}),
|
|
@@ -9618,7 +9944,6 @@ class TestServerGeneral(TestServer):
|
|
|
9618
9944
|
'locked': None,
|
|
9619
9945
|
'locked_reason': None,
|
|
9620
9946
|
'name': _server.name,
|
|
9621
|
-
'pinned_availability_zone': None,
|
|
9622
9947
|
'progress': None,
|
|
9623
9948
|
'project_id': 'tenant-id-xxx',
|
|
9624
9949
|
'properties': format_columns.DictColumn({}),
|