Hello community,

here is the log from the commit of package cloud-init for openSUSE:Factory 
checked in at 2013-06-19 14:42:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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    2013-06-18 
10:29:24.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.cloud-init.new/cloud-init.changes       
2013-06-19 14:42:21.000000000 +0200
@@ -1,0 +2,14 @@
+Tue Jun 18 21:28:58 UTC 2013 - rschweik...@suse.com
+
+- integrate changes from HP
+  + update the sles handler, do not modify the util code integrate
+    routines directky into the sles handler
+    ~ add patch slesHandler.patch
+    ~ remove patch openSUSEHandler.diff
+  + add python dependencies
+    ~ python-argparse
+    ~ python-configobj
+    ~ python-oauth
+  + update the cloud-init config file 
+
+-------------------------------------------------------------------

Old:
----
  slesHandler.diff

New:
----
  slesHandler.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ cloud-init.spec ++++++
--- /var/tmp/diff_new_pack.LHpMQI/_old  2013-06-19 14:42:21.000000000 +0200
+++ /var/tmp/diff_new_pack.LHpMQI/_new  2013-06-19 14:42:21.000000000 +0200
@@ -28,10 +28,13 @@
 Source0:        %{component}-%{version}.tar.bz2
 Source1:        cloud.cfg.suse
 Patch0:         fixupSysVinit.patch
-Patch1:         slesHandler.diff
+Patch1:         slesHandler.patch
 Patch2:         openSUSEHandler.diff
+Requires:       python-argparse
 Requires:       python-boto
 Requires:       python-cheetah
+Requires:       python-configobj
+Requires:       python-oauth
 Requires:       python-prettytable
 Requires:       python-requests
 Requires:       python-xml
@@ -107,6 +110,14 @@
 mkdir -p %{buildroot}%{_defaultdocdir}
 mv %{buildroot}/usr/share/doc/%{component} %{buildroot}%{docdir}
 cp -a %{S:1} %{buildroot}/%{_sysconfdir}/cloud/cloud.cfg
+%if 0%{?suse_version}
+%if 0%{?sles_version} != 0
+sed -i s/INSERT_SUSE_DISTRO/sles/ %{buildroot}/%{_sysconfdir}/cloud/cloud.cfg
+%endif
+%if 0%{?sles_version} == 0
+sed -i s/INSERT_SUSE_DISTRO/opensuse/ 
%{buildroot}/%{_sysconfdir}/cloud/cloud.cfg
+%endif
+%endif
 
 # remove debian/ubuntu specific profile.d file (bnc#779553)
 rm -f %{buildroot}%{_sysconfdir}/profile.d/Z99-cloud-locale-test.sh

++++++ cloud.cfg.suse ++++++
--- /var/tmp/diff_new_pack.LHpMQI/_old  2013-06-19 14:42:21.000000000 +0200
+++ /var/tmp/diff_new_pack.LHpMQI/_new  2013-06-19 14:42:21.000000000 +0200
@@ -1,26 +1,35 @@
-# adapted default config for (open)SUSE systems
-user: root
-disable_root: False
-preserve_hostname: False
-cc_ready_cmd: [ /bin/true ]
+# Adapted default config for (open)SUSE systems
+
+users:
+ - root
+
+disable_root: false
+preserve_hostname: false
 syslog_fix_perms: root:root
-# datasource_list: ["NoCloud", "ConfigDrive", "OVF", "MAAS", "Ec2", 
"CloudStack"]
+mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
+ssh_genkeytypes: ['rsa', 'dsa']
 
+# The modules that run in the 'init' stage
 cloud_init_modules:
+ - migrator
  - bootcmd
+ - write-files
+ - resizefs
  - set_hostname
  - update_hostname
  - update_etc_hosts
  - ca-certs
  - rsyslog
+ - users-groups
  - ssh
 
+# The modules that run in the 'config' stage
 cloud_config_modules:
  - mounts
  - ssh-import-id
  - locale
  - set-passwords
- - landscape
+ - package-update-upgrade-install
  - timezone
  - puppet
  - chef
@@ -28,12 +37,25 @@
  - mcollective
  - disable-ec2-metadata
  - runcmd
+ - byobu
 
