python-openstackclient 8.0.0__py3-none-any.whl → 8.2.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.
Files changed (106) hide show
  1. openstackclient/api/compute_v2.py +2 -2
  2. openstackclient/api/volume_v2.py +60 -0
  3. openstackclient/api/volume_v3.py +60 -0
  4. openstackclient/compute/client.py +5 -0
  5. openstackclient/compute/v2/console.py +7 -0
  6. openstackclient/compute/v2/console_connection.py +48 -0
  7. openstackclient/compute/v2/flavor.py +14 -1
  8. openstackclient/compute/v2/keypair.py +10 -3
  9. openstackclient/compute/v2/server.py +76 -13
  10. openstackclient/compute/v2/server_event.py +1 -1
  11. openstackclient/identity/common.py +85 -11
  12. openstackclient/identity/v3/application_credential.py +88 -87
  13. openstackclient/identity/v3/domain.py +67 -49
  14. openstackclient/identity/v3/group.py +113 -68
  15. openstackclient/identity/v3/project.py +42 -20
  16. openstackclient/identity/v3/role.py +7 -2
  17. openstackclient/identity/v3/user.py +38 -5
  18. openstackclient/image/client.py +5 -0
  19. openstackclient/image/v1/image.py +16 -1
  20. openstackclient/image/v2/cache.py +10 -6
  21. openstackclient/image/v2/image.py +59 -12
  22. openstackclient/image/v2/metadef_objects.py +8 -2
  23. openstackclient/image/v2/metadef_properties.py +9 -2
  24. openstackclient/network/client.py +0 -6
  25. openstackclient/network/v2/floating_ip.py +58 -29
  26. openstackclient/network/v2/network_qos_rule.py +3 -11
  27. openstackclient/network/v2/port.py +16 -0
  28. openstackclient/network/v2/router.py +1 -1
  29. openstackclient/network/v2/security_group.py +49 -7
  30. openstackclient/network/v2/security_group_rule.py +18 -1
  31. openstackclient/shell.py +1 -1
  32. openstackclient/tests/functional/base.py +5 -1
  33. openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
  34. openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
  35. openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
  36. openstackclient/tests/functional/image/v2/test_image.py +36 -14
  37. openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
  38. openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
  39. openstackclient/tests/unit/api/test_volume_v2.py +124 -0
  40. openstackclient/tests/unit/api/test_volume_v3.py +124 -0
  41. openstackclient/tests/unit/compute/v2/fakes.py +81 -305
  42. openstackclient/tests/unit/compute/v2/test_console.py +18 -1
  43. openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
  44. openstackclient/tests/unit/compute/v2/test_flavor.py +160 -175
  45. openstackclient/tests/unit/compute/v2/test_keypair.py +12 -5
  46. openstackclient/tests/unit/compute/v2/test_server.py +211 -97
  47. openstackclient/tests/unit/compute/v2/test_server_backup.py +32 -71
  48. openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
  49. openstackclient/tests/unit/compute/v2/test_server_image.py +33 -72
  50. openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
  51. openstackclient/tests/unit/identity/v3/test_application_credential.py +93 -65
  52. openstackclient/tests/unit/identity/v3/test_domain.py +117 -107
  53. openstackclient/tests/unit/identity/v3/test_group.py +353 -202
  54. openstackclient/tests/unit/identity/v3/test_project.py +46 -53
  55. openstackclient/tests/unit/identity/v3/test_role.py +2 -8
  56. openstackclient/tests/unit/identity/v3/test_user.py +86 -6
  57. openstackclient/tests/unit/image/v1/test_image.py +55 -9
  58. openstackclient/tests/unit/image/v2/test_image.py +128 -58
  59. openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
  60. openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
  61. openstackclient/tests/unit/network/v2/fakes.py +406 -485
  62. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +13 -19
  63. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
  64. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +3 -5
  65. openstackclient/tests/unit/network/v2/test_network.py +4 -4
  66. openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
  67. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
  68. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
  69. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
  70. openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
  71. openstackclient/tests/unit/network/v2/test_port.py +57 -17
  72. openstackclient/tests/unit/network/v2/test_router.py +73 -57
  73. openstackclient/tests/unit/network/v2/test_security_group_network.py +31 -27
  74. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +1 -3
  75. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +82 -39
  76. openstackclient/tests/unit/volume/v2/fakes.py +1 -2
  77. openstackclient/tests/unit/volume/v2/test_service.py +57 -91
  78. openstackclient/tests/unit/volume/v2/test_volume.py +466 -410
  79. openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
  80. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
  81. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
  82. openstackclient/tests/unit/volume/v3/test_service.py +221 -141
  83. openstackclient/tests/unit/volume/v3/test_volume.py +569 -534
  84. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  85. openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
  86. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +682 -47
  87. openstackclient/volume/v2/service.py +41 -38
  88. openstackclient/volume/v2/volume.py +140 -88
  89. openstackclient/volume/v2/volume_backup.py +9 -3
  90. openstackclient/volume/v2/volume_snapshot.py +121 -84
  91. openstackclient/volume/v3/block_storage_log_level.py +22 -28
  92. openstackclient/volume/v3/service.py +105 -14
  93. openstackclient/volume/v3/volume.py +287 -99
  94. openstackclient/volume/v3/volume_backup.py +24 -19
  95. openstackclient/volume/v3/volume_group.py +1 -1
  96. openstackclient/volume/v3/volume_snapshot.py +485 -10
  97. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/AUTHORS +13 -0
  98. python_openstackclient-8.2.0.dist-info/METADATA +264 -0
  99. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/RECORD +104 -98
  100. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/entry_points.txt +7 -6
  101. python_openstackclient-8.2.0.dist-info/pbr.json +1 -0
  102. python_openstackclient-8.0.0.dist-info/METADATA +0 -166
  103. python_openstackclient-8.0.0.dist-info/pbr.json +0 -1
  104. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/LICENSE +0 -0
  105. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/WHEEL +0 -0
  106. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/top_level.txt +0 -0
