6164e0a
diff -rup cloud-init-17.1.orig/cloudinit/net/sysconfig.py cloud-init-17.1/cloudinit/net/sysconfig.py
6164e0a
--- cloud-init-17.1.orig/cloudinit/net/sysconfig.py	2018-03-26 19:22:35.693111559 +0200
8bc9d61
+++ cloud-init-17.1/cloudinit/net/sysconfig.py	2018-03-26 23:47:41.424803588 +0200
8bc9d61
@@ -586,7 +586,17 @@ class Renderer(renderer.Renderer):
8bc9d61
 
8bc9d61
         # always write /etc/sysconfig/network configuration
8bc9d61
         sysconfig_path = util.target_path(target, "etc/sysconfig/network")
8bc9d61
-        netcfg = [_make_header(), 'NETWORKING=yes']
6164e0a
+        # Make sure that existing lines, other than overriding ones, remain
8bc9d61
+        netcfg = []
6164e0a
+        for line in util.load_file(sysconfig_path, quiet=True).split('\n'):
8bc9d61
+            if 'cloud-init' in line:
8bc9d61
+                break
6164e0a
+            if not line.startswith(('NETWORKING=',
6164e0a
+                                    'IPV6_AUTOCONF=',
6164e0a
+                                    'NETWORKING_IPV6=')):
6164e0a
+                netcfg.append(line)
8bc9d61
+        # Now generate the cloud-init portion of sysconfig/network
8bc9d61
+        netcfg.extend([_make_header(), 'NETWORKING=yes'])
8bc9d61
         if network_state.use_ipv6:
8bc9d61
             netcfg.append('NETWORKING_IPV6=yes')
8bc9d61
             netcfg.append('IPV6_AUTOCONF=no')
6164e0a
diff -rup cloud-init-17.1.orig/tests/unittests/test_distros/test_netconfig.py cloud-init-17.1/tests/unittests/test_distros/test_netconfig.py
6164e0a
--- cloud-init-17.1.orig/tests/unittests/test_distros/test_netconfig.py	2018-03-26 19:22:35.717111557 +0200
6164e0a
+++ cloud-init-17.1/tests/unittests/test_distros/test_netconfig.py	2018-03-26 22:08:25.008717651 +0200
6164e0a
@@ -384,6 +384,82 @@ hn0: flags=8843
6164e0a
             buf.write(content)
6164e0a
             write_bufs[filename] = buf
6164e0a
 
