Skip to content

Commit e8a5069

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "compute: Add support for 'server boot --nic ...,tag=<tag>'"
2 parents af18b51 + 9ed34aa commit e8a5069

3 files changed

Lines changed: 133 additions & 4 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,8 @@ def __call__(self, parser, namespace, values, option_string=None):
646646

647647
values = '='.join([self.key, values])
648648

649+
# We don't include 'tag' here by default since that requires a
650+
# particular microversion
649651
info = {
650652
'net-id': '',
651653
'port-id': '',
@@ -656,11 +658,11 @@ def __call__(self, parser, namespace, values, option_string=None):
656658
for kv_str in values.split(','):
657659
k, sep, v = kv_str.partition("=")
658660

659-
if k not in info or not v:
661+
if k not in list(info) + ['tag'] or not v:
660662
msg = _(
661663
"Invalid argument %s; argument must be of form "
662-
"'net-id=net-uuid,v4-fixed-ip=ip-addr,v6-fixed-ip=ip-addr,"
663-
"port-id=port-uuid'"
664+
"'net-id=net-uuid,port-id=port-uuid,v4-fixed-ip=ip-addr,"
665+
"v6-fixed-ip=ip-addr,tag=tag'"
664666
)
665667
raise argparse.ArgumentTypeError(msg % values)
666668

@@ -801,7 +803,7 @@ def get_parser(self, prog_name):
801803
parser.add_argument(
802804
'--nic',
803805
metavar="<net-id=net-uuid,port-id=port-uuid,v4-fixed-ip=ip-addr,"
804-
"v6-fixed-ip=ip-addr,auto,none>",
806+
"v6-fixed-ip=ip-addr,tag=tag,auto,none>",
805807
action=NICAction,
806808
dest='nics',
807809
default=[],
@@ -814,6 +816,8 @@ def get_parser(self, prog_name):
814816
"\n"
815817
"v6-fixed-ip=<ip-addr>: IPv6 fixed address for NIC (optional),"
816818
"\n"
819+
"tag: interface metadata tag (optional) "
820+
"(supported by --os-compute-api-version 2.43 or above),\n"
817821
"none: (v2.37+) no network is attached,\n"
818822
"auto: (v2.37+) the compute service will automatically "
819823
"allocate a network.\n"
@@ -1191,6 +1195,17 @@ def _match_image(image_api, wanted_properties):
11911195
nics = nics[0]
11921196
else:
11931197
for nic in nics:
1198+
if 'tag' in nic:
1199+
if (
1200+
compute_client.api_version <
1201+
api_versions.APIVersion('2.43')
1202+
):
1203+
msg = _(
1204+
'--os-compute-api-version 2.43 or greater is '
1205+
'required to support the --nic tag field'
1206+
)
1207+
raise exceptions.CommandError(msg)
1208+
11941209
if self.app.client_manager.is_network_endpoint_enabled():
11951210
network_client = self.app.client_manager.network
11961211

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,113 @@ def test_server_create_with_network(self):
14231423
self.assertEqual(self.columns, columns)
14241424
self.assertEqual(self.datalist(), data)
14251425

1426+
def test_server_create_with_network_tag(self):
1427+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
1428+
'2.43')
1429+
1430+
arglist = [
1431+
'--image', 'image1',
1432+
'--flavor', 'flavor1',
1433+
'--nic', 'net-id=net1,tag=foo',
1434+
self.new_server.name,
1435+
]
1436+
verifylist = [
1437+
('image', 'image1'),
1438+
('flavor', 'flavor1'),
1439+
('nics', [
1440+
{
1441+
'net-id': 'net1', 'port-id': '',
1442+
'v4-fixed-ip': '', 'v6-fixed-ip': '',
1443+
'tag': 'foo',
1444+
},
1445+
]),
1446+
('server_name', self.new_server.name),
1447+
]
1448+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1449+
1450+
find_network = mock.Mock()
1451+
network_client = self.app.client_manager.network
1452+
network_client.find_network = find_network
1453+
network_resource = mock.Mock(id='net1_uuid')
1454+
find_network.return_value = network_resource
1455+
1456+
# Mock sdk APIs.
1457+
_network = mock.Mock(id='net1_uuid')
1458+
find_network = mock.Mock()
1459+
find_network.return_value = _network
1460+
self.app.client_manager.network.find_network = find_network
1461+
1462+
# In base command class ShowOne in cliff, abstract method take_action()
1463+
# returns a two-part tuple with a tuple of column names and a tuple of
1464+
# data to be shown.
1465+
columns, data = self.cmd.take_action(parsed_args)
1466+
1467+
# Set expected values
1468+
kwargs = dict(
1469+
meta=None,
1470+
files={},
1471+
reservation_id=None,
1472+
min_count=1,
1473+
max_count=1,
1474+
security_groups=[],
1475+
userdata=None,
1476+
key_name=None,
1477+
availability_zone=None,
1478+
admin_pass=None,
1479+
block_device_mapping_v2=[],
1480+
nics=[
1481+
{
1482+
'net-id': 'net1_uuid',
1483+
'v4-fixed-ip': '',
1484+
'v6-fixed-ip': '',
1485+
'port-id': '',
1486+
'tag': 'foo',
1487+
},
1488+
],
1489+
scheduler_hints={},
1490+
config_drive=None,
1491+
)
1492+
# ServerManager.create(name, image, flavor, **kwargs)
1493+
self.servers_mock.create.assert_called_with(
1494+
self.new_server.name,
1495+
self.image,
1496+
self.flavor,
1497+
**kwargs
1498+
)
1499+
1500+
self.assertEqual(self.columns, columns)
1501+
self.assertEqual(self.datalist(), data)
1502+
1503+
network_client.find_network.assert_called_once()
1504+
self.app.client_manager.network.find_network.assert_called_once()
1505+
1506+
def test_server_create_with_network_tag_pre_v243(self):
1507+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
1508+
'2.42')
1509+
1510+
arglist = [
1511+
'--image', 'image1',
1512+
'--flavor', 'flavor1',
1513+
'--nic', 'net-id=net1,tag=foo',
1514+
self.new_server.name,
1515+
]
1516+
verifylist = [
1517+
('image', 'image1'),
1518+
('flavor', 'flavor1'),
1519+
('nics', [
1520+
{
1521+
'net-id': 'net1', 'port-id': '',
1522+
'v4-fixed-ip': '', 'v6-fixed-ip': '',
1523+
'tag': 'foo',
1524+
},
1525+
]),
1526+
('server_name', self.new_server.name),
1527+
]
1528+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1529+
1530+
self.assertRaises(
1531+
exceptions.CommandError, self.cmd.take_action, parsed_args)
1532+
14261533
def test_server_create_with_auto_network(self):
14271534
arglist = [
14281535
'--image', 'image1',
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
features:
3+
- |
4+
The ``--nic`` option of the ``server create`` command now supports an
5+
optional ``tag=<tag>`` key-value pair. This can be used to set a tag for
6+
the interface in server metadata, which can be useful to maintain
7+
persistent references to interfaces during various operations.

0 commit comments

Comments
 (0)