How does it work ?

In a nutshell

WeIRDO is a collection of Ansible roles and playbooks.

WeIRDO, through Ansible, will:

  • Connect to a node specified in it’s inventory (this can be a remote node or localhost)
  • Generate a similar environment to the gate (setup configuration, packages, dependencies)
  • Run the gate job (i.e, or tox provided by the upstream project)

WeIRDO, by itself, doesn’t use or require Jenkins. When run inside a job, however, it will be able to report success or failure.

Details on how the Jenkins jobs are configured is available here.

Example: Puppet-Openstack

Puppet-Openstack gates every commit that is done with syntax, unit and integration tests.


These tests ensure there is no regression when someone contributes to one of the many modules involved in Puppet-Openstack.

While the syntax and unit checks are supplied by each respective puppet module, the integration tests are provided through the puppet-openstack-integration project. Ultimately, these are all configured to run by Jenkins through project-config and are triggered when a patchset is submitted to Gerrit.

The integration tests are of particular interest since the puppet modules will install OpenStack libraries, clients and services with the packages provided through RDO. Tempest is currently the only exception and is installed from source.

Puppet-Openstack uses these integration tests to ensure their puppet modules work well.

WeIRDO leverages these integration tests to ensure that the packages provided by RDO work well.

Test implementation

This is what the WeIRDO implementation looks like for puppet-openstack:

digraph {
  a  [shape = polygon, sides = 4,label = <Install base common packages<br/><FONT POINT-SIZE='12'>(wget, development tools, etc.)</FONT><br/><FONT POINT-SIZE='10'><I>playbooks/roles/common/tasks/packages</I></FONT>>]
  b  [shape = polygon, sides = 4,label = <Setup trunk repositories<br/><FONT POINT-SIZE='12'>(i.e,</FONT><br/><FONT POINT-SIZE='10'><I>playbooks/roles/common/tasks/repositories</I></FONT>>]
  c  [shape = polygon, sides = 4,label = <Install project's test dependencies<br/><FONT POINT-SIZE='12'>(ruby-devel, rubygems, etc.)</FONT><br/><FONT POINT-SIZE='10'><I>playbooks/roles/puppet-openstack/tasks/packages</I></FONT>>]
  d  [shape = polygon, sides = 4,label = <Clone puppet-openstack-integration<br/><FONT POINT-SIZE='10'><I>playbooks/roles/puppet-openstack/tasks/setup</I></FONT>>]
  e  [shape = polygon, sides = 4,label = <Execute<br/><FONT POINT-SIZE='12'>(with scenario001, scenario002, etc.)</FONT><br/><FONT POINT-SIZE='10'><I>playbooks/roles/puppet-openstack/tasks/run</I></FONT>>]
  f  [shape = polygon, sides = 4,label = <Install puppet, puppet modules<br/><FONT POINT-SIZE='10'><I></I></FONT>>]
  g  [shape = polygon, sides = 4,label = <Deploy OpenStack<br/><FONT POINT-SIZE='10'><I> puppet apply fixtures/scenario00X.pp</I></FONT>>]
  h  [shape = polygon, sides = 4,label = <Run Tempest smoke<br/><FONT POINT-SIZE='10'><I> cd tempest; tox -eall -- --concurrency=2 smoke dashboard</I></FONT>>]
  i  [shape = polygon, sides = 4,label = <Collect project's logs<br/><FONT POINT-SIZE='12'>(with</FONT><br/><FONT POINT-SIZE='10'><I>playbooks/roles/puppet-openstack/tasks/logs</I></FONT>>]
  j  [shape = polygon, sides = 4,label = <Collect and centralize additional logs<br/><FONT POINT-SIZE='10'><I>playbooks/roles/common/tasks/logs</I></FONT>>]

  subgraph cluster_0 {
    label = "WeIRDO";
    style = "dashed";
    a -> b -> c -> d -> e;

  subgraph cluster_1 {
    label = "puppet-openstack-integration";
    style = "dashed";
    e -> f -> g -> h;

  subgraph cluster_2 {
    label = "WeIRDO";
    style = "dashed";
    h -> i -> j;