def restart_on_changed(self, config_file, default_config, alternate_config, default_entry, alternate_entry, services): """Run restart on change tests. Test that changing config results in config file being updates and services restarted. Return config to default_config afterwards :param config_file: Config file to check for settings :type config_file: str :param default_config: Dict of charm settings to set on completion :type default_config: dict :param alternate_config: Dict of charm settings to change to :type alternate_config: dict :param default_entry: Config file entries that correspond to default_config :type default_entry: dict :param alternate_entry: Config file entries that correspond to alternate_config :type alternate_entry: dict :param services: Services expected to be restarted when config_file is changed. :type services: list """ # lead_unit is only useed to grab a timestamp, the assumption being # that all the units times are in sync. mtime = model.get_unit_time(self.lead_unit, model_name=self.model_name) logging.debug('Remote unit timestamp {}'.format(mtime)) with self.config_change(default_config, alternate_config): logging.debug( 'Waiting for updates to propagate to {}'.format(config_file)) model.block_until_oslo_config_entries_match( self.application_name, config_file, alternate_entry, model_name=self.model_name) # Config update has occured and hooks are idle. Any services should # have been restarted by now: logging.debug( 'Waiting for services ({}) to be restarted'.format(services)) model.block_until_services_restarted(self.application_name, mtime, services, model_name=self.model_name) logging.debug( 'Waiting for updates to propagate to '.format(config_file)) model.block_until_oslo_config_entries_match( self.application_name, config_file, default_entry, model_name=self.model_name)
def test_get_unit_time(self): async def _run_on_unit(unit_name, command, model_name=None, timeout=None): return {'Stdout': '1524409654'} self.patch_object(model, 'async_run_on_unit') self.async_run_on_unit.side_effect = _run_on_unit self.assertEqual(model.get_unit_time('app/2'), 1524409654) self.async_run_on_unit.assert_called_once_with(unit_name='app/2', command="date +'%s'", model_name=None, timeout=None)
def test_ceph_encryption(self): """Test Ceph encryption. Verify that the new disk is added with encryption by checking for Ceph's encryption keys directory. """ current_release = zaza_openstack.get_os_release() trusty_mitaka = zaza_openstack.get_os_release('trusty_mitaka') if current_release >= trusty_mitaka: logging.warn("Skipping encryption test for Mitaka and higher") return unit_name = 'ceph-osd/0' set_default = { 'osd-encrypt': 'False', 'osd-devices': '/dev/vdb /srv/ceph', } set_alternate = { 'osd-encrypt': 'True', 'osd-devices': '/dev/vdb /srv/ceph /srv/ceph_encrypted', } juju_service = 'ceph-osd' logging.info('Making config change on {}...'.format(juju_service)) mtime = zaza_model.get_unit_time(unit_name) file_mtime = None folder_name = '/etc/ceph/dmcrypt-keys/' with self.config_change(set_default, set_alternate, application_name=juju_service): with tempfile.TemporaryDirectory() as tempdir: # Creating a temp dir to copy keys temp_folder = '/tmp/dmcrypt-keys' cmd = 'mkdir {}'.format(temp_folder) ret = zaza_model.run_on_unit(unit_name, cmd) logging.debug('Ret for cmd {} is {}'.format(cmd, ret)) # Copy keys from /etc to /tmp cmd = 'sudo cp {}* {}'.format(folder_name, temp_folder) ret = zaza_model.run_on_unit(unit_name, cmd) logging.debug('Ret for cmd {} is {}'.format(cmd, ret)) # Changing permissions to be able to SCP the files cmd = 'sudo chown -R ubuntu:ubuntu {}'.format(temp_folder) ret = zaza_model.run_on_unit(unit_name, cmd) logging.debug('Ret for cmd {} is {}'.format(cmd, ret)) # SCP to retrieve all files in folder # -p: preserve timestamps source = '/tmp/dmcrypt-keys/*' zaza_model.scp_from_unit(unit_name=unit_name, source=source, destination=tempdir, scp_opts='-p') for elt in listdir(tempdir): file_path = '/'.join([tempdir, elt]) if path.isfile(file_path): file_mtime = path.getmtime(file_path) if file_mtime: break if not file_mtime: logging.warn('Could not determine mtime, assuming ' 'folder does not exist') raise FileNotFoundError('folder does not exist') if file_mtime >= mtime: logging.info('Folder mtime is newer than provided mtime ' '(%s >= %s) on %s (OK)' % (file_mtime, mtime, unit_name)) else: logging.warn('Folder mtime is older than provided mtime' '(%s < on %s) on %s' % (file_mtime, mtime, unit_name)) raise Exception('Folder mtime is older than provided mtime')