Exemplo n.º 1
0
    def test_changed_with_prev_dict(self):
        c = hookenv.Config(dict(foo='bar', a='b'))
        c.save()
        c = hookenv.Config(dict(foo='baz', a='b'))

        self.assertTrue(c.changed('foo'))
        self.assertFalse(c.changed('a'))
Exemplo n.º 2
0
    def test_previous_with_prev_dict(self):
        c = hookenv.Config(dict(foo='bar'))
        c.save()
        c = hookenv.Config(dict(foo='baz', a='b'))

        self.assertEqual(c.previous('foo'), 'bar')
        self.assertEqual(c.previous('a'), None)
Exemplo n.º 3
0
    def test_getitem(self):
        c = hookenv.Config(dict(foo='bar'))
        c.save()
        c = hookenv.Config(dict(baz='bam'))

        self.assertRaises(KeyError, lambda: c['missing'])
        self.assertEqual(c['foo'], 'bar')
        self.assertEqual(c['baz'], 'bam')
Exemplo n.º 4
0
    def test_get(self):
        c = hookenv.Config(dict(foo='bar'))
        c.save()
        c = hookenv.Config(dict(baz='bam'))

        self.assertIsNone(c.get('missing'))
        self.assertIs(c.get('missing', sentinel.missing), sentinel.missing)
        self.assertEqual(c.get('foo'), 'bar')
        self.assertEqual(c.get('baz'), 'bam')
Exemplo n.º 5
0
    def test_save_with_prev_dict(self):
        c = hookenv.Config(dict(foo='bar'))
        c.save()
        c = hookenv.Config(dict(a='b'))
        c.save()

        with open(c.path, 'r') as f:
            self.assertEqual(c, json.load(f))
            self.assertEqual(c, dict(foo='bar', a='b'))
Exemplo n.º 6
0
def get_template_data():
    rels = hookenv.relations()
    template_data = hookenv.Config()
    template_data.CONFIG_FILE_NAME = '.unit-state'

    overlay_type = get_scoped_rel_attr('network', rels, 'overlay_type')
    etcd_servers = get_rel_hosts('etcd', rels, ('hostname', 'port'))
    api_servers = get_rel_hosts('api', rels, ('hostname', 'port'))

    # kubernetes master isn't ha yet.
    if api_servers:
        api_info = api_servers.pop()
        api_servers = 'http://%s:%s' % (api_info[0], api_info[1])

    template_data['overlay_type'] = overlay_type
    template_data['kubelet_bind_addr'] = _bind_addr(
        hookenv.unit_private_ip())
    template_data['proxy_bind_addr'] = _bind_addr(
        hookenv.unit_get('public-address'))
    template_data['kubeapi_server'] = api_servers
    template_data['etcd_servers'] = ','.join([
        'http://%s:%s' % (s[0], s[1]) for s in sorted(etcd_servers)])
    template_data['identifier'] = os.environ['JUJU_UNIT_NAME'].replace(
        '/', '-')
    return _encode(template_data)
Exemplo n.º 7
0
    def test_in(self):
        # Test behavior of the in operator.

        # Items that exist in the dict exist. Items that don't don't.
        c = hookenv.Config(dict(foo='one'))
        self.assertTrue('foo' in c)
        self.assertTrue('bar' not in c)
        c.save()
        self.assertTrue('foo' in c)
        self.assertTrue('bar' not in c)

        # Adding items works as expected.
        c['foo'] = 'two'
        c['bar'] = 'two'
        self.assertTrue('foo' in c)
        self.assertTrue('bar' in c)
        c.save()
        self.assertTrue('foo' in c)
        self.assertTrue('bar' in c)

        # Removing items works as expected.
        del c['foo']
        self.assertTrue('foo' not in c)
        c.save()
        self.assertTrue('foo' not in c)
Exemplo n.º 8
0
    def test_load_previous(self):
        d = dict(foo='bar')
        c = hookenv.Config()

        with open(c.path, 'w') as f:
            json.dump(d, f)

        c.load_previous()
        self.assertEqual(c._prev_dict, d)
