def test_PreServiceConfigOpts_kwargs(self):
        config = StringIO("""
[Meta]
version=1

[Config]
master_env=TMPDIR
modules=powerlevel/9001,scouter/1.0
services=scouter.conf
config_writer=hod.config.writer.scouter_yaml
directories=/dfs/name,/dfs/data

[scouter.yaml]
wibble=abc
wibble.class=super
        """)
        precfg = hcc.PreServiceConfigOpts(config, workdir='dbz-quotes',
                modules='dbz/episode-28')
        self.assertEqual(precfg.modules, ['powerlevel/9001', 'scouter/1.0',
            'dbz/episode-28'])
        for x in precfg.service_files:
            self.assertTrue(basename(x) in ['scouter.conf'])
        self.assertTrue('scouter.yaml' in precfg.service_configs.keys())
        self.assertEqual(precfg.directories, ['/dfs/name', '/dfs/data'])
        self.assertEqual(hcc.invalid_fields(precfg), [])
        self.assertEqual(precfg.workdir, 'dbz-quotes')
    def test_PreServiceConfigOpts_autogen_hadoop_override(self):
        config = StringIO("""
[Meta]
version=1

[Config]
master_env=TMPDIR
modules=powerlevel/9001,scouter/1.0
services=scouter.conf
workdir=/tmp
config_writer=hod.config.writer.scouter_yaml
directories=/dfs/name,/dfs/data
autogen=hadoop

[yarn-site.xml]
yarn.nodemanager.hostname = 192.167.0.1
        """)
        precfg = hcc.PreServiceConfigOpts(config)
        self.assertEqual(len(precfg.service_configs), 1)
        node = dict(fqdn='hosty.domain.be', network='ib0', pid=1234,
                cores=24, totalcores=24, usablecores=range(24), num_nodes=1,
                memory=dict(meminfo=dict(memtotal=68719476736), ulimit='unlimited'))
        with patch('hod.node.node.Node.go', return_value=node):
            precfg.autogen_configs()
        self.assertEqual(len(precfg.service_configs), 4)
        self.assertTrue('core-site.xml' in precfg.service_configs)
        self.assertTrue('mapred-site.xml' in precfg.service_configs)
        self.assertTrue('yarn-site.xml' in precfg.service_configs)
        yarncfg = precfg.service_configs['yarn-site.xml']
        self.assertTrue('yarn.nodemanager.hostname' in yarncfg)
        self.assertEqual(yarncfg['yarn.nodemanager.hostname'], '192.167.0.1')
        self.assertTrue('yarn.resourcemanager.hostname' in yarncfg)
        self.assertEqual(yarncfg['yarn.resourcemanager.hostname'], '$masterdataname')
    def test_PreServiceConfigOpts_merge(self):
        config1 = StringIO("""
[Meta]
version=1

[Config]
master_env=TMPDIR1
modules=powerlevel/9001,scouter/1.0
services=scouter.conf
workdir=/tmp
config_writer=hod.config.writer.scouter_yaml
directories=/dfs/name,/dfs/data

[scouter.yaml]
wibble=abc
wibble.class=super
    """)
        config2 = StringIO("""
[Meta]
version=1

[Config]
master_env=TMPDIR2
modules=Tackle/3.0,HydroPump/2.0
workdir=/tmp
config_writer=something_else
directories=/dfs/name,/dfs/data

[scouter.yaml]
wibble=abc
wibble.class=not-so-super

[other-service.yaml]
launch-code=1234
missile-type=tomahawk
    """)
        precfg1 = hcc.PreServiceConfigOpts(config1)
        precfg2 = hcc.PreServiceConfigOpts(config2)
        precfg = hcc.merge(precfg1, precfg2)
        self.assertEqual(precfg.master_env, precfg1.master_env + precfg2.master_env)
        self.assertEqual(precfg.modules, precfg1.modules + precfg2.modules)
        self.assertEqual(precfg.directories, precfg1.directories + precfg2.directories)
        self.assertEqual(precfg.workdir, precfg2.workdir)
        self.assertEqual(precfg.service_configs['scouter.yaml']['wibble.class'], 'not-so-super')
        self.assertEqual(precfg.service_configs['other-service.yaml']['launch-code'], '1234')
    def test_PreServiceConfigOpts_invalid(self):
        config = StringIO("""
[Meta]
version=

[Config]
master_env=TMPDIR
modules=powerlevel/9001,scouter/1.0
services=
workdir=
config_writer=hod.config.writer.scouter_yaml
directories=/dfs/name,/dfs/data

[scouter.yaml]
wibble=abc
wibble.class=super
        """)
        precfg = hcc.PreServiceConfigOpts(config)
        self.assertEqual(hcc.invalid_fields(precfg), ['version',
            'workdir', 'service_files'])