python-openstackclient 6.4.0__py3-none-any.whl → 6.5.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 (44) hide show
  1. openstackclient/common/availability_zone.py +4 -4
  2. openstackclient/compute/v2/server.py +173 -99
  3. openstackclient/identity/v3/mapping.py +25 -3
  4. openstackclient/identity/v3/policy.py +3 -1
  5. openstackclient/image/v2/image.py +37 -0
  6. openstackclient/image/v2/metadef_namespaces.py +25 -21
  7. openstackclient/image/v2/metadef_objects.py +26 -30
  8. openstackclient/image/v2/metadef_properties.py +60 -38
  9. openstackclient/network/v2/default_security_group_rule.py +23 -4
  10. openstackclient/network/v2/local_ip_association.py +1 -1
  11. openstackclient/network/v2/ndp_proxy.py +7 -3
  12. openstackclient/network/v2/network.py +2 -2
  13. openstackclient/network/v2/port.py +23 -7
  14. openstackclient/network/v2/subnet.py +1 -0
  15. openstackclient/tests/functional/base.py +7 -4
  16. openstackclient/tests/unit/compute/v2/test_server.py +72 -54
  17. openstackclient/tests/unit/identity/v3/test_mappings.py +9 -4
  18. openstackclient/tests/unit/identity/v3/test_trust.py +0 -2
  19. openstackclient/tests/unit/image/v1/fakes.py +1 -1
  20. openstackclient/tests/unit/image/v2/test_image.py +60 -0
  21. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +5 -19
  22. openstackclient/tests/unit/integ/cli/test_shell.py +0 -2
  23. openstackclient/tests/unit/network/v2/fakes.py +1 -0
  24. openstackclient/tests/unit/network/v2/test_network.py +33 -0
  25. openstackclient/tests/unit/network/v2/test_network_trunk.py +6 -8
  26. openstackclient/tests/unit/network/v2/test_port.py +60 -18
  27. openstackclient/tests/unit/network/v2/test_subnet.py +92 -0
  28. openstackclient/tests/unit/network/v2/test_subnet_pool.py +11 -13
  29. openstackclient/tests/unit/test_shell.py +1 -7
  30. openstackclient/tests/unit/utils.py +8 -1
  31. openstackclient/tests/unit/volume/v1/test_volume.py +4 -6
  32. openstackclient/tests/unit/volume/v2/test_volume.py +4 -6
  33. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +3 -5
  34. openstackclient/volume/v2/volume_type.py +3 -3
  35. {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/AUTHORS +4 -0
  36. {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/METADATA +3 -1
  37. {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/RECORD +42 -43
  38. {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/entry_points.txt +6 -5
  39. python_openstackclient-6.5.0.dist-info/pbr.json +1 -0
  40. openstackclient/tests/unit/common/test_parseractions.py +0 -233
  41. python_openstackclient-6.4.0.dist-info/pbr.json +0 -1
  42. {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/LICENSE +0 -0
  43. {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/WHEEL +0 -0
  44. {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/top_level.txt +0 -0
@@ -74,6 +74,7 @@ def _get_columns(item):
74
74
  'dns_name': 'dns_name',
75
75
  'extra_dhcp_opts': 'extra_dhcp_opts',
76
76
  'fixed_ips': 'fixed_ips',
77
+ 'hardware_offload_type': 'hardware_offload_type',
77
78
  'hints': 'hints',
78
79
  'id': 'id',
79
80
  'ip_allocation': 'ip_allocation',
@@ -124,7 +125,7 @@ class JSONKeyValueAction(argparse.Action):
124
125
  "%(option)s, but encountered JSON parsing error: "
125
126
  "%(error)s"
126
127
  ) % {"option": option_string, "error": e}
127
- raise argparse.ArgumentTypeError(msg)
128
+ raise argparse.ArgumentError(self, msg)
128
129
 
129
130
 
130
131
  def _get_attrs(client_manager, parsed_args):
@@ -212,6 +213,12 @@ def _get_attrs(client_manager, parsed_args):
212
213
  if 'device_profile' in parsed_args and parsed_args.device_profile:
213
214
  attrs['device_profile'] = parsed_args.device_profile
214
215
 
216
+ if (
217
+ 'hardware_offload_type' in parsed_args
218
+ and parsed_args.hardware_offload_type
219
+ ):
220
+ attrs['hardware_offload_type'] = parsed_args.hardware_offload_type
221
+
215
222
  return attrs
216
223
 
217
224
 
@@ -409,7 +416,7 @@ def _validate_port_hints(hints):
409
416
  {'openvswitch': {'other_config': {'tx-steering': 'hash'}}},
410
417
  ):
411
418
  msg = _("Invalid value to --hints, see --help for valid values.")
412
- raise argparse.ArgumentTypeError(msg)
419
+ raise exceptions.CommandError(msg)
413
420
 
414
421
 
415
422
  # When we have multiple hints, we'll need to refactor this to expand aliases
@@ -560,6 +567,15 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
560
567
  metavar='<device-profile>',
561
568
  help=_('Cyborg port device profile'),
562
569
  )
570
+ parser.add_argument(
571
+ '--hardware-offload-type',
572
+ metavar='<hardware-offload-type>',
573
+ dest='hardware_offload_type',
574
+ help=_(
575
+ 'Hardware offload type this port will request when '
576
+ 'attached to the network backend'
577
+ ),
578
+ )
563
579
  _tag.add_tag_option_to_parser_for_create(parser, _('port'))
564
580
  return parser
565
581
 
@@ -1163,10 +1179,6 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
1163
1179
  "or ID) (repeat option to unset multiple security groups)"
1164
1180
  ),
1165
1181
  )
1166
-
1167
- parser.add_argument(
1168
- 'port', metavar="<port>", help=_("Port to modify (name or ID)")
1169
- )
1170
1182
  parser.add_argument(
1171
1183
  '--allowed-address',
1172
1184
  metavar='ip-address=<ip-address>[,mac-address=<mac-address>]',
@@ -1209,8 +1221,12 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
1209
1221
  default=False,
1210
1222
  help=_("Clear hints for the port."),
1211
1223
  )
1212
-
1213
1224
  _tag.add_tag_option_to_parser_for_unset(parser, _('port'))
1225
+ parser.add_argument(
1226
+ 'port',
1227
+ metavar="<port>",
1228
+ help=_("Port to modify (name or ID)"),
1229
+ )
1214
1230
 
1215
1231
  return parser
1216
1232
 
@@ -306,6 +306,7 @@ class CreateSubnet(command.ShowOne, common.NeutronCommandWithExtraArgs):
306
306
  )
307
307
  subnet_pool_group.add_argument(
308
308
  '--use-prefix-delegation',
309
+ action='store_true',
309
310
  help=_(
310
311
  "Use 'prefix-delegation' if IP is IPv6 format "
311
312
  "and IP would be delegated externally"
@@ -24,14 +24,17 @@ ADMIN_CLOUD = os.environ.get('OS_ADMIN_CLOUD', 'devstack-admin')
24
24
  LOG = logging.getLogger(__name__)
25
25
 
26
26
 
27
- def execute(cmd, fail_ok=False, merge_stderr=False):
27
+ def execute(cmd, *, fail_ok=False):
28
28
  """Executes specified command for the given action."""
29
29
  LOG.debug('Executing: %s', cmd)
30
30
  cmdlist = shlex.split(cmd)
31
31
  stdout = subprocess.PIPE
32
- stderr = subprocess.STDOUT if merge_stderr else subprocess.PIPE
32
+ stderr = subprocess.PIPE
33
+ env = {
34
+ k: v for k, v in os.environ.copy().items() if not k.startswith('OS_')
35
+ }
33
36
 
34
- proc = subprocess.Popen(cmdlist, stdout=stdout, stderr=stderr)
37
+ proc = subprocess.Popen(cmdlist, stdout=stdout, stderr=stderr, env=env)
35
38
 
36
39
  result_out, result_err = proc.communicate()
37
40
  result_out = result_out.decode('utf-8')
@@ -65,7 +68,7 @@ class TestCase(testtools.TestCase):
65
68
  :param cloud: The cloud to execute against. This can be a string, empty
66
69
  string, or None. A string results in '--os-auth-type $cloud', an
67
70
  empty string results in the '--os-auth-type' option being
68
- omitted, and None resuts in '--os-auth-type none' for legacy
71
+ omitted, and None results in '--os-auth-type none' for legacy
69
72
  reasons.
70
73
  :param fail_ok: If failure is permitted. If False (default), a command
71
74
  failure will result in `~tempest.lib.exceptions.CommandFailed`
@@ -11,8 +11,7 @@
11
11
  # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
12
  # License for the specific language governing permissions and limitations
13
13
  # under the License.
14
- #
15
- import argparse
14
+
16
15
  import collections
17
16
  import copy
18
17
  import getpass
@@ -33,11 +32,11 @@ from openstackclient.compute.v2 import server
33
32
  from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
34
33
  from openstackclient.tests.unit.image.v2 import fakes as image_fakes
35
34
  from openstackclient.tests.unit.network.v2 import fakes as network_fakes
36
- from openstackclient.tests.unit import utils
35
+ from openstackclient.tests.unit import utils as test_utils
37
36
  from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
38
37
 
39
38
 
40
- class TestPowerStateColumn(utils.TestCase):
39
+ class TestPowerStateColumn(test_utils.TestCase):
41
40
  def test_human_readable(self):
42
41
  self.assertEqual(
43
42
  'NOSTATE', server.PowerStateColumn(0x00).human_readable()
@@ -1128,7 +1127,7 @@ class TestServerAddVolume(TestServerVolume):
1128
1127
  ('disable_delete_on_termination', True),
1129
1128
  ]
1130
1129
  ex = self.assertRaises(
1131
- utils.ParserException,
1130
+ test_utils.ParserException,
1132
1131
  self.check_parser,
1133
1132
  self.cmd,
1134
1133
  arglist,
@@ -1314,7 +1313,6 @@ class TestServerCreate(TestServer):
1314
1313
  'id',
1315
1314
  'image',
1316
1315
  'name',
1317
- 'networks',
1318
1316
  'properties',
1319
1317
  )
1320
1318
 
@@ -1328,7 +1326,6 @@ class TestServerCreate(TestServer):
1328
1326
  self.new_server.id,
1329
1327
  self.image.name + ' (' + self.new_server.image.get('id') + ')',
1330
1328
  self.new_server.name,
1331
- self.new_server.networks,
1332
1329
  format_columns.DictColumn(self.new_server.metadata),
1333
1330
  )
1334
1331
  return datalist
@@ -1373,7 +1370,7 @@ class TestServerCreate(TestServer):
1373
1370
  ]
1374
1371
 
1375
1372
  self.assertRaises(
1376
- utils.ParserException,
1373
+ test_utils.ParserException,
1377
1374
  self.check_parser,
1378
1375
  self.cmd,
1379
1376
  arglist,
@@ -1447,6 +1444,8 @@ class TestServerCreate(TestServer):
1447
1444
  'a=b',
1448
1445
  '--hint',
1449
1446
  'a=c',
1447
+ '--server-group',
1448
+ 'servergroup',
1450
1449
  self.new_server.name,
1451
1450
  ]
1452
1451
  verifylist = [
@@ -1455,22 +1454,26 @@ class TestServerCreate(TestServer):
1455
1454
  ('key_name', 'keyname'),
1456
1455
  ('properties', {'Beta': 'b'}),
1457
1456
  ('security_group', ['securitygroup']),
1458
- ('hint', {'a': ['b', 'c']}),
1457
+ ('hints', {'a': ['b', 'c']}),
1458
+ ('server_group', 'servergroup'),
1459
1459
  ('config_drive', True),
1460
1460
  ('password', 'passw0rd'),
1461
1461
  ('server_name', self.new_server.name),
1462
1462
  ]
1463
1463
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1464
1464
 
1465
- # In base command class ShowOne in cliff, abstract method take_action()
1466
- # returns a two-part tuple with a tuple of column names and a tuple of
1467
- # data to be shown.
1465
+ fake_server_group = compute_fakes.create_one_server_group()
1466
+ self.compute_client.server_groups.get.return_value = fake_server_group
1467
+
1468
1468
  fake_sg = network_fakes.FakeSecurityGroup.create_security_groups()
1469
1469
  mock_find_sg = network_fakes.FakeSecurityGroup.get_security_groups(
1470
1470
  fake_sg
1471
1471
  )
1472
1472
  self.app.client_manager.network.find_security_group = mock_find_sg
1473
1473
 
1474
+ # In base command class ShowOne in cliff, abstract method take_action()
1475
+ # returns a two-part tuple with a tuple of column names and a tuple of
1476
+ # data to be shown.
1474
1477
  columns, data = self.cmd.take_action(parsed_args)
1475
1478
 
1476
1479
  mock_find_sg.assert_called_once_with(
@@ -1490,7 +1493,7 @@ class TestServerCreate(TestServer):
1490
1493
  admin_pass='passw0rd',
1491
1494
  block_device_mapping_v2=[],
1492
1495
  nics=[],
1493
- scheduler_hints={'a': ['b', 'c']},
1496
+ scheduler_hints={'a': ['b', 'c'], 'group': fake_server_group.id},
1494
1497
  config_drive=True,
1495
1498
  )
1496
1499
  # ServerManager.create(name, image, flavor, **kwargs)
@@ -2193,7 +2196,7 @@ class TestServerCreate(TestServer):
2193
2196
  self.new_server.name,
2194
2197
  ]
