summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
Diffstat (limited to 'cloudinit')
-rw-r--r--cloudinit/config/cc_vyos.py92
-rw-r--r--cloudinit/sources/DataSourceOVF.py3
2 files changed, 54 insertions, 41 deletions
diff --git a/cloudinit/config/cc_vyos.py b/cloudinit/config/cc_vyos.py
index a6e06e34..dd7e5415 100644
--- a/cloudinit/config/cc_vyos.py
+++ b/cloudinit/config/cc_vyos.py
@@ -30,6 +30,7 @@ from cloudinit.distros import ug_util
from cloudinit.settings import PER_INSTANCE
from cloudinit.sources import INSTANCE_JSON_FILE
from cloudinit.util import load_file, load_json
+from cloudinit.sources.DataSourceOVF import get_properties as ovf_get_properties
from vyos.configtree import ConfigTree
# configure logging
@@ -106,52 +107,66 @@ def hostname_filter(hostname):
# configure system parameters from OVF template
-def set_config_ovf(config, metadata):
+def set_config_ovf(config, ovf_environment):
logger.debug("Applying configuration from an OVF template")
- ip_0 = metadata['ip0']
- mask_0 = metadata['netmask0']
- gateway = metadata['gateway']
- DNS = list(metadata['DNS'].replace(' ', '').split(','))
- NTP = list(metadata['NTP'].replace(' ', '').split(','))
- APIKEY = metadata['APIKEY']
- APIPORT = metadata['APIPORT']
- APIDEBUG = metadata['APIDEBUG']
-
- if ip_0 and ip_0 != 'null' and mask_0 and mask_0 != 'null' and gateway and gateway != 'null':
- cidr = str(ipaddress.IPv4Network('0.0.0.0/' + mask_0).prefixlen)
- ipcidr = ip_0 + '/' + cidr
-
- set_ipaddress(config, 'eth0', ipcidr)
- config.set_tag(['interfaces', 'ethernet'])
+ # Check for 'null' values and replace them by the 'None'
+ # this make the rest of the code easier
+ for (ovf_property_key, ovf_property_value) in ovf_environment.items():
+ if ovf_property_value == 'null':
+ ovf_environment[ovf_property_key] = None
+
+ # get all variables required for configuration
+ ip_address = ovf_environment['ip0']
+ ip_mask = ovf_environment['netmask0']
+ gateway = ovf_environment['gateway']
+ dns_string = ovf_environment['DNS']
+ ntp_string = ovf_environment['NTP']
+ api_key = ovf_environment['APIKEY']
+ api_port = ovf_environment['APIPORT']
+ api_debug = ovf_environment['APIDEBUG']
+
+ # Configure an interface and default route
+ if ip_address and ip_mask and gateway:
+ ip_address_cidr = ipaddress.ip_interface("{}/{}".format(ip_address, ip_mask)).with_prefixlen
+ logger.debug("Configuring the IP address on the eth0 interface: {}".format(ip_address_cidr))
+ set_ipaddress(config, 'eth0', ip_address_cidr)
+
+ logger.debug("Configuring default route via: {}".format(gateway))
config.set(['protocols', 'static', 'route', '0.0.0.0/0', 'next-hop'], value=gateway, replace=True)
config.set_tag(['protocols', 'static', 'route'])
config.set_tag(['protocols', 'static', 'route', '0.0.0.0/0', 'next-hop'])
else:
+ logger.debug("Configuring a DHCP client on the eth0 interface (fallback from OVF)")
set_ipaddress(config, 'eth0', 'dhcp')
- config.set_tag(['interfaces', 'ethernet'])
- DNS = [server for server in DNS if server and server != 'null']
- if DNS:
- for server in DNS:
+ # Configure DNS servers
+ if dns_string:
+ dns_list = list(dns_string.replace(' ', '').split(','))
+ for server in dns_list:
+ logger.debug("Configuring DNS server: {}".format(server))
config.set(['system', 'name-server'], value=server, replace=False)
- NTP = [server for server in NTP if server and server != 'null']
- if NTP:
- for server in NTP:
+ # Configure NTP servers
+ if ntp_string:
+ ntp_list = list(ntp_string.replace(' ', '').split(','))
+ for server in ntp_list:
+ logger.debug("Configuring NTP server: {}".format(server))
config.set(['system', 'ntp', 'server'], value=server, replace=False)
- config.set_tag(['system', 'ntp', 'server'])
+ config.set_tag(['system', 'ntp', 'server'])
- if APIKEY and APIKEY != 'null':
- config.set(['service', 'https', 'api', 'keys', 'id', 'cloud-init', 'key'], value=APIKEY, replace=True)
+ # Configure API
+ if api_key:
+ logger.debug("Configuring HTTP API key: {}".format(api_key))
+ config.set(['service', 'https', 'api', 'keys', 'id', 'cloud-init', 'key'], value=api_key, replace=True)
config.set_tag(['service', 'https', 'api', 'keys', 'id'])
-
- if APIDEBUG != 'False' and APIKEY and APIKEY != 'null':
- config.set(['service', 'https', 'api', 'debug'], replace=True)
-
- if APIPORT and APIPORT != 'null' and APIKEY and APIKEY != 'null':
- config.set(['service', 'https', 'listen-address', '0.0.0.0', 'listen-port'], value=APIPORT, replace=True)
+ if api_key and api_port:
+ logger.debug("Configuring HTTP API port: {}".format(api_port))
+ config.set(['service', 'https', 'listen-address', '0.0.0.0', 'listen-port'], value=api_port, replace=True)
config.set_tag(['service', 'https', 'listen-address'])
+ if api_key and api_debug != 'False':
+ logger.debug("Enabling HTTP API debug")
+ config.set(['service', 'https', 'api', 'debug'], replace=True)
# get an IP address type
@@ -201,6 +216,7 @@ def set_ipaddress(config, iface, address):
# configure address
logger.debug("Configuring IP address {} on interface {}".format(address, iface))
config.set(['interfaces', 'ethernet', iface, 'address'], value=address, replace=False)
+ config.set_tag(['interfaces', 'ethernet'])
# configure interface from networking config version 1
@@ -225,7 +241,6 @@ def set_config_interfaces_v1(config, iface_config):
else:
set_ipaddress(config, iface_name, 'dhcp')
- config.set_tag(['interfaces', 'ethernet'])
continue
# configure static options
@@ -248,7 +263,6 @@ def set_config_interfaces_v1(config, iface_config):
# apply to the configuration
if ip_static_addr:
set_ipaddress(config, iface_name, ip_static_addr)
- config.set_tag(['interfaces', 'ethernet'])
except Exception as err:
logger.error("Impossible to configure static IP address: {}".format(err))
@@ -328,17 +342,14 @@ def set_config_interfaces_v2(config, iface_name, iface_config):
if 'dhcp4' in iface_config:
if iface_config['dhcp4'] is True:
set_ipaddress(config, iface_name, 'dhcp')
- config.set_tag(['interfaces', 'ethernet'])
if 'dhcp6' in iface_config:
if iface_config['dhcp6'] is True:
set_ipaddress(config, iface_name, 'dhcpv6')
- config.set_tag(['interfaces', 'ethernet'])
# configure static addresses
if 'addresses' in iface_config:
for item in iface_config['addresses']:
set_ipaddress(config, iface_name, item)
- config.set_tag(['interfaces', 'ethernet'])
# configure gateways
if 'gateway4' in iface_config:
@@ -391,7 +402,6 @@ def set_config_interfaces_v2(config, iface_name, iface_config):
def set_config_dhcp(config):
logger.debug("Configuring DHCPv4 on eth0 interface (fallback)")
set_ipaddress(config, 'eth0', 'dhcp')
- config.set_tag(['interfaces', 'ethernet'])
# configure SSH server service
@@ -439,6 +449,10 @@ def handle(name, cfg, cloud, log, _args):
logger.debug("Users: {}".format(users))
(default_user, default_user_config) = ug_util.extract_default(users)
logger.debug("Default user: {}".format(default_user))
+ # Get OVF properties
+ if 'OVF' in dsname:
+ ovf_environment = ovf_get_properties(cloud.datasource.environment)
+ logger.debug("OVF environment: {}".format(ovf_environment))
# VyOS configuration file selection
cfg_file_name = '/opt/vyatta/etc/config/config.boot'
@@ -486,7 +500,7 @@ def handle(name, cfg, cloud, log, _args):
# apply settings from OVF template
if 'OVF' in dsname:
- set_config_ovf(config, metadata_ds)
+ set_config_ovf(config, ovf_environment)
# Empty hostname option may be interpreted as 'null' string by some hypervisors
# we need to replace it to the empty value to process it later properly
if hostname and hostname == 'null':
diff --git a/cloudinit/sources/DataSourceOVF.py b/cloudinit/sources/DataSourceOVF.py
index 6a9a331d..e53d2eb1 100644
--- a/cloudinit/sources/DataSourceOVF.py
+++ b/cloudinit/sources/DataSourceOVF.py
@@ -436,8 +436,7 @@ def read_ovf_environment(contents):
cfg = {}
ud = None
cfg_props = ['password']
- md_props = ['seedfrom', 'local-hostname', 'public-keys', 'instance-id',
- 'ip0', 'netmask0', 'gateway', 'DNS', 'NTP', 'APIKEY' ,'APIPORT', 'APIDEBUG']
+ md_props = ['seedfrom', 'local-hostname', 'public-keys', 'instance-id']
for (prop, val) in props.items():
if prop == 'hostname':
prop = "local-hostname"