James Page bfddde02ac Ensure all config files written on config-changed
Write all configuration files when charm configuration options
change to ensure that the ssl_ca is written into the identity.yaml
file.

This commit also drops some parts of the unit tests for hooks
which to be honest need reworking as they have a number of
boundary violations.

Change-Id: I5e84ebd23fd487f64b2902327ce3f33739ed9840
Closes-Bug: 1843484
2020-07-23 07:10:18 +01:00

108 lines
4.2 KiB
Python

import base64
import mock
import os
import shutil
import tempfile
from hooks import hooks
from test_utils import CharmTestCase
TO_PATCH = [
'apt_update',
'apt_install',
'get_release',
'install_ca_cert',
'get_configs',
]
class TestConfigChanged(CharmTestCase):
def setUp(self):
CharmTestCase.setUp(self, hooks, TO_PATCH)
self.tmpdir = tempfile.mkdtemp()
hooks.CRON_POLL_FILEPATH = os.path.join(self.tmpdir,
hooks.CRON_POLL_FILENAME)
self.tmpcrond = tempfile.mkdtemp(prefix='cron.d')
hooks.CRON_D = self.tmpcrond
self.sharedir = tempfile.mkdtemp(prefix='share')
hooks.USR_SHARE_DIR = self.sharedir
setattr(self.test_config, "save", lambda: None)
hooks.CRON_POLL_FILEPATH = os.path.join(self.tmpcrond,
hooks.CRON_POLL_FILENAME)
self.get_release.return_value = 'icehouse'
self.mock_configs = mock.MagicMock()
self.get_configs.return_value = self.mock_configs
def tearDown(self):
CharmTestCase.tearDown(self)
shutil.rmtree(self.tmpdir)
shutil.rmtree(self.tmpcrond)
shutil.rmtree(self.sharedir)
@mock.patch.object(hooks, 'update_nrpe_config')
@mock.patch('os.symlink')
@mock.patch('charmhelpers.core.hookenv.config')
@mock.patch('charmhelpers.core.hookenv.relations_of_type')
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.get_nagios_hostname')
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.config')
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.local_unit')
def test_default_config(self, local_unit, nrpe_config, nag_host,
relations_of_type, config, symlink,
update_nrpe_config):
local_unit.return_value = 'juju/0'
nag_host.return_value = "nagios_hostname"
nrpe_config.return_value = self.test_config
setattr(self.test_config, "changed", lambda x: False)
config.return_value = self.test_config
self.test_config.set('run', True)
self.test_config.set('ssl_ca', base64.b64encode(b'foobar'))
hooks.config_changed()
self.mock_configs.write_all.assert_called_once_with()
symlink.assert_any_call(os.path.join(self.sharedir,
hooks.SCRIPT_WRAPPER_NAME),
'/etc/cron.%s/%s'
% (self.test_config['frequency'],
hooks.CRON_JOB_FILENAME))
self.assertTrue(os.path.isfile(os.path.join(self.tmpcrond,
hooks.CRON_POLL_FILENAME)))
update_nrpe_config.assert_called()
self.install_ca_cert.assert_called_with(b'foobar')
@mock.patch.object(hooks, 'update_nrpe_config')
@mock.patch('os.path.exists')
@mock.patch('os.remove')
@mock.patch('glob.glob')
@mock.patch('charmhelpers.core.hookenv.config')
@mock.patch('charmhelpers.core.hookenv.relations_of_type')
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.get_nagios_hostname')
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.config')
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.local_unit')
def test_uninstall_cron(self, local_unit, nrpe_config, nag_host,
relations_of_type, config, glob, remove, exists,
update_nrpe_config):
local_unit.return_value = 'juju/0'
nag_host.return_value = "nagios_hostname"
nrpe_config.return_value = self.test_config
self.test_config.set('run', False)
setattr(self.test_config, "changed", lambda x: True)
config.return_value = self.test_config
glob.return_value = [os.path.join('/etc/cron.daily/',
hooks.CRON_JOB_FILENAME)]
exists.return_value = True
hooks.config_changed()
self.mock_configs.write_all.assert_called_once_with()
remove.assert_any_call(os.path.join('/etc/cron.daily/',
hooks.CRON_JOB_FILENAME))
remove.assert_any_call(hooks.CRON_POLL_FILEPATH)
update_nrpe_config.assert_called()