2195
2198
  self.assertRaises(
2196
- argparse.ArgumentTypeError,
2199
+ test_utils.ParserException,
2197
2200
  self.check_parser,
2198
2201
  self.cmd,
2199
2202
  arglist,
@@ -2212,7 +2215,7 @@ class TestServerCreate(TestServer):
2212
2215
  self.new_server.name,
2213
2216
  ]
2214
2217
  self.assertRaises(
2215
- argparse.ArgumentTypeError,
2218
+ test_utils.ParserException,
2216
2219
  self.check_parser,
2217
2220
  self.cmd,
2218
2221
  arglist,
@@ -2231,7 +2234,7 @@ class TestServerCreate(TestServer):
2231
2234
  self.new_server.name,
2232
2235
  ]
2233
2236
  self.assertRaises(
2234
- argparse.ArgumentTypeError,
2237
+ test_utils.ParserException,
2235
2238
  self.check_parser,
2236
2239
  self.cmd,
2237
2240
  arglist,
@@ -2250,7 +2253,7 @@ class TestServerCreate(TestServer):
2250
2253
  self.new_server.name,
2251
2254
  ]
2252
2255
  self.assertRaises(
2253
- argparse.ArgumentTypeError,
2256
+ test_utils.ParserException,
2254
2257
  self.check_parser,
2255
2258
  self.cmd,
2256
2259
  arglist,
@@ -2305,7 +2308,7 @@ class TestServerCreate(TestServer):
2305
2308
  self.new_server.name, self.image, self.flavor, **kwargs
2306
2309
  )
