Files
infra-specs/specs/puppet-modules.rst
K Jonathan Harker 0bd46310cd Put the puppet modules in their own projects/repos
Signed-off-by: Spencer Krum <nibz@cat.pdx.edu>
Change-Id: I8e00191b453fbb248249e96acacd8d3bb3959564
2014-08-26 12:51:57 -07:00

7.7 KiB

::

Copyright 2014 Hewlett-Packard Development Company, L.P.

This work is licensed under a Creative Commons Attribution 3.0 Unported License. http://creativecommons.org/licenses/by/3.0/legalcode

Separate puppet-module projects

Rather than having all puppet modules in a single project, each should be in its own project.

Problem Description

The openstack-infra/config project is a monolithic ecosystem of puppet modules. This makes it hard to pick-and-choose specific modules to use downstream such as asterisk or graphite when the larger ecosystem is not wanted, and also makes it easier to accidentally write changes in the wrong puppet module. Some modules, such as jenkins or gerrit, should be generic and reusable across deployments while others (the openstack_project module and possibly others in the future) are very site-specific. Making the site-specific modules a downstream consumer of the generic modules will more clearly delineate where site-specific changes should be made and make the generic modules more easily re-consumable.

Proposed Change

Put each (or at least most) puppet modules in their own project.

Alternatives

  • Leave openstack-infra/config as is (monolithic)
  • Create several projects, each with a logical group of modules (e.g. logstash + log_processor + elasticseacrh + kibana)

Implementation

The openstack_project module and manifests/site.pp will remain in config. The devstack_host, remove_nginx, and salt modules will be deleted. All other modules will be put in their own project.

Assignee(s)

Primary assignee(s):
  • jesusaurus
  • nibalizer
Additional assignee(s):
  • bodepd

Work Items

We will need to create integration tests to ensure that api compatibility is maintained between puppet modules. This will be difficult to create without having multiple modules, but is important to have before actively developing the new modules. After breaking out the first module we should create an integration test to make sure that changes to it do not break openstack-infra/config and then we can continue with the rest of the modules.

The following process must be done for each module separately:

  1. Freeze changes to a specific module within config

  2. Isolate the module's history with git-subtree:

    git subtree split --prefix=modules/$MODULE --branch=$MODULE

    The resulting tree can be pushed to a remote.

    • git-subtree will do the right thing by re-rooting the resulting code at modules/$MODULE but will require git >= 1.8.3.2 (and even then may be in a separate contrib package)
  3. Push the new branch to a temporary project (e.g. personal github repo)

  4. Add a new gerrit project for the module (using the temporary project as upstream)

  5. Modify install_modules.sh to install the module from the new gerrit project and add the new project to the puppet integration tests. Remove the old module from openstack_infra/config with rm.

    • We should continuously deploy the master branch
  6. Propose a review to add some of the files that are needed by the module:

    • Rakefile :

      require 'rubygems'
      require 'puppetlabs_spec_helper/rake_tasks'
      require 'puppet-lint/tasks/puppet-lint'
      PuppetLint.configuration.fail_on_warnings = true
      PuppetLint.configuration.send('disable_80chars')
      PuppetLint.configuration.send('disable_autoloader_layout')
      PuppetLint.configuration.send('disable_class_inherits_from_params_class')
      PuppetLint.configuration.send('disable_class_parameter_defaults')
    • Modulefile :

      name 'openstack-pip'
      version '0.0.1'
      source 'git://git.openstack.org/openstack-infra/puppet-pip.git'
      author 'openstackci'
      license 'Apache 2.0'
      summary 'Puppet module for the pip package manager'
      description 'This module provides providers to help pip install well. Only tested against 2.7.'
      project_page 'https://github.com/openstack-ci/puppet-pip'
    • README.md :

      # OpenStack Pip Module
      
      Adds a pip3 provider to handle pip installs in the Python3 ecosystem
      
      
      ## Example
      
      ```puppet
      
      package {'flask':
        ensure   => latest,
        provider => 'pip3'
      }
      ```
    • Metadata.json :

      {
        "name": "openstackci-pip",
        "version": "0.0.1",
        "author": "Openstack CI",
        "summary": "Pip provider",
        "license": "ASL 2.0",
        "source": "git://git.openstack.org/openstack-infra/puppet-pip.git",
        "project_page": "https://github.com/openstack-ci/puppet-pip",
        "issues_url": "https://github.com/openstack-ci/puppet-pip",
        "dependencies": []
      }
# Note that determining dependencies may not be immediately obvious,

we must count on the code review process to ensure that we've done this right.

  1. Lather, rinse, and repeat

Repositories

  • openstack-infra/puppet-accessbot
  • openstack-infra/puppet-asterisk
  • openstack-infra/puppet-bugdaystats
  • openstack-infra/puppet-bup
  • openstack-infra/puppet-cgit
  • openstack-infra/puppet-drupal
  • openstack-infra/puppet-elastic_recheck
  • openstack-infra/puppet-elasticsearch
  • openstack-infra/puppet-exim
  • openstack-infra/puppet-gerrit
  • openstack-infra/puppet-gerritbot
  • openstack-infra/puppet-github
  • openstack-infra/puppet-graphite
  • openstack-infra/puppet-iptables
  • openstack-infra/puppet-jeepyb
  • openstack-infra/puppet-jenkins
  • openstack-infra/puppet-kibana
  • openstack-infra/puppet-lodgeit
  • openstack-infra/puppet-log_processor
  • openstack-infra/puppet-logrotate
  • openstack-infra/puppet-logstash
  • openstack-infra/puppet-mailman
  • openstack-infra/puppet-mediawiki
  • openstack-infra/puppet-meetbot
  • openstack-infra/puppet-mysql_backup
  • openstack-infra/puppet-nodepool
  • openstack-infra/puppet-openssl
  • openstack-infra/puppet-openstackid
  • openstack-infra/puppet-packagekit
  • openstack-infra/puppet-pip
  • openstack-infra/puppet-planet
  • openstack-infra/puppet-puppetboot
  • openstack-infra/puppet-recheckwatch
  • openstack-infra/puppet-redis
  • openstack-infra/puppet-releasestatus
  • openstack-infra/puppet-remove_nginx
  • openstack-infra/puppet-reviewday
  • openstack-infra/puppet-salt
  • openstack-infra/puppet-snmpd
  • openstack-infra/puppet-ssh
  • openstack-infra/puppet-ssl_cert_check
  • openstack-infra/puppet-statusbot
  • openstack-infra/puppet-storyboard
  • openstack-infra/puppet-subversion
  • openstack-infra/puppet-sudoers
  • openstack-infra/puppet-tmpreaper
  • openstack-infra/puppet-ulimit
  • openstack-infra/puppet-unattended_upgrades
  • openstack-infra/puppet-unbound
  • openstack-infra/puppet-user
  • openstack-infra/puppet-zuul

Servers

None

DNS Entries

None

Documentation

Each new module will have its own documentation.

Security

None

Testing

  • Unit tests: We currently only lint and syntax-check the modules in config. They should also have rspec-beaker and server-spec tests written for them (even if we don't move them to their own project).
  • Integration tests: We need to test that changes to the new projects do not break config (such as with changes to a class's parameter list).

Developer Impact

By migrating from a single project to many projects, developers will no longer be able to atomically change multiple modules at the same time. This means that changes that touch multiple modules will have to be made in a backwards-compatible way with soft dependencies between changes (such as two changes mentioning each other in their commit messages). Requiring backwards-compatible changes will also make it easier for downstream consumers to use the modules.

Dependencies

None