Hello community, here is the log from the commit of package cloud-init for openSUSE:Factory checked in at 2018-03-28 10:34:25 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cloud-init (Old) and /work/SRC/openSUSE:Factory/.cloud-init.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cloud-init" Wed Mar 28 10:34:25 2018 rev:49 rq:591769 version:18.1 Changes: -------- --- /work/SRC/openSUSE:Factory/cloud-init/cloud-init.changes 2018-02-16 21:46:29.507150452 +0100 +++ /work/SRC/openSUSE:Factory/.cloud-init.new/cloud-init.changes 2018-03-28 10:34:30.446299784 +0200 @@ -1,0 +2,64 @@ +Wed Mar 21 22:27:40 UTC 2018 - [email protected] + +- Update to version 18.1 (bsc#1085787, bsc#1084749) + + Forward port cloud-init-python2-sigpipe.patch + + Forward port 0003-Distro-dependent-chrony-config-file.patch + partial integration into 0001-Support-chrony-configuration-lp-1731619.patch + + Forward port cloud-init-no-python-linux-dist.patch + + Remove 0002-Disable-method-deprecation-warning-for-pylint.patch + use new cloud-init internal distro detection code + + Remove cloud-init-resize-ro-btrfs.patch included upstream + + Remove 0001-Set-syslog_fix_perms-for-SUSE-distro-addresses-bsc-1.patch + included upstream + + OVF: Fix VMware support for 64-bit platforms. [Sankar Tanguturi] + + ds-identify: Fix searching for iso9660 OVF cdroms. (LP: #1749980) + + SUSE: Fix groups used for ownership of cloud-init.log [Robert Schweikert] + + ds-identify: check /writable/system-data/ for nocloud seed. + (LP: #1747070) + + tests: run nosetests in cloudinit/ directory, fix py26 fallout. + + tools: run-centos: git clone rather than tar. + + tests: add support for logs with lxd from snap and future lxd 3. + (LP: #1745663) + + EC2: Fix get_instance_id called against cached datasource pickle. + (LP: #1748354) + + cli: fix cloud-init status to report running when before result.json + (LP: #1747965) + + net: accept network-config in netplan format for renaming interfaces + (LP: #1709715) + + Fix ssh keys validation in ssh_util [Tatiana Kholkina] + + docs: Update RTD content for cloud-init subcommands. + + OVF: Extend well-known labels to include OVFENV. (LP: #1698669) + + Fix potential cases of uninitialized variables. (LP: #1744796) + + tests: Collect script output as binary, collect systemd journal, fix lxd. + + HACKING.rst: mention setting user name and email via git config. + + Azure VM Preprovisioning support. [Douglas Jordan] (LP: #1734991) + + tools/read-version: Fix read-version when in a git worktree. + + docs: Fix typos in docs and one debug message. [Florian Grignon] + + btrfs: support resizing if root is mounted ro. + [Robert Schweikert] (LP: #1734787) + + OpenNebula: Improve network configuration support. + [Akihiko Ota] (LP: #1719157, #1716397, #1736750) + + tests: Fix EC2 Platform to return console output as bytes. + + tests: Fix attempted use of /run in a test case. + + GCE: Improvements and changes to ssh key behavior for default user. + [Max Illfelder] (LP: #1670456, #1707033, #1707037, #1707039) + + subp: make ProcessExecutionError have expected types in stderr, stdout. + + tests: when querying ntp server, do not do dns resolution. + + Recognize uppercase vfat disk labels [James Penick] (LP: #1598783) + + tests: remove zesty as supported OS to test [Joshua Powers] + + Do not log warning on config files that represent None. (LP: #1742479) + + tests: Use git hash pip dependency format for pylxd. + + tests: add integration requirements text file [Joshua Powers] + + MAAS: add check_instance_id based off oauth tokens. (LP: #1712680) + + tests: update apt sources list test [Joshua Powers] + + tests: clean up image properties [Joshua Powers] + + tests: rename test ssh keys to avoid appearance of leaking private keys. + [Joshua Powers] + + tests: Enable AWS EC2 Integration Testing [Joshua Powers] + + cli: cloud-init clean handles symlinks (LP: #1741093) + + SUSE: Add a basic test of network config rendering. [Robert Schweikert] + + Azure: Only bounce network when necessary. (LP: #1722668) + + lint: Fix lints seen by pylint version 1.8.1. + + cli: Fix error in cloud-init modules --mode=init. (LP: #1736600) + +------------------------------------------------------------------- Old: ---- 0001-Set-syslog_fix_perms-for-SUSE-distro-addresses-bsc-1.patch 0002-Disable-method-deprecation-warning-for-pylint.patch cloud-init-17.2.tar.gz cloud-init-resize-ro-btrfs.patch New: ---- cloud-init-18.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cloud-init.spec ++++++ --- /var/tmp/diff_new_pack.bXzzFv/_old 2018-03-28 10:34:31.914246985 +0200 +++ /var/tmp/diff_new_pack.bXzzFv/_new 2018-03-28 10:34:31.918246842 +0200 @@ -18,7 +18,7 @@ %global configver 0.7 Name: cloud-init -Version: 17.2 +Version: 18.1 Release: 0 License: GPL-3.0 and AGPL-3.0 Summary: Cloud node initialization tool @@ -37,15 +37,11 @@ Patch27: cloud-init-sysconfig-netpathfix.patch Patch29: datasourceLocalDisk.patch Patch34: cloud-init-tests-set-exec.patch -# FIXME cloud-init-resize-ro-btrfs.patch -# proposed for upstream merge (lp#1734787) -Patch36: cloud-init-resize-ro-btrfs.patch # FIXME chrony support upstream # These patches represent a working appraoch to supporting chrony # Upstream is seeking a significant re-write which is not likely to happen # before we need chrony support Patch37: 0001-Support-chrony-configuration-lp-1731619.patch -Patch38: 0002-Disable-method-deprecation-warning-for-pylint.patch Patch39: 0003-Distro-dependent-chrony-config-file.patch # FIXME switch to iproute2 tools # Proposed for merging upstream @@ -55,9 +51,6 @@ Patch41: cloud-init-no-python-linux-dist.patch # Disable OVF tests Patch42: cloud-init-skip-ovf-tests.patch -# FIXME do not use the default user:groups for log file permission settings -# Proposed for merging upstream -Patch43: 0001-Set-syslog_fix_perms-for-SUSE-distro-addresses-bsc-1.patch BuildRequires: fdupes BuildRequires: filesystem # pkg-config is needed to find correct systemd unit dir @@ -196,14 +189,11 @@ %patch27 %patch29 -p0 %patch34 -%patch36 -%patch37 -p1 -%patch38 -p1 +%patch37 %patch39 -p1 %patch40 -p1 %patch41 %patch42 -%patch43 -p1 %build %if 0%{?suse_version} && 0%{?suse_version} <= 1315 ++++++ 0001-Support-chrony-configuration-lp-1731619.patch ++++++ ++++ 741 lines (skipped) ++++ between /work/SRC/openSUSE:Factory/cloud-init/0001-Support-chrony-configuration-lp-1731619.patch ++++ and /work/SRC/openSUSE:Factory/.cloud-init.new/0001-Support-chrony-configuration-lp-1731619.patch ++++++ 0003-Distro-dependent-chrony-config-file.patch ++++++ --- /var/tmp/diff_new_pack.bXzzFv/_old 2018-03-28 10:34:31.962245259 +0200 +++ /var/tmp/diff_new_pack.bXzzFv/_new 2018-03-28 10:34:31.966245115 +0200 @@ -1,67 +1,6 @@ -From 42cb1841035befa5b5823b3321c8fe92f2cb9087 Mon Sep 17 00:00:00 2001 -From: Robert Schweikert <[email protected]> -Date: Mon, 18 Dec 2017 14:54:10 -0500 -Subject: [PATCH 3/3] - Distro dependent chrony config file + We all like to - stor ethe drift file in different places and name it differently :( - ---- - cloudinit/config/cc_ntp.py | 8 +++++-- - ...{chrony.conf.tmpl => chrony.conf.opensuse.tmpl} | 0 - templates/chrony.conf.sles.tmpl | 25 ++++++++++++++++++++++ - 3 files changed, 31 insertions(+), 2 deletions(-) - rename templates/{chrony.conf.tmpl => chrony.conf.opensuse.tmpl} (100%) - create mode 100644 templates/chrony.conf.sles.tmpl - -diff --git a/cloudinit/config/cc_ntp.py b/cloudinit/config/cc_ntp.py -index 2f662a9e..1db648bc 100644 ---- a/cloudinit/config/cc_ntp.py -+++ b/cloudinit/config/cc_ntp.py -@@ -50,6 +50,7 @@ schema = { - 'examples': [ - dedent("""\ - ntp: -+ enabled: true - pools: [0.int.pool.ntp.org, 1.int.pool.ntp.org, ntp.myorg.org] - servers: - - ntp.server.local -@@ -61,6 +62,9 @@ schema = { - 'ntp': { - 'type': ['object', 'null'], - 'properties': { -+ 'enabled': { -+ "type": "boolean" -+ }, - 'pools': { - 'type': 'array', - 'items': { -@@ -109,7 +113,7 @@ def handle(name, cfg, cloud, log, _args): - if not isinstance(ntp_cfg, (dict)): - raise RuntimeError(("'ntp' key existed in config," - " but not a dictionary type," -- " is a %s %instead"), type_utils.obj_name(ntp_cfg)) -+ " is a %s instead"), type_utils.obj_name(ntp_cfg)) - - if ntp_cfg.get('enabled') and ntp_cfg.get('enabled') == 'true': - cloud.distro.set_timesync_client() -@@ -129,7 +133,7 @@ def handle(name, cfg, cloud, log, _args): - template_name = 'timesyncd.conf' - elif client_name == 'chrony': - confpath = CHRONY_CONF_FILE -- template_name = 'chrony.conf' -+ template_name = 'chrony.conf.%s' % cloud.distro.name - else: - if ntp_installable(): - service_name = 'ntp' -diff --git a/templates/chrony.conf.tmpl b/templates/chrony.conf.opensuse.tmpl -similarity index 100% -rename from templates/chrony.conf.tmpl -rename to templates/chrony.conf.opensuse.tmpl -diff --git a/templates/chrony.conf.sles.tmpl b/templates/chrony.conf.sles.tmpl -new file mode 100644 -index 00000000..38e84d85 --- /dev/null -+++ b/templates/chrony.conf.sles.tmpl -@@ -0,0 +1,25 @@ ++++ templates/chrony.conf.sles.tmpl +@@ -0,0 +1,24 @@ +## template:jinja +# cloud-init generated file +# See chrony.conf(5) @@ -86,7 +25,30 @@ + +# Enable kernel synchronization of the real-time clock (RTC). +rtcsync +--- /dev/null ++++ templates/chrony.conf.opensuse.tmpl +@@ -0,0 +1,24 @@ ++## template:jinja ++# cloud-init generated file ++# See chrony.conf(5) ++ ++{% if pools %}# pools ++{% endif %} ++{% for pool in pools -%} ++pool {{pool}} iburst ++{% endfor %} ++{%- if servers %}# servers ++{% endif %} ++{% for server in servers -%} ++server {{server}} iburst ++{% endfor %} ++ ++# Record the rate at which the the system clock gains/losses time ++driftfile /var/lib/chrony/drift + --- -2.13.6 - ++# Allow the system clock to be stepped in the first three updates ++# if its offset is larger than 1 second. ++makestep 1.0 3 ++ ++# Enable kernel synchronization of the real-time clock (RTC). ++rtcsync ++++++ cloud-init-17.2.tar.gz -> cloud-init-18.1.tar.gz ++++++ ++++ 6292 lines of diff (skipped) ++++++ cloud-init-no-python-linux-dist.patch ++++++ --- /var/tmp/diff_new_pack.bXzzFv/_old 2018-03-28 10:34:32.298233175 +0200 +++ /var/tmp/diff_new_pack.bXzzFv/_new 2018-03-28 10:34:32.298233175 +0200 @@ -1,25 +1,22 @@ ---- /dev/null +--- cloudinit/tests/test_util.py.orig +++ cloudinit/tests/test_util.py -@@ -0,0 +1,129 @@ -+# This file is part of cloud-init. See LICENSE file for license information. -+ -+"""Tests for cloudinit.util""" -+ -+import logging +@@ -3,10 +3,12 @@ + """Tests for cloudinit.util""" + + import logging +import platform -+ -+import cloudinit.util as util -+ -+from cloudinit.tests.helpers import CiTestCase, mock + + import cloudinit.util as util + + from cloudinit.tests.helpers import CiTestCase, mock +from textwrap import dedent -+ -+LOG = logging.getLogger(__name__) -+ -+MOUNT_INFO = [ -+ '68 0 8:3 / / ro,relatime shared:1 - btrfs /dev/sda1 ro,attr2,inode64', -+ '153 68 254:0 / /home rw,relatime shared:101 - xfs /dev/sda2 rw,attr2' -+] -+ + + LOG = logging.getLogger(__name__) + +@@ -15,6 +17,29 @@ MOUNT_INFO = [ + '153 68 254:0 / /home rw,relatime shared:101 - xfs /dev/sda2 rw,attr2' + ] + +OS_RELEASE_SLES = dedent("""\ +NAME="SLES"\n +VERSION="12-SP3"\n @@ -43,35 +40,13 @@ +UBUNTU_CODENAME=xenial\n +""") + -+ -+class TestUtil(CiTestCase): -+ -+ def test_parse_mount_info_no_opts_no_arg(self): -+ result = util.parse_mount_info('/home', MOUNT_INFO, LOG) -+ self.assertEqual(('/dev/sda2', 'xfs', '/home'), result) -+ -+ def test_parse_mount_info_no_opts_arg(self): -+ result = util.parse_mount_info('/home', MOUNT_INFO, LOG, False) -+ self.assertEqual(('/dev/sda2', 'xfs', '/home'), result) -+ -+ def test_parse_mount_info_with_opts(self): -+ result = util.parse_mount_info('/', MOUNT_INFO, LOG, True) -+ self.assertEqual( -+ ('/dev/sda1', 'btrfs', '/', 'ro,relatime'), -+ result -+ ) -+ -+ @mock.patch('cloudinit.util.get_mount_info') -+ def test_mount_is_rw(self, m_mount_info): -+ m_mount_info.return_value = ('/dev/sda1', 'btrfs', '/', 'rw,relatime') -+ is_rw = util.mount_is_read_write('/') -+ self.assertEqual(is_rw, True) -+ -+ @mock.patch('cloudinit.util.get_mount_info') -+ def test_mount_is_ro(self, m_mount_info): -+ m_mount_info.return_value = ('/dev/sda1', 'btrfs', '/', 'ro,relatime') -+ is_rw = util.mount_is_read_write('/') -+ self.assertEqual(is_rw, False) + + class TestUtil(CiTestCase): + +@@ -44,3 +69,61 @@ class TestUtil(CiTestCase): + m_mount_info.return_value = ('/dev/sda1', 'btrfs', '/', 'ro,relatime') + is_rw = util.mount_is_read_write('/') + self.assertEqual(is_rw, False) + + @mock.patch('os.path.exists') + @mock.patch('cloudinit.util.load_file') @@ -132,7 +107,7 @@ + return 1 --- cloudinit/util.py.orig +++ cloudinit/util.py -@@ -570,6 +570,43 @@ def get_cfg_option_str(yobj, key, defaul +@@ -576,6 +576,43 @@ def get_cfg_option_str(yobj, key, defaul def get_cfg_option_int(yobj, key, default=0): return int(get_cfg_option_str(yobj, key, default=default)) @@ -176,7 +151,7 @@ def system_info(): info = { -@@ -578,19 +615,19 @@ def system_info(): +@@ -584,19 +621,19 @@ def system_info(): 'release': platform.release(), 'python': platform.python_version(), 'uname': platform.uname(), @@ -199,82 +174,9 @@ var = 'suse' else: var = 'linux' -@@ -2053,7 +2090,7 @@ def expand_package_list(version_fmt, pkg - return pkglist - - --def parse_mount_info(path, mountinfo_lines, log=LOG): -+def parse_mount_info(path, mountinfo_lines, log=LOG, get_mnt_opts=False): - """Return the mount information for PATH given the lines from - /proc/$$/mountinfo.""" - -@@ -2115,11 +2152,16 @@ def parse_mount_info(path, mountinfo_lin - - match_mount_point = mount_point - match_mount_point_elements = mount_point_elements -+ mount_options = parts[5] - -- if devpth and fs_type and match_mount_point: -- return (devpth, fs_type, match_mount_point) -+ if get_mnt_opts: -+ if devpth and fs_type and match_mount_point and mount_options: -+ return (devpth, fs_type, match_mount_point, mount_options) - else: -- return None -+ if devpth and fs_type and match_mount_point: -+ return (devpth, fs_type, match_mount_point) -+ -+ return None - - - def parse_mtab(path): -@@ -2189,7 +2231,7 @@ def parse_mount(path): - return None - - --def get_mount_info(path, log=LOG): -+def get_mount_info(path, log=LOG, get_mnt_opts=False): - # Use /proc/$$/mountinfo to find the device where path is mounted. - # This is done because with a btrfs filesystem using os.stat(path) - # does not return the ID of the device. -@@ -2221,7 +2263,7 @@ def get_mount_info(path, log=LOG): - mountinfo_path = '/proc/%s/mountinfo' % os.getpid() - if os.path.exists(mountinfo_path): - lines = load_file(mountinfo_path).splitlines() -- return parse_mount_info(path, lines, log) -+ return parse_mount_info(path, lines, log, get_mnt_opts) - elif os.path.exists("/etc/mtab"): - return parse_mtab(path) - else: -@@ -2329,7 +2371,8 @@ def pathprefix2dict(base, required=None, - missing.append(f) - - if len(missing): -- raise ValueError("Missing required files: %s", ','.join(missing)) -+ raise ValueError( -+ 'Missing required files: {files}'.format(files=','.join(missing))) - - return ret - -@@ -2606,4 +2649,10 @@ def wait_for_files(flist, maxwait, naple - return need - - -+def mount_is_read_write(mount_point): -+ """Check whether the given mount point is mounted rw""" -+ result = get_mount_info(mount_point, get_mnt_opts=True) -+ mount_opts = result[-1].split(',') -+ return mount_opts[0] == 'rw' -+ - # vi: ts=4 expandtab --- setup.py.orig +++ setup.py -@@ -1,3 +1,4 @@ -+ - # Copyright (C) 2009 Canonical Ltd. - # Copyright (C) 2012 Yahoo! Inc. - # -@@ -25,7 +26,7 @@ from distutils.errors import DistutilsAr +@@ -25,7 +25,7 @@ from distutils.errors import DistutilsAr import subprocess RENDERED_TMPD_PREFIX = "RENDERED_TEMPD" @@ -283,7 +185,7 @@ def is_f(p): return os.path.isfile(p) -@@ -114,10 +115,20 @@ def render_tmpl(template): +@@ -114,10 +114,20 @@ def render_tmpl(template): atexit.register(shutil.rmtree, tmpd) bname = os.path.basename(template).rstrip(tmpl_ext) fpath = os.path.join(tmpd, bname) @@ -305,7 +207,7 @@ INITSYS_FILES = { 'sysvinit': [f for f in glob('sysvinit/redhat/*') if is_f(f)], -@@ -227,6 +238,19 @@ if not in_virtualenv(): +@@ -227,6 +237,19 @@ if not in_virtualenv(): for k in INITSYS_ROOTS.keys(): INITSYS_ROOTS[k] = "/" + INITSYS_ROOTS[k] @@ -325,7 +227,7 @@ data_files = [ (ETC + '/cloud', [render_tmpl("config/cloud.cfg.tmpl")]), (ETC + '/cloud/cloud.cfg.d', glob('config/cloud.cfg.d/*')), -@@ -259,7 +283,7 @@ requirements = read_requires() +@@ -259,7 +282,7 @@ requirements = read_requires() setuptools.setup( name='cloud-init', version=get_version(), ++++++ cloud-init-python2-sigpipe.patch ++++++ --- /var/tmp/diff_new_pack.bXzzFv/_old 2018-03-28 10:34:32.326232167 +0200 +++ /var/tmp/diff_new_pack.bXzzFv/_new 2018-03-28 10:34:32.330232023 +0200 @@ -1,5 +1,3 @@ -Index: cloudinit/util.py -=================================================================== --- cloudinit/util.py.orig +++ cloudinit/util.py @@ -35,6 +35,7 @@ import time @@ -10,13 +8,13 @@ from six.moves.urllib import parse as urlparse import six -@@ -1858,7 +1859,8 @@ def subp(args, data=None, rcs=None, env= - +@@ -1868,7 +1869,8 @@ def subp(args, data=None, rcs=None, env= + try: sp = subprocess.Popen(args, stdout=stdout, stderr=stderr, stdin=stdin, - env=env, shell=shell) + env=env, shell=shell, + preexec_fn=lambda: signal(SIGPIPE, SIG_DFL)) (out, err) = sp.communicate(data) - - # Just ensure blank instead of none. + except OSError as e: + raise ProcessExecutionError(
