Merge "nocloud: fix network config regression"

This commit is contained in:
Zuul 2024-06-26 09:33:35 +00:00 committed by Gerrit Code Review
commit 529105eac6
2 changed files with 143 additions and 117 deletions
cloudbaseinit
metadata/services
tests/metadata/services

@ -237,10 +237,11 @@ class NoCloudNetworkConfigV1Parser(object):
networks = []
services = []
network_config = network_config.get('network') \
if network_config else {}
network_config = network_config.get('config') \
if network_config else None
if network_config and network_config.get('network'):
network_config = network_config.get('network')
if network_config:
network_config = network_config.get('config')
if not network_config:
LOG.warning("Network configuration is empty")
return
@ -479,8 +480,9 @@ class NoCloudNetworkConfigV2Parser(object):
networks = []
services = []
network_config = network_config.get('network') \
if network_config else {}
if network_config and network_config.get('network'):
network_config = network_config.get('network')
if not network_config:
LOG.warning("Network configuration is empty")
return
@ -529,12 +531,21 @@ class NoCloudNetworkConfigParser(object):
@staticmethod
def parse(network_data):
network_data_version = network_data.get("network", {}).get("version")
# we can have a network key in some cases
if network_data.get("network"):
network_data = network_data.get("network")
network_data_version = network_data.get("version")
if network_data_version == 1:
network_config_parser = NoCloudNetworkConfigV1Parser()
return network_config_parser.parse(network_data)
elif network_data_version == 2:
network_config_parser = NoCloudNetworkConfigV2Parser()
else:
raise exception.CloudbaseInitException(
"Unsupported network_data_version: '%s'"
% network_data_version)
return NoCloudNetworkConfigV2Parser().parse(network_data)
return network_config_parser.parse(network_data)
class NoCloudConfigDriveService(baseconfigdrive.BaseConfigDriveService):

