Allow boot server with multiple nics
Trying to boot a server while specifying multiple --nic parameters leads to an error: Invalid nic argument. This patch fixes it. Change-Id: I662fd366df8e79db1966d45a9e090087dbace4b0 Closes-Bug: #1706597
This commit is contained in:
parent
aec93636f6
commit
0a3cf89c67
@ -695,6 +695,29 @@ class ShellTest(utils.TestCase):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_boot_with_multiple_nics(self):
|
||||||
|
cmd = ('boot --image %s --flavor 1 '
|
||||||
|
'--nic net-id=net_a,v4-fixed-ip=10.0.0.1 '
|
||||||
|
'--nic net-id=net_b some-server' %
|
||||||
|
FAKE_UUID_1)
|
||||||
|
self.run_command(cmd)
|
||||||
|
self.assert_called_anytime(
|
||||||
|
'POST', '/servers',
|
||||||
|
{
|
||||||
|
'server': {
|
||||||
|
'flavorRef': '1',
|
||||||
|
'name': 'some-server',
|
||||||
|
'imageRef': FAKE_UUID_1,
|
||||||
|
'min_count': 1,
|
||||||
|
'max_count': 1,
|
||||||
|
'networks': [
|
||||||
|
{'uuid': 'net_a', 'fixed_ip': '10.0.0.1'},
|
||||||
|
{'uuid': 'net_b'}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
def test_boot_nics_with_tag(self):
|
def test_boot_nics_with_tag(self):
|
||||||
cmd = ('boot --image %s --flavor 1 '
|
cmd = ('boot --image %s --flavor 1 '
|
||||||
'--nic net-id=a=c,v4-fixed-ip=10.0.0.1,tag=foo some-server' %
|
'--nic net-id=a=c,v4-fixed-ip=10.0.0.1,tag=foo some-server' %
|
||||||
|
@ -268,12 +268,11 @@ def _parse_nics(cs, args):
|
|||||||
supports_auto_alloc = cs.api_version >= api_versions.APIVersion('2.37')
|
supports_auto_alloc = cs.api_version >= api_versions.APIVersion('2.37')
|
||||||
supports_nic_tags = _supports_nic_tags(cs)
|
supports_nic_tags = _supports_nic_tags(cs)
|
||||||
|
|
||||||
nic_info = {"net-id": "", "v4-fixed-ip": "", "v6-fixed-ip": "",
|
nic_keys = {'net-id', 'v4-fixed-ip', 'v6-fixed-ip', 'port-id', 'net-name'}
|
||||||
"port-id": "", "net-name": ""}
|
|
||||||
|
|
||||||
if supports_auto_alloc and supports_nic_tags:
|
if supports_auto_alloc and supports_nic_tags:
|
||||||
# API version >= 2.42
|
# API version >= 2.42
|
||||||
nic_info.update({"tag": ""})
|
nic_keys.add('tag')
|
||||||
err_msg = (_("Invalid nic argument '%s'. Nic arguments must be of "
|
err_msg = (_("Invalid nic argument '%s'. Nic arguments must be of "
|
||||||
"the form --nic <auto,none,net-id=net-uuid,"
|
"the form --nic <auto,none,net-id=net-uuid,"
|
||||||
"net-name=network-name,v4-fixed-ip=ip-addr,"
|
"net-name=network-name,v4-fixed-ip=ip-addr,"
|
||||||
@ -292,7 +291,7 @@ def _parse_nics(cs, args):
|
|||||||
"be used with any other --nic value."))
|
"be used with any other --nic value."))
|
||||||
elif not supports_auto_alloc and supports_nic_tags:
|
elif not supports_auto_alloc and supports_nic_tags:
|
||||||
# 2.36 >= API version >= 2.32
|
# 2.36 >= API version >= 2.32
|
||||||
nic_info.update({"tag": ""})
|
nic_keys.add('tag')
|
||||||
err_msg = (_("Invalid nic argument '%s'. Nic arguments must be of "
|
err_msg = (_("Invalid nic argument '%s'. Nic arguments must be of "
|
||||||
"the form --nic <net-id=net-uuid,"
|
"the form --nic <net-id=net-uuid,"
|
||||||
"net-name=network-name,v4-fixed-ip=ip-addr,"
|
"net-name=network-name,v4-fixed-ip=ip-addr,"
|
||||||
@ -310,6 +309,7 @@ def _parse_nics(cs, args):
|
|||||||
auto_or_none = False
|
auto_or_none = False
|
||||||
nics = []
|
nics = []
|
||||||
for nic_str in args.nics:
|
for nic_str in args.nics:
|
||||||
|
nic_info = {}
|
||||||
nic_info_set = False
|
nic_info_set = False
|
||||||
for kv_str in nic_str.split(","):
|
for kv_str in nic_str.split(","):
|
||||||
if auto_or_none:
|
if auto_or_none:
|
||||||
@ -341,13 +341,13 @@ def _parse_nics(cs, args):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
raise exceptions.CommandError(err_msg % nic_str)
|
raise exceptions.CommandError(err_msg % nic_str)
|
||||||
|
|
||||||
if k in nic_info:
|
if k in nic_keys:
|
||||||
# if user has given a net-name resolve it to network ID
|
# if user has given a net-name resolve it to network ID
|
||||||
if k == 'net-name':
|
if k == 'net-name':
|
||||||
k = 'net-id'
|
k = 'net-id'
|
||||||
v = _find_network_id(cs, v)
|
v = _find_network_id(cs, v)
|
||||||
# if some argument was given multiple times
|
# if some argument was given multiple times
|
||||||
if nic_info[k]:
|
if k in nic_info:
|
||||||
raise exceptions.CommandError(err_msg % nic_str)
|
raise exceptions.CommandError(err_msg % nic_str)
|
||||||
nic_info[k] = v
|
nic_info[k] = v
|
||||||
nic_info_set = True
|
nic_info_set = True
|
||||||
@ -357,15 +357,15 @@ def _parse_nics(cs, args):
|
|||||||
if auto_or_none:
|
if auto_or_none:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if nic_info['v4-fixed-ip'] and not netutils.is_valid_ipv4(
|
if 'v4-fixed-ip' in nic_info and not netutils.is_valid_ipv4(
|
||||||
nic_info['v4-fixed-ip']):
|
nic_info['v4-fixed-ip']):
|
||||||
raise exceptions.CommandError(_("Invalid ipv4 address."))
|
raise exceptions.CommandError(_("Invalid ipv4 address."))
|
||||||
|
|
||||||
if nic_info['v6-fixed-ip'] and not netutils.is_valid_ipv6(
|
if 'v6-fixed-ip' in nic_info and not netutils.is_valid_ipv6(
|
||||||
nic_info['v6-fixed-ip']):
|
nic_info['v6-fixed-ip']):
|
||||||
raise exceptions.CommandError(_("Invalid ipv6 address."))
|
raise exceptions.CommandError(_("Invalid ipv6 address."))
|
||||||
|
|
||||||
if bool(nic_info['net-id']) == bool(nic_info['port-id']):
|
if bool(nic_info.get('net-id')) == bool(nic_info.get('port-id')):
|
||||||
raise exceptions.CommandError(err_msg % nic_str)
|
raise exceptions.CommandError(err_msg % nic_str)
|
||||||
|
|
||||||
nics.append(nic_info)
|
nics.append(nic_info)
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- Fix an ability to boot server with multiple nics which was broken with
|
||||||
|
microversion 2.42 (fix tag attribute disappearing).
|
Loading…
Reference in New Issue
Block a user