Joshua Harlow 114525e386 System config niceness!
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
2012-10-10 16:21:22 -07:00

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)