6164e0a
+        def replace_load_file(filename, *args, **kwargs):
6164e0a
+            if filename == '/etc/sysconfig/network':
6164e0a
+                return 'TEST=yes\nTEST2=yes'
6164e0a
+            else:
6164e0a
+                return ''
6164e0a
+
6164e0a
+        with ExitStack() as mocks:
6164e0a
+            mocks.enter_context(
6164e0a
+                mock.patch.object(util, 'write_file', replace_write))
6164e0a
+            mocks.enter_context(
6164e0a
+                mock.patch.object(util, 'load_file', replace_load_file))
6164e0a
+            mocks.enter_context(
6164e0a
+                mock.patch.object(os.path, 'isfile', return_value=False))
6164e0a
+
6164e0a
+            rh_distro.apply_network(BASE_NET_CFG, False)
6164e0a
+
6164e0a
+            self.assertEqual(len(write_bufs), 4)
6164e0a
+            self.assertIn('/etc/sysconfig/network-scripts/ifcfg-lo',
6164e0a
+                          write_bufs)
6164e0a
+            write_buf = write_bufs['/etc/sysconfig/network-scripts/ifcfg-lo']
6164e0a
+            expected_buf = '''
6164e0a
+DEVICE="lo"
6164e0a
+ONBOOT=yes
6164e0a
+'''
6164e0a
+            self.assertCfgEquals(expected_buf, str(write_buf))
6164e0a
+            self.assertEqual(write_buf.mode, 0o644)
6164e0a
+
6164e0a
+            self.assertIn('/etc/sysconfig/network-scripts/ifcfg-eth0',
6164e0a
+                          write_bufs)
6164e0a
+            write_buf = write_bufs['/etc/sysconfig/network-scripts/ifcfg-eth0']
6164e0a
+            expected_buf = '''
6164e0a
+DEVICE="eth0"
6164e0a
+BOOTPROTO="static"
6164e0a
+NETMASK="255.255.255.0"
6164e0a
+IPADDR="192.168.1.5"
6164e0a
+ONBOOT=yes
6164e0a
+GATEWAY="192.168.1.254"
6164e0a
+BROADCAST="192.168.1.0"
6164e0a
+'''
6164e0a
+            self.assertCfgEquals(expected_buf, str(write_buf))
6164e0a
+            self.assertEqual(write_buf.mode, 0o644)
6164e0a
+
6164e0a
+            self.assertIn('/etc/sysconfig/network-scripts/ifcfg-eth1',
6164e0a
+                          write_bufs)
6164e0a
+            write_buf = write_bufs['/etc/sysconfig/network-scripts/ifcfg-eth1']
6164e0a
+            expected_buf = '''
6164e0a
+DEVICE="eth1"
6164e0a
+BOOTPROTO="dhcp"
6164e0a
+ONBOOT=yes
6164e0a
+'''
6164e0a
+            self.assertCfgEquals(expected_buf, str(write_buf))
6164e0a
+            self.assertEqual(write_buf.mode, 0o644)
6164e0a
+
6164e0a
+            self.assertIn('/etc/sysconfig/network', write_bufs)
6164e0a
+            write_buf = write_bufs['/etc/sysconfig/network']
6164e0a
+            expected_buf = '''
6164e0a
+# Created by cloud-init v. 0.7
6164e0a
+NETWORKING=yes
6164e0a
+TEST=yes
6164e0a
+TEST2=yes
6164e0a
+'''
6164e0a
+            self.assertCfgEquals(expected_buf, str(write_buf))
6164e0a
+            self.assertEqual(write_buf.mode, 0o644)
6164e0a
+
6164e0a
+    def test_simple_write_rh_no_extra(self):
6164e0a
+        rh_distro = self._get_distro('rhel')
6164e0a
+
6164e0a
+        write_bufs = {}
6164e0a
+
6164e0a
+        def replace_write(filename, content, mode=0o644, omode="wb"):
6164e0a
+            buf = WriteBuffer()
6164e0a
+            buf.mode = mode
6164e0a
+            buf.omode = omode
6164e0a
+            buf.write(content)
6164e0a
+            write_bufs[filename] = buf
6164e0a
+
6164e0a
         with ExitStack() as mocks:
6164e0a
             mocks.enter_context(
6164e0a
                 mock.patch.object(util, 'write_file', replace_write))
6164e0a
@@ -453,6 +529,12 @@ NETWORKING=yes
6164e0a
             buf.write(content)
6164e0a
             write_bufs[filename] = buf
6164e0a
 
6164e0a
+        def replace_load_file(filename, *args, **kwargs):
6164e0a
+            if filename == '/etc/sysconfig/network':
6164e0a
+                return 'TEST=yes\nTEST2=yes'
6164e0a
+            else:
6164e0a
+                return ''
6164e0a
+
6164e0a
         with ExitStack() as mocks:
6164e0a
             # sysconfig availability checks
6164e0a
             mocks.enter_context(
6164e0a
@@ -460,7 +542,7 @@ NETWORKING=yes
6164e0a
             mocks.enter_context(
6164e0a
                 mock.patch.object(util, 'write_file', replace_write))
6164e0a
             mocks.enter_context(
6164e0a
-                mock.patch.object(util, 'load_file', return_value=''))
6164e0a
+                mock.patch.object(util, 'load_file', replace_load_file))
6164e0a
             mocks.enter_context(
6164e0a
                 mock.patch.object(os.path, 'isfile', return_value=True))
