← Back to team overview

cloud-init-dev team mailing list archive

[Merge] lp:~vlastimil-holer/cloud-init/net-reconfigure into lp:cloud-init

 

Scott Moser has proposed merging lp:~vlastimil-holer/cloud-init/net-reconfigure into lp:cloud-init.

Requested reviews:
  cloud init development team (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~vlastimil-holer/cloud-init/net-reconfigure/+merge/186352
-- 
https://code.launchpad.net/~vlastimil-holer/cloud-init/net-reconfigure/+merge/186352
Your team cloud init development team is requested to review the proposed merge of lp:~vlastimil-holer/cloud-init/net-reconfigure into lp:cloud-init.
=== modified file 'cloudinit/distros/__init__.py'
--- cloudinit/distros/__init__.py	2013-09-11 12:30:35 +0000
+++ cloudinit/distros/__init__.py	2013-09-18 14:56:08 +0000
@@ -63,7 +63,7 @@
         raise NotImplementedError()
 
     @abc.abstractmethod
-    def _write_network(self, settings):
+    def _write_network(self, settings, pretend=False):
         # In the future use the http://fedorahosted.org/netcf/
         # to write this blob out in a distro format
         raise NotImplementedError()
@@ -112,6 +112,12 @@
                                         mirror_info=arch_info)
 
     def apply_network(self, settings, bring_up=True):
+        # List newly configured devices and put them
+        # down before new configuration is written to disk,
+        if bring_up:
+            dev_names = self._write_network(settings, pretend=True)
+            self._bring_down_interfaces(dev_names)
+
         # Write it out
         dev_names = self._write_network(settings)
         # Now try to bring them up
@@ -266,9 +272,9 @@
             contents.write("%s\n" % (eh))
             util.write_file(self.hosts_fn, contents.getvalue(), mode=0644)
 
-    def _bring_up_interface(self, device_name):
-        cmd = ['ifup', device_name]
-        LOG.debug("Attempting to run bring up interface %s using command %s",
+    def _bring_interface(self, device_name, command):
+        cmd = [command, device_name]
+        LOG.debug("Attempting to manage interface %s using command %s",
                    device_name, cmd)
         try:
             (_out, err) = util.subp(cmd)
@@ -279,15 +285,27 @@
             util.logexc(LOG, "Running interface command %s failed", cmd)
             return False
 
-    def _bring_up_interfaces(self, device_names):
+    def _bring_up_interface(self, device_name):
+        return self._bring_interface(device_name, command='ifup')
+
+    def _bring_down_interface(self, device_name):
+        return self._bring_interface(device_name, command='ifdown')
+
+    def _bring_interfaces(self, device_names, cb):
         am_failed = 0
         for d in device_names:
-            if not self._bring_up_interface(d):
+            if not cb(d):
                 am_failed += 1
         if am_failed == 0:
             return True
         return False
 
+    def _bring_up_interfaces(self, device_names):
+        return self._bring_interfaces(device_names, self._bring_up_interface)
+
+    def _bring_down_interfaces(self, device_names):
+        return self._bring_interfaces(device_names, self._bring_down_interface)
+
     def get_default_user(self):
         return self.get_option('default_user')
 

=== modified file 'cloudinit/distros/debian.py'
--- cloudinit/distros/debian.py	2013-09-04 06:51:51 +0000
+++ cloudinit/distros/debian.py	2013-09-18 14:56:08 +0000
@@ -70,19 +70,28 @@
         self.update_package_sources()
         self.package_command('install', pkgs=pkglist)
 
-    def _write_network(self, settings):
-        util.write_file(self.network_conf_fn, settings)
+    def _write_network(self, settings, pretend=False):
+        if not pretend:
+            util.write_file(self.network_conf_fn, settings)
         return ['all']
 
-    def _bring_up_interfaces(self, device_names):
+    def _bring_interfaces(self, device_names, cb):
         use_all = False
         for d in device_names:
             if d == 'all':
                 use_all = True
         if use_all:
-            return distros.Distro._bring_up_interface(self, '--all')
+            return cb(self, '--all')
         else:
-            return distros.Distro._bring_up_interfaces(self, device_names)
+            return cb(self, device_names)
+
+    def _bring_up_interfaces(self, device_names):
+        return self._bring_interfaces(device_names,
+                                      distros.Distro._bring_up_interface)
+
+    def _bring_down_interfaces(self, device_names):
+        return self._bring_interfaces(device_names,
+                                      distros.Distro._bring_down_interface)
 
     def _select_hostname(self, hostname, fqdn):
         # Prefer the short hostname over the long

=== modified file 'cloudinit/distros/rhel.py'
--- cloudinit/distros/rhel.py	2013-09-04 06:51:51 +0000
+++ cloudinit/distros/rhel.py	2013-09-18 14:56:08 +0000
@@ -61,7 +61,7 @@
     def install_packages(self, pkglist):
         self.package_command('install', pkgs=pkglist)
 
-    def _write_network(self, settings):
+    def _write_network(self, settings, pretend=False):
         # TODO(harlowja) fix this... since this is the ubuntu format
         entries = rhel_util.translate_network(settings)
         LOG.debug("Translated ubuntu style network settings %s into %s",
@@ -82,15 +82,16 @@
                 'MACADDR': info.get('hwaddress'),
                 'ONBOOT': _make_sysconfig_bool(info.get('auto')),
             }
-            rhel_util.update_sysconfig_file(net_fn, net_cfg)
+            if not pretend:
+                rhel_util.update_sysconfig_file(net_fn, net_cfg)
             if 'dns-nameservers' in info:
                 nameservers.extend(info['dns-nameservers'])
             if 'dns-search' in info:
                 searchservers.extend(info['dns-search'])
-        if nameservers or searchservers:
+        if (nameservers or searchservers) and not pretend:
             rhel_util.update_resolve_conf_file(self.resolve_conf_fn,
                                                nameservers, searchservers)
-        if dev_names:
+        if dev_names and not pretend:
             net_cfg = {
                 'NETWORKING': _make_sysconfig_bool(True),
             }
@@ -154,11 +155,19 @@
             else:
                 return default
 
-    def _bring_up_interfaces(self, device_names):
+    def _bring_interfaces(self, device_names, cb):
         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)