2307
2310
  self.assertEqual(self.columns, columns)
2308
- self.assertEqual(self.datalist(), data)
2311
+ self.assertTupleEqual(self.datalist(), data)
2309
2312
 
2310
2313
  @mock.patch.object(common_utils, 'wait_for_status', return_value=False)
2311
2314
  def test_server_create_with_wait_fails(self, mock_wait_for_status):
@@ -2327,7 +2330,9 @@ class TestServerCreate(TestServer):
2327
2330
 
2328
2331
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2329
2332
 
2330
- self.assertRaises(SystemExit, self.cmd.take_action, parsed_args)
2333
+ self.assertRaises(
2334
+ exceptions.CommandError, self.cmd.take_action, parsed_args
2335
+ )
2331
2336
 
2332
2337
  mock_wait_for_status.assert_called_once_with(
2333
2338
  self.servers_mock.get,
@@ -3300,7 +3305,7 @@ class TestServerCreate(TestServer):
3300
3305
  self.new_server.name,
3301
3306
  ]
3302
3307
  self.assertRaises(
3303
- argparse.ArgumentTypeError,
3308
+ test_utils.ParserException,
3304
3309
  self.check_parser,
3305
3310
  self.cmd,
3306
3311
  arglist,
@@ -3318,7 +3323,7 @@ class TestServerCreate(TestServer):
3318
3323
  self.new_server.name,
3319
3324
  ]
