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'))
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)
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')
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')
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'))
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)
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)
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)
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)
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()
def test_previous_without_prev_dict(self): c = hookenv.Config() self.assertEqual(c.previous('foo'), None)
def test_changed_without_prev_dict(self): d = dict(foo='bar') c = hookenv.Config(d) self.assertTrue(c.changed('foo'))
def test_init(self): d = dict(foo='bar') c = hookenv.Config(d) self.assertEqual(c['foo'], 'bar') self.assertEqual(c._prev_dict, None)
def test_keys(self): c = hookenv.Config(dict(foo='bar')) c["baz"] = "bar" self.assertEqual(sorted([six.u("foo"), "baz"]), sorted(c.keys()))
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)