6164e0a
 
6164e0a
@@ -509,6 +591,8 @@ USERCTL=no
6164e0a
             expected_buf = '''
6164e0a
 # Created by cloud-init v. 0.7
6164e0a
 NETWORKING=yes
6164e0a
+TEST=yes
6164e0a
+TEST2=yes
6164e0a
 '''
6164e0a
             self.assertCfgEquals(expected_buf, str(write_buf))
6164e0a
             self.assertEqual(write_buf.mode, 0o644)
6164e0a
@@ -525,13 +609,20 @@ NETWORKING=yes
6164e0a
             buf.write(content)
6164e0a
             write_bufs[filename] = buf
6164e0a
 
6164e0a
+        def replace_load_file(filename, *args, **kwargs):
6164e0a
+            if filename == '/etc/sysconfig/network':
6164e0a
+                return 'TEST=yes\nTEST2=yes'
6164e0a
+            else:
6164e0a
+                return ''
6164e0a
+
6164e0a
         with ExitStack() as mocks:
6164e0a
             mocks.enter_context(
6164e0a
                 mock.patch.object(util, 'write_file', replace_write))
6164e0a
             mocks.enter_context(
6164e0a
-                mock.patch.object(util, 'load_file', return_value=''))
6164e0a
+                mock.patch.object(util, 'load_file', replace_load_file))
6164e0a
             mocks.enter_context(
6164e0a
                 mock.patch.object(os.path, 'isfile', return_value=False))
6164e0a
+
6164e0a
             rh_distro.apply_network(BASE_NET_CFG_IPV6, False)
6164e0a
 
6164e0a
             self.assertEqual(len(write_bufs), 4)
6164e0a
@@ -587,6 +678,8 @@ IPV6_DEFAULTGW="2607:f0d0:1002:0011::1"
6164e0a
 NETWORKING=yes
6164e0a
 NETWORKING_IPV6=yes
6164e0a
 IPV6_AUTOCONF=no
6164e0a
+TEST=yes
6164e0a
+TEST2=yes
6164e0a
 '''
6164e0a
             self.assertCfgEquals(expected_buf, str(write_buf))
6164e0a
             self.assertEqual(write_buf.mode, 0o644)
6164e0a
@@ -604,13 +697,19 @@ IPV6_AUTOCONF=no
6164e0a
             buf.write(content)
6164e0a
             write_bufs[filename] = buf
6164e0a
 
6164e0a
+        def replace_load_file(filename, *args, **kwargs):
6164e0a
+            if filename == '/etc/sysconfig/network':
6164e0a
+                return 'TEST=yes\nTEST2=yes'
6164e0a
+            else:
6164e0a
+                return ''
6164e0a
+
6164e0a
         with ExitStack() as mocks:
6164e0a
             mocks.enter_context(
6164e0a
                 mock.patch.object(util, 'which', return_value=True))
6164e0a
             mocks.enter_context(
6164e0a
                 mock.patch.object(util, 'write_file', replace_write))
6164e0a
             mocks.enter_context(
6164e0a
-                mock.patch.object(util, 'load_file', return_value=''))
6164e0a
+                mock.patch.object(util, 'load_file', replace_load_file))
6164e0a
             mocks.enter_context(
6164e0a
                 mock.patch.object(os.path, 'isfile', return_value=True))
6164e0a
 
6164e0a
@@ -658,6 +757,8 @@ USERCTL=no
6164e0a
 NETWORKING=yes
6164e0a
 NETWORKING_IPV6=yes
6164e0a
 IPV6_AUTOCONF=no
6164e0a
+TEST=yes
6164e0a
+TEST2=yes
6164e0a
 '''
6164e0a
             self.assertCfgEquals(expected_buf, str(write_buf))
6164e0a
             self.assertEqual(write_buf.mode, 0o644)