
1. Move out the old helpers that provided oop access/reading/writing to various standard conf files and place those in parsers instead. 2. Unify the 'update_hostname' which varied very little between distros and make it generic so that subclasses can only provide a couple of functions to obtain the hostname updating functionality 3. Implement that new set of functions in rhel/debian 4. Use the new parsers chop_comment function for similar use cases as well as add a new utils make header function that can be used for configuration files that are newly generated to use (less duplication here of this same thing being done in multiple places. 5. Add in a distro '_apply_hostname' which calls out to the 'hostname' program to set the system hostname (more duplication elimination). 6. Make the 'constant' filenames being written to for configuration by the various distros be instance members instead of string constants 'sprinkled' throughout the code
175 lines
5.1 KiB
Python
175 lines
5.1 KiB
Python
from mocker import MockerTestCase
|
|
|
|
import mocker
|
|
|
|
import os
|
|
|
|
from cloudinit import distros
|
|
from cloudinit import helpers
|
|
from cloudinit import settings
|
|
from cloudinit import util
|
|
|
|
from StringIO import StringIO
|
|
|
|
|
|
BASE_NET_CFG = '''
|
|
auto lo
|
|
iface lo inet loopback
|
|
|
|
auto eth0
|
|
iface eth0 inet static
|
|
address 192.168.1.5
|
|
netmask 255.255.255.0
|
|
network 192.168.0.0
|
|
broadcast 192.168.1.0
|
|
gateway 192.168.1.254
|
|
|
|
auto eth1
|
|
iface eth1 inet dhcp
|
|
'''
|
|
|
|
|
|
class WriteBuffer(object):
|
|
def __init__(self):
|
|
self.buffer = StringIO()
|
|
self.mode = None
|
|
self.omode = None
|
|
|
|
def write(self, text):
|
|
self.buffer.write(text)
|
|
|
|
def __str__(self):
|
|
return self.buffer.getvalue()
|
|
|
|
|
|
class TestNetCfgDistro(MockerTestCase):
|
|
|
|
def _get_distro(self, dname):
|
|
cls = distros.fetch(dname)
|
|
cfg = settings.CFG_BUILTIN
|
|
cfg['system_info']['distro'] = dname
|
|
paths = helpers.Paths({})
|
|
return cls(dname, cfg, paths)
|
|
|
|
def test_simple_write_ub(self):
|
|
ub_distro = self._get_distro('ubuntu')
|
|
util_mock = self.mocker.replace(util.write_file,
|
|
spec=False, passthrough=False)
|
|
exists_mock = self.mocker.replace(os.path.isfile,
|
|
spec=False, passthrough=False)
|
|
|
|
exists_mock(mocker.ARGS)
|
|
self.mocker.count(0, None)
|
|
self.mocker.result(False)
|
|
|
|
write_bufs = {}
|
|
|
|
def replace_write(filename, content, mode=0644, omode="wb"):
|
|
buf = WriteBuffer()
|
|
buf.mode = mode
|
|
buf.omode = omode
|
|
buf.write(content)
|
|
write_bufs[filename] = buf
|
|
|
|
util_mock(mocker.ARGS)
|
|
self.mocker.call(replace_write)
|
|
self.mocker.replay()
|
|
ub_distro.apply_network(BASE_NET_CFG, False)
|
|
|
|
self.assertEquals(len(write_bufs), 1)
|
|
self.assertIn('/etc/network/interfaces', write_bufs)
|
|
write_buf = write_bufs['/etc/network/interfaces']
|
|
self.assertEquals(str(write_buf).strip(), BASE_NET_CFG.strip())
|
|
self.assertEquals(write_buf.mode, 0644)
|
|
|
|
def assertCfgEquals(self, blob1, blob2):
|
|
cfg_tester = distros.parsers.quoting_conf.QuotingConfigObj
|
|
b1 = dict(cfg_tester(blob1.strip().splitlines()))
|
|
b2 = dict(cfg_tester(blob2.strip().splitlines()))
|
|
self.assertEquals(b1, b2)
|
|
for (k, v) in b1.items():
|
|
self.assertIn(k, b2)
|
|
for (k, v) in b2.items():
|
|
self.assertIn(k, b1)
|
|
for (k, v) in b1.items():
|
|
self.assertEquals(v, b2[k])
|
|
|
|
def test_simple_write_rh(self):
|
|
rh_distro = self._get_distro('rhel')
|
|
write_mock = self.mocker.replace(util.write_file,
|
|
spec=False, passthrough=False)
|
|
load_mock = self.mocker.replace(util.load_file,
|
|
spec=False, passthrough=False)
|
|
exists_mock = self.mocker.replace(os.path.isfile,
|
|
spec=False, passthrough=False)
|
|
|
|
write_bufs = {}
|
|
|
|
def replace_write(filename, content, mode=0644, omode="wb"):
|
|
buf = WriteBuffer()
|
|
buf.mode = mode
|
|
buf.omode = omode
|
|
buf.write(content)
|
|
write_bufs[filename] = buf
|
|
|
|
exists_mock(mocker.ARGS)
|
|
self.mocker.count(0, None)
|
|
self.mocker.result(False)
|
|
|
|
load_mock(mocker.ARGS)
|
|
self.mocker.count(0, None)
|
|
self.mocker.result('')
|
|
|
|
for _i in range(0, 3):
|
|
write_mock(mocker.ARGS)
|
|
self.mocker.call(replace_write)
|
|
|
|
write_mock(mocker.ARGS)
|
|
self.mocker.call(replace_write)
|
|
|
|
self.mocker.replay()
|
|
rh_distro.apply_network(BASE_NET_CFG, False)
|
|
|
|
self.assertEquals(len(write_bufs), 4)
|
|
self.assertIn('/etc/sysconfig/network-scripts/ifcfg-lo', write_bufs)
|
|
write_buf = write_bufs['/etc/sysconfig/network-scripts/ifcfg-lo']
|
|
expected_buf = '''
|
|
DEVICE="lo"
|
|
ONBOOT=yes
|
|
'''
|
|
self.assertCfgEquals(expected_buf, str(write_buf))
|
|
self.assertEquals(write_buf.mode, 0644)
|
|
|
|
self.assertIn('/etc/sysconfig/network-scripts/ifcfg-eth0', write_bufs)
|
|
write_buf = write_bufs['/etc/sysconfig/network-scripts/ifcfg-eth0']
|
|
expected_buf = '''
|
|
DEVICE="eth0"
|
|
BOOTPROTO="static"
|
|
NETMASK="255.255.255.0"
|
|
IPADDR="192.168.1.5"
|
|
ONBOOT=yes
|
|
GATEWAY="192.168.1.254"
|
|
BROADCAST="192.168.1.0"
|
|
'''
|
|
self.assertCfgEquals(expected_buf, str(write_buf))
|
|
self.assertEquals(write_buf.mode, 0644)
|
|
|
|
self.assertIn('/etc/sysconfig/network-scripts/ifcfg-eth1', write_bufs)
|
|
write_buf = write_bufs['/etc/sysconfig/network-scripts/ifcfg-eth1']
|
|
expected_buf = '''
|
|
DEVICE="eth1"
|
|
BOOTPROTO="dhcp"
|
|
ONBOOT=yes
|
|
'''
|
|
self.assertCfgEquals(expected_buf, str(write_buf))
|
|
self.assertEquals(write_buf.mode, 0644)
|
|
|
|
self.assertIn('/etc/sysconfig/network', write_bufs)
|
|
write_buf = write_bufs['/etc/sysconfig/network']
|
|
expected_buf = '''
|
|
# Created by cloud-init v. 0.7
|
|
NETWORKING=yes
|
|
'''
|
|
self.assertCfgEquals(expected_buf, str(write_buf))
|
|
self.assertEquals(write_buf.mode, 0644)
|