beaker 2.7.1 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/HISTORY.md +121 -2
- data/lib/beaker/dsl.rb +2 -2
- data/lib/beaker/dsl/helpers.rb +13 -1429
- data/lib/beaker/dsl/helpers/facter_helpers.rb +48 -0
- data/lib/beaker/dsl/helpers/hiera_helpers.rb +71 -0
- data/lib/beaker/dsl/helpers/host_helpers.rb +506 -0
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +698 -0
- data/lib/beaker/dsl/helpers/tk_helpers.rb +101 -0
- data/lib/beaker/dsl/helpers/web_helpers.rb +115 -0
- data/lib/beaker/dsl/install_utils.rb +8 -1570
- data/lib/beaker/dsl/install_utils/ezbake_utils.rb +256 -0
- data/lib/beaker/dsl/install_utils/module_utils.rb +237 -0
- data/lib/beaker/dsl/install_utils/pe_utils.rb +518 -0
- data/lib/beaker/dsl/install_utils/puppet_utils.rb +722 -0
- data/lib/beaker/dsl/outcomes.rb +0 -4
- data/lib/beaker/dsl/roles.rb +0 -3
- data/lib/beaker/dsl/structure.rb +127 -4
- data/lib/beaker/dsl/wrappers.rb +0 -4
- data/lib/beaker/host.rb +23 -0
- data/lib/beaker/host/unix/pkg.rb +4 -4
- data/lib/beaker/host_prebuilt_steps.rb +11 -5
- data/lib/beaker/hypervisor/vagrant.rb +1 -0
- data/lib/beaker/hypervisor/vmpooler.rb +38 -0
- data/lib/beaker/logger.rb +10 -4
- data/lib/beaker/network_manager.rb +5 -4
- data/lib/beaker/options/command_line_parser.rb +7 -0
- data/lib/beaker/shared.rb +2 -1
- data/lib/beaker/shared/semvar.rb +41 -0
- data/lib/beaker/test_suite.rb +20 -6
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/facter_helpers_spec.rb +59 -0
- data/spec/beaker/dsl/helpers/hiera_helpers_spec.rb +96 -0
- data/spec/beaker/dsl/helpers/host_helpers_spec.rb +413 -0
- data/spec/beaker/dsl/{helpers_spec.rb → helpers/puppet_helpers_spec.rb} +2 -611
- data/spec/beaker/dsl/helpers/tk_helpers_spec.rb +83 -0
- data/spec/beaker/dsl/helpers/web_helpers_spec.rb +60 -0
- data/spec/beaker/dsl/install_utils/module_utils_spec.rb +241 -0
- data/spec/beaker/dsl/install_utils/pe_utils_spec.rb +475 -0
- data/spec/beaker/dsl/install_utils/puppet_utils_spec.rb +523 -0
- data/spec/beaker/dsl/structure_spec.rb +108 -0
- data/spec/beaker/host_prebuilt_steps_spec.rb +44 -0
- data/spec/beaker/host_spec.rb +41 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +2 -1
- data/spec/beaker/logger_spec.rb +9 -2
- data/spec/beaker/network_manager_spec.rb +7 -1
- data/spec/beaker/options/command_line_parser_spec.rb +3 -2
- data/spec/beaker/shared/semvar_spec.rb +36 -0
- data/spec/beaker/test_suite_spec.rb +48 -0
- data/spec/mocks.rb +10 -0
- metadata +23 -5
- data/lib/beaker/dsl/ezbake_utils.rb +0 -259
- data/spec/beaker/dsl/install_utils_spec.rb +0 -1242
@@ -1,259 +0,0 @@
|
|
1
|
-
require 'beaker/dsl/install_utils'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
module Beaker
|
5
|
-
module DSL
|
6
|
-
# This module contains methods to assist in installing projects from source
|
7
|
-
# that use ezbake for packaging.
|
8
|
-
#
|
9
|
-
# @api dsl
|
10
|
-
module EZBakeUtils
|
11
|
-
|
12
|
-
# @!group Public DSL Methods
|
13
|
-
|
14
|
-
# Installs leiningen project with given name and version on remote host.
|
15
|
-
#
|
16
|
-
# @param [Host] host A single remote host on which to install the
|
17
|
-
# specified leiningen project.
|
18
|
-
# @api dsl
|
19
|
-
def install_from_ezbake host
|
20
|
-
ezbake_validate_support host
|
21
|
-
ezbake_tools_available?
|
22
|
-
install_ezbake_tarball_on_host host
|
23
|
-
ezbake_installsh host, "service"
|
24
|
-
end
|
25
|
-
|
26
|
-
# Installs termini with given name and version on remote host.
|
27
|
-
#
|
28
|
-
# @param [Host] host A single remote host on which to install the
|
29
|
-
# specified leiningen project.
|
30
|
-
# @api dsl
|
31
|
-
def install_termini_from_ezbake host
|
32
|
-
ezbake_validate_support host
|
33
|
-
ezbake_tools_available?
|
34
|
-
install_ezbake_tarball_on_host host
|
35
|
-
ezbake_installsh host, "termini"
|
36
|
-
end
|
37
|
-
|
38
|
-
# Install a development version of ezbake into the local m2 repository
|
39
|
-
#
|
40
|
-
# This can be useful if you want to work on a development branch of
|
41
|
-
# ezbake that hasn't been released yet. Ensure your project dependencies
|
42
|
-
# in your development branch include a reference to the -SNAPSHOT
|
43
|
-
# version of the project for it to successfully pickup a pre-shipped
|
44
|
-
# version of ezbake.
|
45
|
-
#
|
46
|
-
# @param url [String] git url
|
47
|
-
# @param branch [String] git branch
|
48
|
-
# @api dsl
|
49
|
-
def ezbake_dev_build url = "git@github.com:puppetlabs/ezbake.git",
|
50
|
-
branch = "master"
|
51
|
-
ezbake_dir = 'tmp/ezbake'
|
52
|
-
conditionally_clone url, ezbake_dir, branch
|
53
|
-
lp = ezbake_lein_prefix
|
54
|
-
|
55
|
-
Dir.chdir(ezbake_dir) do
|
56
|
-
ezbake_local_cmd "#{lp} install",
|
57
|
-
:throw_on_failure => true
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
# @!endgroup
|
62
|
-
|
63
|
-
class << self
|
64
|
-
attr_accessor :config
|
65
|
-
end
|
66
|
-
|
67
|
-
# @!group Private helpers
|
68
|
-
|
69
|
-
# Test for support in one place
|
70
|
-
#
|
71
|
-
# @param [Host] host host to check for support
|
72
|
-
# @raise [RuntimeError] if OS is not supported
|
73
|
-
# @api private
|
74
|
-
def ezbake_validate_support host
|
75
|
-
variant, version, _, _ = host['platform'].to_array
|
76
|
-
unless variant =~ /^(fedora|el|centos|debian|ubuntu)$/
|
77
|
-
raise RuntimeError,
|
78
|
-
"No support for #{variant} within ezbake_utils ..."
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
# Build, copy & unpack tarball on remote host
|
83
|
-
#
|
84
|
-
# @param [Host] host installation destination
|
85
|
-
# @api private
|
86
|
-
def install_ezbake_tarball_on_host host
|
87
|
-
if not ezbake_config
|
88
|
-
ezbake_stage
|
89
|
-
end
|
90
|
-
|
91
|
-
# Skip installation if the remote directory exists
|
92
|
-
result = on host, "test -d #{ezbake_install_dir}", :acceptable_exit_codes => [0, 1]
|
93
|
-
return if result.exit_code == 0
|
94
|
-
|
95
|
-
ezbake_staging_dir = File.join('target', 'staging')
|
96
|
-
Dir.chdir(ezbake_staging_dir) do
|
97
|
-
ezbake_local_cmd 'rake package:tar'
|
98
|
-
end
|
99
|
-
|
100
|
-
local_tarball = ezbake_staging_dir + "/pkg/" + ezbake_install_name + ".tar.gz"
|
101
|
-
remote_tarball = ezbake_install_dir + ".tar.gz"
|
102
|
-
scp_to host, local_tarball, remote_tarball
|
103
|
-
|
104
|
-
# untar tarball on host
|
105
|
-
on host, "tar -xzf " + remote_tarball
|
106
|
-
|
107
|
-
# Check to ensure directory exists
|
108
|
-
on host, "test -d #{ezbake_install_dir}"
|
109
|
-
end
|
110
|
-
|
111
|
-
LOCAL_COMMANDS_REQUIRED = [
|
112
|
-
['leiningen', 'lein --version', nil],
|
113
|
-
['lein-pprint', 'lein with-profile ci pprint :version',
|
114
|
-
'Must have lein-pprint installed under the :ci profile.'],
|
115
|
-
['java', 'java -version', nil],
|
116
|
-
['git', 'git --version', nil],
|
117
|
-
['rake', 'rake --version', nil],
|
118
|
-
]
|
119
|
-
|
120
|
-
# Checks given host for the tools necessary to perform
|
121
|
-
# install_from_ezbake.
|
122
|
-
#
|
123
|
-
# @raise [RuntimeError] if tool is not found
|
124
|
-
# @api private
|
125
|
-
def ezbake_tools_available?
|
126
|
-
LOCAL_COMMANDS_REQUIRED.each do |software_name, command, additional_error_message|
|
127
|
-
if not system command
|
128
|
-
error_message = "Must have #{software_name} installed on development system.\n"
|
129
|
-
if additional_error_message
|
130
|
-
error_message += additional_error_message
|
131
|
-
end
|
132
|
-
raise RuntimeError, error_message
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
# Return the ezbake config.
|
138
|
-
#
|
139
|
-
# @return [Hash] configuration for ezbake, usually from ezbake.rb
|
140
|
-
# @api private
|
141
|
-
def ezbake_config
|
142
|
-
EZBakeUtils.config
|
143
|
-
end
|
144
|
-
|
145
|
-
# Returns a leiningen prefix with local m2 repo capability
|
146
|
-
#
|
147
|
-
# @return [String] lein prefix command that uses a local build
|
148
|
-
# m2 repository.
|
149
|
-
# @api private
|
150
|
-
def ezbake_lein_prefix
|
151
|
-
# Get the absolute path to the local repo
|
152
|
-
m2_repo = File.join(Dir.pwd, 'tmp', 'm2-local')
|
153
|
-
|
154
|
-
'lein update-in : assoc :local-repo "\"' + m2_repo + '\"" --'
|
155
|
-
end
|
156
|
-
|
157
|
-
# Prepares a staging directory for the specified project.
|
158
|
-
#
|
159
|
-
# @api private
|
160
|
-
def ezbake_stage
|
161
|
-
# Install the PuppetDB jar into the local repository
|
162
|
-
ezbake_local_cmd "#{ezbake_lein_prefix} install",
|
163
|
-
:throw_on_failure => true
|
164
|
-
|
165
|
-
# Run ezbake stage
|
166
|
-
ezbake_local_cmd "#{ezbake_lein_prefix} with-profile ezbake ezbake stage",
|
167
|
-
:throw_on_failure => true
|
168
|
-
|
169
|
-
# Boostrap packaging, and grab configuration info from project
|
170
|
-
staging_dir = File.join('target','staging')
|
171
|
-
Dir.chdir(staging_dir) do
|
172
|
-
ezbake_local_cmd 'rake package:bootstrap'
|
173
|
-
|
174
|
-
load 'ezbake.rb'
|
175
|
-
ezbake = EZBake::Config
|
176
|
-
ezbake[:package_version] = `echo -n $(rake pl:print_build_param[ref] | tail -n 1)`
|
177
|
-
EZBakeUtils.config = ezbake
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
# Executes a local command using system, logging the prepared command
|
182
|
-
#
|
183
|
-
# @param [String] cmd command to execute
|
184
|
-
# @param [Hash] opts options
|
185
|
-
# @option opts [bool] :throw_on_failure If true, throws an
|
186
|
-
# exception if the exit code is non-zero. Defaults to false.
|
187
|
-
# @return [bool] true if exit == 0 false if otherwise
|
188
|
-
# @raise [RuntimeError] if :throw_on_failure is true and
|
189
|
-
# command fails
|
190
|
-
# @api private
|
191
|
-
def ezbake_local_cmd cmd, opts={}
|
192
|
-
opts = {
|
193
|
-
:throw_on_failure => false,
|
194
|
-
}.merge(opts)
|
195
|
-
|
196
|
-
logger.notify "localhost $ #{cmd}"
|
197
|
-
result = system cmd
|
198
|
-
if opts[:throw_on_failure] && result == false
|
199
|
-
raise RuntimeError, "Command failure #{cmd}"
|
200
|
-
end
|
201
|
-
result
|
202
|
-
end
|
203
|
-
|
204
|
-
# Retrieve the tarball installation name. This is the name of
|
205
|
-
# the tarball without the .tar.gz extension, and the name of the
|
206
|
-
# path where it will unpack to.
|
207
|
-
#
|
208
|
-
# @return [String] name of the tarball and directory
|
209
|
-
# @api private
|
210
|
-
def ezbake_install_name
|
211
|
-
ezbake = ezbake_config
|
212
|
-
project_package_version = ezbake[:package_version]
|
213
|
-
project_name = ezbake[:project]
|
214
|
-
"%s-%s" % [ project_name, project_package_version ]
|
215
|
-
end
|
216
|
-
|
217
|
-
# Returns the full path to the installed software on the remote host.
|
218
|
-
#
|
219
|
-
# This only returns the path, it doesn't work out if its installed or
|
220
|
-
# not.
|
221
|
-
#
|
222
|
-
# @return [String] path to the installation dir
|
223
|
-
# @api private
|
224
|
-
def ezbake_install_dir
|
225
|
-
"/root/#{ezbake_install_name}"
|
226
|
-
end
|
227
|
-
|
228
|
-
# A helper that wraps the execution of install.sh in the proper
|
229
|
-
# ezbake installation directory.
|
230
|
-
#
|
231
|
-
# @param [Host] host Host to run install.sh on
|
232
|
-
# @param [String] task Task to execute with install.sh
|
233
|
-
# @api private
|
234
|
-
def ezbake_installsh host, task=""
|
235
|
-
on host, "cd #{ezbake_install_dir}; bash install.sh #{task}"
|
236
|
-
end
|
237
|
-
|
238
|
-
# Only clone from given git URI if there is no existing git clone at the
|
239
|
-
# given local_path location.
|
240
|
-
#
|
241
|
-
# @param [String] upstream_uri git URI
|
242
|
-
# @param [String] local_path path to conditionally install to
|
243
|
-
# @param [String] branch to checkout
|
244
|
-
# @api private
|
245
|
-
def conditionally_clone upstream_uri, local_path, branch="origin/HEAD"
|
246
|
-
if ezbake_local_cmd "git --work-tree=#{local_path} --git-dir=#{local_path}/.git status"
|
247
|
-
ezbake_local_cmd "git --work-tree=#{local_path} --git-dir=#{local_path}/.git fetch origin"
|
248
|
-
ezbake_local_cmd "git --work-tree=#{local_path} --git-dir=#{local_path}/.git checkout #{branch}"
|
249
|
-
else
|
250
|
-
parent_dir = File.dirname(local_path)
|
251
|
-
FileUtils.mkdir_p(parent_dir)
|
252
|
-
ezbake_local_cmd "git clone #{upstream_uri} #{local_path}"
|
253
|
-
ezbake_local_cmd "git --work-tree=#{local_path} --git-dir=#{local_path}/.git checkout #{branch}"
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
end
|
258
|
-
end
|
259
|
-
end
|
@@ -1,1242 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class ClassMixedWithDSLInstallUtils
|
4
|
-
include Beaker::DSL::InstallUtils
|
5
|
-
include Beaker::DSL::Wrappers
|
6
|
-
include Beaker::DSL::Helpers
|
7
|
-
include Beaker::DSL::Structure
|
8
|
-
include Beaker::DSL::Roles
|
9
|
-
include Beaker::DSL::Patterns
|
10
|
-
|
11
|
-
def logger
|
12
|
-
@logger ||= RSpec::Mocks::Double.new('logger').as_null_object
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe ClassMixedWithDSLInstallUtils do
|
17
|
-
let(:presets) { Beaker::Options::Presets.new }
|
18
|
-
let(:opts) { presets.presets.merge(presets.env_vars) }
|
19
|
-
let(:basic_hosts) { make_hosts( { :pe_ver => '3.0',
|
20
|
-
:platform => 'linux',
|
21
|
-
:roles => [ 'agent' ] }, 4 ) }
|
22
|
-
let(:hosts) { basic_hosts[0][:roles] = ['master', 'database', 'dashboard']
|
23
|
-
basic_hosts[1][:platform] = 'windows'
|
24
|
-
basic_hosts[2][:platform] = 'osx-10.9-x86_64'
|
25
|
-
basic_hosts[3][:platform] = 'eos'
|
26
|
-
basic_hosts }
|
27
|
-
let(:hosts_sorted) { [ hosts[1], hosts[0], hosts[2], hosts[3] ] }
|
28
|
-
let(:winhost) { make_host( 'winhost', { :platform => 'windows',
|
29
|
-
:pe_ver => '3.0',
|
30
|
-
:working_dir => '/tmp' } ) }
|
31
|
-
let(:machost) { make_host( 'machost', { :platform => 'osx-10.9-x86_64',
|
32
|
-
:pe_ver => '3.0',
|
33
|
-
:working_dir => '/tmp' } ) }
|
34
|
-
let(:unixhost) { make_host( 'unixhost', { :platform => 'linux',
|
35
|
-
:pe_ver => '3.0',
|
36
|
-
:working_dir => '/tmp',
|
37
|
-
:dist => 'puppet-enterprise-3.1.0-rc0-230-g36c9e5c-debian-7-i386' } ) }
|
38
|
-
let(:eoshost) { make_host( 'eoshost', { :platform => 'eos',
|
39
|
-
:pe_ver => '3.0',
|
40
|
-
:working_dir => '/tmp',
|
41
|
-
:dist => 'puppet-enterprise-3.7.1-rc0-78-gffc958f-eos-4-i386' } ) }
|
42
|
-
|
43
|
-
|
44
|
-
context 'extract_repo_info_from' do
|
45
|
-
[{ :protocol => 'git', :path => 'git://github.com/puppetlabs/project.git' },
|
46
|
-
{ :protocol => 'ssh', :path => 'git@github.com:puppetlabs/project.git' },
|
47
|
-
{ :protocol => 'https', :path => 'https://github.com:puppetlabs/project' },
|
48
|
-
{ :protocol => 'file', :path => 'file:///home/example/project' }
|
49
|
-
].each do |type|
|
50
|
-
it "handles #{ type[:protocol] } uris" do
|
51
|
-
uri = "#{ type[:path] }#master"
|
52
|
-
repo_info = subject.extract_repo_info_from uri
|
53
|
-
expect( repo_info[:name] ).to be == 'project'
|
54
|
-
expect( repo_info[:path] ).to be == type[:path]
|
55
|
-
expect( repo_info[:rev] ).to be == 'master'
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'order_packages' do
|
61
|
-
it 'orders facter, hiera before puppet, before anything else' do
|
62
|
-
named_repos = [
|
63
|
-
{ :name => 'puppet_plugin' }, { :name => 'puppet' }, { :name => 'facter' }
|
64
|
-
]
|
65
|
-
ordered_repos = subject.order_packages named_repos
|
66
|
-
expect( ordered_repos[0][:name] ).to be == 'facter'
|
67
|
-
expect( ordered_repos[1][:name] ).to be == 'puppet'
|
68
|
-
expect( ordered_repos[2][:name] ).to be == 'puppet_plugin'
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
context 'find_git_repo_versions' do
|
73
|
-
it 'returns a hash of :name => version' do
|
74
|
-
host = double( 'Host' )
|
75
|
-
repository = { :name => 'name' }
|
76
|
-
path = '/path/to/repo'
|
77
|
-
cmd = 'cd /path/to/repo/name && git describe || true'
|
78
|
-
logger = double.as_null_object
|
79
|
-
|
80
|
-
expect( subject ).to receive( :logger ).and_return( logger )
|
81
|
-
expect( subject ).to receive( :on ).with( host, cmd ).and_yield
|
82
|
-
expect( subject ).to receive( :stdout ).and_return( '2' )
|
83
|
-
|
84
|
-
version = subject.find_git_repo_versions( host, path, repository )
|
85
|
-
|
86
|
-
expect( version ).to be == { 'name' => '2' }
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'install_from_git' do
|
91
|
-
it 'does a ton of stuff it probably shouldnt' do
|
92
|
-
repo = { :name => 'puppet',
|
93
|
-
:path => 'git://my.server.net/puppet.git',
|
94
|
-
:rev => 'master' }
|
95
|
-
path = '/path/to/repos'
|
96
|
-
host = { 'platform' => 'debian' }
|
97
|
-
logger = double.as_null_object
|
98
|
-
|
99
|
-
expect( subject ).to receive( :logger ).exactly( 3 ).times.and_return( logger )
|
100
|
-
expect( subject ).to receive( :on ).exactly( 4 ).times
|
101
|
-
|
102
|
-
subject.install_from_git( host, path, repo )
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'allows a checkout depth of 1' do
|
106
|
-
repo = { :name => 'puppet',
|
107
|
-
:path => 'git://my.server.net/puppet.git',
|
108
|
-
:rev => 'master',
|
109
|
-
:depth => 1 }
|
110
|
-
|
111
|
-
path = '/path/to/repos'
|
112
|
-
cmd = "test -d #{path}/#{repo[:name]} || git clone --branch #{repo[:rev]} --depth #{repo[:depth]} #{repo[:path]} #{path}/#{repo[:name]}"
|
113
|
-
host = { 'platform' => 'debian' }
|
114
|
-
logger = double.as_null_object
|
115
|
-
expect( subject ).to receive( :logger ).exactly( 3 ).times.and_return( logger )
|
116
|
-
expect( subject ).to receive( :on ).with( host,"test -d #{path} || mkdir -p #{path}").exactly( 1 ).times
|
117
|
-
# this is the the command we want to test
|
118
|
-
expect( subject ).to receive( :on ).with( host, cmd ).exactly( 1 ).times
|
119
|
-
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && git remote rm origin && git remote add origin #{repo[:path]} && git fetch origin +refs/pull/*:refs/remotes/origin/pr/* +refs/heads/*:refs/remotes/origin/* && git clean -fdx && git checkout -f #{repo[:rev]}" ).exactly( 1 ).times
|
120
|
-
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && if [ -f install.rb ]; then ruby ./install.rb ; else true; fi" ).exactly( 1 ).times
|
121
|
-
|
122
|
-
subject.install_from_git( host, path, repo )
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'allows a checkout depth with a rev from a specific branch' do
|
126
|
-
repo = { :name => 'puppet',
|
127
|
-
:path => 'git://my.server.net/puppet.git',
|
128
|
-
:rev => 'a2340acddadfeafd234230faf',
|
129
|
-
:depth => 50,
|
130
|
-
:depth_branch => 'master' }
|
131
|
-
|
132
|
-
path = '/path/to/repos'
|
133
|
-
cmd = "test -d #{path}/#{repo[:name]} || git clone --branch #{repo[:depth_branch]} --depth #{repo[:depth]} #{repo[:path]} #{path}/#{repo[:name]}"
|
134
|
-
host = { 'platform' => 'debian' }
|
135
|
-
logger = double.as_null_object
|
136
|
-
expect( subject ).to receive( :logger ).exactly( 3 ).times.and_return( logger )
|
137
|
-
expect( subject ).to receive( :on ).with( host,"test -d #{path} || mkdir -p #{path}").exactly( 1 ).times
|
138
|
-
# this is the the command we want to test
|
139
|
-
expect( subject ).to receive( :on ).with( host, cmd ).exactly( 1 ).times
|
140
|
-
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && git remote rm origin && git remote add origin #{repo[:path]} && git fetch origin +refs/pull/*:refs/remotes/origin/pr/* +refs/heads/*:refs/remotes/origin/* && git clean -fdx && git checkout -f #{repo[:rev]}" ).exactly( 1 ).times
|
141
|
-
expect( subject ).to receive( :on ).with( host, "cd #{path}/#{repo[:name]} && if [ -f install.rb ]; then ruby ./install.rb ; else true; fi" ).exactly( 1 ).times
|
142
|
-
|
143
|
-
subject.install_from_git( host, path, repo )
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
describe 'sorted_hosts' do
|
148
|
-
it 'can reorder so that the master comes first' do
|
149
|
-
allow( subject ).to receive( :hosts ).and_return( hosts_sorted )
|
150
|
-
expect( subject.sorted_hosts ).to be === hosts
|
151
|
-
end
|
152
|
-
|
153
|
-
it 'leaves correctly ordered hosts alone' do
|
154
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
155
|
-
expect( subject.sorted_hosts ).to be === hosts
|
156
|
-
end
|
157
|
-
|
158
|
-
it 'does not allow nil entries' do
|
159
|
-
allow( subject ).to receive( :options ).and_return( { :masterless => true } )
|
160
|
-
masterless_host = [basic_hosts[0]]
|
161
|
-
allow( subject ).to receive( :hosts ).and_return( masterless_host )
|
162
|
-
expect( subject.sorted_hosts ).to be === masterless_host
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
describe 'installer_cmd' do
|
167
|
-
|
168
|
-
it 'generates a windows PE install command for a windows host' do
|
169
|
-
winhost['dist'] = 'puppet-enterprise-3.0'
|
170
|
-
allow( subject ).to receive( :hosts ).and_return( [ hosts[1], hosts[0], hosts[2], winhost ] )
|
171
|
-
expect( subject.installer_cmd( winhost, {} ) ).to be === "cd /tmp && cmd /C 'start /w msiexec.exe /qn /L*V tmp.log /i puppet-enterprise-3.0.msi PUPPET_MASTER_SERVER=vm1 PUPPET_AGENT_CERTNAME=winhost'"
|
172
|
-
end
|
173
|
-
|
174
|
-
it 'generates a unix PE install command for a unix host' do
|
175
|
-
the_host = unixhost.dup
|
176
|
-
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
177
|
-
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp/puppet-enterprise-3.1.0-rc0-230-g36c9e5c-debian-7-i386 && ./puppet-enterprise-installer -a /tmp/answers"
|
178
|
-
end
|
179
|
-
|
180
|
-
it 'generates a unix PE frictionless install command for a unix host with role "frictionless"' do
|
181
|
-
allow( subject ).to receive( :version_is_less ).and_return( false )
|
182
|
-
allow( subject ).to receive( :master ).and_return( 'testmaster' )
|
183
|
-
the_host = unixhost.dup
|
184
|
-
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
185
|
-
the_host['roles'] = ['frictionless']
|
186
|
-
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && curl --tlsv1 -kO https://testmaster:8140/packages/3.0/install.bash && bash install.bash"
|
187
|
-
end
|
188
|
-
|
189
|
-
it 'generates a unix PE frictionless install command for a unix host with role "frictionless" and "frictionless_options"' do
|
190
|
-
allow( subject ).to receive( :version_is_less ).and_return( false )
|
191
|
-
allow( subject ).to receive( :master ).and_return( 'testmaster' )
|
192
|
-
the_host = unixhost.dup
|
193
|
-
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
194
|
-
the_host['roles'] = ['frictionless']
|
195
|
-
the_host['frictionless_options'] = { 'main' => { 'dns_alt_names' => 'puppet' } }
|
196
|
-
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && curl --tlsv1 -kO https://testmaster:8140/packages/3.0/install.bash && bash install.bash main:dns_alt_names=puppet"
|
197
|
-
end
|
198
|
-
|
199
|
-
it 'generates a osx PE install command for a osx host' do
|
200
|
-
the_host = machost.dup
|
201
|
-
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
202
|
-
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && hdiutil attach .dmg && installer -pkg /Volumes/puppet-enterprise-3.0/puppet-enterprise-installer-3.0.pkg -target /"
|
203
|
-
end
|
204
|
-
|
205
|
-
it 'generates an EOS PE install command for an EOS host' do
|
206
|
-
the_host = eoshost.dup
|
207
|
-
commands = ['enable', "extension puppet-enterprise-#{the_host['pe_ver']}-#{the_host['platform']}.swix"]
|
208
|
-
command = commands.join("\n")
|
209
|
-
expect( subject.installer_cmd( the_host, {} ) ).to be === "Cli -c '#{command}'"
|
210
|
-
end
|
211
|
-
|
212
|
-
it 'generates a unix PE install command in verbose for a unix host when pe_debug is enabled' do
|
213
|
-
the_host = unixhost.dup
|
214
|
-
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
215
|
-
the_host[:pe_debug] = true
|
216
|
-
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp/puppet-enterprise-3.1.0-rc0-230-g36c9e5c-debian-7-i386 && ./puppet-enterprise-installer -D -a /tmp/answers"
|
217
|
-
end
|
218
|
-
|
219
|
-
it 'generates a osx PE install command in verbose for a osx host when pe_debug is enabled' do
|
220
|
-
the_host = machost.dup
|
221
|
-
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
222
|
-
the_host[:pe_debug] = true
|
223
|
-
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && hdiutil attach .dmg && installer -verboseR -pkg /Volumes/puppet-enterprise-3.0/puppet-enterprise-installer-3.0.pkg -target /"
|
224
|
-
end
|
225
|
-
|
226
|
-
it 'generates a unix PE frictionless install command in verbose for a unix host with role "frictionless" and pe_debug is enabled' do
|
227
|
-
allow( subject ).to receive( :version_is_less ).and_return( false )
|
228
|
-
allow( subject ).to receive( :master ).and_return( 'testmaster' )
|
229
|
-
the_host = unixhost.dup
|
230
|
-
the_host['pe_installer'] = 'puppet-enterprise-installer'
|
231
|
-
the_host['roles'] = ['frictionless']
|
232
|
-
the_host[:pe_debug] = true
|
233
|
-
expect( subject.installer_cmd( the_host, {} ) ).to be === "cd /tmp && curl --tlsv1 -kO https://testmaster:8140/packages/3.0/install.bash && bash -x install.bash"
|
234
|
-
end
|
235
|
-
|
236
|
-
end
|
237
|
-
|
238
|
-
|
239
|
-
describe 'fetch_puppet' do
|
240
|
-
|
241
|
-
it 'can push a local PE .tar.gz to a host and unpack it' do
|
242
|
-
allow( File ).to receive( :directory? ).and_return( true ) #is local
|
243
|
-
allow( File ).to receive( :exists? ).and_return( true ) #is a .tar.gz
|
244
|
-
unixhost['pe_dir'] = '/local/file/path'
|
245
|
-
allow( subject ).to receive( :scp_to ).and_return( true )
|
246
|
-
|
247
|
-
path = unixhost['pe_dir']
|
248
|
-
filename = "#{ unixhost['dist'] }"
|
249
|
-
extension = '.tar.gz'
|
250
|
-
expect( subject ).to receive( :scp_to ).with( unixhost, "#{ path }/#{ filename }#{ extension }", "#{ unixhost['working_dir'] }/#{ filename }#{ extension }" ).once
|
251
|
-
expect( subject ).to receive( :on ).with( unixhost, /gunzip/ ).once
|
252
|
-
expect( subject ).to receive( :on ).with( unixhost, /tar -xvf/ ).once
|
253
|
-
subject.fetch_puppet( [unixhost], {} )
|
254
|
-
end
|
255
|
-
|
256
|
-
it 'can download a PE .tar from a URL to a host and unpack it' do
|
257
|
-
allow( File ).to receive( :directory? ).and_return( false ) #is not local
|
258
|
-
allow( subject ).to receive( :link_exists? ) do |arg|
|
259
|
-
if arg =~ /.tar.gz/ #there is no .tar.gz link, only a .tar
|
260
|
-
false
|
261
|
-
else
|
262
|
-
true
|
263
|
-
end
|
264
|
-
end
|
265
|
-
allow( subject ).to receive( :on ).and_return( true )
|
266
|
-
|
267
|
-
path = unixhost['pe_dir']
|
268
|
-
filename = "#{ unixhost['dist'] }"
|
269
|
-
extension = '.tar'
|
270
|
-
expect( subject ).to receive( :on ).with( unixhost, "cd #{ unixhost['working_dir'] }; curl #{ path }/#{ filename }#{ extension } | tar -xvf -" ).once
|
271
|
-
subject.fetch_puppet( [unixhost], {} )
|
272
|
-
end
|
273
|
-
|
274
|
-
it 'can download a PE .tar.gz from a URL to a host and unpack it' do
|
275
|
-
allow( File ).to receive( :directory? ).and_return( false ) #is not local
|
276
|
-
allow( subject ).to receive( :link_exists? ).and_return( true ) #is a tar.gz
|
277
|
-
allow( subject ).to receive( :on ).and_return( true )
|
278
|
-
|
279
|
-
path = unixhost['pe_dir']
|
280
|
-
filename = "#{ unixhost['dist'] }"
|
281
|
-
extension = '.tar.gz'
|
282
|
-
expect( subject ).to receive( :on ).with( unixhost, "cd #{ unixhost['working_dir'] }; curl #{ path }/#{ filename }#{ extension } | gunzip | tar -xvf -" ).once
|
283
|
-
subject.fetch_puppet( [unixhost], {} )
|
284
|
-
end
|
285
|
-
|
286
|
-
it 'can download a PE .swix from a URL to an EOS host and unpack it' do
|
287
|
-
allow( File ).to receive( :directory? ).and_return( false ) #is not local
|
288
|
-
allow( subject ).to receive( :link_exists? ).and_return( true ) #is a tar.gz
|
289
|
-
allow( subject ).to receive( :on ).and_return( true )
|
290
|
-
|
291
|
-
path = eoshost['pe_dir']
|
292
|
-
filename = "#{ eoshost['dist'] }"
|
293
|
-
extension = '.swix'
|
294
|
-
commands = ['enable', "copy #{path}/#{filename}#{extension} extension:"]
|
295
|
-
command = commands.join("\n")
|
296
|
-
expect( subject ).to receive( :on ).with( eoshost, "Cli -c '#{command}'" ).once
|
297
|
-
subject.fetch_puppet( [eoshost], {} )
|
298
|
-
end
|
299
|
-
|
300
|
-
it 'can push a local PE package to a windows host' do
|
301
|
-
allow( File ).to receive( :directory? ).and_return( true ) #is local
|
302
|
-
allow( File ).to receive( :exists? ).and_return( true ) #is present
|
303
|
-
winhost['dist'] = 'puppet-enterprise-3.0'
|
304
|
-
allow( subject ).to receive( :scp_to ).and_return( true )
|
305
|
-
|
306
|
-
path = winhost['pe_dir']
|
307
|
-
filename = "puppet-enterprise-#{ winhost['pe_ver'] }"
|
308
|
-
extension = '.msi'
|
309
|
-
expect( subject ).to receive( :scp_to ).with( winhost, "#{ path }/#{ filename }#{ extension }", "#{ winhost['working_dir'] }/#{ filename }#{ extension }" ).once
|
310
|
-
subject.fetch_puppet( [winhost], {} )
|
311
|
-
|
312
|
-
end
|
313
|
-
|
314
|
-
it 'can download a PE dmg from a URL to a mac host' do
|
315
|
-
allow( File ).to receive( :directory? ).and_return( false ) #is not local
|
316
|
-
allow( subject ).to receive( :link_exists? ).and_return( true ) #is not local
|
317
|
-
allow( subject ).to receive( :on ).and_return( true )
|
318
|
-
|
319
|
-
path = machost['pe_dir']
|
320
|
-
filename = "#{ machost['dist'] }"
|
321
|
-
extension = '.dmg'
|
322
|
-
expect( subject ).to receive( :on ).with( machost, "cd #{ machost['working_dir'] }; curl -O #{ path }/#{ filename }#{ extension }" ).once
|
323
|
-
subject.fetch_puppet( [machost], {} )
|
324
|
-
end
|
325
|
-
|
326
|
-
it 'can push a PE dmg to a mac host' do
|
327
|
-
allow( File ).to receive( :directory? ).and_return( true ) #is local
|
328
|
-
allow( File ).to receive( :exists? ).and_return( true ) #is present
|
329
|
-
allow( subject ).to receive( :scp_to ).and_return( true )
|
330
|
-
|
331
|
-
path = machost['pe_dir']
|
332
|
-
filename = "#{ machost['dist'] }"
|
333
|
-
extension = '.dmg'
|
334
|
-
expect( subject ).to receive( :scp_to ).with( machost, "#{ path }/#{ filename }#{ extension }", "#{ machost['working_dir'] }/#{ filename }#{ extension }" ).once
|
335
|
-
subject.fetch_puppet( [machost], {} )
|
336
|
-
end
|
337
|
-
|
338
|
-
it "does nothing for a frictionless agent for PE >= 3.2.0" do
|
339
|
-
unixhost['roles'] << 'frictionless'
|
340
|
-
unixhost['pe_ver'] = '3.2.0'
|
341
|
-
|
342
|
-
expect( subject).to_not receive(:scp_to)
|
343
|
-
expect( subject).to_not receive(:on)
|
344
|
-
allow( subject ).to receive(:version_is_less).with('3.2.0', '3.2.0').and_return(false)
|
345
|
-
subject.fetch_puppet( [unixhost], {} )
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
describe 'do_install' do
|
350
|
-
it 'can perform a simple installation' do
|
351
|
-
allow( subject ).to receive( :on ).and_return( Beaker::Result.new( {}, '' ) )
|
352
|
-
allow( subject ).to receive( :fetch_puppet ).and_return( true )
|
353
|
-
allow( subject ).to receive( :create_remote_file ).and_return( true )
|
354
|
-
allow( subject ).to receive( :sign_certificate_for ).and_return( true )
|
355
|
-
allow( subject ).to receive( :stop_agent_on ).and_return( true )
|
356
|
-
allow( subject ).to receive( :sleep_until_puppetdb_started ).and_return( true )
|
357
|
-
allow( subject ).to receive( :version_is_less ).with('3.0', '4.0').and_return( true )
|
358
|
-
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4').and_return( true )
|
359
|
-
allow( subject ).to receive( :version_is_less ).with('3.0', '3.0').and_return( false )
|
360
|
-
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4').and_return( true )
|
361
|
-
allow( subject ).to receive( :wait_for_host_in_dashboard ).and_return( true )
|
362
|
-
allow( subject ).to receive( :puppet_agent ) do |arg|
|
363
|
-
"puppet agent #{arg}"
|
364
|
-
end
|
365
|
-
allow( subject ).to receive( :puppet ) do |arg|
|
366
|
-
"puppet #{arg}"
|
367
|
-
end
|
368
|
-
|
369
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
370
|
-
#create answers file per-host, except windows
|
371
|
-
expect( subject ).to receive( :create_remote_file ).with( hosts[0], /answers/, /q/ ).once
|
372
|
-
#run installer on all hosts
|
373
|
-
expect( subject ).to receive( :on ).with( hosts[0], /puppet-enterprise-installer/ ).once
|
374
|
-
expect( subject ).to receive( :on ).with( hosts[1], /msiexec.exe/ ).once
|
375
|
-
expect( subject ).to receive( :on ).with( hosts[2], / hdiutil attach puppet-enterprise-3.0-osx-10.9-x86_64.dmg && installer -pkg \/Volumes\/puppet-enterprise-3.0\/puppet-enterprise-installer-3.0.pkg -target \// ).once
|
376
|
-
expect( subject ).to receive( :on ).with( hosts[3], /^Cli/ ).once
|
377
|
-
#does extra mac/EOS specific commands
|
378
|
-
expect( subject ).to receive( :on ).with( hosts[2], /puppet config set server/ ).once
|
379
|
-
expect( subject ).to receive( :on ).with( hosts[3], /puppet config set server/ ).once
|
380
|
-
expect( subject ).to receive( :on ).with( hosts[2], /puppet config set certname/ ).once
|
381
|
-
expect( subject ).to receive( :on ).with( hosts[3], /puppet config set certname/ ).once
|
382
|
-
expect( subject ).to receive( :on ).with( hosts[2], /puppet agent -t/, :acceptable_exit_codes => [1] ).once
|
383
|
-
expect( subject ).to receive( :on ).with( hosts[3], /puppet agent -t/, :acceptable_exit_codes => [0, 1] ).once
|
384
|
-
#sign certificate per-host
|
385
|
-
expect( subject ).to receive( :sign_certificate_for ).with( hosts[0] ).once
|
386
|
-
expect( subject ).to receive( :sign_certificate_for ).with( hosts[1] ).once
|
387
|
-
expect( subject ).to receive( :sign_certificate_for ).with( hosts[2] ).once
|
388
|
-
expect( subject ).to receive( :sign_certificate_for ).with( hosts[3] ).once
|
389
|
-
#stop puppet agent on all hosts
|
390
|
-
expect( subject ).to receive( :stop_agent_on ).with( hosts[0] ).once
|
391
|
-
expect( subject ).to receive( :stop_agent_on ).with( hosts[1] ).once
|
392
|
-
expect( subject ).to receive( :stop_agent_on ).with( hosts[2] ).once
|
393
|
-
expect( subject ).to receive( :stop_agent_on ).with( hosts[3] ).once
|
394
|
-
#wait for puppetdb to start
|
395
|
-
expect( subject ).to receive( :sleep_until_puppetdb_started ).with( hosts[0] ).once
|
396
|
-
#run each puppet agent once
|
397
|
-
expect( subject ).to receive( :on ).with( hosts[0], /puppet agent -t/, :acceptable_exit_codes => [0,2] ).once
|
398
|
-
expect( subject ).to receive( :on ).with( hosts[1], /puppet agent -t/, :acceptable_exit_codes => [0,2] ).once
|
399
|
-
expect( subject ).to receive( :on ).with( hosts[2], /puppet agent -t/, :acceptable_exit_codes => [0,2] ).once
|
400
|
-
expect( subject ).to receive( :on ).with( hosts[3], /puppet agent -t/, :acceptable_exit_codes => [0,2] ).once
|
401
|
-
#run rake task on dashboard
|
402
|
-
expect( subject ).to receive( :on ).with( hosts[0], /\/opt\/puppet\/bin\/rake -sf \/opt\/puppet\/share\/puppet-dashboard\/Rakefile .* RAILS_ENV=production/ ).once
|
403
|
-
#wait for all hosts to appear in the dashboard
|
404
|
-
#run puppet agent now that installation is complete
|
405
|
-
expect( subject ).to receive( :on ).with( hosts, /puppet agent/, :acceptable_exit_codes => [0,2] ).once
|
406
|
-
subject.do_install( hosts, opts )
|
407
|
-
end
|
408
|
-
|
409
|
-
it 'can perform a masterless installation' do
|
410
|
-
hosts = make_hosts({
|
411
|
-
:pe_ver => '3.0',
|
412
|
-
:roles => ['agent']
|
413
|
-
}, 1)
|
414
|
-
|
415
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
416
|
-
allow( subject ).to receive( :options ).and_return({ :masterless => true })
|
417
|
-
allow( subject ).to receive( :on ).and_return( Beaker::Result.new( {}, '' ) )
|
418
|
-
allow( subject ).to receive( :fetch_puppet ).and_return( true )
|
419
|
-
allow( subject ).to receive( :create_remote_file ).and_return( true )
|
420
|
-
allow( subject ).to receive( :stop_agent_on ).and_return( true )
|
421
|
-
allow( subject ).to receive( :version_is_less ).with(anything, '3.2.0').exactly(hosts.length + 1).times.and_return( false )
|
422
|
-
|
423
|
-
expect( subject ).to receive( :on ).with( hosts[0], /puppet-enterprise-installer/ ).once
|
424
|
-
expect( subject ).to receive( :create_remote_file ).with( hosts[0], /answers/, /q/ ).once
|
425
|
-
expect( subject ).to_not receive( :sign_certificate_for )
|
426
|
-
expect( subject ).to receive( :stop_agent_on ).with( hosts[0] ).once
|
427
|
-
expect( subject ).to_not receive( :sleep_until_puppetdb_started )
|
428
|
-
expect( subject ).to_not receive( :wait_for_host_in_dashboard )
|
429
|
-
expect( subject ).to_not receive( :on ).with( hosts[0], /puppet agent -t/, :acceptable_exit_codes => [0,2] )
|
430
|
-
subject.do_install( hosts, opts)
|
431
|
-
end
|
432
|
-
end
|
433
|
-
|
434
|
-
describe 'do_higgs_install' do
|
435
|
-
|
436
|
-
before :each do
|
437
|
-
my_time = double( "time double" )
|
438
|
-
allow( my_time ).to receive( :strftime ).and_return( "2014-07-01_15.27.53" )
|
439
|
-
allow( Time ).to receive( :new ).and_return( my_time )
|
440
|
-
|
441
|
-
hosts[0]['working_dir'] = "tmp/2014-07-01_15.27.53"
|
442
|
-
hosts[0]['dist'] = 'dist'
|
443
|
-
hosts[0]['pe_installer'] = 'pe-installer'
|
444
|
-
allow( hosts[0] ).to receive( :tmpdir ).and_return( "/tmp/2014-07-01_15.27.53" )
|
445
|
-
|
446
|
-
@fail_result = Beaker::Result.new( {}, '' )
|
447
|
-
@fail_result.stdout = "No match here"
|
448
|
-
@success_result = Beaker::Result.new( {}, '' )
|
449
|
-
@success_result.stdout = "Please go to https://website in your browser to continue installation"
|
450
|
-
end
|
451
|
-
|
452
|
-
it 'can perform a simple installation' do
|
453
|
-
allow( subject ).to receive( :fetch_puppet ).and_return( true )
|
454
|
-
allow( subject ).to receive( :sleep ).and_return( true )
|
455
|
-
|
456
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
457
|
-
|
458
|
-
#run higgs installer command
|
459
|
-
expect( subject ).to receive( :on ).with( hosts[0],
|
460
|
-
"cd /tmp/2014-07-01_15.27.53/puppet-enterprise-3.0-linux ; nohup ./pe-installer <<<Y > higgs_2014-07-01_15.27.53.log 2>&1 &",
|
461
|
-
opts ).once
|
462
|
-
#check to see if the higgs installation has proceeded correctly, works on second check
|
463
|
-
expect( subject ).to receive( :on ).with( hosts[0], /cat #{hosts[0]['higgs_file']}/, { :acceptable_exit_codes => 0..255 }).and_return( @fail_result, @success_result )
|
464
|
-
subject.do_higgs_install( hosts[0], opts )
|
465
|
-
end
|
466
|
-
|
467
|
-
it 'fails out after checking installation log 10 times' do
|
468
|
-
allow( subject ).to receive( :fetch_puppet ).and_return( true )
|
469
|
-
allow( subject ).to receive( :sleep ).and_return( true )
|
470
|
-
|
471
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
472
|
-
|
473
|
-
#run higgs installer command
|
474
|
-
expect( subject ).to receive( :on ).with( hosts[0],
|
475
|
-
"cd /tmp/2014-07-01_15.27.53/puppet-enterprise-3.0-linux ; nohup ./pe-installer <<<Y > higgs_2014-07-01_15.27.53.log 2>&1 &",
|
476
|
-
opts ).once
|
477
|
-
#check to see if the higgs installation has proceeded correctly, works on second check
|
478
|
-
expect( subject ).to receive( :on ).with( hosts[0], /cat #{hosts[0]['higgs_file']}/, { :acceptable_exit_codes => 0..255 }).exactly(10).times.and_return( @fail_result )
|
479
|
-
expect{ subject.do_higgs_install( hosts[0], opts ) }.to raise_error
|
480
|
-
end
|
481
|
-
|
482
|
-
end
|
483
|
-
|
484
|
-
describe '#install_puppet' do
|
485
|
-
let(:hosts) do
|
486
|
-
make_hosts({:platform => platform })
|
487
|
-
end
|
488
|
-
|
489
|
-
before do
|
490
|
-
allow( subject ).to receive(:hosts).and_return(hosts)
|
491
|
-
allow( subject ).to receive(:on).and_return(Beaker::Result.new({},''))
|
492
|
-
end
|
493
|
-
context 'on el-6' do
|
494
|
-
let(:platform) { "el-6-i386" }
|
495
|
-
it 'installs' do
|
496
|
-
expect(subject).to receive(:on).with(hosts[0], /puppetlabs-release-el-6\.noarch\.rpm/)
|
497
|
-
expect(subject).to receive(:on).with(hosts[0], 'yum install -y puppet')
|
498
|
-
subject.install_puppet
|
499
|
-
end
|
500
|
-
it 'installs specific version of puppet when passed :version' do
|
501
|
-
expect(subject).to receive(:on).with(hosts[0], 'yum install -y puppet-3000')
|
502
|
-
subject.install_puppet( :version => '3000' )
|
503
|
-
end
|
504
|
-
it 'can install specific versions of puppets dependencies' do
|
505
|
-
expect(subject).to receive(:on).with(hosts[0], 'yum install -y puppet-3000')
|
506
|
-
expect(subject).to receive(:on).with(hosts[0], 'yum install -y hiera-2001')
|
507
|
-
expect(subject).to receive(:on).with(hosts[0], 'yum install -y facter-1999')
|
508
|
-
subject.install_puppet( :version => '3000', :facter_version => '1999', :hiera_version => '2001' )
|
509
|
-
end
|
510
|
-
end
|
511
|
-
context 'on el-5' do
|
512
|
-
let(:platform) { "el-5-i386" }
|
513
|
-
it 'installs' do
|
514
|
-
expect(subject).to receive(:on).with(hosts[0], /puppetlabs-release-el-5\.noarch\.rpm/)
|
515
|
-
expect(subject).to receive(:on).with(hosts[0], 'yum install -y puppet')
|
516
|
-
subject.install_puppet
|
517
|
-
end
|
518
|
-
end
|
519
|
-
context 'on fedora' do
|
520
|
-
let(:platform) { "fedora-18-x86_84" }
|
521
|
-
it 'installs' do
|
522
|
-
expect(subject).to receive(:on).with(hosts[0], /puppetlabs-release-fedora-18\.noarch\.rpm/)
|
523
|
-
expect(subject).to receive(:on).with(hosts[0], 'yum install -y puppet')
|
524
|
-
subject.install_puppet
|
525
|
-
end
|
526
|
-
end
|
527
|
-
context 'on debian' do
|
528
|
-
let(:platform) { "debian-7-amd64" }
|
529
|
-
it 'installs latest if given no version info' do
|
530
|
-
expect(subject).to receive(:on).with(hosts[0], /puppetlabs-release-\$\(lsb_release -c -s\)\.deb/)
|
531
|
-
expect(subject).to receive(:on).with(hosts[0], 'dpkg -i puppetlabs-release-$(lsb_release -c -s).deb')
|
532
|
-
expect(subject).to receive(:on).with(hosts[0], 'apt-get update')
|
533
|
-
expect(subject).to receive(:on).with(hosts[0], 'apt-get install -y puppet')
|
534
|
-
subject.install_puppet
|
535
|
-
end
|
536
|
-
it 'installs specific version of puppet when passed :version' do
|
537
|
-
expect(subject).to receive(:on).with(hosts[0], 'apt-get install -y puppet=3000-1puppetlabs1')
|
538
|
-
subject.install_puppet( :version => '3000' )
|
539
|
-
end
|
540
|
-
it 'can install specific versions of puppets dependencies' do
|
541
|
-
expect(subject).to receive(:on).with(hosts[0], 'apt-get install -y puppet=3000-1puppetlabs1')
|
542
|
-
expect(subject).to receive(:on).with(hosts[0], 'apt-get install -y hiera=2001-1puppetlabs1')
|
543
|
-
expect(subject).to receive(:on).with(hosts[0], 'apt-get install -y facter=1999-1puppetlabs1')
|
544
|
-
subject.install_puppet( :version => '3000', :facter_version => '1999', :hiera_version => '2001' )
|
545
|
-
end
|
546
|
-
end
|
547
|
-
context 'on windows' do
|
548
|
-
let(:platform) { "windows-2008r2-i386" }
|
549
|
-
it 'installs specific version of puppet when passed :version' do
|
550
|
-
allow(subject).to receive(:link_exists?).and_return( true )
|
551
|
-
expect(subject).to receive(:on).with(hosts[0], 'curl -O http://downloads.puppetlabs.com/windows/puppet-3000.msi')
|
552
|
-
expect(subject).to receive(:on).with(hosts[0], " echo 'export PATH=$PATH:\"/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin\":\"/cygdrive/c/Program Files/Puppet Labs/Puppet/bin\"' > /etc/bash.bashrc ")
|
553
|
-
expect(subject).to receive(:on).with(hosts[0], 'cmd /C \'start /w msiexec.exe /qn /i puppet-3000.msi\'')
|
554
|
-
subject.install_puppet(:version => '3000')
|
555
|
-
end
|
556
|
-
it 'installs from custom url when passed :win_download_url' do
|
557
|
-
allow(subject).to receive(:link_exists?).and_return( true )
|
558
|
-
expect(subject).to receive(:on).with(hosts[0], 'curl -O http://nightlies.puppetlabs.com/puppet-latest/repos/windows/puppet-3000.msi')
|
559
|
-
expect(subject).to receive(:on).with(hosts[0], 'cmd /C \'start /w msiexec.exe /qn /i puppet-3000.msi\'')
|
560
|
-
subject.install_puppet( :version => '3000', :win_download_url => 'http://nightlies.puppetlabs.com/puppet-latest/repos/windows' )
|
561
|
-
end
|
562
|
-
end
|
563
|
-
describe 'on unsupported platforms' do
|
564
|
-
let(:platform) { 'solaris-11-x86_64' }
|
565
|
-
let(:host) { make_host('henry', :platform => 'solaris-11-x86_64') }
|
566
|
-
let(:hosts) { [host] }
|
567
|
-
it 'by default raises an error' do
|
568
|
-
expect(subject).to_not receive(:on)
|
569
|
-
expect { subject.install_puppet }.to raise_error(/unsupported platform/)
|
570
|
-
end
|
571
|
-
it 'falls back to installing from gem when given :default_action => "gem_install"' do
|
572
|
-
result = double
|
573
|
-
gem_env_string = '{"RubyGems Environment": [ {"GEM PATHS": [], "EXECUTABLE DIRECTORY": "/does/not/exist" } ] }'
|
574
|
-
allow( result ).to receive(:stdout).and_return gem_env_string
|
575
|
-
allow(subject).to receive(:on).with(host, /gem environment/).and_return result
|
576
|
-
expect(subject).to receive(:on).with(host, /gem install/)
|
577
|
-
subject.install_puppet :default_action => 'gem_install'
|
578
|
-
end
|
579
|
-
end
|
580
|
-
end
|
581
|
-
|
582
|
-
describe 'configure_puppet_on' do
|
583
|
-
before do
|
584
|
-
allow(subject).to receive(:on).and_return(Beaker::Result.new({},''))
|
585
|
-
end
|
586
|
-
context 'on debian' do
|
587
|
-
let(:platform) { 'debian-7-amd64' }
|
588
|
-
let(:host) { make_host('testbox.test.local', :platform => 'debian-7-amd64') }
|
589
|
-
it 'it sets the puppet.conf file to the provided config' do
|
590
|
-
config = { 'main' => {'server' => 'testbox.test.local'} }
|
591
|
-
expect(subject).to receive(:on).with(host, "echo \"[main]\nserver=testbox.test.local\n\n\" > #{host.puppet['config']}")
|
592
|
-
subject.configure_puppet_on(host, config)
|
593
|
-
end
|
594
|
-
end
|
595
|
-
context 'on windows' do
|
596
|
-
let(:platform) { 'windows-2008R2-amd64' }
|
597
|
-
let(:host) { make_host('testbox.test.local', :platform => 'windows-2008R2-amd64') }
|
598
|
-
it 'it sets the puppet.conf file to the provided config' do
|
599
|
-
config = { 'main' => {'server' => 'testbox.test.local'} }
|
600
|
-
expect(subject).to receive(:on) do |host, command|
|
601
|
-
expect(command.command).to eq('powershell.exe')
|
602
|
-
expect(command.args).to eq(["-ExecutionPolicy Bypass", "-InputFormat None", "-NoLogo", "-NoProfile", "-NonInteractive", "-Command $text = \\\"[main]`nserver=testbox.test.local`n`n\\\"; Set-Content -path '#{host.puppet['config']}' -value $text"])
|
603
|
-
end
|
604
|
-
subject.configure_puppet_on(host, config)
|
605
|
-
end
|
606
|
-
end
|
607
|
-
end
|
608
|
-
|
609
|
-
describe 'configure_puppet' do
|
610
|
-
let(:hosts) do
|
611
|
-
make_hosts({:platform => platform })
|
612
|
-
end
|
613
|
-
|
614
|
-
before do
|
615
|
-
allow( subject ).to receive(:hosts).and_return(hosts)
|
616
|
-
allow( subject ).to receive(:on).and_return(Beaker::Result.new({},''))
|
617
|
-
end
|
618
|
-
context 'on debian' do
|
619
|
-
let(:platform) { 'debian-7-amd64' }
|
620
|
-
it 'it sets the puppet.conf file to the provided config' do
|
621
|
-
config = { 'main' => {'server' => 'testbox.test.local'} }
|
622
|
-
expect(subject).to receive(:on).with(hosts[0], "echo \"[main]\nserver=testbox.test.local\n\n\" > #{hosts[0].puppet['config']}")
|
623
|
-
subject.configure_puppet(config)
|
624
|
-
end
|
625
|
-
end
|
626
|
-
context 'on windows' do
|
627
|
-
let(:platform) { 'windows-2008R2-amd64' }
|
628
|
-
it 'it sets the puppet.conf file to the provided config' do
|
629
|
-
config = { 'main' => {'server' => 'testbox.test.local'} }
|
630
|
-
expect(subject).to receive(:on) do |host, command|
|
631
|
-
expect(command.command).to eq('powershell.exe')
|
632
|
-
expect(command.args).to eq(["-ExecutionPolicy Bypass", "-InputFormat None", "-NoLogo", "-NoProfile", "-NonInteractive", "-Command $text = \\\"[main]`nserver=testbox.test.local`n`n\\\"; Set-Content -path '#{host.puppet['config']}' -value $text"])
|
633
|
-
end
|
634
|
-
subject.configure_puppet(config)
|
635
|
-
end
|
636
|
-
end
|
637
|
-
end
|
638
|
-
|
639
|
-
describe '#add_system32_hosts_entry' do
|
640
|
-
before do
|
641
|
-
allow( subject ).to receive(:on).and_return(Beaker::Result.new({},''))
|
642
|
-
end
|
643
|
-
context 'on debian' do
|
644
|
-
let(:platform) { 'debian-7-amd64' }
|
645
|
-
let(:host) { make_host('testbox.test.local', :platform => 'debian-7-amd64') }
|
646
|
-
it 'logs message - nothing to do on this host' do
|
647
|
-
expect( Beaker::Command ).to receive( :new ).never
|
648
|
-
|
649
|
-
expect {
|
650
|
-
subject.add_system32_hosts_entry(host, {})
|
651
|
-
}.to raise_error
|
652
|
-
end
|
653
|
-
end
|
654
|
-
context 'on windows' do
|
655
|
-
let(:platform) { 'windows-2008R2-amd64' }
|
656
|
-
let(:host) { make_host('testbox.test.local', :platform => 'windows-2008R2-amd64') }
|
657
|
-
it 'it add an entry into the /etc/hosts file' do
|
658
|
-
entry = { 'ip' => '23.251.154.122', 'name' => 'forge.puppetlabs.com' }
|
659
|
-
expect(subject).to receive(:on) do |host, command|
|
660
|
-
expect(command.command).to eq('powershell.exe')
|
661
|
-
expect(command.args).to eq(["-ExecutionPolicy Bypass", "-InputFormat None", "-NoLogo", "-NoProfile", "-NonInteractive", "-Command $text = \\\"23.251.154.122`t`tforge.puppetlabs.com\\\"; Add-Content -path 'C:\\Windows\\System32\\Drivers\\etc\\hosts' -value $text"])
|
662
|
-
end
|
663
|
-
|
664
|
-
|
665
|
-
subject.add_system32_hosts_entry(host, entry)
|
666
|
-
end
|
667
|
-
end
|
668
|
-
end
|
669
|
-
|
670
|
-
describe 'install_pe' do
|
671
|
-
|
672
|
-
it 'calls do_install with sorted hosts' do
|
673
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
674
|
-
allow( subject ).to receive( :hosts ).and_return( hosts_sorted )
|
675
|
-
allow( subject ).to receive( :do_install ).and_return( true )
|
676
|
-
expect( subject ).to receive( :do_install ).with( hosts, {} )
|
677
|
-
subject.install_pe
|
678
|
-
end
|
679
|
-
|
680
|
-
it 'fills in missing pe_ver' do
|
681
|
-
hosts.each do |h|
|
682
|
-
h['pe_ver'] = nil
|
683
|
-
end
|
684
|
-
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '2.8' )
|
685
|
-
allow( subject ).to receive( :hosts ).and_return( hosts_sorted )
|
686
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
687
|
-
allow( subject ).to receive( :do_install ).and_return( true )
|
688
|
-
expect( subject ).to receive( :do_install ).with( hosts, {} )
|
689
|
-
subject.install_pe
|
690
|
-
hosts.each do |h|
|
691
|
-
expect( h['pe_ver'] ).to be === '2.8'
|
692
|
-
end
|
693
|
-
end
|
694
|
-
end
|
695
|
-
|
696
|
-
describe 'install_higgs' do
|
697
|
-
it 'fills in missing pe_ver' do
|
698
|
-
hosts[0]['pe_ver'] = nil
|
699
|
-
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '2.8' )
|
700
|
-
allow( subject ).to receive( :hosts ).and_return( [ hosts[1], hosts[0], hosts[2] ] )
|
701
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
702
|
-
allow( subject ).to receive( :do_higgs_install ).and_return( true )
|
703
|
-
expect( subject ).to receive( :do_higgs_install ).with( hosts[0], {} )
|
704
|
-
subject.install_higgs
|
705
|
-
expect( hosts[0]['pe_ver'] ).to be === '2.8'
|
706
|
-
end
|
707
|
-
|
708
|
-
end
|
709
|
-
|
710
|
-
describe 'upgrade_pe' do
|
711
|
-
|
712
|
-
it 'calls puppet-enterprise-upgrader for pre 3.0 upgrades' do
|
713
|
-
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '2.8' )
|
714
|
-
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version_win ).and_return( '2.8' )
|
715
|
-
the_hosts = [ hosts[0].dup, hosts[1].dup, hosts[2].dup ]
|
716
|
-
allow( subject ).to receive( :hosts ).and_return( the_hosts )
|
717
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
718
|
-
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4.0').and_return( true )
|
719
|
-
allow( subject ).to receive( :version_is_less ).with('2.8', '3.0').and_return( true )
|
720
|
-
version = version_win = '2.8'
|
721
|
-
path = "/path/to/upgradepkg"
|
722
|
-
expect( subject ).to receive( :do_install ).with( the_hosts, {:type=>:upgrade, :set_console_password=>true} )
|
723
|
-
subject.upgrade_pe( path )
|
724
|
-
the_hosts.each do |h|
|
725
|
-
expect( h['pe_installer'] ).to be === 'puppet-enterprise-upgrader'
|
726
|
-
end
|
727
|
-
end
|
728
|
-
|
729
|
-
it 'uses standard upgrader for post 3.0 upgrades' do
|
730
|
-
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '3.1' )
|
731
|
-
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version_win ).and_return( '3.1' )
|
732
|
-
the_hosts = [ hosts[0].dup, hosts[1].dup, hosts[2].dup ]
|
733
|
-
allow( subject ).to receive( :hosts ).and_return( the_hosts )
|
734
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
735
|
-
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4.0').and_return( true )
|
736
|
-
allow( subject ).to receive( :version_is_less ).with('3.1', '3.0').and_return( false )
|
737
|
-
version = version_win = '3.1'
|
738
|
-
path = "/path/to/upgradepkg"
|
739
|
-
expect( subject ).to receive( :do_install ).with( the_hosts, {:type=>:upgrade, :set_console_password=>true} )
|
740
|
-
subject.upgrade_pe( path )
|
741
|
-
the_hosts.each do |h|
|
742
|
-
expect( h['pe_installer'] ).to be nil
|
743
|
-
end
|
744
|
-
end
|
745
|
-
|
746
|
-
it 'updates pe_ver post upgrade' do
|
747
|
-
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version ).and_return( '2.8' )
|
748
|
-
allow( Beaker::Options::PEVersionScraper ).to receive( :load_pe_version_win ).and_return( '2.8' )
|
749
|
-
the_hosts = [ hosts[0].dup, hosts[1].dup, hosts[2].dup ]
|
750
|
-
allow( subject ).to receive( :hosts ).and_return( the_hosts )
|
751
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
752
|
-
allow( subject ).to receive( :version_is_less ).with('3.0', '3.4.0').and_return( true )
|
753
|
-
allow( subject ).to receive( :version_is_less ).with('2.8', '3.0').and_return( true )
|
754
|
-
version = version_win = '2.8'
|
755
|
-
path = "/path/to/upgradepkg"
|
756
|
-
expect( subject ).to receive( :do_install ).with( the_hosts, {:type=>:upgrade, :set_console_password=>true} )
|
757
|
-
subject.upgrade_pe( path )
|
758
|
-
the_hosts.each do |h|
|
759
|
-
expect( h['pe_ver'] ).to be === '2.8'
|
760
|
-
end
|
761
|
-
end
|
762
|
-
|
763
|
-
end
|
764
|
-
|
765
|
-
|
766
|
-
def fetch_allows
|
767
|
-
allow(subject).to receive( :logger ) { logger }
|
768
|
-
end
|
769
|
-
|
770
|
-
describe "#fetch_http_file" do
|
771
|
-
let( :logger) { double("Beaker::Logger", :notify => nil , :debug => nil ) }
|
772
|
-
|
773
|
-
before do
|
774
|
-
fetch_allows
|
775
|
-
end
|
776
|
-
|
777
|
-
describe "given valid arguments" do
|
778
|
-
|
779
|
-
it "returns its second and third arguments concatenated." do
|
780
|
-
create_files(['destdir/name'])
|
781
|
-
result = subject.fetch_http_file "http://beaker.tool/", "name", "destdir"
|
782
|
-
expect(result).to eq("destdir/name")
|
783
|
-
end
|
784
|
-
|
785
|
-
end
|
786
|
-
|
787
|
-
end
|
788
|
-
|
789
|
-
describe "#fetch_http_dir" do
|
790
|
-
let( :logger) { double("Beaker::Logger", :notify => nil , :debug => nil ) }
|
791
|
-
let( :result) { double(:each_line => []) }
|
792
|
-
|
793
|
-
before do
|
794
|
-
fetch_allows
|
795
|
-
end
|
796
|
-
|
797
|
-
describe "given valid arguments" do
|
798
|
-
|
799
|
-
it "returns basename of first argument concatenated to second." do
|
800
|
-
expect(subject).to receive(:`).with(/^wget.*/).ordered { result }
|
801
|
-
expect($?).to receive(:to_i).and_return(0)
|
802
|
-
result = subject.fetch_http_dir "http://beaker.tool/beep", "destdir"
|
803
|
-
expect(result).to eq("destdir/beep")
|
804
|
-
end
|
805
|
-
|
806
|
-
end
|
807
|
-
|
808
|
-
end
|
809
|
-
|
810
|
-
describe "#install_puppetlabs_release_repo" do
|
811
|
-
let( :platform ) { Beaker::Platform.new('solaris-7-i386') }
|
812
|
-
let( :host ) do
|
813
|
-
FakeHost.create('fakevm', platform.to_s)
|
814
|
-
end
|
815
|
-
|
816
|
-
before do
|
817
|
-
allow(subject).to receive(:options) { opts }
|
818
|
-
end
|
819
|
-
|
820
|
-
describe "When host is unsupported platform" do
|
821
|
-
let( :platform ) { Beaker::Platform.new('solaris-7-i386') }
|
822
|
-
|
823
|
-
it "raises an exception." do
|
824
|
-
expect{
|
825
|
-
subject.install_puppetlabs_release_repo host
|
826
|
-
}.to raise_error(RuntimeError, /No repository installation step for/)
|
827
|
-
end
|
828
|
-
end
|
829
|
-
|
830
|
-
describe "When host is a debian-like platform" do
|
831
|
-
let( :platform ) { Beaker::Platform.new('debian-7-i386') }
|
832
|
-
|
833
|
-
it "downloads a deb file, installs, and updates the apt cache." do
|
834
|
-
expect(subject).to receive(:on).with( host, /wget .*/ ).ordered
|
835
|
-
expect(subject).to receive(:on).with( host, /dpkg .*/ ).ordered
|
836
|
-
expect(subject).to receive(:on).with( host, "apt-get update" ).ordered
|
837
|
-
subject.install_puppetlabs_release_repo host
|
838
|
-
end
|
839
|
-
|
840
|
-
end
|
841
|
-
|
842
|
-
describe "When host is a redhat-like platform" do
|
843
|
-
let( :platform ) { Beaker::Platform.new('el-7-i386') }
|
844
|
-
|
845
|
-
it "installs an rpm" do
|
846
|
-
expect(subject).to receive(:on).with( host, /rpm .*/ ).ordered
|
847
|
-
subject.install_puppetlabs_release_repo host
|
848
|
-
end
|
849
|
-
|
850
|
-
end
|
851
|
-
|
852
|
-
end
|
853
|
-
|
854
|
-
RSpec.shared_examples "install-dev-repo" do
|
855
|
-
let( :repo_config ) { "repoconfig" }
|
856
|
-
let( :repo_dir ) { "repodir" }
|
857
|
-
|
858
|
-
before do
|
859
|
-
allow(subject).to receive(:fetch_http_file) { repo_config }
|
860
|
-
allow(subject).to receive(:fetch_http_dir) { repo_dir }
|
861
|
-
allow(subject).to receive(:on).with(host, "apt-get update") { }
|
862
|
-
allow(subject).to receive(:options) { opts }
|
863
|
-
allow(subject).to receive(:link_exists?) { true }
|
864
|
-
end
|
865
|
-
|
866
|
-
it "scp's files to SUT then modifies them with find-and-sed 2-hit combo" do
|
867
|
-
expect(subject).to receive(:on).with( host, /^mkdir -p .*$/ ).ordered
|
868
|
-
expect(subject).to receive(:scp_to).with( host, repo_config, /.*/ ).ordered
|
869
|
-
expect(subject).to receive(:scp_to).with( host, repo_dir, /.*/ ).ordered
|
870
|
-
expect(subject).to receive(:on).with( host, /^find .* sed .*/ ).ordered
|
871
|
-
subject.install_puppetlabs_dev_repo host, package_name, package_version
|
872
|
-
end
|
873
|
-
|
874
|
-
end
|
875
|
-
|
876
|
-
describe "#install_puppetlabs_dev_repo" do
|
877
|
-
let( :package_name ) { "puppet" }
|
878
|
-
let( :package_version ) { "7.5.6" }
|
879
|
-
let( :host ) do
|
880
|
-
FakeHost.create('fakvm', platform.to_s, opts)
|
881
|
-
end
|
882
|
-
|
883
|
-
describe "When host is unsupported platform" do
|
884
|
-
let( :platform ) { Beaker::Platform.new('solaris-7-i386') }
|
885
|
-
|
886
|
-
it "raises an exception." do
|
887
|
-
expect(subject).to receive(:on).with( host, /^mkdir -p .*$/ ).ordered
|
888
|
-
allow(subject).to receive(:options) { opts }
|
889
|
-
expect{
|
890
|
-
subject.install_puppetlabs_dev_repo host, package_name, package_version
|
891
|
-
}.to raise_error(RuntimeError, /No repository installation step for/)
|
892
|
-
end
|
893
|
-
|
894
|
-
end
|
895
|
-
|
896
|
-
describe "When host is a debian-like platform" do
|
897
|
-
let( :platform ) { Beaker::Platform.new('debian-7-i386') }
|
898
|
-
include_examples "install-dev-repo"
|
899
|
-
end
|
900
|
-
|
901
|
-
describe "When host is a redhat-like platform" do
|
902
|
-
let( :platform ) { Beaker::Platform.new('el-7-i386') }
|
903
|
-
include_examples "install-dev-repo"
|
904
|
-
end
|
905
|
-
|
906
|
-
end
|
907
|
-
|
908
|
-
describe '#install_packages_from_local_dev_repo' do
|
909
|
-
let( :package_name ) { 'puppet-agent' }
|
910
|
-
let( :platform ) { @platform || 'other' }
|
911
|
-
let( :host ) do
|
912
|
-
FakeHost.create('fakvm', platform, opts)
|
913
|
-
end
|
914
|
-
|
915
|
-
it 'sets the find command correctly for el-based systems' do
|
916
|
-
@platform = 'el-1-3'
|
917
|
-
expect( subject ).to receive( :on ).with( host, /\*\.rpm.+rpm\s-ivh/ )
|
918
|
-
subject.install_packages_from_local_dev_repo( host, package_name )
|
919
|
-
end
|
920
|
-
|
921
|
-
it 'sets the find command correctly for debian-based systems' do
|
922
|
-
@platform = 'debian-1-3'
|
923
|
-
expect( subject ).to receive( :on ).with( host, /\*\.deb.+dpkg\s-i/ )
|
924
|
-
subject.install_packages_from_local_dev_repo( host, package_name )
|
925
|
-
end
|
926
|
-
|
927
|
-
it 'fails correctly for systems not accounted for' do
|
928
|
-
@platform = 'eos-1-3'
|
929
|
-
expect{ subject.install_packages_from_local_dev_repo( host, package_name ) }.to raise_error RuntimeError
|
930
|
-
end
|
931
|
-
|
932
|
-
end
|
933
|
-
|
934
|
-
describe '#install_puppetagent_dev_repo' do
|
935
|
-
|
936
|
-
it 'raises an exception when host platform is unsupported' do
|
937
|
-
platform = Object.new()
|
938
|
-
allow(platform).to receive(:to_array) { ['ptan', '5', 'x4']}
|
939
|
-
host = basic_hosts.first
|
940
|
-
host['platform'] = platform
|
941
|
-
opts = { :version => '0.1.0' }
|
942
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
943
|
-
|
944
|
-
expect{
|
945
|
-
subject.install_puppetagent_dev_repo( host, opts )
|
946
|
-
}.to raise_error(RuntimeError, /No repository installation step for/)
|
947
|
-
end
|
948
|
-
|
949
|
-
it 'runs the correct install for el-based platforms' do
|
950
|
-
platform = Object.new()
|
951
|
-
allow(platform).to receive(:to_array) { ['el', '5', 'x4']}
|
952
|
-
host = basic_hosts.first
|
953
|
-
host['platform'] = platform
|
954
|
-
opts = { :version => '0.1.0' }
|
955
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
956
|
-
|
957
|
-
expect(subject).to receive(:fetch_http_file).once.with(/\/el\//, /-agent-/, /el/)
|
958
|
-
expect(subject).to receive(:scp_to).once.with(host, /-agent-/, "/root")
|
959
|
-
expect(subject).to receive(:on).once.with(host, /rpm\ -ivh/)
|
960
|
-
|
961
|
-
subject.install_puppetagent_dev_repo( host, opts )
|
962
|
-
end
|
963
|
-
|
964
|
-
it 'runs the correct install for debian-based platforms' do
|
965
|
-
platform = Object.new()
|
966
|
-
allow(platform).to receive(:to_array) { ['debian', '5', 'x4']}
|
967
|
-
host = basic_hosts.first
|
968
|
-
host['platform'] = platform
|
969
|
-
opts = { :version => '0.1.0' }
|
970
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
971
|
-
|
972
|
-
expect(subject).to receive(:fetch_http_file).once.with(/\/deb\//, /-agent_/, /deb/)
|
973
|
-
expect(subject).to receive(:scp_to).once.with(host, /-agent_/, "/root")
|
974
|
-
expect(subject).to receive(:on).ordered.with(host, /dpkg\ -i\ --force-all/)
|
975
|
-
expect(subject).to receive(:on).ordered.with(host, /apt-get\ update/)
|
976
|
-
|
977
|
-
subject.install_puppetagent_dev_repo( host, opts )
|
978
|
-
end
|
979
|
-
|
980
|
-
it 'runs the correct install for windows platforms' do
|
981
|
-
platform = Object.new()
|
982
|
-
allow(platform).to receive(:to_array) { ['windows', '5', 'x64']}
|
983
|
-
host = basic_hosts.first
|
984
|
-
host['platform'] = platform
|
985
|
-
opts = { :version => '0.1.0' }
|
986
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
987
|
-
mock_echo = Object.new()
|
988
|
-
allow( mock_echo ).to receive( :raw_output ).and_return( " " )
|
989
|
-
|
990
|
-
expect(subject).to receive(:fetch_http_file).once.with(/\/windows$/, 'puppet-agent-x64.msi', /\/windows$/)
|
991
|
-
expect(subject).to receive(:scp_to).once.with(host, /\/puppet-agent-x64.msi$/, /cygpath/)
|
992
|
-
expect(subject).to receive(:on).ordered.with(host, /echo/).and_return(mock_echo)
|
993
|
-
expect(subject).to receive(:on).ordered.with(host, anything)
|
994
|
-
|
995
|
-
subject.install_puppetagent_dev_repo( host, opts )
|
996
|
-
end
|
997
|
-
|
998
|
-
it 'allows you to override the local copy directory' do
|
999
|
-
platform = Object.new()
|
1000
|
-
allow(platform).to receive(:to_array) { ['debian', '5', 'x4']}
|
1001
|
-
host = basic_hosts.first
|
1002
|
-
host['platform'] = platform
|
1003
|
-
opts = { :version => '0.1.0', :copy_base_local => 'face' }
|
1004
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
1005
|
-
|
1006
|
-
expect(subject).to receive(:fetch_http_file).once.with(/\/deb\//, /-agent_/, /face/)
|
1007
|
-
expect(subject).to receive(:scp_to).once.with(host, /face/, "/root")
|
1008
|
-
expect(subject).to receive(:on).ordered.with(host, /dpkg\ -i\ --force-all/)
|
1009
|
-
expect(subject).to receive(:on).ordered.with(host, /apt-get\ update/)
|
1010
|
-
|
1011
|
-
subject.install_puppetagent_dev_repo( host, opts )
|
1012
|
-
end
|
1013
|
-
|
1014
|
-
it 'allows you to override the external copy directory' do
|
1015
|
-
platform = Object.new()
|
1016
|
-
allow(platform).to receive(:to_array) { ['debian', '5', 'x4']}
|
1017
|
-
host = basic_hosts.first
|
1018
|
-
host['platform'] = platform
|
1019
|
-
opts = { :version => '0.1.0', :copy_dir_external => 'muppetsB' }
|
1020
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
1021
|
-
|
1022
|
-
expect(subject).to receive(:fetch_http_file).once.with(/\/deb\//, /-agent_/, /deb/)
|
1023
|
-
expect(subject).to receive(:scp_to).once.with(host, /-agent_/, /muppetsB/)
|
1024
|
-
expect(subject).to receive(:on).ordered.with(host, /dpkg\ -i\ --force-all/)
|
1025
|
-
expect(subject).to receive(:on).ordered.with(host, /apt-get\ update/)
|
1026
|
-
|
1027
|
-
subject.install_puppetagent_dev_repo( host, opts )
|
1028
|
-
end
|
1029
|
-
|
1030
|
-
end
|
1031
|
-
|
1032
|
-
describe '#install_dev_puppet_module_on' do
|
1033
|
-
context 'having set allow( a ).to receive forge' do
|
1034
|
-
it 'stubs the forge on the host' do
|
1035
|
-
master = hosts.first
|
1036
|
-
allow( subject ).to receive( :options ).and_return( {:forge_host => 'ahost.com'} )
|
1037
|
-
|
1038
|
-
expect( subject ).to receive( :with_forge_stubbed_on )
|
1039
|
-
|
1040
|
-
subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
|
1041
|
-
end
|
1042
|
-
|
1043
|
-
it 'installs via #install_puppet_module_via_pmt' do
|
1044
|
-
master = hosts.first
|
1045
|
-
allow( subject ).to receive( :options ).and_return( {:forge_host => 'ahost.com'} )
|
1046
|
-
allow( subject ).to receive( :with_forge_stubbed_on ).and_yield
|
1047
|
-
|
1048
|
-
expect( subject ).to receive( :install_puppet_module_via_pmt_on )
|
1049
|
-
|
1050
|
-
subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
|
1051
|
-
end
|
1052
|
-
end
|
1053
|
-
context 'without allow( a ).to receive forge (default)' do
|
1054
|
-
it 'calls copy_module_to to get the module on the SUT' do
|
1055
|
-
master = hosts.first
|
1056
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
1057
|
-
|
1058
|
-
expect( subject ).to receive( :copy_module_to )
|
1059
|
-
|
1060
|
-
subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
|
1061
|
-
end
|
1062
|
-
end
|
1063
|
-
end
|
1064
|
-
|
1065
|
-
describe '#install_dev_puppet_module' do
|
1066
|
-
it 'delegates to #install_dev_puppet_module_on with the hosts list' do
|
1067
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
1068
|
-
allow( subject ).to receive( :options ).and_return( {} )
|
1069
|
-
|
1070
|
-
hosts.each do |host|
|
1071
|
-
expect( subject ).to receive( :install_dev_puppet_module_on ).
|
1072
|
-
with( host, {:source => '/module', :module_name => 'test'})
|
1073
|
-
end
|
1074
|
-
|
1075
|
-
subject.install_dev_puppet_module( {:source => '/module', :module_name => 'test'} )
|
1076
|
-
end
|
1077
|
-
end
|
1078
|
-
|
1079
|
-
describe '#install_puppet_module_via_pmt_on' do
|
1080
|
-
it 'installs module via puppet module tool' do
|
1081
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
1082
|
-
master = hosts.first
|
1083
|
-
|
1084
|
-
|
1085
|
-
expect( subject ).to receive( :puppet ).with('module install test ', {}).once
|
1086
|
-
|
1087
|
-
subject.install_puppet_module_via_pmt_on( master, {:module_name => 'test'} )
|
1088
|
-
end
|
1089
|
-
|
1090
|
-
it 'takes the trace option and passes it down correctly' do
|
1091
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
1092
|
-
master = hosts.first
|
1093
|
-
trace_opts = { :trace => nil }
|
1094
|
-
master['default_module_install_opts'] = trace_opts
|
1095
|
-
|
1096
|
-
expect( subject ).to receive( :puppet ).with('module install test ', trace_opts).once
|
1097
|
-
|
1098
|
-
subject.install_puppet_module_via_pmt_on( master, {:module_name => 'test'} )
|
1099
|
-
end
|
1100
|
-
end
|
1101
|
-
|
1102
|
-
describe '#install_puppet_module_via_pmt' do
|
1103
|
-
it 'delegates to #install_puppet_module_via_pmt with the hosts list' do
|
1104
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
1105
|
-
|
1106
|
-
expect( subject ).to receive( :install_puppet_module_via_pmt_on ).with( hosts, {:source => '/module', :module_name => 'test'}).once
|
1107
|
-
|
1108
|
-
subject.install_puppet_module_via_pmt( {:source => '/module', :module_name => 'test'} )
|
1109
|
-
end
|
1110
|
-
end
|
1111
|
-
|
1112
|
-
describe 'copy_module_to' do
|
1113
|
-
let(:ignore_list) { Beaker::DSL::InstallUtils::PUPPET_MODULE_INSTALL_IGNORE }
|
1114
|
-
let(:source){ File.expand_path('./')}
|
1115
|
-
let(:target){'/etc/puppetlabs/puppet/modules/testmodule'}
|
1116
|
-
let(:module_parse_name){'testmodule'}
|
1117
|
-
|
1118
|
-
shared_examples 'copy_module_to' do |opts|
|
1119
|
-
it{
|
1120
|
-
host = double("host")
|
1121
|
-
allow( host ).to receive(:[]).with('distmoduledir').and_return('/etc/puppetlabs/puppet/modules')
|
1122
|
-
result = double
|
1123
|
-
stdout = target.split('/')[0..-2].join('/') + "\n"
|
1124
|
-
allow( result ).to receive(:stdout).and_return( stdout )
|
1125
|
-
expect( subject ).to receive(:on).with(host, "echo #{File.dirname(target)}" ).and_return(result )
|
1126
|
-
allow( Dir ).to receive(:getpwd).and_return(source)
|
1127
|
-
|
1128
|
-
allow( subject ).to receive(:parse_for_moduleroot).and_return(source)
|
1129
|
-
if module_parse_name
|
1130
|
-
allow( subject ).to receive(:parse_for_modulename).with(any_args()).and_return(module_parse_name)
|
1131
|
-
else
|
1132
|
-
expect( subject).to_not receive(:parse_for_modulename)
|
1133
|
-
end
|
1134
|
-
|
1135
|
-
allow( File ).to receive(:exists?).with(any_args()).and_return(false)
|
1136
|
-
allow( File ).to receive(:directory?).with(any_args()).and_return(false)
|
1137
|
-
|
1138
|
-
expect( subject ).to receive(:scp_to).with(host,source, File.dirname(target), {:ignore => ignore_list})
|
1139
|
-
expect( subject ).to receive(:on).with(host, "mv #{File.join(File.dirname(target), File.basename(source))} #{target}")
|
1140
|
-
if opts.nil?
|
1141
|
-
subject.copy_module_to(host)
|
1142
|
-
else
|
1143
|
-
subject.copy_module_to(host,opts)
|
1144
|
-
end
|
1145
|
-
}
|
1146
|
-
end
|
1147
|
-
|
1148
|
-
describe 'should call scp with the correct info, with only providing host' do
|
1149
|
-
let(:target){'/etc/puppetlabs/puppet/modules/testmodule'}
|
1150
|
-
|
1151
|
-
it_should_behave_like 'copy_module_to', :module_name => 'testmodule'
|
1152
|
-
end
|
1153
|
-
|
1154
|
-
describe 'should call scp with the correct info, when specifying the modulename' do
|
1155
|
-
let(:target){'/etc/puppetlabs/puppet/modules/bogusmodule'}
|
1156
|
-
let(:module_parse_name){false}
|
1157
|
-
it_should_behave_like 'copy_module_to', {:module_name =>'bogusmodule'}
|
1158
|
-
end
|
1159
|
-
|
1160
|
-
describe 'should call scp with the correct info, when specifying the target to a different path' do
|
1161
|
-
target = '/opt/shared/puppet/modules'
|
1162
|
-
let(:target){"#{target}/testmodule"}
|
1163
|
-
it_should_behave_like 'copy_module_to', {:target_module_path => target, :module_name => 'testmodule'}
|
1164
|
-
end
|
1165
|
-
|
1166
|
-
describe 'should accept multiple hosts when' do
|
1167
|
-
it 'used in a default manner' do
|
1168
|
-
allow( subject ).to receive( :build_ignore_list ).and_return( [] )
|
1169
|
-
allow( subject ).to receive( :parse_for_modulename ).and_return( [nil, 'modulename'] )
|
1170
|
-
allow( subject ).to receive( :on ).and_return( double.as_null_object )
|
1171
|
-
hosts = [{}, {}]
|
1172
|
-
|
1173
|
-
expect( subject ).to receive( :scp_to ).twice
|
1174
|
-
subject.copy_module_to( hosts )
|
1175
|
-
end
|
1176
|
-
end
|
1177
|
-
end
|
1178
|
-
|
1179
|
-
describe 'split_author_modulename' do
|
1180
|
-
it 'should return a correct modulename' do
|
1181
|
-
result = subject.split_author_modulename('myname-test_43_module')
|
1182
|
-
expect(result[:author]).to eq('myname')
|
1183
|
-
expect(result[:module]).to eq('test_43_module')
|
1184
|
-
end
|
1185
|
-
end
|
1186
|
-
|
1187
|
-
describe 'get_module_name' do
|
1188
|
-
it 'should return an array of author and modulename' do
|
1189
|
-
expect(subject.get_module_name('myname-test_43_module')).to eq(['myname', 'test_43_module'])
|
1190
|
-
end
|
1191
|
-
it 'should return nil for invalid names' do
|
1192
|
-
expect(subject.get_module_name('myname-')).to eq(nil)
|
1193
|
-
end
|
1194
|
-
end
|
1195
|
-
|
1196
|
-
describe 'parse_for_modulename' do
|
1197
|
-
directory = '/testfilepath/myname-testmodule'
|
1198
|
-
it 'should return name from metadata.json' do
|
1199
|
-
allow( File ).to receive(:exists?).with("#{directory}/metadata.json").and_return(true)
|
1200
|
-
allow( File ).to receive(:read).with("#{directory}/metadata.json").and_return(" {\"name\":\"myname-testmodule\"} ")
|
1201
|
-
expect( subject.logger ).to receive(:debug).with("Attempting to parse Modulename from metadata.json")
|
1202
|
-
expect(subject.logger).to_not receive(:debug).with('Unable to determine name, returning null')
|
1203
|
-
expect(subject.parse_for_modulename(directory)).to eq(['myname', 'testmodule'])
|
1204
|
-
end
|
1205
|
-
it 'should return name from Modulefile' do
|
1206
|
-
allow( File ).to receive(:exists?).with("#{directory}/metadata.json").and_return(false)
|
1207
|
-
allow( File ).to receive(:exists?).with("#{directory}/Modulefile").and_return(true)
|
1208
|
-
allow( File ).to receive(:read).with("#{directory}/Modulefile").and_return("name 'myname-testmodule' \nauthor 'myname'")
|
1209
|
-
expect( subject.logger ).to receive(:debug).with("Attempting to parse Modulename from Modulefile")
|
1210
|
-
expect(subject.logger).to_not receive(:debug).with("Unable to determine name, returning null")
|
1211
|
-
expect(subject.parse_for_modulename(directory)).to eq(['myname', 'testmodule'])
|
1212
|
-
end
|
1213
|
-
end
|
1214
|
-
|
1215
|
-
describe 'parse_for_module_root' do
|
1216
|
-
directory = '/testfilepath/myname-testmodule'
|
1217
|
-
describe 'stops searching when either' do
|
1218
|
-
it 'finds a Modulefile' do
|
1219
|
-
allow( File ).to receive(:exists?).and_return(false)
|
1220
|
-
allow( File ).to receive(:exists?).with("#{directory}/Modulefile").and_return(true)
|
1221
|
-
|
1222
|
-
expect( subject.logger ).to_not receive(:debug).with("At root, can't parse for another directory")
|
1223
|
-
expect( subject.logger ).to receive(:debug).with("No Modulefile or metadata.json found at #{directory}/acceptance, moving up")
|
1224
|
-
expect(subject.parse_for_moduleroot("#{directory}/acceptance")).to eq(directory)
|
1225
|
-
end
|
1226
|
-
it 'finds a metadata.json file' do
|
1227
|
-
allow( File ).to receive(:exists?).and_return(false)
|
1228
|
-
allow( File ).to receive(:exists?).with("#{directory}/metadata.json").and_return(true)
|
1229
|
-
|
1230
|
-
expect( subject.logger ).to_not receive(:debug).with("At root, can't parse for another directory")
|
1231
|
-
expect( subject.logger ).to receive(:debug).with("No Modulefile or metadata.json found at #{directory}/acceptance, moving up")
|
1232
|
-
expect(subject.parse_for_moduleroot("#{directory}/acceptance")).to eq(directory)
|
1233
|
-
end
|
1234
|
-
end
|
1235
|
-
it 'should recersively go up the directory to find the module files' do
|
1236
|
-
allow( File ).to receive(:exists?).and_return(false)
|
1237
|
-
expect( subject.logger ).to receive(:debug).with("No Modulefile or metadata.json found at #{directory}, moving up")
|
1238
|
-
expect( subject.logger ).to receive(:error).with("At root, can't parse for another directory")
|
1239
|
-
expect(subject.parse_for_moduleroot(directory)).to eq(nil)
|
1240
|
-
end
|
1241
|
-
end
|
1242
|
-
end
|