3320
3325
  self.assertRaises(
3321
- argparse.ArgumentTypeError,
3326
+ test_utils.ParserException,
3322
3327
  self.check_parser,
3323
3328
  self.cmd,
3324
3329
  arglist,
@@ -3336,7 +3341,7 @@ class TestServerCreate(TestServer):
3336
3341
  self.new_server.name,
3337
3342
  ]
3338
3343
  self.assertRaises(
3339
- argparse.ArgumentTypeError,
3344
+ test_utils.ParserException,
3340
3345
  self.check_parser,
3341
3346
  self.cmd,
3342
3347
  arglist,
@@ -3757,7 +3762,7 @@ class TestServerCreate(TestServer):
3757
3762
  self.new_server.name,
3758
3763
  ]
3759
3764
  self.assertRaises(
3760
- argparse.ArgumentTypeError,
3765
+ test_utils.ParserException,
3761
3766
  self.check_parser,
3762
3767
  self.cmd,
3763
3768
  arglist,
@@ -3775,7 +3780,7 @@ class TestServerCreate(TestServer):
3775
3780
  self.new_server.name,
3776
3781
  ]
3777
3782
  self.assertRaises(
3778
- argparse.ArgumentTypeError,
3783
+ test_utils.ParserException,
3779
3784
  self.check_parser,
3780
3785
  self.cmd,
3781
3786
  arglist,
@@ -3794,7 +3799,7 @@ class TestServerCreate(TestServer):
3794
3799
  self.new_server.name,
3795
3800
  ]
