From b546cfbc4a20ee32329376a8b5c257b0ea96a6a6 Mon Sep 17 00:00:00 2001 From: Gareth Rushgrove Date: Sat, 25 Jul 2015 16:32:42 +0100 Subject: [PATCH] Support new Docker repos Docker have created a new set of official repositories, including adding Yum and Debian based packages. --- CONTRIBUTING.md | 2 +- README.md | 45 ++++++-- Rakefile | 1 + manifests/init.pp | 6 + manifests/install.pp | 60 ++-------- manifests/params.pp | 103 +++++++++++++----- manifests/repos.pp | 55 ++++++++++ manifests/run.pp | 22 +++- manifests/service.pp | 90 ++++++++++----- manifests/systemd_reload.pp | 5 +- metadata.json | 8 +- spec/acceptance/docker_full_spec.rb | 101 +++++------------ spec/acceptance/docker_spec.rb | 14 +-- spec/acceptance/nodesets/centos-66-x64.yml | 2 +- spec/acceptance/nodesets/centos-70-x64.yml | 2 +- spec/acceptance/nodesets/debian-78-x64.yml | 3 +- spec/acceptance/nodesets/debian-81-x64.yml | 12 ++ spec/acceptance/nodesets/default.yml | 5 +- ...ver-12042-x64.yml => ubuntu-12042-x64.yml} | 4 +- ...erver-1404-x64.yml => ubuntu-1404-x64.yml} | 4 +- spec/acceptance/nodesets/ubuntu-1504-x64.yml | 12 ++ spec/classes/docker_spec.rb | 75 +++++++++---- spec/defines/run_spec.rb | 2 +- .../{docker.rhel7.erb => docker.systemd.erb} | 0 .../service-overrides-archlinux.conf.erb | 0 .../service-overrides-debian.conf.erb | 6 + .../service-overrides-rhel.conf.erb | 10 ++ 27 files changed, 405 insertions(+), 244 deletions(-) create mode 100644 manifests/repos.pp create mode 100644 spec/acceptance/nodesets/debian-81-x64.yml rename spec/acceptance/nodesets/{ubuntu-server-12042-x64.yml => ubuntu-12042-x64.yml} (86%) rename spec/acceptance/nodesets/{ubuntu-server-1404-x64.yml => ubuntu-1404-x64.yml} (85%) create mode 100644 spec/acceptance/nodesets/ubuntu-1504-x64.yml rename templates/etc/sysconfig/{docker.rhel7.erb => docker.systemd.erb} (100%) rename files/service-overrides-archlinux.conf => templates/etc/systemd/system/docker.service.d/service-overrides-archlinux.conf.erb (100%) create mode 100644 templates/etc/systemd/system/docker.service.d/service-overrides-debian.conf.erb create mode 100644 templates/etc/systemd/system/docker.service.d/service-overrides-rhel.conf.erb diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 867261b48..31f309fd2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -80,5 +80,5 @@ run the integration tests against Centos 6.5 with: Or with Ubuntu 14.04 with: - BEAKER_set=ubuntu-server-1404-x64 bundle exec rake beaker + BEAKER_set=ubuntu-1404-x64 bundle exec rake beaker diff --git a/README.md b/README.md index a5441e8ae..fa0807e37 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ Puppet module for installing, configuring and managing -[Docker](https://github.com/dotcloud/docker) from the [official repository](http://docs.docker.io/en/latest/installation/ubuntulinux/) on Ubuntu, from [EPEL on RedHat](http://docs.docker.io/en/latest/installation/rhel/) based distributions or the [standard repositories](http://docs.docker.com/installation/archlinux/) for Archlinux and Fedora. - +[Docker](https://github.com/docker/docker) from the [official repository](http://docs.docker.com/installation/) or alternatively from [EPEL on RedHat](http://docs.docker.io/en/latest/installation/rhel/) based distributions. + [![Puppet Forge](http://img.shields.io/puppetforge/v/garethr/docker.svg)](https://forge.puppetlabs.com/garethr/docker) [![Build Status](https://secure.travis-ci.org/garethr/garethr-docker.png)](http://travis-ci.org/garethr/garethr-docker) [![Documentation @@ -13,6 +13,8 @@ Endorsement](https://img.shields.io/puppetforge/e/garethr/docker.svg)](https://f This module is currently tested on: +* Debian 8.0 +* Debian 7.8 * Ubuntu 12.04 * Ubuntu 14.04 * Centos 7.0 @@ -25,7 +27,6 @@ too: * Archlinux * Amazon Linux * Fedora -* Debian ## Examples @@ -72,6 +73,32 @@ class { 'docker': } ``` +Docker recently [launched new official +repositories](http://blog.docker.com/2015/07/new-apt-and-yum-repos/#comment-247448) +which are now the default for the module from version 5. If you want to +stick with the old respoitories you can do so with the following: + +```puppet +class { 'docker': + package_name => 'lxc-docker', + package_source_location => 'https://get.docker.com/ubuntu', + package_key_source => 'https://get.docker.com/gpg', + package_key => '36A1D7869245C8950F966E92D8576A8BA88D21E', + package_release => 'docker', +} +``` + +The module also now uses the upstream repositories by default for RHEL +based distros, including Fedora. If you want to stick with the distro packages +you should use the following: + +```puppet +class { 'docker': + use_upstream_package_source => false, + package_name => 'docker', +} +``` + By default the docker daemon will bind to a unix socket at /var/run/docker.sock. This can be changed, as well as binding to a tcp socket if required. @@ -83,9 +110,10 @@ class { 'docker': } ``` -Unless specified this installs the latest version of docker from the docker inc +Unless specified this installs the latest version of docker from the docker repository on first run. However if you want to specify a specific version you -can do so, unless you are using Archlinux which only supports the latest release: +can do so, unless you are using Archlinux which only supports the latest release. +Note that this relies on a package with that version existing in the reposiroty. ```puppet class { 'docker': @@ -101,7 +129,6 @@ class { 'docker': } ``` - In some cases dns resolution won't work well in the container unless you give a dns server to the docker daemon like this: ```puppet @@ -114,7 +141,7 @@ To add users to the Docker group you can pass an array like this: ```puppet class { 'docker': - docker_users => [ 'user1', 'user2' ], + docker_users => ['user1', 'user2'], } ``` @@ -239,13 +266,13 @@ docker::run { 'helloworld': } ``` -If using hiera, there's a docker::run_instance class you can configure, for example: +If using hiera, there's a `docker::run_instance` class you can configure, for example: ```yaml --- classes: - docker::run_instance - + docker::run_instance::instance: helloworld: image: 'ubuntu:precise' diff --git a/Rakefile b/Rakefile index a1320f2bf..6ca619fc7 100644 --- a/Rakefile +++ b/Rakefile @@ -16,6 +16,7 @@ end PuppetLint.configuration.relative = true PuppetLint.configuration.send("disable_80chars") PuppetLint.configuration.log_format = "%{path}:%{linenumber}:%{check}:%{KIND}:%{message}" +PuppetLint.configuration.send('disable_case_without_default') PuppetLint.configuration.fail_on_warnings = true # Forsake support for Puppet 2.6.2 for the benefit of cleaner code. diff --git a/manifests/init.pp b/manifests/init.pp index 6dfaf91ab..ace772607 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -156,6 +156,10 @@ $selinux_enabled = $docker::params::selinux_enabled, $use_upstream_package_source = $docker::params::use_upstream_package_source, $package_source_location = $docker::params::package_source_location, + $package_release = $docker::params::package_release, + $package_repos = $docker::params::package_repos, + $package_key = $docker::params::package_key, + $package_key_source = $docker::params::package_key_source, $service_state = $docker::params::service_state, $service_enable = $docker::params::service_enable, $root_dir = $docker::params::root_dir, @@ -219,9 +223,11 @@ fail('You need to provide both $dm_datadev and $dm_metadatadev parameters for direct lvm.') } + class { 'docker::repos': } -> class { 'docker::install': } -> class { 'docker::config': } ~> class { 'docker::service': } + contain 'docker::repos' contain 'docker::install' contain 'docker::config' contain 'docker::service' diff --git a/manifests/install.pp b/manifests/install.pp index 17c940f17..747e0eb08 100644 --- a/manifests/install.pp +++ b/manifests/install.pp @@ -10,37 +10,14 @@ validate_string($::kernelrelease) validate_bool($docker::use_upstream_package_source) - ensure_packages($docker::prerequired_packages) + if $docker::version and $docker::ensure != 'absent' { + $ensure = $docker::version + } else { + $ensure = $docker::ensure + } case $::osfamily { 'Debian': { - if $docker::manage_package { - Package['apt-transport-https'] -> Package['docker'] - } - - if ($docker::use_upstream_package_source) { - include apt - apt::source { 'docker': - location => $docker::package_source_location, - release => 'docker', - repos => 'main', - required_packages => 'debian-keyring debian-archive-keyring', - key => '36A1D7869245C8950F966E92D8576A8BA88D21E9', - key_source => 'https://get.docker.com/gpg', - pin => '10', - include_src => false, - } - if $docker::manage_package { - Apt::Source['docker'] -> Package['docker'] - } - } else { - if $docker::version and $docker::ensure != 'absent' { - $ensure = $docker::version - } else { - $ensure = $docker::ensure - } - } - if $::operatingsystem == 'Ubuntu' { case $::operatingsystemrelease { # On Ubuntu 12.04 (precise) install the backported 13.10 (saucy) kernel @@ -68,23 +45,10 @@ elsif versioncmp($::operatingsystemrelease, '6.5') < 0 { fail('Docker needs RedHat/CentOS version to be at least 6.5.') } - $manage_kernel = false - - if ($::operatingsystem != 'Amazon') and ($::operatingsystem != 'Fedora') { - if ($docker::use_upstream_package_source) { - if ($docker::manage_epel == true){ - include 'epel' - if $docker::manage_package { - Class['epel'] -> Package['docker'] - } - } - } - } } 'Archlinux': { $manage_kernel = false - if $docker::version { notify { 'docker::version unsupported on Archlinux': message => 'Versions other than latest are not supported on Arch Linux. This setting will be ignored.' @@ -102,23 +66,17 @@ } } - if $docker::version { - $dockerpackage = "${docker::package_name}-${docker::version}" - } else { - $dockerpackage = $docker::package_name - } - if $docker::manage_package { if $docker::repo_opt { package { 'docker': - ensure => $docker::ensure, - name => $dockerpackage, + ensure => $ensure, + name => $docker::package_name, install_options => $docker::repo_opt, } } else { package { 'docker': - ensure => $docker::ensure, - name => $dockerpackage, + ensure => $ensure, + name => $docker::package_name, } } } diff --git a/manifests/params.pp b/manifests/params.pp index 4f595f1e1..dc410ea51 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -31,8 +31,7 @@ $dm_metadatadev = undef $manage_package = true $manage_kernel = true - $manage_epel = true - $package_name_default = 'lxc-docker' + $package_name_default = 'docker-engine' $service_name_default = 'docker' $docker_command_default = 'docker' $docker_group_default = 'docker' @@ -40,36 +39,63 @@ 'Debian' : { case $::operatingsystem { 'Ubuntu' : { - $package_name = $package_name_default - $service_name = $service_name_default - $docker_command = $docker_command_default + $package_release = "ubuntu-${::lsbdistcodename}" + if (versioncmp($::operatingsystemrelease, '15.04') >= 0) { + include docker::systemd_reload + } } default: { - $package_name = 'docker.io' - $service_name = 'docker.io' - $docker_command = 'docker.io' + $package_release = "debian-${::lsbdistcodename}" + if (versioncmp($::operatingsystemmajrelease, '8') >= 0) { + include docker::systemd_reload + } } } + + $manage_epel = false + $package_name = $package_name_default + $service_name = $service_name_default + $docker_command = $docker_command_default $docker_group = $docker_group_default - $package_source_location = 'https://get.docker.com/ubuntu' + $package_source_location = 'https://apt.dockerproject.org/repo' + $package_key_source = 'https://apt.dockerproject.org/gpg' + $package_key = '58118E89F3A912897C070ADBF76221572C52609D' + $package_repos = 'main' $use_upstream_package_source = true - $detach_service_in_init = true $repo_opt = undef $nowarn_kernel = false + + if ($::operatingsystem == 'Debian' and versioncmp($::operatingsystemmajrelease, '8') >= 0) or ($::operatingsystem == 'Ubuntu' and versioncmp($::operatingsystemrelease, '15.04') >= 0) { + $detach_service_in_init = false + } else { + $detach_service_in_init = true + } + } 'RedHat' : { - if $::operatingsystem == 'Fedora' { - $package_name = 'docker-io' + if (versioncmp($::operatingsystemrelease, '7.0') < 0) and $::operatingsystem != 'Amazon' { + $package_name = 'docker-io' + $use_upstream_package_source = false + $manage_epel = true + } elsif $::operatingsystem == 'Amazon' { + $package_name = 'docker' $use_upstream_package_source = false - } elsif (versioncmp($::operatingsystemrelease, '7.0') < 0) and $::operatingsystem != 'Amazon' { - $package_name = 'docker-io' + $manage_epel = false + } else { + $package_name = $package_name_default $use_upstream_package_source = true + $manage_epel = false + } + $package_key_source = 'https://yum.dockerproject.org/gpg' + if $::operatingsystem == 'Fedora' { + $package_source_location = "https://yum.dockerproject.org/repo/main/fedora/${::operatingsystemmajrelease}" } else { - $package_name = 'docker' - $use_upstream_package_source = false + $package_source_location = "https://yum.dockerproject.org/repo/main/centos/${::operatingsystemmajrelease}" } - $package_source_location = '' - $service_name = $service_name_default + $package_key = undef + $package_repos = undef + $package_release = undef + $service_name = $service_name_default $docker_command = $docker_command_default if versioncmp($::operatingsystemrelease, '7.0') < 0 { $detach_service_in_init = true @@ -80,7 +106,11 @@ } } else { $detach_service_in_init = false - $docker_group = 'dockerroot' + if $use_upstream_package_source { + $docker_group = $docker_group_default + } else { + $docker_group = 'dockerroot' + } include docker::systemd_reload } @@ -101,27 +131,40 @@ } else { $repo_opt = undef } - if $::kernelversion == '2.6.32' { $nowarn_kernel = true } - else { $nowarn_kernel = false } + if $::kernelversion == '2.6.32' { + $nowarn_kernel = true + } else { + $nowarn_kernel = false + } } 'Archlinux' : { + include docker::systemd_reload + $manage_epel = false $docker_group = $docker_group_default - $package_source_location = '' + $package_key_source = undef + $package_source_location = undef + $package_key = undef + $package_repos = undef + $package_release = undef $use_upstream_package_source = false - $package_name = 'docker' - $service_name = $service_name_default + $package_name = 'docker' + $service_name = $service_name_default $docker_command = $docker_command_default $detach_service_in_init = false - include docker::systemd_reload $repo_opt = undef $nowarn_kernel = false } default: { + $manage_epel = false $docker_group = $docker_group_default - $package_source_location = '' + $package_key_source = undef + $package_source_location = undef + $package_key = undef + $package_repos = undef + $package_release = undef $use_upstream_package_source = true - $package_name = $package_name_default - $service_name = $service_name_default + $package_name = $package_name_default + $service_name = $service_name_default $docker_command = $docker_command_default $detach_service_in_init = true $repo_opt = undef @@ -134,8 +177,8 @@ # https://github.com/docker/docker/issues/4734 $prerequired_packages = $::osfamily ? { 'Debian' => $::operatingsystem ? { - 'Debian' => ['apt-transport-https', 'cgroupfs-mount'], - 'Ubuntu' => ['apt-transport-https', 'cgroup-lite', 'apparmor'], + 'Debian' => ['cgroupfs-mount'], + 'Ubuntu' => ['cgroup-lite', 'apparmor'], default => [], }, 'RedHat' => ['device-mapper'], diff --git a/manifests/repos.pp b/manifests/repos.pp new file mode 100644 index 000000000..494a7dad5 --- /dev/null +++ b/manifests/repos.pp @@ -0,0 +1,55 @@ +# == Class: docker::repos +# +# +class docker::repos { + + ensure_packages($docker::prerequired_packages) + + case $::osfamily { + 'Debian': { + include apt + # apt-transport-https is required by the apt to get the sources + ensure_packages('apt-transport-https') + Package['apt-transport-https'] -> Apt::Source <||> + if $::operatingsystem == 'Debian' and $::lsbdistcodename == 'wheezy' { + include apt::backports + } + Exec['apt_update'] -> Package[$docker::prerequired_packages] + if ($docker::use_upstream_package_source) { + apt::source { 'docker': + location => $docker::package_source_location, + release => $docker::package_release, + repos => $docker::package_repos, + key => $docker::package_key, + key_source => $docker::package_key_source, + required_packages => 'debian-keyring debian-archive-keyring', + pin => '10', + include_src => false, + } + if $docker::manage_package { + Apt::Source['docker'] -> Package['docker'] + } + } + + } + 'RedHat': { + if $docker::manage_package { + if ($docker::use_upstream_package_source) { + yumrepo { 'docker': + baseurl => $docker::package_source_location, + gpgkey => $docker::package_key_source, + gpgcheck => true, + } + Yumrepo['docker'] -> Package['docker'] + } + + if ($::operatingsystem != 'Amazon') and ($::operatingsystem != 'Fedora') { + if ($docker::manage_epel == true) { + include 'epel' + Class['epel'] -> Package['docker'] + } + } + } + } + } +} diff --git a/manifests/run.pp b/manifests/run.pp index 2eaa89c93..59f5ed224 100644 --- a/manifests/run.pp +++ b/manifests/run.pp @@ -154,12 +154,19 @@ case $::osfamily { 'Debian': { - $initscript = "/etc/init.d/${service_prefix}${sanitised_title}" - $init_template = 'docker/etc/init.d/docker-run.erb' $deprecated_initscript = "/etc/init/${service_prefix}${sanitised_title}.conf" $hasstatus = true - $uses_systemd = false - $mode = '0755' + if ($::operatingsystem == 'Debian' and versioncmp($::operatingsystemmajrelease, '8') >= 0) or ($::operatingsystem == 'Ubuntu' and versioncmp($::operatingsystemrelease, '15.04') >= 0) { + $initscript = "/etc/systemd/system/${service_prefix}${sanitised_title}.service" + $init_template = 'docker/etc/systemd/system/docker-run.erb' + $uses_systemd = true + $mode = '0644' + } else { + $uses_systemd = false + $initscript = "/etc/init.d/${service_prefix}${sanitised_title}" + $init_template = 'docker/etc/init.d/docker-run.erb' + $mode = '0755' + } } 'RedHat': { if ($::operatingsystem == 'Amazon') or (versioncmp($::operatingsystemrelease, '7.0') < 0) { @@ -212,9 +219,16 @@ File[$initscript] } + if $uses_systemd { + $provider = 'systemd' + } else { + $provider = undef + } + service { "${service_prefix}${sanitised_title}": ensure => $running, enable => true, + provider => $provider, hasstatus => $hasstatus, require => File[$initscript], } diff --git a/manifests/service.pp b/manifests/service.pp index e890c8c4b..771457431 100644 --- a/manifests/service.pp +++ b/manifests/service.pp @@ -50,39 +50,69 @@ case $::osfamily { 'Debian': { - $hasstatus = true - $hasrestart = false + if $::operatingsystem == 'Ubuntu' and versioncmp($::operatingsystemrelease, '15.04') < 0 { + $hasstatus = true + $hasrestart = false + file { '/etc/init.d/docker': + ensure => 'link', + target => '/lib/init/upstart-job', + force => true, + notify => Service['docker'], + } + } else { + $hasstatus = undef + $hasrestart = undef + } - case $::operatingsystem { - 'Debian': { - # Do nothing as Debian doesn't have Upstart + if ($::operatingsystem == 'Debian' and versioncmp($::operatingsystemmajrelease, '8') >= 0) or ($::operatingsystem == 'Ubuntu' and versioncmp($::operatingsystemrelease, '15.04') >= 0) { + file { '/etc/systemd/system/docker.service.d': + ensure => directory; } - default: { - file { '/etc/init.d/docker': - ensure => 'link', - target => '/lib/init/upstart-job', - force => true, - notify => Service['docker'], - } + file { '/etc/systemd/system/docker.service.d/service-overrides.conf': + ensure => present, + content => template('docker/etc/systemd/system/docker.service.d/service-overrides-debian.conf.erb'), + notify => Exec['docker-systemd-reload']; } + file { '/etc/default/docker-storage': + ensure => present, + force => true, + content => template('docker/etc/sysconfig/docker-storage.erb'), + notify => Service['docker'], + } + $template = 'docker/etc/sysconfig/docker.systemd.erb' + } else { + $template = 'docker/etc/default/docker.erb' } file { "/etc/default/${service_name}": ensure => present, force => true, - content => template('docker/etc/default/docker.erb'), + content => template($template), notify => Service['docker'], } + } 'RedHat': { if ($::operatingsystem == 'Fedora') or (versioncmp($::operatingsystemrelease, '7.0') >= 0) { - $template = 'docker.rhel7.erb' + $template = 'docker.systemd.erb' } else { $template = 'docker.erb' } $hasstatus = undef $hasrestart = undef + if ($docker::use_upstream_package_source) { + file { '/etc/systemd/system/docker.service.d': + ensure => directory; + } + + file { '/etc/systemd/system/docker.service.d/service-overrides.conf': + ensure => present, + content => template('docker/etc/systemd/system/docker.service.d/service-overrides-rhel.conf.erb'), + notify => Exec['docker-systemd-reload']; + } + } + file { '/etc/sysconfig/docker': ensure => present, force => true, @@ -101,20 +131,21 @@ $hasstatus = true $hasrestart = true - file { - '/etc/systemd/system/docker.service.d': - ensure => directory; + file { '/etc/systemd/system/docker.service.d': + ensure => directory; + } - '/etc/systemd/system/docker.service.d/service-overrides.conf': - ensure => present, - source => 'puppet:///modules/docker/service-overrides-archlinux.conf', - notify => Exec['docker-systemd-reload']; + file { '/etc/systemd/system/docker.service.d/service-overrides.conf': + ensure => present, + content => template('docker/etc/systemd/system/docker.service.d/service-overrides-archlinux.conf.erb'), + notify => Exec['docker-systemd-reload']; + } - '/etc/conf.d/docker': - ensure => present, - force => true, - content => template('docker/etc/conf.d/docker.erb'), - notify => Service['docker']; + file { '/etc/conf.d/docker': + ensure => present, + force => true, + content => template('docker/etc/conf.d/docker.erb'), + notify => Service['docker']; } } default: { @@ -122,9 +153,10 @@ } } - $provider = $::operatingsystem ? { - 'Ubuntu' => 'upstart', - default => undef, + if $::operatingsystem == 'Ubuntu' and versioncmp($::operatingsystemrelease, '15.04') < 0 { + $provider = 'upstart' + } else { + $provider = undef } service { 'docker': diff --git a/manifests/systemd_reload.pp b/manifests/systemd_reload.pp index 445a25776..e47d0838d 100644 --- a/manifests/systemd_reload.pp +++ b/manifests/systemd_reload.pp @@ -4,7 +4,8 @@ # class docker::systemd_reload { exec { 'docker-systemd-reload': - command => '/usr/bin/systemctl daemon-reload', + path => ['/bin/', '/sbin/', '/usr/bin/', '/usr/sbin/'], + command => 'systemctl daemon-reload', refreshonly => true, } -} \ No newline at end of file +} diff --git a/metadata.json b/metadata.json index 5cc7d3bc1..0482f67f4 100644 --- a/metadata.json +++ b/metadata.json @@ -25,6 +25,12 @@ "12.04", "14.04" ] + },{ + "operatingsystem": "Debian", + "operatingsystemrelease": [ + "7.8", + "8.0" + ] },{ "operatingsystem": "Archlinux" },{ @@ -50,7 +56,7 @@ "version_requirement": ">= 4.1.0" },{ "name": "puppetlabs/apt", - "version_requirement": ">= 1.1.0 <= 3.0.0" + "version_requirement": ">= 1.8.0 <= 3.0.0" },{ "name": "stahnma/epel", "version_requirement": ">= 0.0.6" diff --git a/spec/acceptance/docker_full_spec.rb b/spec/acceptance/docker_full_spec.rb index 97ba7b6b0..711352023 100644 --- a/spec/acceptance/docker_full_spec.rb +++ b/spec/acceptance/docker_full_spec.rb @@ -9,6 +9,8 @@ } EOS apply_manifest(pp, :catch_failures => true) + # A sleep to give docker time to execute properly + sleep 4 end end @@ -26,9 +28,6 @@ class { 'docker': } apply_manifest(pp, :catch_changes => true) unless fact('selinux') == 'true' end - # A sleep to give docker time to execute properly - sleep 4 - it 'should be start a docker process' do shell('ps -aux | grep docker') do |r| expect(r.stdout).to match(/\/usr\/bin\/docker/) @@ -41,18 +40,19 @@ class { 'docker': } end context 'passing a TCP address to bind to' do - let(:pp) {" - class { 'docker': - tcp_bind => 'tcp://127.0.0.1:4444', - } - "} - - it 'should run successfully' do - apply_manifest(pp, :catch_failures => true) + before(:all) do + @pp =<<-EOS + class { 'docker': + tcp_bind => 'tcp://127.0.0.1:4444', + } + EOS + apply_manifest(@pp, :catch_failures => true) + # A sleep to give docker time to execute properly + sleep 4 end it 'should run idempotently' do - apply_manifest(pp, :catch_changes => true) unless fact('selinux') == 'true' + apply_manifest(@pp, :catch_changes => true) unless fact('selinux') == 'true' end it 'should result in docker listening on the specified address' do @@ -63,23 +63,21 @@ class { 'docker': end context 'bound to a particular unix socket' do - let(:pp) {" - class { 'docker': - socket_bind => 'unix:///var/run/docker.sock', - } - "} - - it 'should run successfully' do - apply_manifest(pp, :catch_failures => true) + before(:each) do + @pp =<<-EOS + class { 'docker': + socket_bind => 'unix:///var/run/docker.sock', + } + EOS + apply_manifest(@pp, :catch_failures => true) + # A sleep to give docker time to execute properly + sleep 4 end it 'should run idempotently' do - apply_manifest(pp, :catch_changes => true) unless fact('selinux') == 'true' + apply_manifest(@pp, :catch_changes => true) unless fact('selinux') == 'true' end - # A sleep to give docker time to execute properly - sleep 4 - it 'should show docker listening on the specified unix socket' do shell('ps -aux | grep docker') do |r| expect(r.stdout).to match(/unix:\/\/\/var\/run\/docker.sock/) @@ -137,7 +135,6 @@ class { 'docker':} end end - context 'which cleans up any running containers' do after(:each) do # A sleep to give docker time to execute properly @@ -157,7 +154,7 @@ class { 'docker':} pp=<<-EOS class { 'docker':} - docker::image { 'ubuntu': + docker::image { 'ubuntu_with_file': docker_file => "/root/Dockerfile", require => Class['docker'], } @@ -165,28 +162,17 @@ class { 'docker':} file { '/root/Dockerfile': ensure => present, content => "FROM ubuntu\nRUN touch /root/test_file_from_dockerfile.txt", - before => Docker::Image['ubuntu'], - } - EOS - - pp2=<<-EOS - docker::run { 'container_2_3': - image => 'ubuntu', - command => 'init', + before => Docker::Image['ubuntu_with_file'], } EOS apply_manifest(pp, :catch_failures => true) apply_manifest(pp, :catch_changes => true) unless fact('selinux') == 'true' - apply_manifest(pp2, :catch_failures => true) - apply_manifest(pp2, :catch_changes => true) unless fact('selinux') == 'true' - # A sleep to give docker time to execute properly sleep 4 - container_id = shell("docker ps | awk 'FNR == 2 {print $1}'") - shell("docker exec #{container_id.stdout.strip} ls /root") do |r| + shell("docker run ubuntu_with_file ls /root") do |r| expect(r.stdout).to match(/test_file_from_dockerfile.txt/) end end @@ -207,15 +193,9 @@ class { 'docker': } EOS pp2=<<-EOS - docker::image { 'newos': + docker::image { 'ubuntu_from_commit': docker_tar => "/root/rootfs.tar" } - - docker::run { 'container_2_4_2': - image => 'newos', - command => 'init', - require => Docker::Image['newos'], - } EOS apply_manifest(pp, :catch_failures => true) @@ -224,9 +204,9 @@ class { 'docker': } # A sleep to give docker time to execute properly sleep 4 - # Commit currently running container as an image called newos + # Commit currently running container as an image container_id = shell("docker ps | awk 'FNR == 2 {print $1}'") - shell("docker commit #{container_id.stdout.strip} newos") + shell("docker commit #{container_id.stdout.strip} ubuntu_from_commit") # Stop all container using systemd shell('ls -D -1 /etc/systemd/system/docker-container* | sed \'s/\/etc\/systemd\/system\///g\' | sed \'s/\.service//g\' | while read container; do service $container stop; done') @@ -240,7 +220,7 @@ class { 'docker': } end # Export new to a tar file - shell("docker save newos > /root/rootfs.tar") + shell("docker save ubuntu_from_commit > /root/rootfs.tar") # Remove all images shell('docker rmi $(docker images -q) || true') @@ -256,8 +236,7 @@ class { 'docker': } # A sleep to give docker time to execute properly sleep 4 - container_id = shell("docker ps | awk 'FNR == 2 {print $1}'") - shell("docker exec #{container_id.stdout.strip} ls /root") do |r| + shell("docker run ubuntu_from_commit ls /root") do |r| expect(r.stdout).to match(/test_file_for_tar_test.txt/) end end @@ -339,10 +318,6 @@ class { 'docker': expect(r.stdout).to match(/test_file.txt/) end - if default['platform'] =~ /debian/ or default['platform'] =~ /ubuntu/ - shell("/etc/init.d/docker-container-3-1 status", :acceptable_exit_codes => [0]) - end - container_name = shell("docker ps | awk 'FNR == 2 {print $NF}'") expect("#{container_name.stdout.strip}").to match(/(container-3-1|container_3_1)/) end @@ -373,10 +348,6 @@ class { 'docker':} shell('docker ps') do |r| expect(r.stdout).to match(/"init".+5555\/tcp\, 0\.0\.0.0\:\d+\-\>4444\/tcp/) end - - if default['platform'] =~ /debian/ or default['platform'] =~ /ubuntu/ - shell("/etc/init.d/docker-container-3-2 status", :acceptable_exit_codes => [0]) - end end it 'should start a container with the hostname set' do @@ -406,10 +377,6 @@ class { 'docker':} shell("docker exec #{container_id.stdout.strip} hostname") do |r| expect(r.stdout).to match(/testdomain.com/) end - - if default['platform'] =~ /debian/ or default['platform'] =~ /ubuntu/ - shell("/etc/init.d/docker-container-3-3 status", :acceptable_exit_codes => [0]) - end end it 'should start a container while mounting local volumes' do @@ -443,10 +410,6 @@ class { 'docker':} shell("docker exec #{container_id.stdout.strip} ls /root/mnt") do |r| expect(r.stdout).to match(/test_mount.txt/) end - - if default['platform'] =~ /debian/ or default['platform'] =~ /ubuntu/ - shell("/etc/init.d/docker-container-3-4 status", :acceptable_exit_codes => [0]) - end end it 'should start multiple linked containers' do @@ -550,10 +513,6 @@ class { 'docker':} shell('docker ps | wc -l') do |r| expect(r.stdout).to match(/^1$/) end - - if default['platform'] =~ /debian/ or default['platform'] =~ /ubuntu/ - shell("/etc/init.d/docker-container-3-6 status", :acceptable_exit_codes => [1]) - end end end diff --git a/spec/acceptance/docker_spec.rb b/spec/acceptance/docker_spec.rb index 1195d6c3f..56508a8dd 100644 --- a/spec/acceptance/docker_spec.rb +++ b/spec/acceptance/docker_spec.rb @@ -1,16 +1,7 @@ require 'spec_helper_acceptance' describe 'docker' do - case fact('osfamily') - when 'RedHat' - package_name = if fact('operatingsystemrelease').to_f >= 7 - 'docker' - else - 'docker-io' - end - else - package_name = 'lxc-docker' - end + package_name = 'docker-engine' service_name = 'docker' command = 'docker' @@ -22,7 +13,7 @@ context 'with default parameters' do let(:pp) {" class { 'docker': - docker_users => [ 'testuser' ] + docker_users => [ 'testuser' ], } docker::image { 'nginx': } docker::run { 'nginx': @@ -61,7 +52,6 @@ class { 'docker': describe command("#{command} version") do its(:exit_status) { should eq 0 } - its(:stdout) { should match /Client version:/ } end describe command("#{command} images"), :sudo => true do diff --git a/spec/acceptance/nodesets/centos-66-x64.yml b/spec/acceptance/nodesets/centos-66-x64.yml index 1fffff686..75268a1a8 100644 --- a/spec/acceptance/nodesets/centos-66-x64.yml +++ b/spec/acceptance/nodesets/centos-66-x64.yml @@ -1,7 +1,7 @@ HOSTS: centos-66-x64: roles: - - master + - default platform: el-6-x86_64 box: puppetlabs/centos-6.6-64-nocm box_url: https://vagrantcloud.com/puppetlabs/boxes/centos-6.6-64-nocm diff --git a/spec/acceptance/nodesets/centos-70-x64.yml b/spec/acceptance/nodesets/centos-70-x64.yml index 845e47eb4..915bfa95e 100644 --- a/spec/acceptance/nodesets/centos-70-x64.yml +++ b/spec/acceptance/nodesets/centos-70-x64.yml @@ -1,7 +1,7 @@ HOSTS: centos-70-x64: roles: - - master + - default platform: el-7-x86_64 box: puppetlabs/centos-7.0-64-nocm box_url: https://vagrantcloud.com/puppetlabs/boxes/centos-7.0-64-nocm diff --git a/spec/acceptance/nodesets/debian-78-x64.yml b/spec/acceptance/nodesets/debian-78-x64.yml index c4062fd13..e418ceb5d 100644 --- a/spec/acceptance/nodesets/debian-78-x64.yml +++ b/spec/acceptance/nodesets/debian-78-x64.yml @@ -1,7 +1,7 @@ HOSTS: debian-78-x64: roles: - - master + - default platform: debian-7-amd64 box: puppetlabs/debian-7.8-64-nocm box_url: https://vagrantcloud.com/puppetlabs/boxes/debian-7.8-64-nocm @@ -10,3 +10,4 @@ HOSTS: CONFIG: log_level: verbose type: foss + color: false diff --git a/spec/acceptance/nodesets/debian-81-x64.yml b/spec/acceptance/nodesets/debian-81-x64.yml new file mode 100644 index 000000000..f1f3b072a --- /dev/null +++ b/spec/acceptance/nodesets/debian-81-x64.yml @@ -0,0 +1,12 @@ +HOSTS: + debian-81-x64: + roles: + - default + platform: debian-8-amd64 + box: debian/jessie64 + hypervisor: vagrant + +CONFIG: + log_level: verbose + type: foss + color: false diff --git a/spec/acceptance/nodesets/default.yml b/spec/acceptance/nodesets/default.yml index ec5ce8c74..6124b3ced 100644 --- a/spec/acceptance/nodesets/default.yml +++ b/spec/acceptance/nodesets/default.yml @@ -1,7 +1,7 @@ HOSTS: - ubuntu-server-1404-x64: + ubuntu-1404-x64: roles: - - master + - default platform: ubuntu-14.04-amd64 box: puppetlabs/ubuntu-14.04-64-nocm box_url: https://vagrantcloud.com/puppetlabs/ubuntu-14.04-64-nocm @@ -10,3 +10,4 @@ HOSTS: CONFIG: log_level: verbose type: foss + color: false diff --git a/spec/acceptance/nodesets/ubuntu-server-12042-x64.yml b/spec/acceptance/nodesets/ubuntu-12042-x64.yml similarity index 86% rename from spec/acceptance/nodesets/ubuntu-server-12042-x64.yml rename to spec/acceptance/nodesets/ubuntu-12042-x64.yml index 23890413f..90564dd49 100644 --- a/spec/acceptance/nodesets/ubuntu-server-12042-x64.yml +++ b/spec/acceptance/nodesets/ubuntu-12042-x64.yml @@ -1,7 +1,7 @@ HOSTS: - ubuntu-server-12042-x64: + ubuntu-12042-x64: roles: - - master + - default platform: ubuntu-12.04-amd64 box: ubuntu-server-12042-x64-vbox4210-nocm box_url: http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-server-12042-x64-vbox4210-nocm.box diff --git a/spec/acceptance/nodesets/ubuntu-server-1404-x64.yml b/spec/acceptance/nodesets/ubuntu-1404-x64.yml similarity index 85% rename from spec/acceptance/nodesets/ubuntu-server-1404-x64.yml rename to spec/acceptance/nodesets/ubuntu-1404-x64.yml index 22290e65b..6124b3ced 100644 --- a/spec/acceptance/nodesets/ubuntu-server-1404-x64.yml +++ b/spec/acceptance/nodesets/ubuntu-1404-x64.yml @@ -1,7 +1,7 @@ HOSTS: - ubuntu-server-1404-x64: + ubuntu-1404-x64: roles: - - master + - default platform: ubuntu-14.04-amd64 box: puppetlabs/ubuntu-14.04-64-nocm box_url: https://vagrantcloud.com/puppetlabs/ubuntu-14.04-64-nocm diff --git a/spec/acceptance/nodesets/ubuntu-1504-x64.yml b/spec/acceptance/nodesets/ubuntu-1504-x64.yml new file mode 100644 index 000000000..4a6e41450 --- /dev/null +++ b/spec/acceptance/nodesets/ubuntu-1504-x64.yml @@ -0,0 +1,12 @@ +HOSTS: + ubuntu-1504-x64: + roles: + - default + platform: ubuntu-15.04-amd64 + box: ubuntu/vivid64 + hypervisor: vagrant + +CONFIG: + log_level: verbose + type: foss + color: false diff --git a/spec/classes/docker_spec.rb b/spec/classes/docker_spec.rb index a3f93ebc0..4b452de6a 100644 --- a/spec/classes/docker_spec.rb +++ b/spec/classes/docker_spec.rb @@ -2,11 +2,30 @@ describe 'docker', :type => :class do - ['Debian', 'RedHat', 'Archlinux'].each do |osfamily| + ['Debian', 'Ubuntu', 'RedHat', 'Archlinux'].each do |osfamily| context "on #{osfamily}" do + if osfamily == 'Debian' let(:facts) { { - :osfamily => osfamily, + :osfamily => 'Debian', + :operatingsystem => 'Debian', + :lsbdistid => 'Debian', + :lsbdistcodename => 'wheezy', + :kernelrelease => '3.2.0-4-amd64', + :operatingsystemrelease => '7.3', + } } + service_config_file = '/etc/default/docker' + storage_config_file = '/etc/default/docker' + + context 'It should include default prerequired_packages' do + it { should contain_package('apt-transport-https').with_ensure('present') } + it { should contain_package('cgroupfs-mount').with_ensure('present') } + end + end + + if osfamily == 'Ubuntu' + let(:facts) { { + :osfamily => 'Debian', :operatingsystem => 'Ubuntu', :lsbdistid => 'Ubuntu', :lsbdistcodename => 'maverick', @@ -17,22 +36,32 @@ storage_config_file = '/etc/default/docker' it { should contain_service('docker').with_hasrestart('false') } - it { should contain_class('apt') } - it { should contain_package('apt-transport-https').that_comes_before('Package[docker]') } - it { should contain_package('docker').with_name('lxc-docker').with_ensure('present') } - it { should contain_apt__source('docker').with_location('https://get.docker.com/ubuntu') } it { should contain_file('/etc/init.d/docker').with_ensure('link').with_target('/lib/init/upstart-job') } + + context 'It should include default prerequired_packages' do + it { should contain_package('apt-transport-https').with_ensure('present') } + it { should contain_package('cgroup-lite').with_ensure('present') } + it { should contain_package('apparmor').with_ensure('present') } + end + end + + if osfamily == 'Ubuntu' or osfamily == 'Debian' + + it { should contain_class('apt') } + it { should contain_package('apt-transport-https').that_comes_before('Apt::Source[docker]') } + it { should contain_package('docker').with_name('docker-engine').with_ensure('present') } + it { should contain_apt__source('docker').with_location('https://apt.dockerproject.org/repo') } it { should contain_package('docker').with_install_options(nil) } context 'with a custom version' do let(:params) { {'version' => '0.5.5' } } - it { should contain_package('docker').with_name('lxc-docker-0.5.5').with_ensure('present') } + it { should contain_package('docker').with_ensure('0.5.5').with_name('docker-engine') } end context 'with no upstream package source' do let(:params) { {'use_upstream_package_source' => false } } it { should_not contain_apt__source('docker') } - it { should contain_package('docker').with_name('lxc-docker') } + it { should contain_package('docker').with_name('docker-engine') } end context 'with no upstream package source' do @@ -42,11 +71,6 @@ it { should contain_package('docker') } end - context 'It should include default prerequired_packages' do - it { should contain_package('apt-transport-https').with_ensure('present') } - it { should contain_package('cgroup-lite').with_ensure('present') } - it { should contain_package('apparmor').with_ensure('present') } - end context 'when given a specific tmp_dir' do let(:params) {{ 'tmp_dir' => '/bigtmp' }} @@ -99,7 +123,9 @@ storage_config_file = '/etc/conf.d/docker' end + it { should compile.with_all_deps } + it { should contain_class('docker::repos').that_comes_before('docker::install') } it { should contain_class('docker::install').that_comes_before('docker::config') } it { should contain_class('docker::service').that_subscribes_to('docker::config') } it { should contain_class('docker::config') } @@ -119,7 +145,7 @@ 'version' => '0.5.5', 'package_name' => 'docker-custom-pkg-name', } } - it { should contain_package('docker').with_name('docker-custom-pkg-name-0.5.5').with_ensure('present') } + it { should contain_package('docker').with_name('docker-custom-pkg-name').with_ensure('0.5.5') } end context 'when not managing the package' do @@ -315,7 +341,7 @@ context 'with no upstream package source' do let(:params) { {'use_upstream_package_source' => false } } it { should_not contain_apt__source('docker') } - it { should contain_package('docker').with_name('docker.io') } + it { should contain_package('docker').with_name('docker-engine') } end end @@ -327,18 +353,17 @@ } } it { should contain_class('epel') } + it { should_not contain_yumrepo('docker') } + context 'with no epel repo' do let(:params) { {'manage_epel' => false } } it { should_not contain_class('epel') } end + it { should contain_package('docker').with_name('docker-io').with_ensure('present') } it { should_not contain_apt__source('docker') } it { should_not contain_package('linux-image-extra-3.8.0-29-generic') } - context 'with no upstream package source' do - let(:params) { {'use_upstream_package_source' => false } } - it { should_not contain_class('epel') } - end end context 'RedHat 6.5 with patched Docker kernel' do @@ -368,7 +393,8 @@ :operatingsystemrelease => '21.0' } } - it { should contain_package('docker').with_name('docker') } + it { should contain_package('docker').with_name('docker-engine') } + it { should contain_yumrepo('docker') } it { should_not contain_class('epel') } end @@ -380,7 +406,8 @@ :operatingsystemmajrelease => '7', } } - it { should contain_package('docker').with_name('docker') } + it { should contain_package('docker').with_name('docker-engine') } + it { should contain_yumrepo('docker') } it { should_not contain_class('epel') } it { should contain_package('docker').with_install_options('--enablerepo=rhel7-extras') } @@ -399,7 +426,7 @@ :operatingsystemmajrelease => '7', } } - it { should contain_package('docker').with_name('docker') } + it { should contain_package('docker').with_name('docker-engine') } it { should_not contain_class('epel') } it { should contain_package('docker').with_install_options('--enablerepo=ol7_addons') } @@ -413,7 +440,7 @@ :operatingsystemmajrelease => '7', } } - it { should contain_package('docker').with_name('docker') } + it { should contain_package('docker').with_name('docker-engine') } it { should_not contain_class('epel') } it { should contain_package('docker').with_install_options('--enablerepo=sl-extras') } @@ -444,7 +471,7 @@ :kernelrelease => '3.8.0-29-generic' } } it { should contain_service('docker').with_provider('upstart') } - it { should contain_package('docker').with_name('lxc-docker').with_ensure('present') } + it { should contain_package('docker').with_name('docker-engine').with_ensure('present') } it { should contain_package('apparmor') } end diff --git a/spec/defines/run_spec.rb b/spec/defines/run_spec.rb index 0708824c2..3264b9a39 100644 --- a/spec/defines/run_spec.rb +++ b/spec/defines/run_spec.rb @@ -10,7 +10,7 @@ if osfamily == 'Debian' initscript = '/etc/init.d/docker-sample' - command = 'docker.io' + command = 'docker' systemd = false elsif osfamily == 'Archlinux' initscript = '/etc/systemd/system/docker-sample.service' diff --git a/templates/etc/sysconfig/docker.rhel7.erb b/templates/etc/sysconfig/docker.systemd.erb similarity index 100% rename from templates/etc/sysconfig/docker.rhel7.erb rename to templates/etc/sysconfig/docker.systemd.erb diff --git a/files/service-overrides-archlinux.conf b/templates/etc/systemd/system/docker.service.d/service-overrides-archlinux.conf.erb similarity index 100% rename from files/service-overrides-archlinux.conf rename to templates/etc/systemd/system/docker.service.d/service-overrides-archlinux.conf.erb diff --git a/templates/etc/systemd/system/docker.service.d/service-overrides-debian.conf.erb b/templates/etc/systemd/system/docker.service.d/service-overrides-debian.conf.erb new file mode 100644 index 000000000..7a9f2d5c1 --- /dev/null +++ b/templates/etc/systemd/system/docker.service.d/service-overrides-debian.conf.erb @@ -0,0 +1,6 @@ +[Service] +EnvironmentFile=-/etc/default/docker +EnvironmentFile=-/etc/default/docker-storage +ExecStart= +ExecStart=/usr/bin/<%= @docker_command %> -d -H fd:// $OPTIONS \ + $DOCKER_STORAGE_OPTIONS diff --git a/templates/etc/systemd/system/docker.service.d/service-overrides-rhel.conf.erb b/templates/etc/systemd/system/docker.service.d/service-overrides-rhel.conf.erb new file mode 100644 index 000000000..2fe5989cc --- /dev/null +++ b/templates/etc/systemd/system/docker.service.d/service-overrides-rhel.conf.erb @@ -0,0 +1,10 @@ +[Service] +EnvironmentFile=-/etc/sysconfig/docker +EnvironmentFile=-/etc/sysconfig/docker-storage +EnvironmentFile=-/etc/sysconfig/docker-network +ExecStart= +ExecStart=/usr/bin/<%= @docker_command %> -d -H fd:// $OPTIONS \ + $DOCKER_STORAGE_OPTIONS \ + $DOCKER_NETWORK_OPTIONS \ + $BLOCK_REGISTRY \ + $INSECURE_REGISTRY