diff options
author | Scott Moser <smoser@ubuntu.com> | 2014-09-30 13:26:03 -0400 |
---|---|---|
committer | Scott Moser <smoser@ubuntu.com> | 2014-09-30 13:26:03 -0400 |
commit | a429725ede3395a7e9c21b864a82e2c092657ae2 (patch) | |
tree | 3f3ae31e40ddd7f94c662c2d3f5f2108af5cda97 | |
parent | b76866ad72d433cc9008a137c464c7ed44401549 (diff) | |
parent | 87080e18f8fb2522a01ccbe58c60b5e06bfdd5d7 (diff) | |
download | vyos-cloud-init-a429725ede3395a7e9c21b864a82e2c092657ae2.tar.gz vyos-cloud-init-a429725ede3395a7e9c21b864a82e2c092657ae2.zip |
FreeBSD: Support ConfigDrive
Add support for freebsd reading config drive. Primary work is
related to re-factoring mount_cb to not be so linux specific.
Other changes:
* declare PATH in freebsd initscripts
* list dependency on e2fsprogs (for blkid)
* enable ConfigDrive in freebsd config
* hosts.freebsd.tmpl added
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | cloudinit/sources/DataSourceConfigDrive.py | 14 | ||||
-rw-r--r-- | cloudinit/sources/DataSourceOVF.py | 3 | ||||
-rw-r--r-- | cloudinit/util.py | 81 | ||||
-rw-r--r-- | config/cloud.cfg-freebsd | 2 | ||||
-rwxr-xr-x | sysvinit/freebsd/cloudconfig | 1 | ||||
-rwxr-xr-x | sysvinit/freebsd/cloudfinal | 1 | ||||
-rwxr-xr-x | sysvinit/freebsd/cloudinit | 1 | ||||
-rwxr-xr-x | sysvinit/freebsd/cloudinitlocal | 1 | ||||
-rw-r--r-- | templates/hosts.freebsd.tmpl | 24 | ||||
-rwxr-xr-x | tools/build-on-freebsd | 22 |
11 files changed, 115 insertions, 36 deletions
@@ -37,6 +37,7 @@ - resizefs: fix broken background resizing [Jay Faulkner] (LP: #1338614) - cc_grub_dpkg: fix EC2 hvm instances to avoid prompt on grub update. (LP: #1336855) + - FreeBsd: support config drive datasource [Joseph bajin] 0.7.5: - open 0.7.5 - Add a debug log message around import failures diff --git a/cloudinit/sources/DataSourceConfigDrive.py b/cloudinit/sources/DataSourceConfigDrive.py index 4e5d90de..27658073 100644 --- a/cloudinit/sources/DataSourceConfigDrive.py +++ b/cloudinit/sources/DataSourceConfigDrive.py @@ -37,7 +37,9 @@ DEFAULT_METADATA = { VALID_DSMODES = ("local", "net", "pass", "disabled") FS_TYPES = ('vfat', 'iso9660') LABEL_TYPES = ('config-2',) -OPTICAL_DEVICES = tuple(('/dev/sr%s' % i for i in range(0, 2))) +POSSIBLE_MOUNTS = ('sr', 'cd') +OPTICAL_DEVICES = tuple(('/dev/%s%s' % (z, i) for z in POSSIBLE_MOUNTS + for i in range(0, 2))) class DataSourceConfigDrive(openstack.SourceMixin, sources.DataSource): @@ -70,7 +72,15 @@ class DataSourceConfigDrive(openstack.SourceMixin, sources.DataSource): if not found: for dev in find_candidate_devs(): try: - results = util.mount_cb(dev, read_config_drive) + # Set mtype if freebsd and turn off sync + if dev.startswith("/dev/cd"): + mtype = "cd9660" + sync = False + else: + mtype = None + sync = True + results = util.mount_cb(dev, read_config_drive, mtype=mtype, + sync=sync) found = dev except openstack.NonReadable: pass diff --git a/cloudinit/sources/DataSourceOVF.py b/cloudinit/sources/DataSourceOVF.py index 2f53c1ba..7ba60735 100644 --- a/cloudinit/sources/DataSourceOVF.py +++ b/cloudinit/sources/DataSourceOVF.py @@ -215,8 +215,7 @@ def transport_iso9660(require_iso=True): continue try: - (fname, contents) = util.mount_cb(fullp, - get_ovf_env, mtype=mtype) + (fname, contents) = util.mount_cb(fullp, get_ovf_env, mtype=mtype) except util.MountFailedError: LOG.debug("%s not mountable as iso9660" % fullp) continue diff --git a/cloudinit/util.py b/cloudinit/util.py index 946059e9..76e91951 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -1297,7 +1297,7 @@ def unmounter(umount): yield umount finally: if umount: - umount_cmd = ["umount", '-l', umount] + umount_cmd = ["umount", umount] subp(umount_cmd) @@ -1346,37 +1346,70 @@ def mount_cb(device, callback, data=None, rw=False, mtype=None, sync=True): Mount the device, call method 'callback' passing the directory in which it was mounted, then unmount. Return whatever 'callback' returned. If data != None, also pass data to callback. + + mtype is a filesystem type. it may be a list, string (a single fsname) + or a list of fsnames. """ + + if isinstance(mtype, str): + mtypes = [mtype] + elif isinstance(mtype, (list, tuple)): + mtypes = list(mtype) + elif mtype is None: + mtypes = None + + # clean up 'mtype' input a bit based on platform. + platsys = platform.system().lower() + if platsys == "linux": + if mtypes is None: + mtypes = ["auto"] + elif platsys.endswith("bsd"): + if mtypes is None: + mtypes = ['ufs', 'cd9660', 'vfat'] + for index, mtype in enumerate(mtypes): + if mtype == "iso9660": + mtypes[index] = "cd9660" + else: + # we cannot do a smart "auto", so just call 'mount' once with no -t + mtypes = [''] + mounted = mounts() with tempdir() as tmpd: umount = False if device in mounted: mountpoint = mounted[device]['mountpoint'] else: - try: - mountcmd = ['mount'] - mountopts = [] - if rw: - mountopts.append('rw') - else: - mountopts.append('ro') - if sync: - # This seems like the safe approach to do - # (ie where this is on by default) - mountopts.append("sync") - if mountopts: - mountcmd.extend(["-o", ",".join(mountopts)]) - if mtype: - mountcmd.extend(['-t', mtype]) - mountcmd.append(device) - mountcmd.append(tmpd) - subp(mountcmd) - umount = tmpd # This forces it to be unmounted (when set) - mountpoint = tmpd - except (IOError, OSError) as exc: - raise MountFailedError(("Failed mounting %s " - "to %s due to: %s") % + for mtype in mtypes: + mountpoint = None + try: + mountcmd = ['mount'] + mountopts = [] + if rw: + mountopts.append('rw') + else: + mountopts.append('ro') + if sync: + # This seems like the safe approach to do + # (ie where this is on by default) + mountopts.append("sync") + if mountopts: + mountcmd.extend(["-o", ",".join(mountopts)]) + if mtype: + mountcmd.extend(['-t', mtype]) + mountcmd.append(device) + mountcmd.append(tmpd) + subp(mountcmd) + umount = tmpd # This forces it to be unmounted (when set) + mountpoint = tmpd + break + except (IOError, OSError) as exc: + LOG.debug("Failed mount of '%s' as '%s': %s", + device, mtype, exc) + pass + if not mountpoint: + raise MountFailedError("Failed mounting %s to %s due to: %s" % (device, tmpd, exc)) + # Be nice and ensure it ends with a slash if not mountpoint.endswith("/"): mountpoint += "/" diff --git a/config/cloud.cfg-freebsd b/config/cloud.cfg-freebsd index bb3a4a51..17924be8 100644 --- a/config/cloud.cfg-freebsd +++ b/config/cloud.cfg-freebsd @@ -5,7 +5,7 @@ syslog_fix_perms: root:wheel # This should not be required, but leave it in place until the real cause of # not beeing able to find -any- datasources is resolved. -datasource_list: ['OpenStack'] +datasource_list: ['ConfigDrive', 'OpenStack'] # A set of users which may be applied and/or used by various modules # when a 'default' entry is found it will reference the 'default_user' diff --git a/sysvinit/freebsd/cloudconfig b/sysvinit/freebsd/cloudconfig index 44c216b3..01bc061e 100755 --- a/sysvinit/freebsd/cloudconfig +++ b/sysvinit/freebsd/cloudconfig @@ -6,6 +6,7 @@ . /etc/rc.subr +PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" export CLOUD_CFG=/usr/local/etc/cloud/cloud.cfg name="cloudconfig" diff --git a/sysvinit/freebsd/cloudfinal b/sysvinit/freebsd/cloudfinal index f668e036..1b487aa0 100755 --- a/sysvinit/freebsd/cloudfinal +++ b/sysvinit/freebsd/cloudfinal @@ -6,6 +6,7 @@ . /etc/rc.subr +PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" export CLOUD_CFG=/usr/local/etc/cloud/cloud.cfg name="cloudfinal" diff --git a/sysvinit/freebsd/cloudinit b/sysvinit/freebsd/cloudinit index c5478678..862eeab4 100755 --- a/sysvinit/freebsd/cloudinit +++ b/sysvinit/freebsd/cloudinit @@ -6,6 +6,7 @@ . /etc/rc.subr +PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" export CLOUD_CFG=/usr/local/etc/cloud/cloud.cfg name="cloudinit" diff --git a/sysvinit/freebsd/cloudinitlocal b/sysvinit/freebsd/cloudinitlocal index c340d5d0..fb342a0f 100755 --- a/sysvinit/freebsd/cloudinitlocal +++ b/sysvinit/freebsd/cloudinitlocal @@ -6,6 +6,7 @@ . /etc/rc.subr +PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" export CLOUD_CFG=/usr/local/etc/cloud/cloud.cfg name="cloudinitlocal" diff --git a/templates/hosts.freebsd.tmpl b/templates/hosts.freebsd.tmpl new file mode 100644 index 00000000..7ded762f --- /dev/null +++ b/templates/hosts.freebsd.tmpl @@ -0,0 +1,24 @@ +## template:jinja +{# +This file /etc/cloud/templates/hosts.freebsd.tmpl is only utilized +if enabled in cloud-config. Specifically, in order to enable it +you need to add the following to config: + manage_etc_hosts: True +-#} +# Your system has configured 'manage_etc_hosts' as True. +# As a result, if you wish for changes to this file to persist +# then you will need to either +# a.) make changes to the master file in /etc/cloud/templates/hosts.freebsd.tmpl +# b.) change or remove the value of 'manage_etc_hosts' in +# /etc/cloud/cloud.cfg or cloud-config from user-data +# +# The following lines are desirable for IPv4 capable hosts +127.0.0.1 {{fqdn}} {{hostname}} +127.0.0.1 localhost.localdomain localhost +127.0.0.1 localhost4.localdomain4 localhost4 + +# The following lines are desirable for IPv6 capable hosts +::1 {{fqdn}} {{hostname}} +::1 localhost.localdomain localhost +::1 localhost6.localdomain6 localhost6 + diff --git a/tools/build-on-freebsd b/tools/build-on-freebsd index 65d783f7..8436498e 100755 --- a/tools/build-on-freebsd +++ b/tools/build-on-freebsd @@ -9,15 +9,23 @@ fail() { echo "FAILED:" "$@" 1>&2; exit 1; } depschecked=/tmp/c-i.dependencieschecked pkgs=" dmidecode - py27-argparse - py27-boto gpart sudo - py27-configobj py27-yaml + e2fsprogs + gpart py27-Jinja2 - py27-oauth py27-serial + py27-argparse + py27-boto + py27-cheetah + py27-configobj + py27-jsonpatch + py27-jsonpointer + py27-oauth py27-prettytable - py27-requests py27-six - python py27-cheetah - py27-jsonpointer py27-jsonpatch + py27-requests + py27-serial + py27-six + py27-yaml + python + sudo " [ -f "$depschecked" ] || pkg install ${pkgs} || fail "install packages" touch $depschecked |