@@ -21,6 +21,7 @@ from unittest import mock
21
21
  import uuid
22
22
 
23
23
  import iso8601
24
+ from openstack.compute.v2 import server as _server
24
25
  from openstack.compute.v2 import server_group as _server_group
25
26
  from openstack import exceptions as sdk_exceptions
26
27
  from openstack.test import fakes as sdk_fakes
@@ -70,7 +71,7 @@ class TestServer(compute_fakes.TestComputev2):
70
71
  self.attrs = {}
71
72
 
72
73
  def setup_sdk_servers_mock(self, count):
73
- servers = compute_fakes.create_sdk_servers(
74
+ servers = compute_fakes.create_servers(
74
75
  attrs=self.attrs,
75
76
  count=count,
76
77
  )
@@ -88,10 +89,6 @@ class TestServerAddFixedIP(TestServer):
88
89
  # Get the command object to test
89
90
  self.cmd = server.AddFixedIP(self.app, None)
90
91
 
91
- # Mock network methods
92
- self.find_network = mock.Mock()
93
- self.app.client_manager.network.find_network = self.find_network
94
-
95
92
  def test_server_add_fixed_ip_pre_v249_with_tag(self):
96
93
  self.set_compute_api_version('2.48')
97
94
 
@@ -348,7 +345,7 @@ class TestServerAddFloatingIPCompute(compute_fakes.TestComputev2):
348
345
  super().setUp()
349
346
 
350
347
  self.app.client_manager.network_endpoint_enabled = False
351
- self.server = compute_fakes.create_one_sdk_server()
348
+ self.server = compute_fakes.create_one_server()
352
349
  self.compute_client.find_server.return_value = self.server
353
350
 
354
351
  self.cmd = server.AddFloatingIP(self.app, None)
@@ -404,10 +401,10 @@ class TestServerAddFloatingIPNetwork(
404
401
  def setUp(self):
405
402
  super().setUp()
406
403
 
407
- self.server = compute_fakes.create_one_sdk_server()
404
+ self.server = compute_fakes.create_one_server()
408
405
  self.compute_client.find_server.return_value = self.server
409
406
 
410
- self.network_client.update_ip = mock.Mock(return_value=None)
407
+ self.network_client.update_ip.return_value = None
411
408
 
412
409
  # Get the command object to test
413
410
  self.cmd = server.AddFloatingIP(self.app, None)
@@ -415,8 +412,8 @@ class TestServerAddFloatingIPNetwork(
415
412
  def test_server_add_floating_ip(self):
416
413
  _port = network_fakes.create_one_port()
417
414
  _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
418
- self.network_client.find_ip = mock.Mock(return_value=_floating_ip)
419
- self.network_client.ports = mock.Mock(return_value=[_port])
415
+ self.network_client.find_ip.return_value = _floating_ip
416
+ self.network_client.ports.return_value = [_port]
420
417
  arglist = [
421
418
  self.server.id,
422
419
  _floating_ip['floating_ip_address'],
@@ -447,8 +444,8 @@ class TestServerAddFloatingIPNetwork(
447
444
  def test_server_add_floating_ip_no_ports(self):
448
445
  floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
449
446
 
450
- self.network_client.find_ip = mock.Mock(return_value=floating_ip)
451
- self.network_client.ports = mock.Mock(return_value=[])
447
+ self.network_client.find_ip.return_value = floating_ip
448
+ self.network_client.ports.return_value = []
452
449
 
453
450
  arglist = [
454
451
  self.server.id,
@@ -478,17 +475,17 @@ class TestServerAddFloatingIPNetwork(
478
475
  def test_server_add_floating_ip_no_external_gateway(self, success=False):
479
476
  _port = network_fakes.create_one_port()
480
477
  _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
481
- self.network_client.find_ip = mock.Mock(return_value=_floating_ip)
478
+ self.network_client.find_ip.return_value = _floating_ip
482
479
  return_value = [_port]
483
480
  # In the success case, we'll have two ports, where the first port is
484
481
  # not attached to an external gateway but the second port is.
485
482
  if success:
486
483
  return_value.append(_port)
487
- self.network_client.ports = mock.Mock(return_value=return_value)
484
+ self.network_client.ports.return_value = return_value
488
485
  side_effect = [sdk_exceptions.NotFoundException()]
489
486
  if success:
490
487
  side_effect.append(None)
491
- self.network_client.update_ip = mock.Mock(side_effect=side_effect)
488
+ self.network_client.update_ip.side_effect = side_effect
492
489
  arglist = [
493
490
  self.server.id,
494
491
  _floating_ip['floating_ip_address'],
@@ -534,8 +531,8 @@ class TestServerAddFloatingIPNetwork(
534
531
  def test_server_add_floating_ip_with_fixed_ip(self):
535
532
  _port = network_fakes.create_one_port()
536
533
  _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
537
- self.network_client.find_ip = mock.Mock(return_value=_floating_ip)
538
- self.network_client.ports = mock.Mock(return_value=[_port])
534
+ self.network_client.find_ip.return_value = _floating_ip
535
+ self.network_client.ports.return_value = [_port]
539
536
  # The user has specified a fixed ip that matches one of the ports
540
537
  # already attached to the instance.
541
538
  arglist = [
@@ -574,8 +571,8 @@ class TestServerAddFloatingIPNetwork(
574
571
  def test_server_add_floating_ip_with_fixed_ip_no_port_found(self):
575
572
  _port = network_fakes.create_one_port()
576
573
  _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
577
- self.network_client.find_ip = mock.Mock(return_value=_floating_ip)
578
- self.network_client.ports = mock.Mock(return_value=[_port])
574
+ self.network_client.find_ip.return_value = _floating_ip
575
+ self.network_client.ports.return_value = [_port]
579
576
  # The user has specified a fixed ip that does not match any of the
580
577
  # ports already attached to the instance.
581
578
  nonexistent_ip = '10.0.0.9'
@@ -613,9 +610,6 @@ class TestServerAddPort(TestServer):
613
610
  # Get the command object to test
614
611
  self.cmd = server.AddPort(self.app, None)
615
612
 
616
- self.find_port = mock.Mock()
617
- self.app.client_manager.network.find_port = self.find_port
618
-
619
613
  def _test_server_add_port(self, port_id):
620
614
  servers = self.setup_sdk_servers_mock(count=1)
621
615
  port = 'fake-port'
@@ -635,21 +629,23 @@ class TestServerAddPort(TestServer):
635
629
  self.assertIsNone(result)
636
630
 
637
631
  def test_server_add_port(self):
638
- self._test_server_add_port(self.find_port.return_value.id)
639
- self.find_port.assert_called_once_with(
632
+ self._test_server_add_port(
633
+ self.network_client.find_port.return_value.id
634
+ )
635
+ self.network_client.find_port.assert_called_once_with(
640
636
  'fake-port', ignore_missing=False
641
637
  )
642
638
 
643
639
  def test_server_add_port_no_neutron(self):
644
640
  self.app.client_manager.network_endpoint_enabled = False
645
641
  self._test_server_add_port('fake-port')
646
- self.find_port.assert_not_called()
642
+ self.network_client.find_port.assert_not_called()
647
643
 
648
644
  def test_server_add_port_with_tag(self):
649
645
  self.set_compute_api_version('2.49')
650
646
 
651
647
  servers = self.setup_sdk_servers_mock(count=1)
652
- self.find_port.return_value.id = 'fake-port'
648
+ self.network_client.find_port.return_value.id = 'fake-port'
653
649
  arglist = [
654
650
  servers[0].id,
655
651
  'fake-port',
@@ -674,7 +670,7 @@ class TestServerAddPort(TestServer):
674
670
  self.set_compute_api_version('2.48')
675
671
 
676
672
  servers = self.setup_sdk_servers_mock(count=1)
677
- self.find_port.return_value.id = 'fake-port'
673
+ self.network_client.find_port.return_value.id = 'fake-port'
678
674
  arglist = [
679
675
  servers[0].id,
680
676
  'fake-port',
@@ -700,7 +696,7 @@ class TestServerVolume(TestServer):
700
696
  def setUp(self):
701
697
  super().setUp()
702
698
 
703
- self.server = compute_fakes.create_one_sdk_server()
699
+ self.server = compute_fakes.create_one_server()
704
700
  self.compute_client.find_server.return_value = self.server
705
701
 
706
702
  self.volume = volume_fakes.create_one_sdk_volume()
@@ -1037,9 +1033,6 @@ class TestServerAddNetwork(TestServer):
1037
1033
  # Get the command object to test
1038
1034
  self.cmd = server.AddNetwork(self.app, None)
1039
1035
 
1040
- self.find_network = mock.Mock()
1041
- self.app.client_manager.network.find_network = self.find_network
1042
-
1043
1036
  def _test_server_add_network(self, net_id):
1044
1037
  servers = self.setup_sdk_servers_mock(count=1)
1045
1038
  network = 'fake-network'
@@ -1059,21 +1052,23 @@ class TestServerAddNetwork(TestServer):
1059
1052
  self.assertIsNone(result)
1060
1053
 
1061
1054
  def test_server_add_network(self):
1062
- self._test_server_add_network(self.find_network.return_value.id)
1063
- self.find_network.assert_called_once_with(
1055
+ self._test_server_add_network(
1056
+ self.network_client.find_network.return_value.id
1057
+ )
1058
+ self.network_client.find_network.assert_called_once_with(
1064
1059
  'fake-network', ignore_missing=False
1065
1060
  )
1066
1061
 
1067
1062
  def test_server_add_network_no_neutron(self):
1068
1063
  self.app.client_manager.network_endpoint_enabled = False
1069
1064
  self._test_server_add_network('fake-network')
1070
- self.find_network.assert_not_called()
1065
+ self.network_client.find_network.assert_not_called()
1071
1066
 
1072
1067
  def test_server_add_network_with_tag(self):
1073
1068
  self.set_compute_api_version('2.49')
1074
1069
 
1075
1070
  servers = self.setup_sdk_servers_mock(count=1)
1076
- self.find_network.return_value.id = 'fake-network'
1071
+ self.network_client.find_network.return_value.id = 'fake-network'
1077
1072
 
1078
1073
  arglist = [
1079
1074
  servers[0].id,
@@ -1099,7 +1094,7 @@ class TestServerAddNetwork(TestServer):
1099
1094
  self.set_compute_api_version('2.48')
1100
1095
 
1101
1096
  servers = self.setup_sdk_servers_mock(count=1)
1102
- self.find_network.return_value.id = 'fake-network'
1097
+ self.network_client.find_network.return_value.id = 'fake-network'
1103
1098
 
1104
1099
  arglist = [
1105
1100
  servers[0].id,
@@ -1126,7 +1121,7 @@ class TestServerAddSecurityGroup(compute_fakes.TestComputev2):
1126
1121
  def setUp(self):
1127
1122
  super().setUp()
1128
1123
 
1129
- self.server = compute_fakes.create_one_sdk_server()
1124
+ self.server = compute_fakes.create_one_server()
1130
1125
  self.compute_client.find_server.return_value = self.server
1131
1126
  self.compute_client.add_security_group_to_server.return_value = None
1132
1127
 
@@ -1295,7 +1290,7 @@ class TestServerCreate(TestServer):
1295
1290
  'image': self.image,
1296
1291
  'flavor': self.flavor,
1297
1292
  }
1298
- self.server = compute_fakes.create_one_sdk_server(attrs=attrs)
1293
+ self.server = compute_fakes.create_one_server(attrs=attrs)
1299
1294
 
1300
1295
  self.compute_client.create_server.return_value = self.server
1301
1296
  self.compute_client.get_server.return_value = self.server
@@ -1704,7 +1699,7 @@ class TestServerCreate(TestServer):
1704
1699
  },
1705
1700
  {
1706
1701
  'uuid': network_net2.id,
1707
- 'fixed': '10.0.0.2',
1702
+ 'fixed_ip': '10.0.0.2',
1708
1703
  },
1709
1704
  {
1710
1705
  'port': port_port1.id,
@@ -4382,7 +4377,7 @@ class TestServerDelete(compute_fakes.TestComputev2):
4382
4377
  def setUp(self):
4383
4378
  super().setUp()
4384
4379
 
4385
- self.server = compute_fakes.create_one_sdk_server()
4380
+ self.server = compute_fakes.create_one_server()
4386
4381
  self.compute_client.find_server.return_value = self.server
4387
4382
  self.compute_client.delete_server.return_value = None
4388
4383
 
@@ -4429,7 +4424,7 @@ class TestServerDelete(compute_fakes.TestComputev2):
4429
4424
  self.assertIsNone(result)
4430
4425
 
4431
4426
  def test_server_delete_multi_servers(self):
4432
- servers = compute_fakes.create_sdk_servers(count=3)
4427
+ servers = compute_fakes.create_servers(count=3)
4433
4428
  self.compute_client.find_server.return_value = None
4434
4429
  self.compute_client.find_server.side_effect = servers
4435
4430
 
@@ -4591,6 +4586,16 @@ class _TestServerList(TestServer):
4591
4586
  'Pinned Availability Zone',
4592
4587
  'Host',
4593
4588
  'Properties',
4589
+ 'Scheduler Hints',
4590
+ )
4591
+ columns_all_projects = (
4592
+ 'ID',
4593
+ 'Name',
4594
+ 'Status',
4595
+ 'Networks',
4596
+ 'Image',
4597
+ 'Flavor',
4598
+ 'Project ID',
4594
4599
  )
4595
4600
 
4596
4601
  def setUp(self):
@@ -4730,6 +4735,7 @@ class TestServerList(_TestServerList):
4730
4735
  getattr(s, 'pinned_availability_zone', ''),
4731
4736
  server.HostColumn(getattr(s, 'hypervisor_hostname')),
4732
4737
  format_columns.DictColumn(s.metadata),
4738
+ format_columns.DictListColumn(None),
4733
4739
  )
4734
4740
  for s in self.servers
4735
4741
  )
@@ -4752,6 +4758,36 @@ class TestServerList(_TestServerList):
4752
4758
  self.assertEqual(self.columns_long, columns)
4753
4759
  self.assertEqual(self.data, tuple(data))
4754
4760
 
4761
+ def test_server_list_all_projects_option(self):
4762
+ self.data = tuple(
4763
+ (
4764
+ s.id,
4765
+ s.name,
4766
+ s.status,
4767
+ server.AddressesColumn(s.addresses),
4768
+ # Image will be an empty string if boot-from-volume
4769
+ self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
4770
+ self.flavor.name,
4771
+ s.project_id,
4772
+ )
4773
+ for s in self.servers
4774
+ )
4775
+ arglist = [
4776
+ '--all-projects',
4777
+ ]
4778
+ verifylist = [
4779
+ ('all_projects', True),
4780
+ ('long', False),
4781
+ ('deleted', False),
4782
+ ]
4783
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4784
+ columns, data = self.cmd.take_action(parsed_args)
4785
+
4786
+ self.image_client.images.assert_called()
4787
+ self.compute_client.flavors.assert_called()
4788
+ self.assertEqual(self.columns_all_projects, columns)
4789
+ self.assertEqual(self.data, tuple(data))
4790
+
4755
4791
  def test_server_list_column_option(self):
4756
4792
  arglist = [
4757
4793
  '-c',
@@ -4778,6 +4814,8 @@ class TestServerList(_TestServerList):
4778
4814
  'Host',
4779
4815
  '-c',
4780
4816
  'Properties',
4817
+ '-c',
4818
+ 'Scheduler Hints',
4781
4819
  '--long',
4782
4820
  ]
4783
4821
  verifylist = [
@@ -4800,6 +4838,7 @@ class TestServerList(_TestServerList):
4800
4838
  self.assertIn('Pinned Availability Zone', columns)
4801
4839
  self.assertIn('Host', columns)
4802
4840
  self.assertIn('Properties', columns)
4841
+ self.assertIn('Scheduler Hints', columns)
4803
4842
  self.assertCountEqual(columns, set(columns))
4804
4843
 
4805
4844
  def test_server_list_no_name_lookup_option(self):
@@ -5213,6 +5252,7 @@ class TestServerList(_TestServerList):
5213
5252
  getattr(s, 'pinned_availability_zone', ''),
5214
5253
  server.HostColumn(getattr(s, 'hypervisor_hostname')),
5215
5254
  format_columns.DictColumn(s.metadata),
5255
+ format_columns.DictListColumn(s.scheduler_hints),
5216
5256
  )
5217
5257
  for s in self.servers
5218
5258
  )
@@ -5268,6 +5308,7 @@ class TestServerList(_TestServerList):
5268
5308
  getattr(s, 'pinned_availability_zone', ''),
5269
5309
  server.HostColumn(getattr(s, 'hypervisor_hostname')),
5270
5310
  format_columns.DictColumn(s.metadata),
5311
+ format_columns.DictListColumn(s.scheduler_hints),
5271
5312
  s.host_status,
5272
5313
  )
5273
5314
  for s in servers
@@ -5305,6 +5346,7 @@ class TestServerListV273(_TestServerList):
5305
5346
  'Pinned Availability Zone',
5306
5347
  'Host',
5307
5348
  'Properties',
5349
+ 'Scheduler Hints',
5308
5350
  )
5309
5351
 
5310
5352
  def setUp(self):
@@ -5479,9 +5521,7 @@ class TestServerListV273(_TestServerList):
5479
5521
  ],
5480
5522
  "networks": {},
5481
5523
  }
5482
- fake_server = compute_fakes.fakes.FakeResource(
5483
- info=server_dict,
5484
- )
5524
+ fake_server = _server.Server(**server_dict)
5485
5525
  self.servers.append(fake_server)
5486
5526
  columns, data = self.cmd.take_action(parsed_args)
5487
5527
  # get the first three servers out since our interest is in the partial
@@ -5492,9 +5532,9 @@ class TestServerListV273(_TestServerList):
5492
5532
  partial_server = next(data)
5493
5533
  expected_row = (
5494
5534
  'server-id-95a56bfc4xxxxxx28d7e418bfd97813a',
5495
- '',
5535
+ None,
5496
5536
  'UNKNOWN',
5497
- server.AddressesColumn(''),
5537
+ server.AddressesColumn(None),
5498
5538
  '',
5499
5539
  '',
5500
5540
  )
@@ -5503,7 +5543,7 @@ class TestServerListV273(_TestServerList):
5503
5543
 
5504
5544
  class TestServerAction(compute_fakes.TestComputev2):
5505
5545
  def run_method_with_sdk_servers(self, method_name, server_count):
5506
- servers = compute_fakes.create_sdk_servers(count=server_count)
5546
+ servers = compute_fakes.create_servers(count=server_count)
5507
5547
  self.compute_client.find_server.side_effect = servers
5508
5548
 
5509
5549
  arglist = [s.id for s in servers]
@@ -5536,7 +5576,7 @@ class TestServerLock(TestServerAction):
5536
5576
  def test_server_lock_with_reason(self):
5537
5577
  self.set_compute_api_version('2.73')
5538
5578
 
5539
- self.server = compute_fakes.create_one_sdk_server()
5579
+ self.server = compute_fakes.create_one_server()
5540
5580
  self.compute_client.find_server.return_value = self.server
5541
5581
  self.compute_client.lock_server.return_value = None
5542
5582
 
@@ -5565,8 +5605,8 @@ class TestServerLock(TestServerAction):
5565
5605
  def test_server_lock_with_reason_multi_servers(self):
5566
5606
  self.set_compute_api_version('2.73')
5567
5607
 
5568
- server_a = compute_fakes.create_one_sdk_server()
5569
- server_b = compute_fakes.create_one_sdk_server()
5608
+ server_a = compute_fakes.create_one_server()
5609
+ server_b = compute_fakes.create_one_server()
5570
5610
 
5571
5611
  self.compute_client.find_server.side_effect = [server_a, server_b]
5572
5612
  self.compute_client.lock_server.return_value = None
@@ -5595,7 +5635,7 @@ class TestServerLock(TestServerAction):
5595
5635
  def test_server_lock_with_reason_pre_v273(self):
5596
5636
  self.set_compute_api_version('2.72')
5597
5637
 
5598
- server = compute_fakes.create_one_sdk_server()
5638
+ server = compute_fakes.create_one_server()
5599
5639
 
5600
5640
  arglist = [
5601
5641
  server.id,
@@ -5623,7 +5663,7 @@ class TestServerMigrate(TestServer):
5623
5663
  def setUp(self):
5624
5664
  super().setUp()
5625
5665
 
5626
- self.server = compute_fakes.create_one_sdk_server()
5666
+ self.server = compute_fakes.create_one_server()
5627
5667
  self.compute_client.find_server.return_value = self.server
5628
5668
  self.compute_client.migrate_server.return_value = None
5629
5669
  self.compute_client.live_migrate_server.return_value = None
@@ -6168,7 +6208,7 @@ class TestServerRebuild(TestServer):
6168
6208
  'status': 'ACTIVE',
6169
6209
  'image': {'id': self.image.id},
6170
6210
  }
6171
- self.server = compute_fakes.create_one_sdk_server(attrs=attrs)
6211
+ self.server = compute_fakes.create_one_server(attrs=attrs)
6172
6212
  self.compute_client.find_server.return_value = self.server
6173
6213
  self.compute_client.rebuild_server.return_value = self.server
6174
6214
 
@@ -6903,7 +6943,7 @@ class TestServerRebuildVolumeBacked(TestServer):
6903
6943
  'status': 'ACTIVE',
6904
6944
  'image': '',
6905
6945
  }
6906
- self.server = compute_fakes.create_one_sdk_server(attrs=attrs)
6946
+ self.server = compute_fakes.create_one_server(attrs=attrs)
6907
6947
  self.compute_client.find_server.return_value = self.server
6908
6948
  self.compute_client.rebuild_server.return_value = self.server
6909
6949
 
@@ -6993,10 +7033,11 @@ class TestServerEvacuate(TestServer):
6993
7033
  'image': self.image,
6994
7034
  'networks': {},
6995
7035
  'adminPass': 'passw0rd',
7036
+ 'status': 'ACTIVE',
6996
7037
  }
6997
- self.server = compute_fakes.create_one_sdk_server(attrs=attrs)
7038
+ self.server = compute_fakes.create_one_server(attrs=attrs)
6998
7039
  attrs['id'] = self.server.id
6999
- self.new_server = compute_fakes.create_one_sdk_server(attrs=attrs)
7040
+ self.new_server = compute_fakes.create_one_server(attrs=attrs)
7000
7041
 
7001
7042
  # Return value for utils.find_resource for server.
7002
7043
  self.compute_client.find_server.return_value = self.server
@@ -7130,6 +7171,33 @@ class TestServerEvacuate(TestServer):
7130
7171
  mock_wait_for_status.assert_called_once_with(
7131
7172
  self.compute_client.get_server,
7132
7173
  self.server.id,
7174
+ success_status=['ACTIVE'],
7175
+ callback=mock.ANY,
7176
+ )
7177
+
7178
+ @mock.patch.object(common_utils, 'wait_for_status', return_value=True)
7179
+ def test_evacuate_with_wait_ok_shutoff(self, mock_wait_for_status):
7180
+ self.server.status = 'SHUTOFF'
7181
+ self.compute_client.get_server.return_value = self.server
7182
+
7183
+ args = [
7184
+ self.server.id,
7185
+ '--wait',
7186
+ ]
7187
+ verify_args = [
7188
+ ('server', self.server.id),
7189
+ ('wait', True),
7190
+ ]
7191
+ evac_args = {
7192
+ 'host': None,
7193
+ 'on_shared_storage': False,
7194
+ 'admin_pass': None,
7195
+ }
7196
+ self._test_evacuate(args, verify_args, evac_args)
7197
+ mock_wait_for_status.assert_called_once_with(
7198
+ self.compute_client.get_server,
7199
+ self.server.id,
7200
+ success_status=['ACTIVE', 'SHUTOFF'],
7133
7201
  callback=mock.ANY,
7134
7202
  )
7135
7203
 
@@ -7138,7 +7206,7 @@ class TestServerRemoveFixedIP(compute_fakes.TestComputev2):
7138
7206
  def setUp(self):
7139
7207
  super().setUp()
7140
7208
 
7141
- self.server = compute_fakes.create_one_sdk_server()
7209
+ self.server = compute_fakes.create_one_server()
7142
7210
 
7143
7211
  # Get the command object to test
7144
7212
  self.cmd = server.RemoveFixedIP(self.app, None)
@@ -7167,7 +7235,7 @@ class TestServerRescue(compute_fakes.TestComputev2):
7167
7235
  def setUp(self):
7168
7236
  super().setUp()
7169
7237
 
7170
- self.server = compute_fakes.create_one_sdk_server()
7238
+ self.server = compute_fakes.create_one_server()
7171
7239
  self.compute_client.find_server.return_value = self.server
7172
7240
 
7173
7241
  self.cmd = server.RescueServer(self.app, None)
@@ -7247,7 +7315,7 @@ class TestServerRemoveFloatingIPCompute(compute_fakes.TestComputev2):
7247
7315
  super().setUp()
7248
7316
 
7249
7317
  self.app.client_manager.network_endpoint_enabled = False
7250
- self.server = compute_fakes.create_one_sdk_server()
7318
+ self.server = compute_fakes.create_one_server()
7251
7319
  self.compute_client.find_server.return_value = self.server
7252
7320
 
7253
7321
  self.cmd = server.RemoveFloatingIP(self.app, None)
@@ -7277,14 +7345,14 @@ class TestServerRemoveFloatingIPNetwork(network_fakes.TestNetworkV2):
7277
7345
  def setUp(self):
7278
7346
  super().setUp()
7279
7347
 
7280
- self.network_client.update_ip = mock.Mock(return_value=None)
7348
+ self.network_client.update_ip.return_value = None
7281
7349
 
7282
7350
  # Get the command object to test
7283
7351
  self.cmd = server.RemoveFloatingIP(self.app, None)
7284
7352
 
7285
7353
  def test_server_remove_floating_ip_default(self):
7286
7354
  _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
7287
- self.network_client.find_ip = mock.Mock(return_value=_floating_ip)
7355
+ self.network_client.find_ip.return_value = _floating_ip
7288
7356
  arglist = [
7289
7357
  'fake_server',
7290
7358
  _floating_ip['ip'],
@@ -7317,9 +7385,6 @@ class TestServerRemovePort(TestServer):
7317
7385
  # Get the command object to test
7318
7386
  self.cmd = server.RemovePort(self.app, None)
7319
7387
 
7320
- self.find_port = mock.Mock()
7321
- self.app.client_manager.network.find_port = self.find_port
7322
-
7323
7388
  def _test_server_remove_port(self, port_id):
7324
7389
  servers = self.setup_sdk_servers_mock(count=1)
7325
7390
  port = 'fake-port'
@@ -7342,15 +7407,17 @@ class TestServerRemovePort(TestServer):
7342
7407
  self.assertIsNone(result)
7343
7408
 
7344
7409
  def test_server_remove_port(self):
7345
- self._test_server_remove_port(self.find_port.return_value.id)
7346
- self.find_port.assert_called_once_with(
7410
+ self._test_server_remove_port(
7411
+ self.network_client.find_port.return_value.id
7412
+ )
7413
+ self.network_client.find_port.assert_called_once_with(
7347
7414
  'fake-port', ignore_missing=False
7348
7415
  )
7349
7416
 
7350
7417
  def test_server_remove_port_no_neutron(self):
7351
7418
  self.app.client_manager.network_endpoint_enabled = False
7352
7419
  self._test_server_remove_port('fake-port')
7353
- self.find_port.assert_not_called()
7420
+ self.network_client.find_port.assert_not_called()
7354
7421
 
7355
7422
 
7356
7423
  class TestServerRemoveNetwork(TestServer):
@@ -7360,16 +7427,12 @@ class TestServerRemoveNetwork(TestServer):
7360
7427
  # Get the command object to test
7361
7428
  self.cmd = server.RemoveNetwork(self.app, None)
7362
7429
 
7363
- # Set method to be tested.
7364
- self.fake_inf = mock.Mock()
7365
-
7366
- self.find_network = mock.Mock()
7367
- self.app.client_manager.network.find_network = self.find_network
7368
- self.compute_client.server_interfaces.return_value = [self.fake_inf]
7430
+ self.fake_if = mock.Mock()
7431
+ self.compute_client.server_interfaces.return_value = [self.fake_if]
7369
7432
 
7370
7433
  def _test_server_remove_network(self, network_id):
7371
- self.fake_inf.net_id = network_id
7372
- self.fake_inf.port_id = 'fake-port'
7434
+ self.fake_if.net_id = network_id
7435
+ self.fake_if.port_id = 'fake-port'
7373
7436
  servers = self.setup_sdk_servers_mock(count=1)
7374
7437
  network = 'fake-network'
7375
7438
 
@@ -7394,22 +7457,24 @@ class TestServerRemoveNetwork(TestServer):
7394
7457
  self.assertIsNone(result)
7395
7458
 
7396
7459
  def test_server_remove_network(self):
7397
- self._test_server_remove_network(self.find_network.return_value.id)
7398
- self.find_network.assert_called_once_with(
7460
+ self._test_server_remove_network(
7461
+ self.network_client.find_network.return_value.id
7462
+ )
7463
+ self.network_client.find_network.assert_called_once_with(
7399
7464
  'fake-network', ignore_missing=False
7400
7465
  )
7401
7466
 
7402
7467
  def test_server_remove_network_no_neutron(self):
7403
7468
  self.app.client_manager.network_endpoint_enabled = False
7404
7469
  self._test_server_remove_network('fake-network')
7405
- self.find_network.assert_not_called()
7470
+ self.network_client.find_network.assert_not_called()
7406
7471
 
7407
7472
 
7408
7473
  class TestServerRemoveSecurityGroup(TestServer):
7409
7474
  def setUp(self):
7410
7475
  super().setUp()
7411
7476
 
7412
- self.server = compute_fakes.create_one_sdk_server()
7477
+ self.server = compute_fakes.create_one_server()
7413
7478
  self.compute_client.find_server.return_value = self.server
7414
7479
  self.compute_client.remove_security_group_from_server.return_value = (
7415
7480
  None
@@ -7472,7 +7537,7 @@ class TestServerResize(compute_fakes.TestComputev2):
7472
7537
  def setUp(self):
7473
7538
  super().setUp()
7474
7539
 
7475
- self.server = compute_fakes.create_one_sdk_server()
7540
+ self.server = compute_fakes.create_one_server()
7476
7541
  self.compute_client.find_server.return_value = self.server
7477
7542
  self.flavor = compute_fakes.create_one_flavor()
7478
7543
  self.compute_client.find_flavor.return_value = self.flavor
@@ -7680,7 +7745,7 @@ class TestServerResizeConfirm(compute_fakes.TestComputev2):
7680
7745
  def setUp(self):
7681
7746
  super().setUp()
7682
7747
 
7683
- self.server = compute_fakes.create_one_sdk_server()
7748
+ self.server = compute_fakes.create_one_server()
7684
7749
  self.compute_client.find_server.return_value = self.server
7685
7750
  self.compute_client.confirm_server_resize.return_value = None
7686
7751
 
@@ -7712,7 +7777,7 @@ class TestServerMigrateConfirm(compute_fakes.TestComputev2):
7712
7777
  def setUp(self):
7713
7778
  super().setUp()
7714
7779
 
7715
- self.server = compute_fakes.create_one_sdk_server()
7780
+ self.server = compute_fakes.create_one_server()
7716
7781
  self.compute_client.find_server.return_value = self.server
7717
7782
  self.compute_client.confirm_server_resize.return_value = None
7718
7783
 
@@ -7750,7 +7815,7 @@ class TestServerConfirmMigration(compute_fakes.TestComputev2):
7750
7815
  def setUp(self):
7751
7816
  super().setUp()
7752
7817
 
7753
- self.server = compute_fakes.create_one_sdk_server()
7818
+ self.server = compute_fakes.create_one_server()
7754
7819
  self.compute_client.find_server.return_value = self.server
7755
7820
  self.compute_client.confirm_server_resize.return_value = None
7756
7821
 
@@ -7781,7 +7846,7 @@ class TestServerResizeRevert(compute_fakes.TestComputev2):
7781
7846
  def setUp(self):
7782
7847
  super().setUp()
7783
7848
 
7784
- self.server = compute_fakes.create_one_sdk_server()
7849
+ self.server = compute_fakes.create_one_server()
7785
7850
  self.compute_client.find_server.return_value = self.server
7786
7851
  self.compute_client.revert_server_resize.return_value = None
7787
7852
 
@@ -7813,7 +7878,7 @@ class TestServerMigrateRevert(compute_fakes.TestComputev2):
7813
7878
  def setUp(self):
7814
7879
  super().setUp()
7815
7880
 
7816
- self.server = compute_fakes.create_one_sdk_server()
7881
+ self.server = compute_fakes.create_one_server()
7817
7882
  self.compute_client.find_server.return_value = self.server
7818
7883
  self.compute_client.revert_server_resize.return_value = None
7819
7884
 
@@ -7851,7 +7916,7 @@ class TestServerRevertMigration(compute_fakes.TestComputev2):
7851
7916
  def setUp(self):
7852
7917
  super().setUp()
7853
7918
 
7854
- self.server = compute_fakes.create_one_sdk_server()
7919
+ self.server = compute_fakes.create_one_server()
7855
7920
  self.compute_client.find_server.return_value = self.server
7856
7921
  self.compute_client.revert_server_resize.return_value = None
7857
7922
 
@@ -7910,7 +7975,7 @@ class TestServerSet(TestServer):
7910
7975
  def setUp(self):
7911
7976
  super().setUp()
7912
7977
 
7913
- self.server = compute_fakes.create_one_sdk_server()
7978
+ self.server = compute_fakes.create_one_server()
7914
7979
  self.compute_client.find_server.return_value = self.server
7915
7980
 
7916
7981
  # Get the command object to test
@@ -7935,6 +8000,7 @@ class TestServerSet(TestServer):
7935
8000
  arglist = [
7936
8001
  '--state',
7937
8002
  'active',
8003
+ '--auto-approve',
7938
8004
  self.server.id,
7939
8005
  ]
7940
8006
  verifylist = [
@@ -7955,6 +8021,54 @@ class TestServerSet(TestServer):
7955
8021
  self.compute_client.add_tag_to_server.assert_not_called()
7956
8022
  self.assertIsNone(result)
7957
8023
 
8024
+ def test_server_set_with_state_prompt_y(self):
8025
+ arglist = [
8026
+ '--state',
8027
+ 'active',
8028
+ self.server.id,
8029
+ ]
8030
+ verifylist = [
8031
+ ('state', 'active'),
8032
+ ('server', self.server.id),
8033
+ ]
8034
+
8035
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
8036
+ with mock.patch('getpass.getpass', return_value='y'):
8037
+ result = self.cmd.take_action(parsed_args)
8038
+
8039
+ self.compute_client.reset_server_state.assert_called_once_with(
8040
+ self.server, state='active'
8041
+ )
8042
+ self.compute_client.update_server.assert_not_called()
8043
+ self.compute_client.set_server_metadata.assert_not_called()
8044
+ self.compute_client.change_server_password.assert_not_called()
8045
+ self.compute_client.clear_server_password.assert_not_called()
8046
+ self.compute_client.add_tag_to_server.assert_not_called()
8047
+ self.assertIsNone(result)
8048
+
8049
+ def test_server_set_with_state_prompt_n(self):
8050
+ arglist = [
8051
+ '--state',
8052
+ 'active',
8053
+ self.server.id,
8054
+ ]
8055
+ verifylist = [
8056
+ ('state', 'active'),
8057
+ ('server', self.server.id),
8058
+ ]
8059
+
8060
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
8061
+ with mock.patch('getpass.getpass', return_value='n'):
8062
+ result = self.cmd.take_action(parsed_args)
8063
+
8064
+ self.compute_client.reset_server_state.assert_not_called()
8065
+ self.compute_client.update_server.assert_not_called()
8066
+ self.compute_client.set_server_metadata.assert_not_called()
8067
+ self.compute_client.change_server_password.assert_not_called()
8068
+ self.compute_client.clear_server_password.assert_not_called()
8069
+ self.compute_client.add_tag_to_server.assert_not_called()
8070
+ self.assertIsNone(result)
8071
+
7958
8072
  def test_server_set_with_invalid_state(self):
7959
8073
  arglist = [
7960
8074
  '--state',
@@ -8243,7 +8357,7 @@ class TestServerShelve(TestServer):
8243
8357
  def setUp(self):
8244
8358
  super().setUp()
8245
8359
 
8246
- self.server = compute_fakes.create_one_sdk_server(
8360
+ self.server = compute_fakes.create_one_server(
8247
8361
  attrs={'status': 'ACTIVE'},
8248
8362
  )
8249
8363
 
@@ -8377,7 +8491,7 @@ class TestServerShow(TestServer):
8377
8491
  self.compute_client.get_server_diagnostics.return_value = {
8378
8492
  'test': 'test'
8379
8493
  }
8380
- self.server = compute_fakes.create_one_sdk_server(
8494
+ self.server = compute_fakes.create_one_server(
8381
8495
  attrs=server_info,
8382
8496
  )
8383
8497
  self.server.fetch_topology = mock.MagicMock(return_value=self.topology)
@@ -8644,7 +8758,7 @@ class TestServerSsh(TestServer):
8644
8758
  ],
8645
8759
  },
8646
8760
  }
8647
- self.server = compute_fakes.create_one_sdk_server(
8761
+ self.server = compute_fakes.create_one_server(
8648
8762
  attrs=self.attrs,
8649
8763
  )
8650
8764
  self.compute_client.find_server.return_value = self.server
@@ -8765,7 +8879,7 @@ class TestServerStart(TestServerAction):
8765
8879
  self.run_method_with_sdk_servers('start_server', 3)
8766
8880
 
8767
8881
  def test_server_start_with_all_projects(self):
8768
- server = compute_fakes.create_one_sdk_server()
8882
+ server = compute_fakes.create_one_server()
8769
8883
  self.compute_client.find_server.return_value = server
8770
8884
 
8771
8885
  arglist = [
@@ -8801,7 +8915,7 @@ class TestServerStop(TestServerAction):
8801
8915
  self.run_method_with_sdk_servers('stop_server', 3)
8802
8916
 
8803
8917
  def test_server_start_with_all_projects(self):
8804
- server = compute_fakes.create_one_sdk_server()
8918
+ server = compute_fakes.create_one_server()
8805
8919
  self.compute_client.find_server.return_value = server
8806
8920
 
8807
8921
  arglist = [
@@ -8869,7 +8983,7 @@ class TestServerUnrescue(compute_fakes.TestComputev2):
8869
8983
  def setUp(self):
8870
8984
  super().setUp()
8871
8985
 
8872
- self.server = compute_fakes.create_one_sdk_server()
8986
+ self.server = compute_fakes.create_one_server()
8873
8987
  self.compute_client.find_server.return_value = self.server
8874
8988
 
8875
8989
  self.cmd = server.UnrescueServer(self.app, None)
@@ -8898,7 +9012,7 @@ class TestServerUnset(TestServer):
8898
9012
  def setUp(self):
8899
9013
  super().setUp()
8900
9014
 
8901
- self.server = compute_fakes.create_one_sdk_server()
9015
+ self.server = compute_fakes.create_one_server()
8902
9016
  self.compute_client.find_server.return_value = self.server
8903
9017
 
8904
9018
  # Get the command object to test
@@ -9048,7 +9162,7 @@ class TestServerUnshelve(TestServer):
9048
9162
  def setUp(self):
9049
9163
  super().setUp()
9050
9164
 
9051
- self.server = compute_fakes.create_one_sdk_server(
9165
+ self.server = compute_fakes.create_one_server(
9052
9166
  attrs={'status': 'SHELVED'},
9053
9167
  )
9054
9168
 
@@ -9370,7 +9484,7 @@ class TestServerGeneral(TestServer):
9370
9484
  'properties': '',
9371
9485
  'volumes_attached': [{"id": "6344fe9d-ef20-45b2-91a6"}],
9372
9486
  }
9373
- _server = compute_fakes.create_one_sdk_server(server_info)
9487
+ _server = compute_fakes.create_one_server(server_info)
9374
9488
  self.compute_client.get_server.return_value = _server
9375
9489
 
9376
9490
  expected = {
@@ -9457,7 +9571,7 @@ class TestServerGeneral(TestServer):
9457
9571
  'properties': '',
9458
9572
  'volumes_attached': [{"id": "6344fe9d-ef20-45b2-91a6"}],
9459
9573
  }
9460
- _server = compute_fakes.create_one_sdk_server(server_info)
9574
+ _server = compute_fakes.create_one_server(server_info)
9461
9575
  self.compute_client.get_server.return_value = _server
9462
9576
 
9463
9577
  expected = {