@ -15,6 +15,7 @@
import ddt
import importlib
import os
import textwrap
import unittest
import unittest.mock as mock
@ -48,55 +49,57 @@ network:
config:
- type: router
"""
NOCLOUD_NETWORK_CONFIG_TEST_DATA_V1 = """
network:
version: 1
config:
- type: physical
name: interface0
mac_address: "52:54:00:12:34:00"
mtu: 1450
subnets:
- type: static
address: 192.168.1.10
netmask: 255.255.255.0
gateway: 192.168.1.1
dns_nameservers:
- 192.168.1.11
- type: bond
name: bond0
bond_interfaces:
- gbe0
- gbe1
mac_address: "52:54:00:12:34:00"
params:
bond-mode: active-backup
bond-lacp-rate: false
mtu: 1450
subnets:
- type: static
address: 192.168.1.10
netmask: 255.255.255.0
dns_nameservers:
- 192.168.1.11
- type: vlan
name: vlan0
vlan_link: eth1
vlan_id: 150
mac_address: "52:54:00:12:34:00"
mtu: 1450
subnets:
- type: static
address: 192.168.1.10
netmask: 255.255.255.0
dns_nameservers:
- 192.168.1.11
- type: nameserver
address:
- 192.168.23.2
- 8.8.8.8
search: acme.local
NOCLOUD_NETWORK_CONFIG_TEST_DATA_V1_LEGACY = """
version: 1
config:
- type: physical
name: interface0
mac_address: "52:54:00:12:34:00"
mtu: 1450
subnets:
- type: static
address: 192.168.1.10
netmask: 255.255.255.0
gateway: 192.168.1.1
dns_nameservers:
- 192.168.1.11
- type: bond
name: bond0
bond_interfaces:
- gbe0
- gbe1
mac_address: "52:54:00:12:34:00"
params:
bond-mode: active-backup
bond-lacp-rate: false
mtu: 1450
subnets:
- type: static
address: 192.168.1.10
netmask: 255.255.255.0
dns_nameservers:
- 192.168.1.11
- type: vlan
name: vlan0
vlan_link: eth1
vlan_id: 150
mac_address: "52:54:00:12:34:00"
mtu: 1450
subnets:
- type: static
address: 192.168.1.10
netmask: 255.255.255.0
dns_nameservers:
- 192.168.1.11
- type: nameserver
address:
- 192.168.23.2
- 8.8.8.8
search: acme.local
"""
NOCLOUD_NETWORK_CONFIG_TEST_DATA_V1 = """
network:%s
""" % (textwrap.indent(NOCLOUD_NETWORK_CONFIG_TEST_DATA_V1_LEGACY, " "))
NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2_EMPTY_CONFIG = """
"""
NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2_CONFIG_IS_NOT_DICT = """
@ -116,67 +119,69 @@ network:
eth0:
- test
"""
NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2 = """
network:
version: 2
ethernets:
interface0:
match:
macaddress: "52:54:00:12:34:00"
set-name: "eth0"
NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2_LEGACY = """
version: 2
ethernets:
interface0:
match:
macaddress: "52:54:00:12:34:00"
set-name: "eth0"
addresses:
- 192.168.1.10/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 192.168.1.10/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 192.168.1.11
- 192.168.1.12
search:
- acme.local
mtu: 1450
interface1:
set-name: "interface1"
- 192.168.1.11
- 192.168.1.12
search:
- acme.local
mtu: 1450
interface1:
set-name: "interface1"
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 192.168.1.11
- 192.168.1.12
search:
- acme.local
bonds:
bond0:
interfaces: ["gbe0", "gbe1"]
match:
macaddress: "52:54:00:12:34:00"
parameters:
mode: active-backup
lacp-rate: false
- 192.168.1.11
- 192.168.1.12
search:
- acme.local
bonds:
bond0:
interfaces: ["gbe0", "gbe1"]
match:
macaddress: "52:54:00:12:34:00"
parameters:
mode: active-backup
lacp-rate: false
addresses:
- 192.168.1.10/24
nameservers:
addresses:
- 192.168.1.10/24
nameservers:
addresses:
- 192.168.1.11
mtu: 1450
vlans:
vlan0:
id: 150
link: eth1
dhcp4: yes
match:
macaddress: "52:54:00:12:34:00"
- 192.168.1.11
mtu: 1450
vlans:
vlan0:
id: 150
link: eth1
dhcp4: yes
match:
macaddress: "52:54:00:12:34:00"
addresses:
- 192.168.1.10/24
nameservers:
addresses:
- 192.168.1.10/24
nameservers:
addresses:
- 192.168.1.11
mtu: 1450
bridges:
br0:
interfaces: ['eth0']
dhcp4: true
- 192.168.1.11
mtu: 1450
bridges:
br0:
interfaces: ['eth0']
dhcp4: true
"""
NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2 = """
network:%s
""" % (textwrap.indent(NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2_LEGACY, " "))
@ddt.ddt
@ -207,7 +212,12 @@ class TestNoCloudNetworkConfigV1Parser(unittest.TestCase):
self.assertEqual(True, expected_result[0] in self.snatcher.output[0])
self.assertEqual(result, expected_result[1])
def test_network_details_v2(self):
@ddt.data(
(NOCLOUD_NETWORK_CONFIG_TEST_DATA_V1, True),
(NOCLOUD_NETWORK_CONFIG_TEST_DATA_V1_LEGACY, True)
)
@ddt.unpack
def test_network_details_v2(self, test_data, expected_result):
expected_bond = nm.Bond(
members=["gbe0", "gbe1"],
type=nm.BOND_TYPE_ACTIVE_BACKUP,
@ -275,7 +285,7 @@ class TestNoCloudNetworkConfigV1Parser(unittest.TestCase):
search='acme.local')
result = self._parser.parse(
serialization.parse_json_yaml(NOCLOUD_NETWORK_CONFIG_TEST_DATA_V1))
serialization.parse_json_yaml(test_data))
self.assertEqual(result.links[0], expected_link)
self.assertEqual(result.networks[0], expected_network)
@ -318,7 +328,12 @@ class TestNoCloudNetworkConfigV2Parser(unittest.TestCase):
self.assertEqual(True, expected_result[0] in self.snatcher.output[0])
self.assertEqual(result, expected_result[1])
def test_network_details_v2(self):
@ddt.data(
(NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2, True),
(NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2_LEGACY, True)
)
@ddt.unpack
def test_network_details_v2(self, test_data, expected_result):
expected_bond = nm.Bond(
members=["gbe0", "gbe1"],
type=nm.BOND_TYPE_ACTIVE_BACKUP,
@ -406,7 +421,7 @@ class TestNoCloudNetworkConfigV2Parser(unittest.TestCase):
search='acme.local')
result = self._parser.parse(
serialization.parse_json_yaml(NOCLOUD_NETWORK_CONFIG_TEST_DATA_V2))
serialization.parse_json_yaml(test_data))
self.assertEqual(result.links[0], expected_link)
self.assertEqual(result.links[1], expected_link_if1)