3796
3801
  self.assertRaises(
3797
- argparse.ArgumentTypeError,
3802
+ test_utils.ParserException,
3798
3803
  self.check_parser,
3799
3804
  self.cmd,
3800
3805
  arglist,
@@ -3812,7 +3817,7 @@ class TestServerCreate(TestServer):
3812
3817
  self.new_server.name,
3813
3818
  ]
3814
3819
  self.assertRaises(
3815
- argparse.ArgumentTypeError,
3820
+ test_utils.ParserException,
3816
3821
  self.check_parser,
3817
3822
  self.cmd,
3818
3823
  arglist,
@@ -4569,7 +4574,9 @@ class TestServerDelete(TestServer):
4569
4574
  ]
4570
4575
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4571
4576
 
4572
- self.assertRaises(SystemExit, self.cmd.take_action, parsed_args)
4577
+ self.assertRaises(
4578
+ exceptions.CommandError, self.cmd.take_action, parsed_args
4579
+ )
4573
4580
 
4574
4581
  self.servers_mock.delete.assert_called_with(servers[0].id)
4575
4582
  mock_wait_for_delete.assert_called_once_with(
@@ -5183,7 +5190,7 @@ class TestServerList(_TestServerList):
5183
5190
  ]
5184
5191
 
5185
5192
  self.assertRaises(
5186
- utils.ParserException,
5193
+ test_utils.ParserException,
5187
5194
  self.check_parser,
5188
5195
  self.cmd,
5189
5196
  arglist,
@@ -5442,7 +5449,7 @@ class TestServerListV273(_TestServerList):
5442
5449
  verifylist = [('locked', True), ('unlocked', True)]
5443
5450
 
5444
5451
  ex = self.assertRaises(
5445
- utils.ParserException,
5452
+ test_utils.ParserException,
5446
5453
  self.check_parser,
5447
5454
  self.cmd,
5448
5455
  arglist,
@@ -5984,7 +5991,9 @@ class TestServerMigrate(TestServer):
5984
5991
  ]
5985
5992
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5986
5993
 
5987
- self.assertRaises(SystemExit, self.cmd.take_action, parsed_args)
5994
+ self.assertRaises(
5995
+ exceptions.CommandError, self.cmd.take_action, parsed_args
5996
+ )
5988
5997
 
5989
5998
  self.servers_mock.get.assert_called_with(self.server.id)
5990
5999
  self.server.migrate.assert_called_with()
@@ -6090,9 +6099,10 @@ class TestServerReboot(TestServer):
6090
6099
  ]
6091
6100
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6092
6101
 
6093
- self.assertRaises(SystemExit, self.cmd.take_action, parsed_args)
6102
+ self.assertRaises(
6103
+ exceptions.CommandError, self.cmd.take_action, parsed_args
6104
+ )
6094
6105
 
6095
- self.assertIn('Error rebooting server', mock_log.call_args[0][0])
6096
6106
  self.compute_sdk_client.reboot_server.assert_called_once_with(
6097
6107
  servers[0].id,
6098
6108
  'SOFT',
@@ -6351,7 +6361,9 @@ class TestServerRebuild(TestServer):
6351
6361
  ]
6352
6362
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6353
6363
 
6354
- self.assertRaises(SystemExit, self.cmd.take_action, parsed_args)
6364
+ self.assertRaises(
6365
+ exceptions.CommandError, self.cmd.take_action, parsed_args
6366
+ )
6355
6367
 