+# The modules that run in the 'final' stage
 cloud_final_modules:
  - rightscale_userdata
  - scripts-per-once
  - scripts-per-boot
  - scripts-per-instance
  - scripts-user
+ - ssh-authkey-fingerprints
  - keys-to-console
+ - phone-home
  - final-message
+ - power-state-change
+
+# System and/or distro specific settings
+system_info:
+   distro: INSERT_SUSE_DISTRO
+   paths:
+      cloud_dir: /var/lib/cloud/
+      templates_dir: /etc/cloud/templates/
+   ssh_svcname: sshd

++++++ slesHandler.patch ++++++
Index: cloud-init-0.7.2/cloudinit/config/cc_resolv_conf.py
===================================================================
--- cloud-init-0.7.2.orig/cloudinit/config/cc_resolv_conf.py    2013-06-18 
15:11:17.016476944 +0200
+++ cloud-init-0.7.2/cloudinit/config/cc_resolv_conf.py 2013-06-18 
15:11:55.760669066 +0200
@@ -1,8 +1,12 @@
 # vi: ts=4 expandtab
 #
 #    Copyright (C) 2013 Craig Tracey
+#    Copyright (C) 2013 SUSE LLC
+#    Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
 #
 #    Author: Craig Tracey <craigtra...@gmail.com>
+#    Author: Robert Schweikert <rjsch...@suse.com>
+#    Author: Juerg Haefliger <juerg.haefli...@hp.com>
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU General Public License version 3, as
@@ -53,7 +57,7 @@
 
 frequency = PER_INSTANCE
 
-distros = ['fedora', 'rhel']
+distros = ['fedora', 'opensuse', 'rhel', 'sles']
 
 
 def generate_resolv_conf(cloud, log, params):
Index: cloud-init-0.7.2/cloudinit/distros/__init__.py
===================================================================
--- cloud-init-0.7.2.orig/cloudinit/distros/__init__.py 2013-06-18 
15:11:16.996476840 +0200
+++ cloud-init-0.7.2/cloudinit/distros/__init__.py      2013-06-18 
15:12:18.848783546 +0200
@@ -1,13 +1,15 @@
 # vi: ts=4 expandtab
 #
 #    Copyright (C) 2012 Canonical Ltd.
-#    Copyright (C) 2012 Hewlett-Packard Development Company, L.P.
+#    Copyright (C) 2012, 2013 Hewlett-Packard Development Company, L.P.
 #    Copyright (C) 2012 Yahoo! Inc.
+#    Copyright (C) 2013 SUSE LLC
 #
 #    Author: Scott Moser <scott.mo...@canonical.com>
 #    Author: Juerg Haefliger <juerg.haefli...@hp.com>
 #    Author: Joshua Harlow <harlo...@yahoo-inc.com>
 #    Author: Ben Howard <ben.how...@canonical.com>
+#    Author: Robert Schweikert <rjsch...@suse.com>
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU General Public License version 3, as
@@ -38,7 +40,8 @@
 
 OSFAMILIES = {
     'debian': ['debian', 'ubuntu'],
-    'redhat': ['fedora', 'rhel']
+    'redhat': ['fedora', 'rhel'],
+    'suse': ['opensuse', 'sles']
 }
 
 LOG = logging.getLogger(__name__)
@@ -347,7 +350,8 @@
             try:
                 util.subp(adduser_cmd, logstring=x_adduser_cmd)
             except Exception as e:
-                util.logexc(LOG, "Failed to create user %s due to error.", e)
+                util.logexc(LOG, "Failed to create user %s due to error.",
+                            name)
                 raise e
 
         # Set password if plain-text password provided
@@ -358,10 +362,10 @@
         # lock account unless lock_password is False.
         if kwargs.get('lock_passwd', True):
             try:
-                util.subp(['passwd', '--lock', name])
+                util.subp(['passwd', '-l', name])
             except Exception as e:
-                util.logexc(LOG, ("Failed to disable password logins for"
-                            "user %s" % name), e)
+                util.logexc(LOG, "Failed to disable password logins for "
+                            "user %s", name)
                 raise e
 
         # Configure sudo access
@@ -385,7 +389,7 @@
         try:
             util.subp(cmd, pass_string, logstring="chpasswd for %s" % user)
         except Exception as e:
-            util.logexc(LOG, "Failed to set password for %s" % user)
+            util.logexc(LOG, "Failed to set password for %s", user)
             raise e
 
         return True
