diff options
author | eb3095 <45504889+eb3095@users.noreply.github.com> | 2022-02-14 12:00:12 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-14 11:00:12 -0600 |
commit | 470b4a574514cf87f90682ac2bdd71b5fbbe6139 (patch) | |
tree | fd22db578fca02c3fac2b3810ba815a6f1d73833 /cloudinit/sources | |
parent | 17818549b3dda58a907ef44ed7de9f837ad66c3c (diff) | |
download | vyos-cloud-init-470b4a574514cf87f90682ac2bdd71b5fbbe6139.tar.gz vyos-cloud-init-470b4a574514cf87f90682ac2bdd71b5fbbe6139.zip |
Fix extra ipv6 issues, code reduction and simplification (#1243)
Eliminated the duplicate code and now run the entire configuration
routine against both public and private interfaces.
Also addressed an inconsistency from our metadata api for ipv6
address configuration.
Diffstat (limited to 'cloudinit/sources')
-rw-r--r-- | cloudinit/sources/helpers/vultr.py | 127 |
1 files changed, 32 insertions, 95 deletions
diff --git a/cloudinit/sources/helpers/vultr.py b/cloudinit/sources/helpers/vultr.py index 190a5640..88a21034 100644 --- a/cloudinit/sources/helpers/vultr.py +++ b/cloudinit/sources/helpers/vultr.py @@ -7,7 +7,7 @@ from functools import lru_cache from cloudinit import dmi from cloudinit import log as log -from cloudinit import net, netinfo, subp, url_helper, util +from cloudinit import net, subp, url_helper, util from cloudinit.net.dhcp import EphemeralDHCPv4, NoDHCPLeaseError # Get LOG @@ -30,9 +30,6 @@ def get_metadata(url, timeout, retries, sec_between, agent): with EphemeralDHCPv4( iface=iface[0], connectivity_url_data={"url": url} ): - # Set metadata route - set_route(iface[0]) - # Fetch the metadata v1 = read_metadata(url, timeout, retries, sec_between, agent) @@ -43,49 +40,6 @@ def get_metadata(url, timeout, retries, sec_between, agent): raise exception -# Set route for metadata -def set_route(iface): - # Get routes, confirm entry does not exist - routes = netinfo.route_info() - - # If no tools exist and empty dict is returned - if "ipv4" not in routes: - return - - # We only care about IPv4 - routes = routes["ipv4"] - - # Searchable list - dests = [] - - # Parse each route into a more searchable format - for route in routes: - dests.append(route["destination"]) - - gw_present = "100.64.0.0" in dests or "100.64.0.0/10" in dests - dest_present = "169.254.169.254" in dests - - # If not IPv6 only (No link local) - # or the route is already present - if not gw_present or dest_present: - return - - # Set metadata route - if subp.which("ip"): - subp.subp( - [ - "ip", - "route", - "add", - "169.254.169.254/32", - "dev", - iface, - ] - ) - elif subp.which("route"): - subp.subp(["route", "add", "-net", "169.254.169.254/32", "100.64.0.1"]) - - # Read the system information from SMBIOS def get_sysinfo(): return { @@ -165,19 +119,18 @@ def generate_network_config(interfaces): # Prepare interface 0, public if len(interfaces) > 0: - public = generate_public_network_interface(interfaces[0]) + public = generate_interface(interfaces[0], primary=True) network["config"].append(public) # Prepare additional interfaces, private for i in range(1, len(interfaces)): - private = generate_private_network_interface(interfaces[i]) + private = generate_interface(interfaces[i]) network["config"].append(private) return network -# Input Metadata and generate public network config part -def generate_public_network_interface(interface): +def generate_interface(interface, primary=False): interface_name = get_interface_name(interface["mac"]) if not interface_name: raise RuntimeError( @@ -188,13 +141,33 @@ def generate_public_network_interface(interface): "name": interface_name, "type": "physical", "mac_address": interface["mac"], - "accept-ra": 1, - "subnets": [ + } + + if primary: + netcfg["accept-ra"] = 1 + netcfg["subnets"] = [ {"type": "dhcp", "control": "auto"}, {"type": "ipv6_slaac", "control": "auto"}, - ], - } + ] + + if not primary: + netcfg["subnets"] = [ + { + "type": "static", + "control": "auto", + "address": interface["ipv4"]["address"], + "netmask": interface["ipv4"]["netmask"], + } + ] + generate_interface_routes(interface, netcfg) + generate_interface_additional_addresses(interface, netcfg) + + # Add config to template + return netcfg + + +def generate_interface_routes(interface, netcfg): # Options that may or may not be used if "mtu" in interface: netcfg["mtu"] = interface["mtu"] @@ -205,6 +178,8 @@ def generate_public_network_interface(interface): if "routes" in interface: netcfg["subnets"][0]["routes"] = interface["routes"] + +def generate_interface_additional_addresses(interface, netcfg): # Check for additional IP's additional_count = len(interface["ipv4"]["additional"]) if "ipv4" in interface and additional_count > 0: @@ -228,8 +203,8 @@ def generate_public_network_interface(interface): add = { "type": "static6", "control": "auto", - "address": additional["address"], - "netmask": additional["netmask"], + "address": "%s/%s" + % (additional["network"], additional["prefix"]), } if "routes" in additional: @@ -237,44 +212,6 @@ def generate_public_network_interface(interface): netcfg["subnets"].append(add) - # Add config to template - return netcfg - - -# Input Metadata and generate private network config part -def generate_private_network_interface(interface): - interface_name = get_interface_name(interface["mac"]) - if not interface_name: - raise RuntimeError( - "Interface: %s could not be found on the system" % interface["mac"] - ) - - netcfg = { - "name": interface_name, - "type": "physical", - "mac_address": interface["mac"], - "subnets": [ - { - "type": "static", - "control": "auto", - "address": interface["ipv4"]["address"], - "netmask": interface["ipv4"]["netmask"], - } - ], - } - - # Options that may or may not be used - if "mtu" in interface: - netcfg["mtu"] = interface["mtu"] - - if "accept-ra" in interface: - netcfg["accept-ra"] = interface["accept-ra"] - - if "routes" in interface: - netcfg["subnets"][0]["routes"] = interface["routes"] - - return netcfg - # Make required adjustments to the network configs provided def add_interface_names(interfaces): |