diff --git a/manifests/compose.pp b/manifests/compose.pp index 97d35df..27b3d14 100644 --- a/manifests/compose.pp +++ b/manifests/compose.pp @@ -1,100 +1,118 @@ # == Class: docker::compose # # Class to install Docker Compose using the recommended curl command. # # === Parameters # # [*ensure*] # Whether to install or remove Docker Compose # Valid values are absent present # Defaults to present # # [*version*] # The version of Docker Compose to install. # Defaults to the value set in $docker::params::compose_version # # [*install_path*] # The path where to install Docker Compose. # Defaults to the value set in $docker::params::compose_install_path # # [*proxy*] # Proxy to use for downloading Docker Compose. # +# [*base_url*] +# The base url for installation +# This allows use of a mirror that follows the same layout as the +# official repository +# +# [*raw_url*] +# Override the raw URL for installation +# The default is to build a URL from baseurl. If rawurl is set, the caller is +# responsible for ensuring the URL points to the correct version and +# architecture. + class docker::compose( Optional[Pattern[/^present$|^absent$/]] $ensure = 'present', Optional[String] $version = $docker::params::compose_version, Optional[String] $install_path = $docker::params::compose_install_path, - Optional[String] $proxy = undef + Optional[String] $proxy = undef, + Optional[String] $base_url = $docker::params::compose_base_url, + Optional[String] $raw_url = undef ) inherits docker::params { if $proxy != undef { validate_re($proxy, '^((http[s]?)?:\/\/)?([^:^@]+:[^:^@]+@|)([\da-z\.-]+)\.([\da-z\.]{2,6})(:[\d])?([\/\w \.-]*)*\/?$') } if $::osfamily == 'windows' { $file_extension = '.exe' $file_owner = 'Administrator' } else { $file_extension = '' $file_owner = 'root' } $docker_compose_location = "${install_path}/docker-compose${file_extension}" $docker_compose_location_versioned = "${install_path}/docker-compose-${version}${file_extension}" if $ensure == 'present' { - $docker_compose_url = "https://github.com/docker/compose/releases/download/${version}/docker-compose-${::kernel}-x86_64${file_extension}" + + if $raw_url != undef { + $docker_compose_url = $raw_url + } else { + $docker_compose_url = "${base_url}/${version}/docker-compose-${::kernel}-x86_64${file_extension}" + } if $proxy != undef { $proxy_opt = "--proxy ${proxy}" } else { $proxy_opt = '' } if $::osfamily == 'windows' { # lint:ignore:140chars $docker_download_command = "if (Invoke-WebRequest ${docker_compose_url} ${proxy_opt} -UseBasicParsing -OutFile \"${docker_compose_location_versioned}\") { exit 0 } else { exit 1}" # lint:endignore exec { "Install Docker Compose ${version}": command => template('docker/windows/download_docker_compose.ps1.erb'), provider => powershell, creates => $docker_compose_location_versioned, } file { $docker_compose_location: ensure => 'link', target => $docker_compose_location_versioned, require => Exec["Install Docker Compose ${version}"] } } else { ensure_packages(['curl']) exec { "Install Docker Compose ${version}": path => '/usr/bin/', cwd => '/tmp', command => "curl -s -S -L ${proxy_opt} ${docker_compose_url} -o ${docker_compose_location_versioned}", creates => $docker_compose_location_versioned, require => Package['curl'], } file { $docker_compose_location_versioned: owner => $file_owner, mode => '0755', require => Exec["Install Docker Compose ${version}"] } file { $docker_compose_location: ensure => 'link', target => $docker_compose_location_versioned, require => File[$docker_compose_location_versioned] } } } else { file { [ $docker_compose_location_versioned, $docker_compose_location ]: ensure => absent, } } } diff --git a/manifests/params.pp b/manifests/params.pp index b8df727..a688752 100755 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -1,335 +1,336 @@ # == Class: docker::params # # Default parameter values for the docker module # class docker::params { $version = undef $ensure = present $docker_ce_start_command = 'dockerd' $docker_ce_package_name = 'docker-ce' $docker_engine_start_command = 'docker daemon' $docker_engine_package_name = 'docker-engine' $docker_ce_channel = stable $docker_ee = false $docker_ee_start_command = 'dockerd' if ($::osfamily == 'windows') { $docker_ee_package_name = 'Docker' } else { $docker_ee_package_name = 'docker-ee' } $docker_ee_source_location = undef $docker_ee_key_source = undef $docker_ee_key_id = undef $docker_ee_repos = stable $tcp_bind = undef $tls_enable = false $tls_verify = true if ($::osfamily == 'windows') { $tls_cacert = "${::docker_program_data_path}/docker/certs.d/ca.pem" $tls_cert = "${::docker_program_data_path}/docker/certs.d/server-cert.pem" $tls_key = "${::docker_program_data_path}/docker/certs.d/server-key.pem" $compose_version = '1.21.2' $compose_install_path = "${::docker_program_files_path}/Docker" $machine_install_path = "${::docker_program_files_path}/Docker" } else { $tls_cacert = '/etc/docker/tls/ca.pem' $tls_cert = '/etc/docker/tls/cert.pem' $tls_key = '/etc/docker/tls/key.pem' $compose_version = '1.9.0' $compose_install_path = '/usr/local/bin' $machine_install_path = '/usr/local/bin' } $machine_version = '0.16.1' $ip_forward = true $iptables = true $ipv6 = false $ipv6_cidr = undef $default_gateway_ipv6 = undef $icc = undef $ip_masq = true $bip = undef $mtu = undef $fixed_cidr = undef $bridge = undef $default_gateway = undef $socket_bind = 'unix:///var/run/docker.sock' $log_level = undef $log_driver = undef $log_opt = [] $selinux_enabled = undef $socket_group_default = 'docker' $labels = [] $service_state = running $service_enable = true $manage_service = true $root_dir = undef $tmp_dir_config = true $tmp_dir = '/tmp/' $dns = undef $dns_search = undef $proxy = undef + $compose_base_url = 'https://github.com/docker/compose/releases/download' $no_proxy = undef $execdriver = undef $storage_driver = undef $dm_basesize = undef $dm_fs = undef $dm_mkfsarg = undef $dm_mountopt = undef $dm_blocksize = undef $dm_loopdatasize = undef $dm_loopmetadatasize = undef $dm_datadev = undef $dm_metadatadev = undef $dm_thinpooldev = undef $dm_use_deferred_removal = undef $dm_use_deferred_deletion = undef $dm_blkdiscard = undef $dm_override_udev_sync_check = undef $overlay2_override_kernel_check = false $manage_package = true $package_source = undef if ($::osfamily == 'windows') { $docker_command = 'docker' } else { $docker_command = 'docker' } $service_name_default = 'docker' $docker_group_default = 'docker' $storage_devs = undef $storage_vg = undef $storage_root_size = undef $storage_data_size = undef $storage_min_data_size = undef $storage_chunk_size = undef $storage_growpart = undef $storage_auto_extend_pool = undef $storage_pool_autoextend_threshold = undef $storage_pool_autoextend_percent = undef $storage_config_template = 'docker/etc/sysconfig/docker-storage.erb' $registry_mirror = undef $os_lc = downcase($::operatingsystem) $docker_msft_provider_version = undef $nuget_package_provider_version = undef case $::osfamily { 'Debian' : { case $::operatingsystem { 'Ubuntu' : { $package_release = "ubuntu-${::lsbdistcodename}" if (versioncmp($::operatingsystemrelease, '15.04') >= 0) { $service_provider = 'systemd' $storage_config = '/etc/default/docker-storage' $service_config_template = 'docker/etc/sysconfig/docker.systemd.erb' $service_overrides_template = 'docker/etc/systemd/system/docker.service.d/service-overrides-debian.conf.erb' $socket_overrides_template = 'docker/etc/systemd/system/docker.socket.d/socket-overrides.conf.erb' $socket_override = false $service_after_override = undef $service_hasstatus = true $service_hasrestart = true include docker::systemd_reload } else { $service_config_template = 'docker/etc/default/docker.erb' $service_overrides_template = undef $socket_overrides_template = undef $socket_override = false $service_after_override = undef $service_provider = 'upstart' $service_hasstatus = true $service_hasrestart = false $storage_config = undef } } default: { $package_release = "debian-${::lsbdistcodename}" $service_provider = 'systemd' $storage_config = '/etc/default/docker-storage' $service_config_template = 'docker/etc/sysconfig/docker.systemd.erb' $service_overrides_template = 'docker/etc/systemd/system/docker.service.d/service-overrides-debian.conf.erb' $socket_overrides_template = 'docker/etc/systemd/system/docker.socket.d/socket-overrides.conf.erb' $socket_override = false $service_after_override = undef $service_hasstatus = true $service_hasrestart = true include docker::systemd_reload } } $service_name = $service_name_default $docker_group = $docker_group_default $socket_group = $socket_group_default $use_upstream_package_source = true $pin_upstream_package_source = true $apt_source_pin_level = 500 $repo_opt = undef $service_config = undef $storage_setup_file = undef $package_ce_source_location = "https://download.docker.com/linux/${os_lc}" $package_ce_key_source = "https://download.docker.com/linux/${os_lc}/gpg" $package_ce_key_id = '9DC858229FC7DD38854AE2D88D81803C0EBFCD88' $package_ce_release = $::lsbdistcodename $package_source_location = 'http://apt.dockerproject.org/repo' $package_key_source = 'https://apt.dockerproject.org/gpg' $package_key_check_source = undef $package_key_id = '58118E89F3A912897C070ADBF76221572C52609D' $package_ee_source_location = $docker_ee_source_location $package_ee_key_source = $docker_ee_key_source $package_ee_key_id = $docker_ee_key_id $package_ee_release = $::lsbdistcodename $package_ee_repos = $docker_ee_repos $package_ee_package_name = $docker_ee_package_name if ($service_provider == 'systemd') { $detach_service_in_init = false } else { $detach_service_in_init = true } } 'RedHat' : { $service_config = '/etc/sysconfig/docker' $storage_config = '/etc/sysconfig/docker-storage' $storage_setup_file = '/etc/sysconfig/docker-storage-setup' $service_hasstatus = true $service_hasrestart = true $service_provider = 'systemd' $service_config_template = 'docker/etc/sysconfig/docker.systemd.erb' $service_overrides_template = 'docker/etc/systemd/system/docker.service.d/service-overrides-rhel.conf.erb' $socket_overrides_template = 'docker/etc/systemd/system/docker.socket.d/socket-overrides.conf.erb' $socket_override = false $service_after_override = undef $use_upstream_package_source = true $package_ce_source_location = "https://download.docker.com/linux/centos/${::operatingsystemmajrelease}/${::architecture}/${docker_ce_channel}" $package_ce_key_source = 'https://download.docker.com/linux/centos/gpg' $package_ce_key_id = undef $package_ce_release = undef $package_key_id = undef $package_release = undef $package_source_location = "https://yum.dockerproject.org/repo/main/centos/${::operatingsystemmajrelease}" $package_key_source = 'https://yum.dockerproject.org/gpg' $package_key_check_source = true $package_ee_source_location = $docker_ee_source_location $package_ee_key_source = $docker_ee_key_source $package_ee_key_id = $docker_ee_key_id $package_ee_release = undef $package_ee_repos = $docker_ee_repos $package_ee_package_name = $docker_ee_package_name $pin_upstream_package_source = undef $apt_source_pin_level = undef $service_name = $service_name_default $detach_service_in_init = false if $use_upstream_package_source { $docker_group = $docker_group_default $socket_group = $socket_group_default } else { $docker_group = 'dockerroot' $socket_group = 'dockerroot' } # repo_opt to specify install_options for docker package if $::operatingsystem == 'RedHat' { $repo_opt = '--enablerepo=rhel-7-server-extras-rpms' } else { $repo_opt = undef } } 'windows' : { $msft_nuget_package_provider_version = $nuget_package_provider_version $msft_provider_version = $docker_msft_provider_version $msft_package_version = $version $service_config_template = 'docker/windows/config/daemon.json.erb' $service_config = "${::docker_program_data_path}/docker/config/daemon.json" $docker_group = 'docker' $package_ce_source_location = undef $package_ce_key_source = undef $package_ce_key_id = undef $package_ce_repos = undef $package_ce_release = undef $package_key_id = undef $package_release = undef $package_source_location = undef $package_key_source = undef $package_key_check_source = undef $package_ee_source_location = undef $package_ee_package_name = $docker_ee_package_name $package_ee_key_source = undef $package_ee_key_id = undef $package_ee_repos = undef $package_ee_release = undef $use_upstream_package_source = undef $pin_upstream_package_source = undef $apt_source_pin_level = undef $socket_group = undef $service_name = $service_name_default $repo_opt = undef $storage_config = undef $storage_setup_file = undef $service_provider = undef $service_overrides_template = undef $socket_overrides_template = undef $socket_override = false $service_after_override = undef $service_hasstatus = undef $service_hasrestart = undef $detach_service_in_init = true } default: { $docker_group = $docker_group_default $socket_group = $socket_group_default $package_key_source = undef $package_key_check_source = undef $package_source_location = undef $package_key_id = undef $package_repos = undef $package_release = undef $package_ce_key_source = undef $package_ce_source_location = undef $package_ce_key_id = undef $package_ce_repos = undef $package_ce_release = undef $package_ee_source_location = undef $package_ee_key_source = undef $package_ee_key_id = undef $package_ee_release = undef $package_ee_repos = undef $package_ee_package_name = undef $use_upstream_package_source = true $service_overrides_template = undef $socket_overrides_template = undef $socket_override = false $service_after_override = undef $service_hasstatus = undef $service_hasrestart = undef $service_provider = undef $package_name = $docker_ce_package_name $service_name = $service_name_default $detach_service_in_init = true $repo_opt = undef $nowarn_kernel = false $service_config = undef $storage_config = undef $storage_setup_file = undef $service_config_template = undef $pin_upstream_package_source = undef $apt_source_pin_level = undef } } # Special extra packages are required on some OSes. # Specifically apparmor is needed for Ubuntu: # https://github.com/docker/docker/issues/4734 $prerequired_packages = $::osfamily ? { 'Debian' => $::operatingsystem ? { 'Debian' => ['cgroupfs-mount'], 'Ubuntu' => ['cgroup-lite', 'apparmor'], default => [], }, 'RedHat' => ['device-mapper'], default => [], } $dependent_packages = ['docker-ce-cli','containerd.io'] } diff --git a/spec/classes/compose_spec.rb b/spec/classes/compose_spec.rb index de01abb..6788f9e 100644 --- a/spec/classes/compose_spec.rb +++ b/spec/classes/compose_spec.rb @@ -1,118 +1,146 @@ require 'spec_helper' describe 'docker::compose', type: :class do let(:facts) do { kernel: 'Linux', osfamily: 'Debian', operatingsystem: 'Ubuntu', lsbdistid: 'Ubuntu', lsbdistcodename: 'maverick', kernelrelease: '3.8.0-29-generic', operatingsystemrelease: '10.04', operatingsystemmajrelease: '10', } end it { is_expected.to compile } context 'with defaults for all parameters' do it { is_expected.to compile.with_all_deps } it { is_expected.to contain_exec('Install Docker Compose 1.9.0').with( 'path' => '/usr/bin/', 'cwd' => '/tmp', 'command' => 'curl -s -S -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose-1.9.0', 'creates' => '/usr/local/bin/docker-compose-1.9.0', 'require' => 'Package[curl]', ) } it { is_expected.to contain_file('/usr/local/bin/docker-compose-1.9.0').with( 'owner' => 'root', 'mode' => '0755', 'require' => 'Exec[Install Docker Compose 1.9.0]', ) } it { is_expected.to contain_file('/usr/local/bin/docker-compose').with( 'ensure' => 'link', 'target' => '/usr/local/bin/docker-compose-1.9.0', 'require' => 'File[/usr/local/bin/docker-compose-1.9.0]', ) } end context 'with ensure => absent' do let(:params) { { ensure: 'absent' } } it { is_expected.to contain_file('/usr/local/bin/docker-compose-1.9.0').with_ensure('absent') } it { is_expected.to contain_file('/usr/local/bin/docker-compose').with_ensure('absent') } end context 'when no proxy is provided' do let(:params) { { version: '1.7.0' } } it { is_expected.to contain_exec('Install Docker Compose 1.7.0').with_command( 'curl -s -S -L https://github.com/docker/compose/releases/download/1.7.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose-1.7.0', ) } end context 'when proxy is provided' do let(:params) do { proxy: 'http://proxy.example.org:3128/', version: '1.7.0' } end it { is_expected.to compile } it { is_expected.to contain_exec('Install Docker Compose 1.7.0').with_command( 'curl -s -S -L --proxy http://proxy.example.org:3128/ https://github.com/docker/compose/releases/download/1.7.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose-1.7.0', ) } end context 'when proxy is not a http proxy' do let(:params) { { proxy: 'this is not a URL' } } it do expect { is_expected.to compile }.to raise_error(%r{does not match}) end end context 'when proxy contains username and password' do let(:params) do { proxy: 'http://user:password@proxy.example.org:3128/', version: '1.7.0', } end it { is_expected.to compile } it { is_expected.to contain_exec('Install Docker Compose 1.7.0').with_command( 'curl -s -S -L --proxy http://user:password@proxy.example.org:3128/'\ ' https://github.com/docker/compose/releases/download/1.7.0/docker-compose-Linux-x86_64'\ ' -o /usr/local/bin/docker-compose-1.7.0', ) } end context 'when proxy IP is provided' do let(:params) do { proxy: 'http://10.10.10.10:3128/', version: '1.7.0' } end it { is_expected.to compile } it { is_expected.to contain_exec('Install Docker Compose 1.7.0').with_command( 'curl -s -S -L --proxy http://10.10.10.10:3128/ https://github.com/docker/compose/releases/download/1.7.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose-1.7.0', ) } end + + context 'when base_url is provided' do + let(:params) do + { base_url: 'http://example.org', + version: '1.7.0' } + end + + it { is_expected.to compile } + it { + is_expected.to contain_exec('Install Docker Compose 1.7.0').with_command( + 'curl -s -S -L http://example.org/1.7.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose-1.7.0', + ) + } + end + + context 'when raw_url is provided' do + let(:params) do + { raw_url: 'http://example.org', + version: '1.7.0' } + end + + it { is_expected.to compile } + it { + is_expected.to contain_exec('Install Docker Compose 1.7.0').with_command( + 'curl -s -S -L http://example.org -o /usr/local/bin/docker-compose-1.7.0', + ) + } + end end