6356
6368
  mock_wait_for_status.assert_called_once_with(
6357
6369
  self.servers_mock.get,
@@ -6539,7 +6551,7 @@ class TestServerRebuild(TestServer):
6539
6551
  ('key_name', self.server.key_name),
6540
6552
  ]
6541
6553
  self.assertRaises(
6542
- utils.ParserException,
6554
+ test_utils.ParserException,
6543
6555
  self.check_parser,
6544
6556
  self.cmd,
6545
6557
  arglist,
@@ -6643,7 +6655,11 @@ class TestServerRebuild(TestServer):
6643
6655
  '--no-user-data',
6644
6656
  ]
6645
6657
  self.assertRaises(
6646
- utils.ParserException, self.check_parser, self.cmd, arglist, None
6658
+ test_utils.ParserException,
6659
+ self.check_parser,
6660
+ self.cmd,
6661
+ arglist,
6662
+ None,
6647
6663
  )
6648
6664
 
6649
6665
  def test_rebuild_with_trusted_image_cert(self):
@@ -7519,7 +7535,9 @@ class TestServerResize(TestServer):
7519
7535
  ]
7520
7536
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
7521
7537
 
7522
- self.assertRaises(SystemExit, self.cmd.take_action, parsed_args)
7538
+ self.assertRaises(
7539
+ exceptions.CommandError, self.cmd.take_action, parsed_args
7540
+ )
7523
7541
 
7524
7542
  self.servers_mock.get.assert_called_with(
7525
7543
  self.server.id,
@@ -7836,7 +7854,7 @@ class TestServerSet(TestServer):
7836
7854
  ('server', 'foo_vm'),
7837
7855
  ]
