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.
- openstackclient/common/availability_zone.py +4 -4
- openstackclient/compute/v2/server.py +173 -99
- openstackclient/identity/v3/mapping.py +25 -3
- openstackclient/identity/v3/policy.py +3 -1
- openstackclient/image/v2/image.py +37 -0
- openstackclient/image/v2/metadef_namespaces.py +25 -21
- openstackclient/image/v2/metadef_objects.py +26 -30
- openstackclient/image/v2/metadef_properties.py +60 -38
- openstackclient/network/v2/default_security_group_rule.py +23 -4
- openstackclient/network/v2/local_ip_association.py +1 -1
- openstackclient/network/v2/ndp_proxy.py +7 -3
- openstackclient/network/v2/network.py +2 -2
- openstackclient/network/v2/port.py +23 -7
- openstackclient/network/v2/subnet.py +1 -0
- openstackclient/tests/functional/base.py +7 -4
- openstackclient/tests/unit/compute/v2/test_server.py +72 -54
- openstackclient/tests/unit/identity/v3/test_mappings.py +9 -4
- openstackclient/tests/unit/identity/v3/test_trust.py +0 -2
- openstackclient/tests/unit/image/v1/fakes.py +1 -1
- openstackclient/tests/unit/image/v2/test_image.py +60 -0
- openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +5 -19
- openstackclient/tests/unit/integ/cli/test_shell.py +0 -2
- openstackclient/tests/unit/network/v2/fakes.py +1 -0
- openstackclient/tests/unit/network/v2/test_network.py +33 -0
- openstackclient/tests/unit/network/v2/test_network_trunk.py +6 -8
- openstackclient/tests/unit/network/v2/test_port.py +60 -18
- openstackclient/tests/unit/network/v2/test_subnet.py +92 -0
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +11 -13
- openstackclient/tests/unit/test_shell.py +1 -7
- openstackclient/tests/unit/utils.py +8 -1
- openstackclient/tests/unit/volume/v1/test_volume.py +4 -6
- openstackclient/tests/unit/volume/v2/test_volume.py +4 -6
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +3 -5
- openstackclient/volume/v2/volume_type.py +3 -3
- {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/AUTHORS +4 -0
- {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/METADATA +3 -1
- {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/RECORD +42 -43
- {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/entry_points.txt +6 -5
- python_openstackclient-6.5.0.dist-info/pbr.json +1 -0
- openstackclient/tests/unit/common/test_parseractions.py +0 -233
- python_openstackclient-6.4.0.dist-info/pbr.json +0 -1
- {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-6.4.0.dist-info → python_openstackclient-6.5.0.dist-info}/WHEEL +0 -0
- {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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
('
|
|
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
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
#
|
|
8153
|
-
|
|
8154
|
-
|
|
8155
|
-
|
|
8156
|
-
|
|
8157
|
-
|
|
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
|
-
'
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
'
|
|
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.
|
|
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 = [
|
|
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
|
|
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()
|