diff options
Diffstat (limited to 'cloudinit/sources/helpers/vultr.py')
-rw-r--r-- | cloudinit/sources/helpers/vultr.py | 172 |
1 files changed, 76 insertions, 96 deletions
diff --git a/cloudinit/sources/helpers/vultr.py b/cloudinit/sources/helpers/vultr.py index ad347bea..eb504eba 100644 --- a/cloudinit/sources/helpers/vultr.py +++ b/cloudinit/sources/helpers/vultr.py @@ -3,16 +3,12 @@ # This file is part of cloud-init. See LICENSE file for license information. import json +from functools import lru_cache -from cloudinit import log as log -from cloudinit import url_helper from cloudinit import dmi -from cloudinit import util -from cloudinit import net -from cloudinit import netinfo -from cloudinit import subp +from cloudinit import log as log +from cloudinit import net, netinfo, subp, url_helper, util from cloudinit.net.dhcp import EphemeralDHCPv4, NoDHCPLeaseError -from functools import lru_cache # Get LOG LOG = log.getLogger(__name__) @@ -41,21 +37,21 @@ def set_route(): routes = netinfo.route_info() # If no tools exist and empty dict is returned - if 'ipv4' not in routes: + if "ipv4" not in routes: return # We only care about IPv4 - routes = routes['ipv4'] + routes = routes["ipv4"] # Searchable list dests = [] # Parse each route into a more searchable format for route in routes: - dests.append(route['destination']) + 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 + 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 @@ -63,36 +59,32 @@ def set_route(): return # Set metadata route - if subp.which('ip'): - subp.subp([ - 'ip', - 'route', - 'add', - '169.254.169.254/32', - 'dev', - net.find_fallback_nic() - ]) - elif subp.which('route'): - subp.subp([ - 'route', - 'add', - '-net', - '169.254.169.254/32', - '100.64.0.1' - ]) + if subp.which("ip"): + subp.subp( + [ + "ip", + "route", + "add", + "169.254.169.254/32", + "dev", + net.find_fallback_nic(), + ] + ) + 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 { - 'manufacturer': dmi.read_dmi_data("system-manufacturer"), - 'subid': dmi.read_dmi_data("system-serial-number") + "manufacturer": dmi.read_dmi_data("system-manufacturer"), + "subid": dmi.read_dmi_data("system-serial-number"), } # Assumes is Vultr is already checked def is_baremetal(): - if get_sysinfo()['manufacturer'] != "Vultr": + if get_sysinfo()["manufacturer"] != "Vultr": return True return False @@ -102,7 +94,7 @@ def is_vultr(): # VC2, VDC, and HFC use DMI sysinfo = get_sysinfo() - if sysinfo['manufacturer'] == "Vultr": + if sysinfo["manufacturer"] == "Vultr": return True # Baremetal requires a kernel parameter @@ -118,20 +110,20 @@ def read_metadata(url, timeout, retries, sec_between, agent): # Announce os details so we can handle non Vultr origin # images and provide correct vendordata generation. - headers = { - 'Metadata-Token': 'cloudinit', - 'User-Agent': agent - } + headers = {"Metadata-Token": "cloudinit", "User-Agent": agent} - response = url_helper.readurl(url, - timeout=timeout, - retries=retries, - headers=headers, - sec_between=sec_between) + response = url_helper.readurl( + url, + timeout=timeout, + retries=retries, + headers=headers, + sec_between=sec_between, + ) if not response.ok(): - raise RuntimeError("Failed to connect to %s: Code: %s" % - url, response.code) + raise RuntimeError( + "Failed to connect to %s: Code: %s" % url, response.code + ) return response.contents.decode() @@ -156,95 +148,82 @@ def get_interface_name(mac): def generate_network_config(interfaces): network = { "version": 1, - "config": [ - { - "type": "nameserver", - "address": [ - "108.61.10.10" - ] - } - ] + "config": [{"type": "nameserver", "address": ["108.61.10.10"]}], } # Prepare interface 0, public if len(interfaces) > 0: public = generate_public_network_interface(interfaces[0]) - network['config'].append(public) + network["config"].append(public) # Prepare additional interfaces, private for i in range(1, len(interfaces)): private = generate_private_network_interface(interfaces[i]) - network['config'].append(private) + network["config"].append(private) return network # Input Metadata and generate public network config part def generate_public_network_interface(interface): - interface_name = get_interface_name(interface['mac']) + interface_name = get_interface_name(interface["mac"]) if not interface_name: raise RuntimeError( - "Interface: %s could not be found on the system" % - interface['mac']) + "Interface: %s could not be found on the system" % interface["mac"] + ) netcfg = { "name": interface_name, "type": "physical", - "mac_address": interface['mac'], + "mac_address": interface["mac"], "accept-ra": 1, "subnets": [ - { - "type": "dhcp", - "control": "auto" - }, - { - "type": "ipv6_slaac", - "control": "auto" - }, - ] + {"type": "dhcp", "control": "auto"}, + {"type": "ipv6_slaac", "control": "auto"}, + ], } # Options that may or may not be used if "mtu" in interface: - netcfg['mtu'] = interface['mtu'] + netcfg["mtu"] = interface["mtu"] if "accept-ra" in interface: - netcfg['accept-ra'] = interface['accept-ra'] + netcfg["accept-ra"] = interface["accept-ra"] if "routes" in interface: - netcfg['subnets'][0]['routes'] = interface['routes'] + netcfg["subnets"][0]["routes"] = interface["routes"] # Check for additional IP's - additional_count = len(interface['ipv4']['additional']) + additional_count = len(interface["ipv4"]["additional"]) if "ipv4" in interface and additional_count > 0: - for additional in interface['ipv4']['additional']: + for additional in interface["ipv4"]["additional"]: add = { "type": "static", "control": "auto", - "address": additional['address'], - "netmask": additional['netmask'] + "address": additional["address"], + "netmask": additional["netmask"], } if "routes" in additional: - add['routes'] = additional['routes'] + add["routes"] = additional["routes"] - netcfg['subnets'].append(add) + netcfg["subnets"].append(add) # Check for additional IPv6's - additional_count = len(interface['ipv6']['additional']) + additional_count = len(interface["ipv6"]["additional"]) if "ipv6" in interface and additional_count > 0: - for additional in interface['ipv6']['additional']: + for additional in interface["ipv6"]["additional"]: add = { "type": "static6", "control": "auto", - "address": additional['address'], - "netmask": additional['netmask'] + "address": additional["address"], + "netmask": additional["netmask"], } if "routes" in additional: - add['routes'] = additional['routes'] + add["routes"] = additional["routes"] - netcfg['subnets'].append(add) + netcfg["subnets"].append(add) # Add config to template return netcfg @@ -252,35 +231,35 @@ def generate_public_network_interface(interface): # Input Metadata and generate private network config part def generate_private_network_interface(interface): - interface_name = get_interface_name(interface['mac']) + interface_name = get_interface_name(interface["mac"]) if not interface_name: raise RuntimeError( - "Interface: %s could not be found on the system" % - interface['mac']) + "Interface: %s could not be found on the system" % interface["mac"] + ) netcfg = { "name": interface_name, "type": "physical", - "mac_address": interface['mac'], + "mac_address": interface["mac"], "subnets": [ { "type": "static", "control": "auto", - "address": interface['ipv4']['address'], - "netmask": interface['ipv4']['netmask'] + "address": interface["ipv4"]["address"], + "netmask": interface["ipv4"]["netmask"], } - ] + ], } # Options that may or may not be used if "mtu" in interface: - netcfg['mtu'] = interface['mtu'] + netcfg["mtu"] = interface["mtu"] if "accept-ra" in interface: - netcfg['accept-ra'] = interface['accept-ra'] + netcfg["accept-ra"] = interface["accept-ra"] if "routes" in interface: - netcfg['subnets'][0]['routes'] = interface['routes'] + netcfg["subnets"][0]["routes"] = interface["routes"] return netcfg @@ -288,12 +267,13 @@ def generate_private_network_interface(interface): # Make required adjustments to the network configs provided def add_interface_names(interfaces): for interface in interfaces: - interface_name = get_interface_name(interface['mac']) + interface_name = get_interface_name(interface["mac"]) if not interface_name: raise RuntimeError( - "Interface: %s could not be found on the system" % - interface['mac']) - interface['name'] = interface_name + "Interface: %s could not be found on the system" + % interface["mac"] + ) + interface["name"] = interface_name return interfaces |