7838
7856
  self.assertRaises(
7839
- utils.ParserException,
7857
+ test_utils.ParserException,
7840
7858
  self.check_parser,
7841
7859
  self.cmd,
7842
7860
  arglist,
@@ -8149,20 +8167,24 @@ class TestServerShelve(TestServer):
8149
8167
  result = self.cmd.take_action(parsed_args)
8150
8168
  self.assertIsNone(result)
8151
8169
 
8152
- # two calls - one to retrieve the server state before shelving and
8153
- # another to do this before offloading
8154
- self.compute_sdk_client.find_server.assert_has_calls(
8155
- [
8156
- mock.call(self.server.name, ignore_missing=False),
8157
- mock.call(self.server.name, ignore_missing=False),
8158
- ]
8170
+ # one call to retrieve to retrieve the server state before shelving
8171
+ self.compute_sdk_client.find_server.assert_called_once_with(
8172
+ self.server.name,
8173
+ ignore_missing=False,
8174
+ )
8175
+ # one call to retrieve the server state before offloading
8176
+ self.compute_sdk_client.get_server.assert_called_once_with(
8177
+ self.server.id
8159
8178
  )
8179
+ # one call to shelve the server
8160
8180
  self.compute_sdk_client.shelve_server.assert_called_with(
8161
8181
  self.server.id
8162
8182
  )
8183
+ # one call to shelve offload the server
8163
8184
  self.compute_sdk_client.shelve_offload_server.assert_called_once_with(
8164
8185
  self.server.id,
8165
8186
  )
8187
+ # one call to wait for the shelve offload to complete
8166
8188
  mock_wait_for_status.assert_called_once_with(
8167
8189
  self.compute_sdk_client.get_server,
8168
8190
  self.server.id,
@@ -8185,7 +8207,7 @@ class TestServerShow(TestServer):
8185
8207
  'image': {'id': self.image.id},
8186
8208
  'flavor': {'id': self.flavor.id},
8187
8209
  'tenant_id': 'tenant-id-xxx',
8188
- 'networks': {'public': ['10.20.30.40', '2001:db8::f']},
8210
+ 'addresses': {'public': ['10.20.30.40', '2001:db8::f']},
8189
8211
  }
8190
8212
  self.compute_sdk_client.get_server_diagnostics.return_value = {
8191
8213
  'test': 'test'
@@ -8212,7 +8234,6 @@ class TestServerShow(TestServer):
8212
8234
  'id',
8213
8235
  'image',
8214
8236
  'name',
8215
- 'networks',
8216
8237
  'project_id',
8217
8238
  'properties',
8218
8239
  )
@@ -8221,12 +8242,11 @@ class TestServerShow(TestServer):
8221
8242
  server.PowerStateColumn(
8222
8243
  getattr(self.server, 'OS-EXT-STS:power_state')
8223
8244
  ),
8224
- format_columns.DictListColumn(self.server.networks),
8225
8245
  self.flavor.name + " (" + self.flavor.id + ")",
8226
8246
  self.server.id,
8227
8247
  self.image.name + " (" + self.image.id + ")",
8228
8248
  self.server.name,
8229
- {'public': ['10.20.30.40', '2001:db8::f']},
8249
+ server.AddressesColumn({'public': ['10.20.30.40', '2001:db8::f']}),
8230
8250
  'tenant-id-xxx',
8231
8251
  format_columns.DictColumn({}),
8232
8252
  )
@@ -8236,7 +8256,7 @@ class TestServerShow(TestServer):
8236
8256
  verifylist = []
8237
8257
 
8238
8258
  self.assertRaises(
8239
- utils.ParserException,
8259
+ test_utils.ParserException,
8240
8260
  self.check_parser,
8241
8261
  self.cmd,
8242
8262
  arglist,
@@ -8900,7 +8920,7 @@ class TestServerUnshelve(TestServer):
8900
8920
  ]
8901
8921
 
8902
8922
  ex = self.assertRaises(
8903
- utils.ParserException,
8923
+ test_utils.ParserException,
8904
8924
  self.check_parser,
8905
8925
  self.cmd,
8906
8926
  arglist,
@@ -9035,7 +9055,7 @@ class TestServerGeneral(TestServer):
9035
9055
  'image': {u'id': _image.id},
9036
9056
  'flavor': {u'id': _flavor.id},
9037
9057
  'tenant_id': u'tenant-id-xxx',
9038
- 'networks': {u'public': [u'10.20.30.40', u'2001:db8::f']},
9058
+ 'addresses': {u'public': [u'10.20.30.40', u'2001:db8::f']},
9039
9059
  'links': u'http://xxx.yyy.com',
9040
9060
  'properties': '',
9041
9061
  'volumes_attached': [{"id": "6344fe9d-ef20-45b2-91a6"}],
@@ -9055,7 +9075,7 @@ class TestServerGeneral(TestServer):
9055
9075
  ),
9056
9076
  'properties': '',
9057
9077
  'volumes_attached': [{"id": "6344fe9d-ef20-45b2-91a6"}],
9058
- 'addresses': format_columns.DictListColumn(_server.networks),
9078
+ 'addresses': format_columns.DictListColumn(_server.addresses),
9059
9079
  'project_id': 'tenant-id-xxx',
9060
9080
  }
9061
9081
 
@@ -9065,8 +9085,6 @@ class TestServerGeneral(TestServer):
9065
9085
  self.image_client,
9066
9086
  _server,
9067
9087
  )
9068
- # 'networks' is used to create _server. Remove it.
9069
- server_detail.pop('networks')
9070
9088
 
9071
9089
  # Check the results.
9072
9090
  self.assertCountEqual(info, server_detail)
@@ -63,6 +63,7 @@ class TestMappingCreate(TestMapping):
63
63
  self.mapping_mock.create.assert_called_with(
64
64
  mapping_id=identity_fakes.mapping_id,
65
65
  rules=identity_fakes.MAPPING_RULES,
66
+ schema_version=None,
66
67
  )
67
68
 
68
69
  collist = ('id', 'rules')
@@ -106,12 +107,12 @@ class TestMappingList(TestMapping):
106
107
  self.mapping_mock.list.return_value = [
107
108
  fakes.FakeResource(
108
109
  None,
109
- {'id': identity_fakes.mapping_id},
110
+ {'id': identity_fakes.mapping_id, 'schema_version': '1.0'},
110
111
  loaded=True,
111
112
  ),
112
113
  fakes.FakeResource(
113
114
  None,
114
- {'id': 'extra_mapping'},
115
+ {'id': 'extra_mapping', 'schema_version': '2.0'},
115
116
  loaded=True,
116
117
  ),
117
118
  ]
@@ -128,10 +129,13 @@ class TestMappingList(TestMapping):
128
129
 
129
130
  self.mapping_mock.list.assert_called_with()
130
131
 
