def vm_setup(ctx, config): """ Look for virtual machines and handle their initialization """ all_tasks = [x.keys()[0] for x in ctx.config['tasks']] need_ansible = False if 'kernel' in all_tasks and 'ansible.cephlab' not in all_tasks: need_ansible = True ansible_hosts = set() with parallel(): editinfo = os.path.join(os.path.dirname(__file__), 'edit_sudoers.sh') for rem in ctx.cluster.remotes.iterkeys(): if rem.is_vm: ansible_hosts.add(rem.shortname) r = rem.run(args=['test', '-e', '/ceph-qa-ready'], stdout=StringIO(), check_status=False) if r.returncode != 0: p1 = subprocess.Popen(['cat', editinfo], stdout=subprocess.PIPE) p2 = subprocess.Popen([ 'ssh', '-o', 'StrictHostKeyChecking=no', '-t', '-t', str(rem), 'sudo', 'sh' ], stdin=p1.stdout, stdout=subprocess.PIPE) _, err = p2.communicate() if err: log.error("Edit of /etc/sudoers failed: %s", err) if need_ansible and ansible_hosts: log.info("Running ansible on %s", list(ansible_hosts)) ansible_config = dict(hosts=list(ansible_hosts), ) with ansible.CephLab(ctx, config=ansible_config): pass
def task(ctx, config): """ Install packages for a given project. tasks: - install: project: ceph branch: bar - install: project: samba branch: foo extra_packages: ['samba'] - install: extra_packages: deb: ['librados-dev', 'libradosstriper-dev'] rpm: ['librados-devel', 'libradosstriper-devel'] extra_system_packages: deb: ['libboost-system-dev'] rpm: ['boost-devel'] - install: rhbuild: 1.3.0 playbook: downstream_setup.yml vars: yum_repos: - url: "http://location.repo" name: "ceph_repo" Add repos before trying to install any package (all Shaman-related tasks will be ignored): - install: repos: - name: "repo-alias" priority: 1 url: "http://location.repo" Note: The 'repos' are supported for SUSE-based distros only, but patches are welcome to add support for other distros. Overrides are project specific: overrides: install: ceph: sha1: ... Debug packages may optionally be installed: overrides: install: ceph: debuginfo: true Default package lists (which come from packages.yaml) may be overridden: overrides: install: ceph: packages: deb: - ceph-osd - ceph-mon rpm: - ceph-devel - rbd-fuse When tag, branch and sha1 do not reference the same commit hash, the tag takes precedence over the branch and the branch takes precedence over the sha1. When the overrides have a sha1 that is different from the sha1 of the project to be installed, it will be a noop if the project has a branch or tag, because they take precedence over the sha1. For instance: overrides: install: ceph: sha1: 1234 tasks: - install: project: ceph sha1: 4567 branch: foobar # which has sha1 4567 The override will transform the tasks as follows: tasks: - install: project: ceph sha1: 1234 branch: foobar # which has sha1 4567 But the branch takes precedence over the sha1 and foobar will be installed. The override of the sha1 has no effect. When passed 'rhbuild' as a key, it will attempt to install an rh ceph build using ceph-deploy Normally, the package management system will try to install or upgrade specified packages as instructed. But if newer versions of these packages to be installed have been installed on test node, we will have to uninstall or downgrade them. To downgrade multiple packages in a single shot: tasks: - install: project: ceph branch: hammer downgrade_packages: ['librados2', 'librbd1'] Reminder regarding teuthology-suite side effects: The teuthology-suite command always adds the following: overrides: install: ceph: sha1: 1234 where sha1 matches the --ceph argument. For instance if teuthology-suite is called with --ceph master, the sha1 will be the tip of master. If called with --ceph v0.94.1, the sha1 will be the v0.94.1 (as returned by git rev-parse v0.94.1 which is not to be confused with git rev-parse v0.94.1^{commit}) :param ctx: the argparse.Namespace object :param config: the config dict """ if config is None: config = {} assert isinstance(config, dict), \ "task install only supports a dictionary for configuration" project, = config.get('project', 'ceph'), log.debug('project %s' % project) overrides = ctx.config.get('overrides') repos = None if overrides: install_overrides = overrides.get('install', {}) teuthology.deep_merge(config, install_overrides.get(project, {})) repos = install_overrides.get('repos', None) log.debug('INSTALL overrides: %s' % install_overrides) log.debug('config %s' % config) rhbuild = None if config.get('rhbuild'): rhbuild = config.get('rhbuild') log.info("Build is %s " % rhbuild) flavor = get_flavor(config) log.info("Using flavor: %s", flavor) ctx.summary['flavor'] = flavor nested_tasks = [lambda: redhat.install(ctx=ctx, config=config), lambda: ship_utilities(ctx=ctx, config=None)] if config.get('rhbuild'): if config.get('playbook'): ansible_config = dict(config) # remove key not required by ansible task del ansible_config['rhbuild'] nested_tasks.insert( 0, lambda: ansible.CephLab(ctx, config=ansible_config) ) with contextutil.nested(*nested_tasks): yield else: nested_config = dict( branch=config.get('branch'), cleanup=config.get('cleanup'), debuginfo=config.get('debuginfo'), downgrade_packages=config.get('downgrade_packages', []), exclude_packages=config.get('exclude_packages', []), extra_packages=config.get('extra_packages', []), extra_system_packages=config.get('extra_system_packages', []), extras=config.get('extras', None), flavor=flavor, install_ceph_packages=config.get('install_ceph_packages', True), packages=config.get('packages', dict()), project=project, repos_only=config.get('repos_only', False), sha1=config.get('sha1'), tag=config.get('tag'), wait_for_package=config.get('wait_for_package', False), ) if repos: nested_config['repos'] = repos with contextutil.nested( lambda: install(ctx=ctx, config=nested_config), lambda: ship_utilities(ctx=ctx, config=None), ): yield
def task(ctx, config): """ Install packages for a given project. tasks: - install: project: ceph branch: bar - install: project: samba branch: foo extra_packages: ['samba'] - install: rhbuild: 1.3.0 playbook: downstream_setup.yml vars: yum_repos: - url: "http://location.repo" name: "ceph_repo" Overrides are project specific: overrides: install: ceph: sha1: ... Debug packages may optionally be installed: overrides: install: ceph: debuginfo: true Default package lists (which come from packages.yaml) may be overridden: overrides: install: ceph: packages: deb: - ceph-osd - ceph-mon rpm: - ceph-devel - rbd-fuse When tag, branch and sha1 do not reference the same commit hash, the tag takes precedence over the branch and the branch takes precedence over the sha1. When the overrides have a sha1 that is different from the sha1 of the project to be installed, it will be a noop if the project has a branch or tag, because they take precedence over the sha1. For instance: overrides: install: ceph: sha1: 1234 tasks: - install: project: ceph sha1: 4567 branch: foobar # which has sha1 4567 The override will transform the tasks as follows: tasks: - install: project: ceph sha1: 1234 branch: foobar # which has sha1 4567 But the branch takes precedence over the sha1 and foobar will be installed. The override of the sha1 has no effect. When passed 'rhbuild' as a key, it will attempt to install an rh ceph build using ceph-deploy Reminder regarding teuthology-suite side effects: The teuthology-suite command always adds the following: overrides: install: ceph: sha1: 1234 where sha1 matches the --ceph argument. For instance if teuthology-suite is called with --ceph master, the sha1 will be the tip of master. If called with --ceph v0.94.1, the sha1 will be the v0.94.1 (as returned by git rev-parse v0.94.1 which is not to be confused with git rev-parse v0.94.1^{commit}) :param ctx: the argparse.Namespace object :param config: the config dict """ if config is None: config = {} assert isinstance(config, dict), \ "task install only supports a dictionary for configuration" project, = config.get('project', 'ceph'), log.debug('project %s' % project) overrides = ctx.config.get('overrides') if overrides: install_overrides = overrides.get('install', {}) teuthology.deep_merge(config, install_overrides.get(project, {})) log.debug('config %s' % config) rhbuild = None if config.get('rhbuild'): rhbuild = config.get('rhbuild') log.info("Build is %s " % rhbuild) flavor = get_flavor(config) log.info("Using flavor: %s", flavor) ctx.summary['flavor'] = flavor nested_tasks = [ lambda: redhat.install(ctx=ctx, config=config), lambda: ship_utilities(ctx=ctx, config=None) ] if config.get('rhbuild'): if config.get('playbook'): ansible_config = dict(config) # remove key not required by ansible task del ansible_config['rhbuild'] nested_tasks.insert( 0, lambda: ansible.CephLab(ctx, config=ansible_config)) with contextutil.nested(*nested_tasks): yield else: with contextutil.nested( lambda: install( ctx=ctx, config=dict( branch=config.get('branch'), tag=config.get('tag'), sha1=config.get('sha1'), debuginfo=config.get('debuginfo'), flavor=flavor, extra_packages=config.get('extra_packages', []), exclude_packages=config.get('exclude_packages', []), extras=config.get('extras', None), wait_for_package=config.get('wait_for_package', False), project=project, packages=config.get('packages', dict()), )), lambda: ship_utilities(ctx=ctx, config=None), ): yield