Exemplo n.º 9
0
    def test_load_previous_alternate_path(self):
        d = dict(foo='bar')
        c = hookenv.Config()

        alt_path = os.path.join(self.charm_dir, '.alt-config')
        with open(alt_path, 'w') as f:
            json.dump(d, f)

        c.load_previous(path=alt_path)
        self.assertEqual(c._prev_dict, d)
        self.assertEqual(c.path, alt_path)
Exemplo n.º 10
0
import os
import unittest

import mock
from mock import (patch, Mock)

os.environ['CHARM_DIR'] = os.path.join(os.path.dirname(__file__), '..')
os.environ['JUJU_UNIT_NAME'] = 'beaver/0'

from charmhelpers.core import hookenv, services

hookenv.log = mock.MagicMock()

from charmhelpers.core import host

config = hookenv.Config({})
hookenv.config = mock.MagicMock(return_value=config)

import hooks
hooks.ensure_packages = mock.MagicMock()
hooks.run = mock.MagicMock()
host.service = mock.MagicMock(return_value=True)
host.write_file = mock.MagicMock()
hooks.ensure_packages = mock.MagicMock()
hooks.run = mock.MagicMock()


class TestInstall(unittest.TestCase):
    '''Testing that there are no exceptions in hooks.install.'''
    def test_install_does_not_raise(self):
        hooks.install()
Exemplo n.º 11
0
    def test_previous_without_prev_dict(self):
        c = hookenv.Config()

        self.assertEqual(c.previous('foo'), None)
Exemplo n.º 12
0
    def test_changed_without_prev_dict(self):
        d = dict(foo='bar')
        c = hookenv.Config(d)

        self.assertTrue(c.changed('foo'))
Exemplo n.º 13
0
    def test_init(self):
        d = dict(foo='bar')
        c = hookenv.Config(d)

        self.assertEqual(c['foo'], 'bar')
        self.assertEqual(c._prev_dict, None)
Exemplo n.º 14
0
 def test_keys(self):
     c = hookenv.Config(dict(foo='bar'))
     c["baz"] = "bar"
     self.assertEqual(sorted([six.u("foo"), "baz"]), sorted(c.keys()))