131
- collist = ('ID',)
132
+ collist = ('ID', 'schema_version')
132
133
  self.assertEqual(collist, columns)
133
134
 
134
- datalist = [(identity_fakes.mapping_id,), ('extra_mapping',)]
135
+ datalist = [
136
+ (identity_fakes.mapping_id, '1.0'),
137
+ ('extra_mapping', '2.0'),
138
+ ]
135
139
  self.assertEqual(datalist, data)
136
140
 
137
141
 
@@ -173,6 +177,7 @@ class TestMappingSet(TestMapping):
173
177
  self.mapping_mock.update.assert_called_with(
174
178
  mapping=identity_fakes.mapping_id,
175
179
  rules=identity_fakes.MAPPING_RULES_2,
180
+ schema_version=None,
176
181
  )
177
182
 
178
183
  self.assertIsNone(result)
@@ -294,7 +294,6 @@ class TestTrustList(TestTrust):
294
294
  # containing the data to be listed.
295
295
  columns, data = self.cmd.take_action(parsed_args)
296
296
 
297
- print(self.trusts_mock.list.call_args_list)
298
297
  self.trusts_mock.list.assert_any_call(
299
298
  trustee_user=self.users_mock.get(),
300
299
  trustor_user=None,
@@ -335,7 +334,6 @@ class TestTrustList(TestTrust):
335
334
  # containing the data to be listed.
336
335
  columns, data = self.cmd.take_action(parsed_args)
337
336
 
338
- print(self.trusts_mock.list.call_args_list)
339
337
  self.trusts_mock.list.assert_any_call(
340
338
  trustor_user=self.users_mock.get(),
341
339
  trustee_user=None,
@@ -46,7 +46,7 @@ def create_one_image(attrs=None):
46
46
  """Create a fake image.
47
47
 
48
48
  :param Dictionary attrs:
49
- A dictionary with all attrbutes of image
49
+ A dictionary with all attributes of image
50
50
  :return:
51
51
  A FakeResource object with id, name, owner, protected,
52
52
  visibility and tags attrs
@@ -1093,6 +1093,66 @@ class TestRemoveProjectImage(TestImage):
1093
1093
  self.assertIsNone(result)
1094
1094
 
1095
1095
 
1096
+ class TestShowProjectImage(TestImage):
1097
+ _image = image_fakes.create_one_image()
1098
+ new_member = image_fakes.create_one_image_member(
1099
+ attrs={'image_id': _image.id, 'member_id': 'member1'}
1100
+ )
1101
+
1102
+ columns = (
1103
+ 'created_at',
1104
+ 'image_id',
1105
+ 'member_id',
1106
+ 'schema',
1107
+ 'status',
1108
+ 'updated_at',
1109
+ )
1110
+
1111
+ datalist = (
1112
+ new_member.created_at,
1113
+ _image.id,
1114
+ new_member.member_id,
1115
+ new_member.schema,
1116
+ new_member.status,
1117
+ new_member.updated_at,
1118
+ )
1119
+
1120
+ def setUp(self):
1121
+ super().setUp()
1122
+
1123
+ # This is the return value for utils.find_resource()
1124
+ self.image_client.find_image.return_value = self._image
1125
+
1126
+ self.image_client.get_member.return_value = self.new_member
1127
+ # Get the command object to test
1128
+ self.cmd = _image.ShowProjectImage(self.app, None)
1129
+
1130
+ def test_show_project_image(self):
1131
+ arglist = [
1132
+ self._image.id,
1133
+ 'member1',
1134
+ ]
1135
+ verifylist = [
1136
+ ('image', self._image.id),
1137
+ ('member', 'member1'),
1138
+ ]
1139
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1140
+
1141
+ columns, data = self.cmd.take_action(parsed_args)
1142
+
1143
+ self.image_client.find_image.assert_called_with(
1144
+ self._image.id, ignore_missing=False
1145
+ )
1146
+
1147
+ self.image_client.get_member.assert_called_with(
1148
+ member='member1',
1149
+ image=self._image.id,
1150
+ )
1151
+
1152
+ self.assertEqual(self.columns, columns)
1153
+ self.assertEqual(self.datalist, data)
1154
+
1155
+
1096
1156
  class TestImageSet(TestImage):
1097
1157
  project = identity_fakes.FakeProject.create_one_project()
1098
1158
  domain = identity_fakes.FakeDomain.create_one_domain()