Hello community, here is the log from the commit of package cloud-init for openSUSE:Factory checked in at 2016-11-12 13:02:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cloud-init (Old) and /work/SRC/openSUSE:Factory/.cloud-init.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cloud-init" Changes: -------- --- /work/SRC/openSUSE:Factory/cloud-init/cloud-init.changes 2016-10-02 00:07:21.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.cloud-init.new/cloud-init.changes 2016-11-12 13:02:33.000000000 +0100 @@ -1,0 +2,101 @@ +Tue Nov 1 15:56:50 UTC 2016 - [email protected] + +- Modify suseIntegratedHandler.patch (bsc#1007529) + + Fall back to the previous method of writing network information + We have to work out upstream how to have distro specific renderer + for sysconfig + +------------------------------------------------------------------- +Mon Oct 31 12:44:21 UTC 2016 - [email protected] + +- Add cloud-init-sysconfig-netpathfix.patch (bsc#1007529) + + Fix the default path for network scripts +- Cosmetic changes to suseIntegratedHandler.patch + +------------------------------------------------------------------- +Sat Oct 29 13:24:13 UTC 2016 - [email protected] + +- Update cloud-init-no-dmidecode-on-ppc64.patch (bsc#1005616) + + aarch64 does support dmidecode + +------------------------------------------------------------------- +Sat Oct 29 12:40:38 UTC 2016 - [email protected] + +- Update cloud-init-service.patch + + Break another cycle this one in -final + +------------------------------------------------------------------- +Fri Oct 28 20:14:48 UTC 2016 - [email protected] + +- Update cloud-init-service.patch + + Better match upstream intend Ubuntu networking.service is equivalent + to SUSE wicked, thus we cannot translate networking to network, but need + to translate it to wicked + +------------------------------------------------------------------- +Fri Oct 28 19:37:24 UTC 2016 - [email protected] + +- Update cloud-init-service.patch + + We need the following order: + - something brings networking fully up (in our case wicked) + - cloud-init.service runs + - network-online.target is reached + +------------------------------------------------------------------- +Fri Oct 28 19:20:32 UTC 2016 - [email protected] + +- Update cloud-init-service.patch + + The network must be up an running in order to get ssh key injected + +------------------------------------------------------------------- +Fri Oct 28 15:21:39 UTC 2016 - [email protected] + +- Update cloud-init-service.patch + + Had self reference and thus cloud-init.service was never executed + which caused ssh key loading failure + +------------------------------------------------------------------- +Fri Oct 28 04:56:29 UTC 2016 - [email protected] + +- Do not own /lib/udev to not conflict with udev rpm + +------------------------------------------------------------------- +Thu Oct 27 19:40:31 UTC 2016 - [email protected] + +- Forward port suseIntegratedHandler.patch + + Implement new abstract interfaces + + Some minor implementation fixes + +------------------------------------------------------------------- +Wed Oct 26 14:27:55 UTC 2016 - [email protected] + +- Appease the build service, differences between OBS and IBS, + and own the directories + +------------------------------------------------------------------- +Wed Oct 26 11:31:34 UTC 2016 - [email protected] + +- Fix package, udev rules should be in /usr for distros after + SLES 11 + +------------------------------------------------------------------- +Wed Oct 19 13:23:35 UTC 2016 - [email protected] + +- add cloud-init-digital-ocean-datasource-enable-by-default.patch, + cloud-init-digital-ocean-datasource.patch: add DigitalOcean support +- run tests on build + +------------------------------------------------------------------- +Tue Oct 11 15:42:35 UTC 2016 - [email protected] + +- Add cloud-init-handle-no-carrier.patch (boo#1003977) + - Handle the exception when attempting to detect if the network + device is up when it is not + +------------------------------------------------------------------- +Mon Oct 10 20:28:47 UTC 2016 - [email protected] + +- Update cloud-init-service.patch (boo#999942) + - Backport upstream commits 3705bb5964a and 6e45ffb21e96 + +------------------------------------------------------------------- New: ---- cloud-init-digital-ocean-datasource-enable-by-default.patch cloud-init-digital-ocean-datasource.patch cloud-init-handle-no-carrier.patch cloud-init-sysconfig-netpathfix.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cloud-init.spec ++++++ --- /var/tmp/diff_new_pack.6XNG09/_old 2016-11-12 13:02:34.000000000 +0100 +++ /var/tmp/diff_new_pack.6XNG09/_new 2016-11-12 13:02:34.000000000 +0100 @@ -45,12 +45,35 @@ Patch21: cloud-init-net-eni.patch Patch22: cloud-init-service.patch Patch23: cloud-init-fix-unicode-handling-binarydecode.patch +# From upstream patch +Patch24: cloud-init-handle-no-carrier.patch +Patch25: cloud-init-digital-ocean-datasource.patch +Patch26: cloud-init-digital-ocean-datasource-enable-by-default.patch +Patch27: cloud-init-sysconfig-netpathfix.patch BuildRequires: fdupes BuildRequires: filesystem BuildRequires: python-devel BuildRequires: python-setuptools # pkg-config is needed to find correct systemd unit dir BuildRequires: pkg-config +# needed for /lib/udev +BuildRequires: udev +%if 0%{?suse_version} > 1320 +# Test requirements +BuildRequires: python-Cheetah +BuildRequires: python-Jinja2 +BuildRequires: python-PrettyTable +BuildRequires: python-PyYAML +BuildRequires: python-argparse +BuildRequires: python-configobj +BuildRequires: python-contextlib2 +BuildRequires: python-httpretty +BuildRequires: python-jsonpatch +BuildRequires: python-mock +BuildRequires: python-oauthlib +BuildRequires: python-requests +BuildRequires: python-testtools +%endif Requires: bash Requires: file Requires: growpart @@ -149,6 +172,10 @@ %patch21 %patch22 %patch23 +%patch24 +%patch25 -p1 +%patch26 -p1 +%patch27 %if 0%{?suse_version} <= 1130 # disable ecdsa for SLE 11 (not available) @@ -158,6 +185,18 @@ %build python setup.py build + +%if 0%{?suse_version} > 1320 +%check +# these tests are currently failing due to suse patches +rm -v tests/unittests/test_distros/test_netconfig.py +rm -v tests/unittests/test_net.py +rm -v tests/unittests/test_datasource/test_opennebula.py +rm -v tests/unittests/test_datasource/test_cloudstack.py +python -m testtools.run +%endif + + %install python setup.py install --root=%{buildroot} --prefix=%{_prefix} --install-lib=%{python_sitelib} --init-system=%{initsys} find %{buildroot} \( -name .gitignore -o -name .placeholder \) -delete @@ -188,8 +227,10 @@ %endif %endif %if 0%{?suse_version} && 0%{?suse_version} > 1110 -mkdir %{buildroot}/%{_sysconfdir}/rsyslog.d +mkdir -p %{buildroot}/%{_sysconfdir}/rsyslog.d +mkdir -p %{buildroot}/usr/lib/udev/rules.d/ cp -a %{SOURCE2} %{buildroot}/%{_sysconfdir}/rsyslog.d/21-cloudinit.conf +mv %{buildroot}/lib/udev/rules.d/66-azure-ephemeral.rules %{buildroot}/usr/lib/udev/rules.d/ %endif # remove debian/ubuntu specific profile.d file (bnc#779553) @@ -252,16 +293,20 @@ %if 0%{?suse_version} && 0%{?suse_version} > 1110 %dir %{_sysconfdir}/rsyslog.d %{_sysconfdir}/rsyslog.d/21-cloudinit.conf -%endif +/usr/lib/udev/rules.d/66-azure-ephemeral.rules +# This if condition really distinquished between OBS and IBS. +# For SLE 12 builds in OBS owning the directories is not required, while +# SLE 12 builds in IBS require owning the directories +%else /lib/udev/rules.d/66-azure-ephemeral.rules +%endif %dir %attr(0755, root, root) %{_localstatedir}/lib/cloud %dir %{docdir} %dir /etc/NetworkManager %dir /etc/NetworkManager/dispatcher.d %dir /etc/dhcp %dir /etc/dhcp/dhclient-exit-hooks.d -%dir /lib/udev -%dir /lib/udev/rules.d + %files doc ++++++ cloud-init-digital-ocean-datasource-enable-by-default.patch ++++++ >From 7ae201166402fbf2e6c1632028be956a954835ef Mon Sep 17 00:00:00 2001 From: Scott Moser <[email protected]> Date: Tue, 18 Oct 2016 12:30:38 -0400 Subject: DigitalOcean: enable usage of data source by default. Just add DigitalOcean to the list of datasources that are used if there is no 'datasource_list' provided in config. diff --git a/cloudinit/settings.py b/cloudinit/settings.py index 8c258ea..a968271 100644 --- a/cloudinit/settings.py +++ b/cloudinit/settings.py @@ -32,6 +32,7 @@ CFG_BUILTIN = { 'NoCloud', 'ConfigDrive', 'OpenNebula', + 'DigitalOcean', 'Azure', 'AltCloud', 'OVF', -- cgit v0.10.2 ++++++ cloud-init-digital-ocean-datasource.patch ++++++ ++++ 782 lines (skipped) ++++++ cloud-init-handle-no-carrier.patch ++++++ --- cloudinit/net/__init__.py.orig +++ cloudinit/net/__init__.py @@ -33,10 +33,12 @@ def sys_dev_path(devname, path=""): def read_sys_net(devname, path, translate=None, enoent=None, keyerror=None): + dev_path = sys_dev_path(devname, path) try: - contents = util.load_file(sys_dev_path(devname, path)) + contents = util.load_file(dev_path) except (OSError, IOError) as e: - if getattr(e, 'errno', None) in (errno.ENOENT, errno.ENOTDIR): + e_errno = getattr(e, 'errno', None) + if e_errno in (errno.ENOENT, errno.ENOTDIR): if enoent is not None: return enoent raise @@ -109,24 +111,9 @@ def is_disabled_cfg(cfg): return cfg.get('config') == "disabled" -def sys_netdev_info(name, field): - if not os.path.exists(os.path.join(SYS_CLASS_NET, name)): - raise OSError("%s: interface does not exist in %s" % - (name, SYS_CLASS_NET)) - fname = os.path.join(SYS_CLASS_NET, name, field) - if not os.path.exists(fname): - raise OSError("%s: could not find sysfs entry: %s" % (name, fname)) - data = util.load_file(fname) - if data[-1] == '\n': - data = data[:-1] - return data - - def generate_fallback_config(): """Determine which attached net dev is most likely to have a connection and generate network state to run dhcp on that interface""" - # by default use eth0 as primary interface - nconf = {'config': [], 'version': 1} # get list of interfaces that could have connections invalid_interfaces = set(['lo']) @@ -143,28 +130,30 @@ def generate_fallback_config(): # skip any bridges continue try: - carrier = int(sys_netdev_info(interface, 'carrier')) + carrier = read_sys_net(interface, 'carrier', enoent=False) if carrier: + carrier = int(carrier) connected.append(interface) continue - except OSError: + except (IOError, OSError, TypeError): pass # check if nic is dormant or down, as this may make a nick appear to # not have a carrier even though it could acquire one when brought # online by dhclient try: - dormant = int(sys_netdev_info(interface, 'dormant')) + dormant = read_sys_net(interface, 'dormant', enoent=False) if dormant: + domant = int(dormant) possibly_connected.append(interface) continue - except OSError: + except (IOError, OSError, TypeError): pass try: - operstate = sys_netdev_info(interface, 'operstate') + operstate = read_sys_net(interface, 'operstate', enoent=False) if operstate in ['dormant', 'down', 'lowerlayerdown', 'unknown']: possibly_connected.append(interface) continue - except OSError: + except (IOError, OSError): pass # don't bother with interfaces that might not be connected if there are @@ -173,23 +162,29 @@ def generate_fallback_config(): potential_interfaces = connected else: potential_interfaces = possibly_connected - # if there are no interfaces, give up - if not potential_interfaces: - return + # if eth0 exists use it above anything else, otherwise get the interface - # that looks 'first' - if DEFAULT_PRIMARY_INTERFACE in potential_interfaces: - name = DEFAULT_PRIMARY_INTERFACE + # that we can read 'first' (using the sorted defintion of first). + names = [DEFAULT_PRIMARY_INTERFACE] + names.extend(sorted(potential_interfaces)) + target_name = None + target_mac = None + for name in names: + if name not in potential_interfaces: + continue + mac = read_sys_net(name, 'address', enoent=False) + if mac: + target_name = name + target_mac = mac + break + if target_mac and target_name: + nconf = {'config': [], 'version': 1} + nconf['config'].append( + {'type': 'physical', 'name': target_name, + 'mac_address': target_mac, 'subnets': [{'type': 'dhcp'}]}) + return nconf else: - name = sorted(potential_interfaces)[0] - - mac = sys_netdev_info(name, 'address') - target_name = name - - nconf['config'].append( - {'type': 'physical', 'name': target_name, - 'mac_address': mac, 'subnets': [{'type': 'dhcp'}]}) - return nconf + return None def apply_network_config_names(netcfg, strict_present=True, strict_busy=True): --- cloudinit/net/cmdline.py.orig +++ cloudinit/net/cmdline.py @@ -26,7 +26,7 @@ import sys import six from . import get_devicelist -from . import sys_netdev_info +from . import read_sys_net from cloudinit import util @@ -197,7 +197,10 @@ def read_kernel_cmdline_config(files=Non return None if mac_addrs is None: - mac_addrs = dict((k, sys_netdev_info(k, 'address')) - for k in get_devicelist()) + mac_addrs = {} + for k in get_devicelist(): + mac_addr = read_sys_net(k, 'address', enoent=False) + if mac_addr: + mac_addrs[k] = mac_addr return config_from_klibc_net_cfg(files=files, mac_addrs=mac_addrs) --- tests/unittests/test_net.py.orig +++ tests/unittests/test_net.py @@ -422,7 +422,7 @@ pre-down route del -net 10.0.0.0 netmask } -def _setup_test(tmp_dir, mock_get_devicelist, mock_sys_netdev_info, +def _setup_test(tmp_dir, mock_get_devicelist, mock_read_sys_net, mock_sys_dev_path): mock_get_devicelist.return_value = ['eth1000'] dev_characteristics = { @@ -435,10 +435,10 @@ def _setup_test(tmp_dir, mock_get_device } } - def netdev_info(name, field): + def fake_read(devname, path, translate=None, enoent=None, keyerror=None): return dev_characteristics[name][field] - mock_sys_netdev_info.side_effect = netdev_info + mock_read_sys_net.side_effect = fake_read def sys_dev_path(devname, path=""): return tmp_dir + devname + "/" + path @@ -454,15 +454,15 @@ def _setup_test(tmp_dir, mock_get_device class TestSysConfigRendering(TestCase): @mock.patch("cloudinit.net.sys_dev_path") - @mock.patch("cloudinit.net.sys_netdev_info") + @mock.patch("cloudinit.net.read_sys_net") @mock.patch("cloudinit.net.get_devicelist") def test_default_generation(self, mock_get_devicelist, - mock_sys_netdev_info, + mock_read_sys_net, mock_sys_dev_path): tmp_dir = tempfile.mkdtemp() self.addCleanup(shutil.rmtree, tmp_dir) _setup_test(tmp_dir, mock_get_devicelist, - mock_sys_netdev_info, mock_sys_dev_path) + mock_read_sys_net, mock_sys_dev_path) network_cfg = net.generate_fallback_config() ns = network_state.parse_net_config_data(network_cfg, @@ -511,15 +511,15 @@ USERCTL=no class TestEniNetRendering(TestCase): @mock.patch("cloudinit.net.sys_dev_path") - @mock.patch("cloudinit.net.sys_netdev_info") + @mock.patch("cloudinit.net.read_sys_net") @mock.patch("cloudinit.net.get_devicelist") def test_default_generation(self, mock_get_devicelist, - mock_sys_netdev_info, + mock_read_sys_net, mock_sys_dev_path): tmp_dir = tempfile.mkdtemp() self.addCleanup(shutil.rmtree, tmp_dir) _setup_test(tmp_dir, mock_get_devicelist, - mock_sys_netdev_info, mock_sys_dev_path) + mock_read_sys_net, mock_sys_dev_path) network_cfg = net.generate_fallback_config() ns = network_state.parse_net_config_data(network_cfg, ++++++ cloud-init-no-dmidecode-on-ppc64.patch ++++++ --- /var/tmp/diff_new_pack.6XNG09/_old 2016-11-12 13:02:34.000000000 +0100 +++ /var/tmp/diff_new_pack.6XNG09/_new 2016-11-12 13:02:34.000000000 +0100 @@ -5,7 +5,18 @@ # running dmidecode can be problematic on some arches (LP: #1243287) uname_arch = os.uname()[4] - if uname_arch.startswith("arm") or uname_arch == "aarch64": -+ if uname_arch.startswith("arm") or uname_arch == "aarch64" or uname_arch.startswith("ppc"): ++ if uname_arch.startswith("arm") or uname_arch.startswith("ppc"): LOG.debug("dmidata is not supported on %s", uname_arch) return None +--- tests/unittests/test_util.py.orig ++++ tests/unittests/test_util.py +@@ -384,7 +384,7 @@ class TestReadDMIData(helpers.Filesystem + dmi_name = 'use-dmidecode' + self._configure_dmidecode_return(dmi_name, dmi_val) + +- expected = {'armel': None, 'aarch64': None, 'x86_64': dmi_val} ++ expected = {'armel': None, 'aarch64': dmi_val, 'x86_64': dmi_val} + found = {} + # we do not run the 'dmi-decode' binary on some arches + # verify that anything requested that is not in the sysfs dir ++++++ cloud-init-service.patch ++++++ --- /var/tmp/diff_new_pack.6XNG09/_old 2016-11-12 13:02:34.000000000 +0100 +++ /var/tmp/diff_new_pack.6XNG09/_new 2016-11-12 13:02:34.000000000 +0100 @@ -1,13 +1,51 @@ --- systemd/cloud-init.service.orig +++ systemd/cloud-init.service -@@ -1,8 +1,8 @@ +@@ -1,9 +1,18 @@ [Unit] Description=Initial cloud-init job (metadata service crawler) -After=cloud-init-local.service networking.service -+After=cloud-init-local.service network.service - Before=network-online.target sshd.service sshd-keygen.service systemd-user-sessions.service +-Before=network-online.target sshd.service sshd-keygen.service systemd-user-sessions.service -Requires=networking.service -+Requires=network.service - Wants=local-fs.target cloud-init-local.service sshd.service sshd-keygen.service +-Wants=local-fs.target cloud-init-local.service sshd.service sshd-keygen.service ++DefaultDependencies=no ++Wants=cloud-init-local.service ++Wants=local-fs.target ++Wants=sshd-keygen.service ++Wants=sshd.service ++After=cloud-init-local.service ++After=wicked.service ++Requires=wicked.service ++Before=network-online.target ++Before=sshd-keygen.service ++Before=sshd.service ++Before=systemd-user-sessions.service ++Conflicts=shutdown.target [Service] + Type=oneshot +--- systemd/cloud-init-local.service.orig ++++ systemd/cloud-init-local.service +@@ -4,9 +4,10 @@ DefaultDependencies=no + Wants=local-fs.target + Wants=network-pre.target + After=local-fs.target +-Conflicts=shutdown.target ++Before=basic.target + Before=network-pre.target + Before=shutdown.target ++Conflicts=shutdown.target + + [Service] + Type=oneshot +--- systemd/cloud-final.service.orig ++++ systemd/cloud-final.service +@@ -1,6 +1,8 @@ + [Unit] + Description=Execute cloud user/final scripts +-After=network-online.target cloud-config.service rc-local.service multi-user.target ++After=cloud-config.service ++After=network-online.target ++After=rc-local.service + Before=systemd-logind.service + Wants=network-online.target cloud-config.service + ++++++ cloud-init-sysconfig-netpathfix.patch ++++++ --- cloudinit/net/sysconfig.py.orig +++ cloudinit/net/sysconfig.py @@ -94,7 +94,7 @@ class ConfigMap(object): class Route(ConfigMap): """Represents a route configuration.""" - route_fn_tpl = '%(base)s/network-scripts/route-%(name)s' + route_fn_tpl = '%(base)s/network/route-%(name)s' def __init__(self, route_name, base_sysconf_dir): super(Route, self).__init__() @@ -119,7 +119,7 @@ class Route(ConfigMap): class NetInterface(ConfigMap): """Represents a sysconfig/networking-script (and its config + children).""" - iface_fn_tpl = '%(base)s/network-scripts/ifcfg-%(name)s' + iface_fn_tpl = '%(base)s/network/ifcfg-%(name)s' iface_types = { 'ethernet': 'Ethernet', ++++++ suseIntegratedHandler.patch ++++++ --- /var/tmp/diff_new_pack.6XNG09/_old 2016-11-12 13:02:34.000000000 +0100 +++ /var/tmp/diff_new_pack.6XNG09/_new 2016-11-12 13:02:34.000000000 +0100 @@ -1,9 +1,9 @@ --- /dev/null +++ cloudinit/distros/opensuse.py -@@ -0,0 +1,212 @@ +@@ -0,0 +1,226 @@ +# vi: ts=4 expandtab +# -+# Copyright (C) 2014 SUSE LLC ++# Copyright (C) 2016 SUSE LLC +# Copyright (C) 2013 Hewlett-Packard Development Company, L.P. +# +# Author: Robert Schweikert <[email protected]> @@ -33,30 +33,34 @@ + +from cloudinit.distros import net_util +from cloudinit.distros import rhel_util as rhutil ++#from cloudinit.net import sysconfig ++#from cloudinit.net.network_state import parse_net_config_data +from cloudinit.settings import PER_INSTANCE + +LOG = logging.getLogger(__name__) + +class Distro(distros.Distro): + clock_conf_fn = '/etc/sysconfig/clock' -+ locale_conf_fn = '/etc/sysconfig/language' -+ network_conf_fn = '/etc/sysconfig/network' + hostname_conf_fn = '/etc/HOSTNAME' + init_cmd = ['service'] ++ locale_conf_fn = '/etc/sysconfig/language' ++ network_conf_fn = '/etc/sysconfig/network' + network_script_tpl = '/etc/sysconfig/network/ifcfg-%s' + resolve_conf_fn = '/etc/resolv.conf' + route_conf_tpl = '/etc/sysconfig/network/ifroute-%s' -+ tz_local_fn = '/etc/localtime' ++ systemd_hostname_conf_fn = '/etc/hostname' + systemd_locale_conf_fn = '/etc/locale.conf' ++ tz_local_fn = '/etc/localtime' + + def __init__(self, name, cfg, paths): + distros.Distro.__init__(self, name, cfg, paths) ++# self._net_renderer = sysconfig.Renderer() + # This will be used to restrict certain + # calls from repeatly happening (when they + # should only happen say once per instance...) + self._runner = helpers.Runners(paths) -+ cfg['ssh_svcname'] = 'sshd' + self.osfamily = 'suse' ++ cfg['ssh_svcname'] = 'sshd' + self.systemdDist = util.which('systemctl') + if self.systemdDist: + self.init_cmd = ['systemctl'] @@ -149,7 +153,10 @@ + return conf + + def _read_system_hostname(self): -+ host_fn = self.hostname_conf_fn ++ if self.systemdDist: ++ host_fn = self.systemd_hostname_conf_fn ++ else: ++ host_fn = self.hostname_conf_fn + return (host_fn, self._read_hostname(host_fn)) + + def _write_hostname(self, hostname, out_fn): @@ -213,6 +220,13 @@ + rhutil.update_resolve_conf_file(self.resolve_conf_fn, + nameservers, searchservers) + return dev_names ++ ++# New interface cannot yet be implemented/used as we have to figure out ++# how to have a distro specific renderer ++# def _write_network_config(self, netconfig): ++# ns = parse_net_config_data(netconfig) ++# self._net_renderer.render_network_state("/", ns) ++# return [] --- cloudinit/distros/sles.py.orig +++ cloudinit/distros/sles.py @@ -1,10 +1,9 @@