Exemplo n.º 15
0
def mock_charmhelpers(test_case):
    hookenv.cache.clear()  # Clear the hookenv memorisation.

    mocks = []

    # Mock environment
    charm_dir = tempfile.TemporaryDirectory()
    test_case.addCleanup(charm_dir.cleanup)
    mock_env = patch.dict(os.environ, dict(CHARM_DIR=charm_dir.name))
    mock_env.start()
    test_case.addCleanup(mock_env.stop)
    shutil.copyfile(os.path.join(CHARM_DIR, 'metadata.yaml'),
                    os.path.join(charm_dir.name, 'metadata.yaml'))

    # Mock config.
    # Set items:
    #     hookenv.config()['foo'] = 'bar'
    # Reset 'previous' state:
    #     hookenv.config().save();
    #     hookenv.config().load_previous()
    config = hookenv.Config()
    tmp = tempfile.NamedTemporaryFile(suffix='.config')
    config.CONFIG_FILE_NAME = tmp.name
    test_case.addCleanup(tmp.close)
    with open(os.path.join(CHARM_DIR, 'config.yaml'), 'rb') as f:
        defaults = yaml.safe_load(f)['options']
    for k, v in defaults.items():
        opt_type = v.get('type', 'string')
        opt_val = v.get('default', None)
        if opt_val is None:
            config[k] = None
        elif opt_type == 'string':
            config[k] = str(opt_val)
        elif opt_type == 'int':
            config[k] = int(opt_val)
        elif opt_type == 'boolean':
            config[k] = bool(opt_val)

    def mock_config(scope=None):
        if scope is None:
            return config
        return config.get(scope, None)
    mocks.append(patch('charmhelpers.core.hookenv.config',
                       side_effect=mock_config, autospec=True))

    # Magic mocks.
    methods = [
        'charmhelpers.core.hookenv.log',
        'charmhelpers.core.hookenv.hook_name',
        'charmhelpers.core.hookenv.related_units',
        'charmhelpers.core.hookenv.relation_get',
        'charmhelpers.core.hookenv.relation_set',
        'charmhelpers.core.hookenv.relation_ids',
        'charmhelpers.core.hookenv.relation_type',
        'charmhelpers.core.hookenv.service_name',
        'charmhelpers.core.hookenv.local_unit',
        'charmhelpers.core.hookenv.unit_private_ip',
        'charmhelpers.core.hookenv.unit_public_ip',
        'charmhelpers.core.host.log',
        'charmhelpers.fetch.filter_installed_packages',
        'os.chown', 'os.fchown',
    ]
    for m in methods:
        mocks.append(patch(m, autospec=True))

    for mock in mocks:
        mock.start()
        test_case.addCleanup(mock.stop)

    hookenv.local_unit.return_value = 'service/1'

    def mock_unit_private_ip():
        return '10.20.0.{}'.format(hookenv.local_unit().split('/')[-1])
    hookenv.unit_private_ip.side_effect = mock_unit_private_ip

    def mock_unit_public_ip():
        return '10.30.0.{}'.format(hookenv.local_unit().split('/')[-1])
    hookenv.unit_public_ip.side_effect = mock_unit_public_ip

    def mock_service_name():
        return hookenv.local_unit().split('/')[0]
    hookenv.service_name.side_effect = mock_service_name

    hookenv.relation_ids.side_effect = (
        lambda x: ['{}:1'.format(x)] if x else [])
    hookenv.related_units.return_value = ('service/2', 'service/3')

    relinfos = dict()

    def mock_relation_set(relation_id=None, relation_settings=None, **kwargs):
        if relation_id is None:
            relation_id = hookenv.relation_id()
        unit = hookenv.local_unit()
        relinfo = mock_relation_get(unit=unit, rid=relation_id)
        if relation_settings is not None:
            relinfo.update(relation_settings)
        relinfo.update(kwargs)
        return None
    hookenv.relation_set.side_effect = mock_relation_set

    def mock_relation_get(attribute=None, unit=None, rid=None):
        if rid is None:
            rid = hookenv.relation_id()
        if unit is None:
            unit = hookenv.remove_unit()
        service, unit_num = unit.split('/')
        unit_num = int(unit_num)
        relinfos.setdefault(rid, {})
        relinfos[rid].setdefault(
            unit, {'private-address': '10.20.0.{}'.format(unit_num)})
        relinfo = relinfos[rid][unit]
        if attribute is None or attribute == '-':
            return relinfo
        return relinfo.get(attribute)
    hookenv.relation_get.side_effect = mock_relation_get

    def mock_chown(target, uid, gid):
        assert uid == 0
        assert gid == 0
        assert os.path.exists(target)
    os.chown.side_effect = mock_chown

    def mock_fchown(fd, uid, gid):
        assert uid == 0
        assert gid == 0
    os.fchown.side_effect = mock_fchown

    fetch.filter_installed_packages.side_effect = lambda pkgs: list(pkgs)

    def mock_relation_for_unit(unit=None, rid=None):
        if unit is None:
            unit = hookenv.remote_unit()
        service, unit_num = unit.split('/')
        unit_num = int(unit_num)
        return {'private-address': '10.20.0.{}'.format(unit_num)}
    hookenv.relation_for_unit.side_effect = mock_relation_for_unit

    def mock_chown(target, uid, gid):
        assert uid == 0
        assert gid == 0
        assert os.path.exists(target)
    os.chown.side_effect = mock_chown

    def mock_fchown(fd, uid, gid):
        assert uid == 0
        assert gid == 0
    os.fchown.side_effect = mock_fchown

    fetch.filter_installed_packages.side_effect = lambda pkgs: list(pkgs)