← Back to team overview

cloud-init-dev team mailing list archive

[Merge] ~smoser/cloud-init:feature/freebsd-variant into cloud-init:master

 

Scott Moser has proposed merging ~smoser/cloud-init:feature/freebsd-variant into cloud-init:master.

Commit message:
fixes for freebsd

Requested reviews:
  cloud-init commiters (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~smoser/cloud-init/+git/cloud-init/+merge/325760
-- 
Your team cloud-init commiters is requested to review the proposed merge of ~smoser/cloud-init:feature/freebsd-variant into cloud-init:master.
diff --git a/cloudinit/config/cc_growpart.py b/cloudinit/config/cc_growpart.py
index d2bc6e6..bafca9d 100644
--- a/cloudinit/config/cc_growpart.py
+++ b/cloudinit/config/cc_growpart.py
@@ -214,7 +214,7 @@ def device_part_info(devpath):
 
     # FreeBSD doesn't know of sysfs so just get everything we need from
     # the device, like /dev/vtbd0p2.
-    if util.system_info()["platform"].startswith('FreeBSD'):
+    if util.is_FreeBSD():
         m = re.search('^(/dev/.+)p([0-9])$', devpath)
         return (m.group(1), m.group(2))
 
diff --git a/cloudinit/config/cc_power_state_change.py b/cloudinit/config/cc_power_state_change.py
index c1c6fe7..eba58b0 100644
--- a/cloudinit/config/cc_power_state_change.py
+++ b/cloudinit/config/cc_power_state_change.py
@@ -71,7 +71,7 @@ def givecmdline(pid):
         # Example output from procstat -c 1
         #   PID COMM             ARGS
         #     1 init             /bin/init --
-        if util.system_info()["platform"].startswith('FreeBSD'):
+        if util.is_FreeBSD():
             (output, _err) = util.subp(['procstat', '-c', str(pid)])
             line = output.splitlines()[1]
             m = re.search('\d+ (\w|\.|-)+\s+(/\w.+)', line)
diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py
index a0b9eae..9c5ce59 100644
--- a/cloudinit/sources/DataSourceAzure.py
+++ b/cloudinit/sources/DataSourceAzure.py
@@ -101,7 +101,7 @@ def get_dev_storvsc_sysctl():
         sysctl_out, err = util.subp(['sysctl', 'dev.storvsc'])
     except util.ProcessExecutionError:
         LOG.debug("Fail to execute sysctl dev.storvsc")
-        return None
+        sysctl_out = ""
     return sysctl_out
 
 
diff --git a/cloudinit/util.py b/cloudinit/util.py
index 415ca37..6f2b38c 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -573,7 +573,7 @@ def is_ipv4(instr):
 
 
 def is_FreeBSD():
-    return system_info()['platform'].startswith('FreeBSD')
+    return system_info()['variant'] == "freebsd"
 
 
 def get_cfg_option_bool(yobj, key, default=False):
@@ -598,37 +598,29 @@ def get_cfg_option_int(yobj, key, default=0):
 def system_info():
     info = {
         'platform': platform.platform(),
+        'system': platform.system(),
         'release': platform.release(),
         'python': platform.python_version(),
         'uname': platform.uname(),
-        'dist': platform.linux_distribution(),  # pylint: disable=W1505
+        'dist': platform.dist(),
     }
-    plat = info['platform'].lower()
-    # Try to get more info about what it actually is, in a format
-    # that we can easily use across linux and variants...
-    if plat.startswith('darwin'):
-        info['variant'] = 'darwin'
-    elif plat.endswith("bsd"):
-        info['variant'] = 'bsd'
-    elif plat.startswith('win'):
-        info['variant'] = 'windows'
-    elif 'linux' in plat:
-        # Try to get a single string out of these...
-        linux_dist, _version, _id = info['dist']
-        linux_dist = linux_dist.lower()
-        if linux_dist in ('ubuntu', 'linuxmint', 'mint'):
-            info['variant'] = 'ubuntu'
+    system = info['system'].lower()
+    var = 'unknown'
+    if system == "linux":
+        linux_dist = info['dist'][0].lower()
+        if linux_dist in ('centos', 'fedora', 'debian'):
+            var = linux_dist
+        elif linux_dist in ('ubuntu', 'linuxmint', 'mint'):
+            var = 'ubuntu'
+        elif linux_dist == 'redhat':
+            var = 'rhel'
         else:
-            for prefix, variant in [('redhat', 'rhel'),
-                                    ('centos', 'centos'),
-                                    ('fedora', 'fedora'),
-                                    ('debian', 'debian')]:
-                if linux_dist.startswith(prefix):
-                    info['variant'] = variant
-        if 'variant' not in info:
-            info['variant'] = 'linux'
-    if 'variant' not in info:
-        info['variant'] = 'unknown'
+            var = 'linux'
+    elif system in ('windows', 'darwin', "freebsd"):
+        var = system
+
+    info['variant'] = var
+
     return info
 
 
diff --git a/config/cloud.cfg.tmpl b/config/cloud.cfg.tmpl
index 5af2a88..f4b9069 100644
--- a/config/cloud.cfg.tmpl
+++ b/config/cloud.cfg.tmpl
@@ -2,7 +2,7 @@
 # The top level settings are used as module
 # and system configuration.
 
-{% if variant in ["bsd"] %}
+{% if variant in ["freebsd"] %}
 syslog_fix_perms: root:wheel
 {% endif %}
 # A set of users which may be applied and/or used by various modules
@@ -13,7 +13,7 @@ users:
 
 # If this is set, 'root' will not be able to ssh in and they
 # will get a message to login instead as the default $user
-{% if variant in ["bsd"] %}
+{% if variant in ["freebsd"] %}
 disable_root: false
 {% else %}
 disable_root: true
@@ -30,7 +30,7 @@ ssh_pwauth:   0
 # This will cause the set+update hostname module to not operate (if true)
 preserve_hostname: false
 
-{% if variant in ["bsd"] %}
+{% if variant in ["freebsd"] %}
 # 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: ['ConfigDrive', 'Azure', 'OpenStack', 'Ec2']
@@ -53,13 +53,13 @@ cloud_init_modules:
  - write-files
  - growpart
  - resizefs
-{% if variant not in ["bsd"] %}
+{% if variant not in ["freebsd"] %}
  - disk_setup
  - mounts
 {% endif %}
  - set_hostname
  - update_hostname
-{% if variant not in ["bsd"] %}
+{% if variant not in ["freebsd"] %}
  - update_etc_hosts
  - ca-certs
  - rsyslog
@@ -87,7 +87,7 @@ cloud_config_modules:
  - apt-pipelining
  - apt-configure
 {% endif %}
-{% if variant not in ["bsd"] %}
+{% if variant not in ["freebsd"] %}
  - ntp
 {% endif %}
  - timezone
@@ -108,7 +108,7 @@ cloud_final_modules:
  - landscape
  - lxd
 {% endif %}
-{% if variant not in ["bsd"] %}
+{% if variant not in ["freebsd"] %}
  - puppet
  - chef
  - salt-minion
@@ -130,10 +130,8 @@ cloud_final_modules:
 # (not accessible to handlers/transforms)
 system_info:
    # This will affect which distro class gets used
-{% if variant in ["centos", "debian", "fedora", "rhel", "ubuntu"] %}
+{% if variant in ["centos", "debian", "fedora", "rhel", "ubuntu", "freebsd"] %}
    distro: {{ variant }}
-{% elif variant in ["bsd"] %}
-   distro: freebsd
 {% else %}
    # Unknown/fallback distro.
    distro: ubuntu
@@ -182,7 +180,7 @@ system_info:
       cloud_dir: /var/lib/cloud/
       templates_dir: /etc/cloud/templates/
    ssh_svcname: sshd
-{% elif variant in ["bsd"] %}
+{% elif variant in ["freebsd"] %}
    # Default user name + that default users groups (if added/used)
    default_user:
      name: freebsd
diff --git a/tests/unittests/test_handler/test_handler_ntp.py b/tests/unittests/test_handler/test_handler_ntp.py
index 3a9f7f7..e8748ec 100644
--- a/tests/unittests/test_handler/test_handler_ntp.py
+++ b/tests/unittests/test_handler/test_handler_ntp.py
@@ -62,7 +62,7 @@ class TestNtp(FilesystemMockingTestCase):
     def test_ntp_rename_ntp_conf(self):
         """When NTP_CONF exists, rename_ntp moves it."""
         ntpconf = self.tmp_path("ntp.conf", self.new_root)
-        os.mknod(ntpconf)
+        util.write_file(ntpconf, "")
         with mock.patch("cloudinit.config.cc_ntp.NTP_CONF", ntpconf):
             cc_ntp.rename_ntp_conf()
         self.assertFalse(os.path.exists(ntpconf))
diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py
index 014aa6a..a73fd26 100644
--- a/tests/unittests/test_util.py
+++ b/tests/unittests/test_util.py
@@ -20,6 +20,9 @@ except ImportError:
     import mock
 
 
+BASH = util.which('bash')
+
+
 class FakeSelinux(object):
 
     def __init__(self, match_what):
@@ -544,17 +547,17 @@ class TestReadSeeded(helpers.TestCase):
 
 class TestSubp(helpers.TestCase):
 
-    stdin2err = ['bash', '-c', 'cat >&2']
+    stdin2err = [BASH, '-c', 'cat >&2']
     stdin2out = ['cat']
     utf8_invalid = b'ab\xaadef'
     utf8_valid = b'start \xc3\xa9 end'
     utf8_valid_2 = b'd\xc3\xa9j\xc8\xa7'
-    printenv = ['bash', '-c', 'for n in "$@"; do echo "$n=${!n}"; done', '--']
+    printenv = [BASH, '-c', 'for n in "$@"; do echo "$n=${!n}"; done', '--']
 
     def printf_cmd(self, *args):
         # bash's printf supports \xaa.  So does /usr/bin/printf
         # but by using bash, we remove dependency on another program.
-        return(['bash', '-c', 'printf "$@"', 'printf'] + list(args))
+        return([BASH, '-c', 'printf "$@"', 'printf'] + list(args))
 
     def test_subp_handles_utf8(self):
         # The given bytes contain utf-8 accented characters as seen in e.g.
diff --git a/tools/build-on-freebsd b/tools/build-on-freebsd
index ccc10b4..ff9153a 100755
--- a/tools/build-on-freebsd
+++ b/tools/build-on-freebsd
@@ -8,6 +8,7 @@ fail() { echo "FAILED:" "$@" 1>&2; exit 1; }
 # Check dependencies:
 depschecked=/tmp/c-i.dependencieschecked
 pkgs="
+   bash
    dmidecode
    e2fsprogs
    py27-Jinja2
@@ -16,7 +17,7 @@ pkgs="
    py27-configobj
    py27-jsonpatch
    py27-jsonpointer
-   py27-oauth
+   py27-oauthlib
    py27-prettytable
    py27-requests
    py27-serial
@@ -35,9 +36,6 @@ touch $depschecked
 python setup.py build
 python setup.py install -O1 --skip-build --prefix /usr/local/ --init-system sysvinit_freebsd
 
-# Install the correct config file:
-cp config/cloud.cfg-freebsd /etc/cloud/cloud.cfg
-
 # Enable cloud-init in /etc/rc.conf:
 sed -i.bak -e "/cloudinit_enable=.*/d" /etc/rc.conf
 echo 'cloudinit_enable="YES"' >> /etc/rc.conf

Follow ups