@@ -427,7 +431,7 @@
                     util.append_file(sudo_base, sudoers_contents)
                 LOG.debug("Added '#includedir %s' to %s" % (path, sudo_base))
             except IOError as e:
-                util.logexc(LOG, "Failed to write %s" % sudo_base, e)
+                util.logexc(LOG, "Failed to write %s", sudo_base)
                 raise e
         util.ensure_dir(path, 0750)
 
@@ -479,7 +483,7 @@
                 util.subp(group_add_cmd)
                 LOG.info("Created new group %s" % name)
             except Exception as e:
-                util.logexc("Failed to create group %s" % name, e)
+                util.logexc("Failed to create group %s", name)
 
         # Add members to the group, if so defined
         if len(members) > 0:
Index: cloud-init-0.7.2/cloudinit/distros/sles.py
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ cloud-init-0.7.2/cloudinit/distros/sles.py  2013-06-18 15:11:55.764669081 
+0200
@@ -0,0 +1,340 @@
+# vi: ts=4 expandtab
+#
+#    Copyright (C) 2013 SUSE LLC
+#    Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
+#
+#    Author: Robert Schweikert <rjsch...@suse.com>
+#    Author: Juerg Haefliger <juerg.haefli...@hp.com>
+#
+#    Leaning very heavily on the RHEL and Debian implementation
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License version 3, as
+#    published by the Free Software Foundation.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import os
+
+from cloudinit import distros
+
+from cloudinit.distros.parsers.hostname import HostnameConf
+from cloudinit.distros.parsers.resolv_conf import ResolvConf
+from cloudinit.distros.parsers.sys_conf import SysConf
+
+from cloudinit import helpers
+from cloudinit import log as logging
+from cloudinit import util
+
+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'
+    network_script_tpl = '/etc/sysconfig/network/ifcfg-%s'
+    resolve_conf_fn = '/etc/resolv.conf'
+    tz_local_fn = '/etc/localtime'
+    tz_zone_dir = '/usr/share/zoneinfo'
+
+    def __init__(self, name, cfg, paths):
+        distros.Distro.__init__(self, name, cfg, paths)
+        # 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)
+        self.osfamily = 'suse'
+
+    def install_packages(self, pkglist):
+        self.package_command('install', args='-l', pkgs=pkglist)
+
+    def _adjust_resolve(self, dns_servers, search_servers):
+        try:
+            r_conf = ResolvConf(util.load_file(self.resolve_conf_fn))
+            r_conf.parse()
+        except IOError:
+            util.logexc(LOG,
+                        "Failed at parsing %s reverting to an empty instance",
+                        self.resolve_conf_fn)
+            r_conf = ResolvConf('')
+            r_conf.parse()
+        if dns_servers:
+            for s in dns_servers:
+                try:
+                    r_conf.add_nameserver(s)
+                except ValueError:
+                    util.logexc(LOG, "Failed at adding nameserver %s", s)
+        if search_servers:
+            for s in search_servers:
+                try:
+                    r_conf.add_search_domain(s)
+                except ValueError:
+                    util.logexc(LOG, "Failed at adding search domain %s", s)
+        util.write_file(self.resolve_conf_fn, str(r_conf), 0644)
+
+    def _write_network(self, settings):
+        # Convert debian settings to ifcfg format
+        entries = translate_network(settings)
+        LOG.debug("Translated ubuntu style network settings %s into %s",
+                  settings, entries)
+        # Make the intermediate format as the suse format...
+        nameservers = []
+        searchservers = []
+        dev_names = entries.keys()
+        for (dev, info) in entries.iteritems():
+            net_fn = self.network_script_tpl % (dev)
+            mode = info.get('auto')
+            if mode and mode.lower() == 'true':
+                mode = 'auto'
+            else:
+                mode = 'manual'
+            net_cfg = {
+                'BOOTPROTO': info.get('bootproto'),
+                'BROADCAST': info.get('broadcast'),
+                'GATEWAY': info.get('gateway'),
+                'IPADDR': info.get('address'),
+                'LLADDR': info.get('hwaddress'),
+                'NETMASK': info.get('netmask'),
+                'STARTMODE': mode,
+                'USERCONTROL': 'no'
+            }
+            if dev != 'lo':
+                net_cfg['ETHERDEVICE'] = dev
+                net_cfg['ETHTOOL_OPTIONS'] = ''
+            else:
+                net_cfg['FIREWALL'] = 'no'
+            self._update_sysconfig_file(net_fn, net_cfg, True)
+            if 'dns-nameservers' in info:
+                nameservers.extend(info['dns-nameservers'])
+            if 'dns-search' in info:
+                searchservers.extend(info['dns-search'])
+        if nameservers or searchservers:
+            self._adjust_resolve(nameservers, searchservers)
+        return dev_names
+
+    def _update_sysconfig_file(self, fn, adjustments, allow_empty=False):
+        if not adjustments:
+            return
+        (exists, contents) = self._read_conf(fn)
+        updated_am = 0
+        for (k, v) in adjustments.items():
+            if v is None:
+                continue
+            v = str(v)
+            if len(v) == 0 and not allow_empty:
+                continue
+            contents[k] = v
+            updated_am += 1
+        if updated_am:
+            lines = [
+                str(contents),
+            ]
+            if not exists:
+                lines.insert(0, util.make_header())
+            util.write_file(fn, "\n".join(lines) + "\n", 0644)
+
+    def _read_conf(self, fn):
+        exists = False
+        try:
+            contents = util.load_file(fn).splitlines()
+            exists = True
+        except IOError:
+            contents = []
+        return (exists,
+                SysConf(contents))
+
+    def apply_locale(self, locale, out_fn=None):
+        if not out_fn:
+            out_fn = self.locale_conf_fn
+        locale_cfg = {
+            'RC_LANG': locale,
+        }
+        self._update_sysconfig_file(out_fn, locale_cfg)
+
+    def _select_hostname(self, hostname, fqdn):
+        # Prefer the short hostname over the long
+        # fully qualified domain name
+        if not hostname:
+            return fqdn
+        return hostname
+
+    def _write_hostname(self, hostname, out_fn):
+        conf = None
+        try:
+            # Try to update the previous one
+            # so lets see if we can read it first.
+            conf = self._read_hostname_conf(out_fn)
+        except IOError:
+            pass
+        if not conf:
+            conf = HostnameConf('')
+        conf.set_hostname(hostname)
+        util.write_file(out_fn, str(conf), 0644)
+
+    def _read_system_hostname(self):
+        host_fn = self.hostname_conf_fn
+        return (host_fn, self._read_hostname(host_fn))
+
+    def _read_hostname_conf(self, filename):
+        conf = HostnameConf(util.load_file(filename))
+        conf.parse()
+        return conf
+
+    def _read_hostname(self, filename, default=None):
+        hostname = None
+        try:
+            conf = self._read_hostname_conf(filename)
+            hostname = conf.hostname
+        except IOError:
+            pass
+        if not hostname:
+            return default
+        return hostname
+
+    def _bring_up_interfaces(self, device_names):
+        if device_names and 'all' in device_names:
+            raise RuntimeError(('Distro %s can not translate '
+                                'the device name "all"') % (self.name))
+        return distros.Distro._bring_up_interfaces(self, device_names)
+
+    def set_timezone(self, tz):
+        # TODO(harlowja): move this code into
+        # the parent distro...
+        tz_file = os.path.join(self.tz_zone_dir, str(tz))
+        if not os.path.isfile(tz_file):
+            raise RuntimeError(("Invalid timezone %s,"
+                                " no file found at %s") % (tz, tz_file))
+        # Adjust the sysconfig clock zone setting
+        clock_cfg = {
+            'TIMEZONE': str(tz),
+        }
+        self._update_sysconfig_file(self.clock_conf_fn, clock_cfg)
+        # This ensures that the correct tz will be used for the system
+        util.copy(tz_file, self.tz_local_fn)
+
+    def package_command(self, command, args=None, pkgs=None):
+        if pkgs is None:
+            pkgs = []
+
+        cmd = ['zypper']
+        # No user interaction possible, enable non-interactive mode
+        cmd.append('-t')
+        # Do not check the keys, we assume that the initial repos configured
+        # in the image can be trusted
+        cmd.append('--no-gpg-checks')
+
+        # Comand is the operation, such as install
+        cmd.append(command)
+
+        # args are the arguments to the command, not global options
+        if args and isinstance(args, str):
+            cmd.append(args)
+        elif args and isinstance(args, list):
+            cmd.extend(args)
+
+        pkglist = util.expand_package_list('%s-%s', pkgs)
+        cmd.extend(pkglist)
+
+        # Allow the output of this to flow outwards (ie not be captured)
+        util.subp(cmd, capture=False)
+
+    def update_package_sources(self):
+        self._runner.run("update-sources", self.package_command,
+                         ['refresh'], freq=PER_INSTANCE)
+
+
+def translate_network(settings):
+    # Translate Debian based distro interface blobs as given in
+    # /etc/network/interfaces to an equivalent format for distributions
+    # that use ifcfg-* style (RedHat and SUSE). (copied from rhel.py)
+    # Get the standard cmd, args from the ubuntu format
+    entries = []
+    for line in settings.splitlines():
+        line = line.strip()
+        if not line or line.startswith("#"):
+            continue
+        split_up = line.split(None, 1)
+        if len(split_up) <= 1:
+            continue
+        entries.append(split_up)
+    # Figure out where each iface section is
+    ifaces = []
+    consume = {}
+    for (cmd, args) in entries:
+        if cmd == 'iface':
+            if consume:
+                ifaces.append(consume)
+                consume = {}
+            consume[cmd] = args
+        else:
+            consume[cmd] = args
+    # Check if anything left over to consume
+    absorb = False
+    for (cmd, args) in consume.iteritems():
+        if cmd == 'iface':
+            absorb = True
+    if absorb:
+        ifaces.append(consume)
+    # Now translate
+    real_ifaces = {}
+    for info in ifaces:
+        if 'iface' not in info:
+            continue
+        iface_details = info['iface'].split(None)
+        dev_name = None
+        if len(iface_details) >= 1:
+            dev = iface_details[0].strip().lower()
+            if dev:
+                dev_name = dev
+        if not dev_name:
+            continue
+        iface_info = {}
+        if len(iface_details) >= 3:
+            proto_type = iface_details[2].strip().lower()
+            # Seems like this can be 'loopback' which we don't
+            # really care about
+            if proto_type in ['dhcp', 'static']:
+                iface_info['bootproto'] = proto_type
+        # These can just be copied over
+        for k in ['netmask', 'address', 'gateway', 'broadcast']:
+            if k in info:
+                val = info[k].strip().lower()
+                if val:
+                    iface_info[k] = val
+        # Name server info provided??
+        if 'dns-nameservers' in info:
+            iface_info['dns-nameservers'] = info['dns-nameservers'].split()
+        # Name server search info provided??
+        if 'dns-search' in info:
+            iface_info['dns-search'] = info['dns-search'].split()
+        # Is any mac address spoofing going on??
+        if 'hwaddress' in info:
+            hw_info = info['hwaddress'].lower().strip()
+            hw_split = hw_info.split(None, 1)
+            if len(hw_split) == 2 and hw_split[0].startswith('ether'):
+                hw_addr = hw_split[1]
+                if hw_addr:
+                    iface_info['hwaddress'] = hw_addr
+        real_ifaces[dev_name] = iface_info
+    # Check for those that should be started on boot via 'auto'
+    for (cmd, args) in entries:
+        if cmd == 'auto':
+            # Seems like auto can be like 'auto eth0 eth0:1' so just get the
+            # first part out as the device name
+            args = args.split(None)
+            if not args:
+                continue
+            dev_name = args[0].strip().lower()
+            if dev_name in real_ifaces:
+                real_ifaces[dev_name]['auto'] = True
+    return real_ifaces
Index: cloud-init-0.7.2/templates/hosts.suse.tmpl
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ cloud-init-0.7.2/templates/hosts.suse.tmpl  2013-06-18 15:11:55.764669081 
+0200
@@ -0,0 +1,24 @@
+#*
+    This file /etc/cloud/templates/hosts.suse.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.suse.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 localhost
+
+# The following lines are desirable for IPv6 capable hosts
+::1 localhost ipv6-localhost ipv6-loopback
+fe00::0 ipv6-localnet
+
+ff00::0 ipv6-mcastprefix
+ff02::1 ipv6-allnodes
+ff02::2 ipv6-allrouters
+ff02::3 ipv6-allhosts
-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to