+        return cb(self, device_names)
+
+    def _bring_up_interfaces(self, device_names):
+        return self._bring_interfaces(device_names,
+                                      distros.Distro._bring_up_interfaces)
+
+    def _bring_down_interfaces(self, device_names):
+        return self._bring_interfaces(device_names,
+                                      distros.Distro._bring_down_interfaces)
 
     def set_timezone(self, tz):
         tz_file = self._find_tz_file(tz)

=== modified file 'cloudinit/distros/sles.py'
--- cloudinit/distros/sles.py	2013-08-06 10:36:30 +0000
+++ cloudinit/distros/sles.py	2013-09-18 14:56:08 +0000
@@ -52,7 +52,7 @@
     def install_packages(self, pkglist):
         self.package_command('install', args='-l', pkgs=pkglist)
 
-    def _write_network(self, settings):
+    def _write_network(self, settings, pretend=False):
         # Convert debian settings to ifcfg format
         entries = rhel_util.translate_network(settings)
         LOG.debug("Translated ubuntu style network settings %s into %s",
@@ -83,12 +83,13 @@
                 net_cfg['ETHTOOL_OPTIONS'] = ''
             else:
                 net_cfg['FIREWALL'] = 'no'
-            rhel_util.update_sysconfig_file(net_fn, net_cfg, True)
+            if not pretend:
+                rhel_util.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:
+        if (nameservers or searchservers) and not pretend:
             rhel_util.update_resolve_conf_file(self.resolve_conf_fn,
                                                nameservers, searchservers)
         return dev_names
@@ -141,11 +142,19 @@
             return default
         return hostname
 
-    def _bring_up_interfaces(self, device_names):
+    def _bring_interfaces(self, device_names, cb):
         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)
+        return cb(self, device_names)
+
+    def _bring_up_interfaces(self, device_names):
+        return self._bring_interfaces(device_names,
+                                      distros.Distro._bring_up_interfaces)
+
+    def _bring_down_interfaces(self, device_names):
+        return self._bring_interfaces(device_names,
+                                      distros.Distro._bring_down_interfaces)
 
     def set_timezone(self, tz):
         tz_file = self._find_tz_file(tz)


Follow ups