beaker-pe 0.7.0 → 0.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 +86 -2
- data/lib/beaker-pe.rb +6 -0
- data/lib/beaker-pe/install/pe_utils.rb +26 -0
- data/lib/beaker-pe/pe-client-tools/config_file_helper.rb +93 -0
- data/lib/beaker-pe/pe-client-tools/executable_helper.rb +157 -0
- data/lib/beaker-pe/pe-client-tools/install_helper.rb +74 -0
- data/lib/beaker-pe/version.rb +1 -1
- data/spec/beaker-pe/install/pe_utils_spec.rb +4 -0
- data/spec/beaker-pe/pe-client-tools/config_file_helper_spec.rb +13 -0
- data/spec/beaker-pe/pe-client-tools/executable_helper_spec.rb +58 -0
- data/spec/beaker-pe/pe-client-tools/installer_helper_spec.rb +75 -0
- metadata +8 -3
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
OTQ3NDUxZjBkYmY5YjU1ZTA3YjkxYzgwYjY5MjgwZWE4ZjkxNTA2ZQ==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
Y2E2M2I1YjYzMzY2YzIwM2IxNDg1MjhiNTQ5YmRmMjEwYjRjOGY4Mg==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
NTVmZjQxYjcyZjIyNDU3ZTFhMGIzNDUxZTRmZTUwMTcwYmFjZDI3MGM3ZjA1
|
|
10
|
+
NzZkOTNmMTEwMGY3OTllZGFjMDAzNTA4NzVmYWVkYjg0MTFiMjZjYzIxNzdi
|
|
11
|
+
ZjU4ZmY5NDVlYTY0MjkxZGM3NzJmYzQ3ZTU5MWFhMTJhZTRkZWU=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
NTQ5NWE3NjIyOWRhOTJkZDQ1MjU0YzdjOTc3YTY4MTE3ZDE2ODY1ZmJhNGQ5
|
|
14
|
+
M2MxM2NkODgyMGFkMThjMzNmMmIyYjA5NzA4MGVkODBkOGJhYzczNzJiODU0
|
|
15
|
+
NGQyMTU1MTNlMjM1YTRjYjgzYTAzMTFmYWMxN2MxMTkxY2VmMzM=
|
data/HISTORY.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# default - History
|
|
2
2
|
## Tags
|
|
3
|
-
* [LATEST -
|
|
3
|
+
* [LATEST - 2 Aug, 2016 (f4d290f2)](#LATEST)
|
|
4
|
+
* [0.7.0 - 19 Jul, 2016 (8256c0ac)](#0.7.0)
|
|
4
5
|
* [0.6.0 - 11 Jul, 2016 (e974e7f8)](#0.6.0)
|
|
5
6
|
* [0.5.0 - 15 Jun, 2016 (8f2874fe)](#0.5.0)
|
|
6
7
|
* [0.4.0 - 1 Jun, 2016 (f5ad1884)](#0.4.0)
|
|
@@ -11,7 +12,90 @@
|
|
|
11
12
|
* [0.1.0 - 29 Feb, 2016 (4fc88d8c)](#0.1.0)
|
|
12
13
|
|
|
13
14
|
## Details
|
|
14
|
-
### <a name = "LATEST">LATEST -
|
|
15
|
+
### <a name = "LATEST">LATEST - 2 Aug, 2016 (f4d290f2)
|
|
16
|
+
|
|
17
|
+
* (GEM) update beaker-pe version to 0.8.0 (f4d290f2)
|
|
18
|
+
|
|
19
|
+
* (QA-2514) PE-client-tools helpers (#15) (32d70efe)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
(QA-2514) PE-client-tools helpers (#15)
|
|
24
|
+
|
|
25
|
+
* (QA-2514) PE-client-tools helpers
|
|
26
|
+
|
|
27
|
+
* (maint) Add install helpers for pe-client-tools
|
|
28
|
+
|
|
29
|
+
This commit adds three helper methods to install pe-client-tools on Windows.
|
|
30
|
+
|
|
31
|
+
The first is a general method that is designed to abstract
|
|
32
|
+
away the installation of pe-client-tools on supported operating systems.
|
|
33
|
+
Currently, it only accommodates development builds of the tools based on the
|
|
34
|
+
provided SHA and SUITE_VERSION environment variables available.
|
|
35
|
+
|
|
36
|
+
The second is a generic method to install an msi package on a target host.
|
|
37
|
+
Beaker's built in method of this name assumes that msi installed involves the
|
|
38
|
+
installation of puppet, so this method overrides that one without such an
|
|
39
|
+
assumption.
|
|
40
|
+
|
|
41
|
+
The this is a generic method to install a dmg package on a target host.
|
|
42
|
+
Beaker's built in `install_package` method for osx does not accommodate for an
|
|
43
|
+
installer `pkg` file that is named differently from the containing `dmg`. This
|
|
44
|
+
method forces the user to supply both names explicitly.
|
|
45
|
+
|
|
46
|
+
* (maint) Remove install helpers for pe-client-tools
|
|
47
|
+
|
|
48
|
+
This commit removes the dmg and msi helper methods instroduced earlier.
|
|
49
|
+
|
|
50
|
+
These two methods have bee moved into beaker.
|
|
51
|
+
|
|
52
|
+
* basic spec tests for ExecutableHelper & ConfigFileHelper
|
|
53
|
+
```
|
|
54
|
+
* Merge pull request #18 from demophoon/fix/master/pe-16886-pe-console-service-wait (949852c8)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
Merge pull request #18 from demophoon/fix/master/pe-16886-pe-console-service-wait
|
|
59
|
+
|
|
60
|
+
(PE-16886) Add wait for console to be functional before continuing with puppet agent runs
|
|
61
|
+
```
|
|
62
|
+
* Merge pull request #17 from johnduarte/fix-install-pe_utils_spec (187a413a)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Merge pull request #17 from johnduarte/fix-install-pe_utils_spec
|
|
67
|
+
|
|
68
|
+
(MAINT) Fix install/pe_utils spec test
|
|
69
|
+
```
|
|
70
|
+
* (PE-16886) Add wait for console to be functional (eef0f254)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
(PE-16886) Add wait for console to be functional
|
|
75
|
+
|
|
76
|
+
Before this commit the console may or may not be functional by the time
|
|
77
|
+
the next puppet agent run occurs on the following node. This can cause
|
|
78
|
+
puppetserver to return with an error from the classifier when it is
|
|
79
|
+
attempting to evaluate the classes which should be applied to the node.
|
|
80
|
+
|
|
81
|
+
This commit adds in a sleep and service check to the final agent run
|
|
82
|
+
step on the console node which will hopefully work around this issue
|
|
83
|
+
until it is fixed in SERVER-1237.
|
|
84
|
+
```
|
|
85
|
+
* (MAINT) Fix install/pe_utils spec test (5ca075ca)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
(MAINT) Fix install/pe_utils spec test
|
|
90
|
+
|
|
91
|
+
Changes introduced at commit 33cdfef caused the install/pe_utils
|
|
92
|
+
spec test to fail. This commit updates the spec test to introduce
|
|
93
|
+
the `opts[:HOSTS]` data that the implementation code expects to have
|
|
94
|
+
available.
|
|
95
|
+
```
|
|
96
|
+
### <a name = "0.7.0">0.7.0 - 19 Jul, 2016 (8256c0ac)
|
|
97
|
+
|
|
98
|
+
* (HISTORY) update beaker-pe history for gem release 0.7.0 (8256c0ac)
|
|
15
99
|
|
|
16
100
|
* (GEM) update beaker-pe version to 0.7.0 (f31dbe09)
|
|
17
101
|
|
data/lib/beaker-pe.rb
CHANGED
|
@@ -2,12 +2,18 @@ require 'stringify-hash'
|
|
|
2
2
|
require 'beaker-pe/version'
|
|
3
3
|
require 'beaker-pe/install/pe_utils'
|
|
4
4
|
require 'beaker-pe/options/pe_version_scraper'
|
|
5
|
+
require 'beaker-pe/pe-client-tools/config_file_helper'
|
|
6
|
+
require 'beaker-pe/pe-client-tools/install_helper'
|
|
7
|
+
require 'beaker-pe/pe-client-tools/executable_helper'
|
|
5
8
|
|
|
6
9
|
module Beaker
|
|
7
10
|
module DSL
|
|
8
11
|
module PE
|
|
9
12
|
include Beaker::DSL::InstallUtils::PEUtils
|
|
13
|
+
include Beaker::DSL::InstallUtils::PEClientTools
|
|
10
14
|
include Beaker::Options::PEVersionScraper
|
|
15
|
+
include Beaker::DSL::PEClientTools::ConfigFileHelper
|
|
16
|
+
include Beaker::DSL::PEClientTools::ExecutableHelper
|
|
11
17
|
end
|
|
12
18
|
end
|
|
13
19
|
end
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
end
|
|
4
4
|
require "beaker-answers"
|
|
5
5
|
require "timeout"
|
|
6
|
+
require "json"
|
|
6
7
|
module Beaker
|
|
7
8
|
module DSL
|
|
8
9
|
module InstallUtils
|
|
@@ -494,6 +495,9 @@ module Beaker
|
|
|
494
495
|
sleep_until_puppetdb_started(database)
|
|
495
496
|
check_puppetdb_status_endpoint(database)
|
|
496
497
|
end
|
|
498
|
+
if host == dashboard
|
|
499
|
+
check_console_status_endpoint(host)
|
|
500
|
+
end
|
|
497
501
|
end
|
|
498
502
|
end
|
|
499
503
|
|
|
@@ -523,6 +527,9 @@ module Beaker
|
|
|
523
527
|
sleep_until_puppetdb_started(database)
|
|
524
528
|
check_puppetdb_status_endpoint(database)
|
|
525
529
|
end
|
|
530
|
+
if host == dashboard
|
|
531
|
+
check_console_status_endpoint(host)
|
|
532
|
+
end
|
|
526
533
|
end
|
|
527
534
|
end
|
|
528
535
|
end
|
|
@@ -695,6 +702,25 @@ module Beaker
|
|
|
695
702
|
fail_test "PuppetDB took too long to start"
|
|
696
703
|
end
|
|
697
704
|
|
|
705
|
+
def check_console_status_endpoint(host)
|
|
706
|
+
if version_is_less(host['pe_ver'], '2015.2.0')
|
|
707
|
+
return true
|
|
708
|
+
end
|
|
709
|
+
Timeout.timeout(60) do
|
|
710
|
+
match = nil
|
|
711
|
+
while not match
|
|
712
|
+
output = on(host, "curl -s -k https://localhost:4433/status/v1/services --cert /etc/puppetlabs/puppet/ssl/certs/#{host}.pem --key /etc/puppetlabs/puppet/ssl/private_keys/#{host}.pem --cacert /etc/puppetlabs/puppet/ssl/certs/ca.pem", :accept_all_exit_codes => true)
|
|
713
|
+
output = JSON.parse(output.stdout)
|
|
714
|
+
match = output['classifier-service']['state'] == 'running'
|
|
715
|
+
match = match && output['rbac-service']['state'] == 'running'
|
|
716
|
+
match = match && output['activity-service']['state'] == 'running'
|
|
717
|
+
sleep 1
|
|
718
|
+
end
|
|
719
|
+
end
|
|
720
|
+
rescue Timeout::Error
|
|
721
|
+
fail_test "Console services took too long to start"
|
|
722
|
+
end
|
|
723
|
+
|
|
698
724
|
#Install PE based upon host configuration and options
|
|
699
725
|
#
|
|
700
726
|
# @param [Host, Array<Host>] install_hosts One or more hosts to act upon
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require "beaker/dsl/patterns"
|
|
2
|
+
|
|
3
|
+
module Beaker
|
|
4
|
+
module DSL
|
|
5
|
+
module PEClientTools
|
|
6
|
+
module ConfigFileHelper
|
|
7
|
+
|
|
8
|
+
# Helper method to write config files for pe-client-tools
|
|
9
|
+
# @param [Beaker::Host] host The beaker host that gets the config file
|
|
10
|
+
# @param [String] config_level 'user' or 'global'
|
|
11
|
+
# @param [String] tool 'access', 'code', 'db', 'query', 'orchestrator', 'job', 'app'
|
|
12
|
+
# @param [String] contents The contents of the config file
|
|
13
|
+
def write_client_tool_config_on(host, config_level, tool, contents)
|
|
14
|
+
|
|
15
|
+
# TODO take a hash and parse file or take literal string
|
|
16
|
+
|
|
17
|
+
file = "#{Private.config_path(host, config_level)}/#{Private.file_name(tool)}"
|
|
18
|
+
create_remote_file(host, file, contents)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Private
|
|
23
|
+
|
|
24
|
+
require 'beaker/dsl/patterns'
|
|
25
|
+
|
|
26
|
+
extend Beaker::DSL
|
|
27
|
+
extend Beaker::DSL::Patterns
|
|
28
|
+
|
|
29
|
+
def self.file_name(tool)
|
|
30
|
+
if tool =~ /orchestrator|job|app/i
|
|
31
|
+
'puppet-orchestrator.conf'
|
|
32
|
+
elsif tool =~ /code/i
|
|
33
|
+
'puppet-code.conf'
|
|
34
|
+
elsif tool =~ /access/i
|
|
35
|
+
'puppet-access.conf'
|
|
36
|
+
elsif tool =~ /db|query/i
|
|
37
|
+
'puppetdb.conf'
|
|
38
|
+
else
|
|
39
|
+
raise ArgumentError.new("Unknown pe-client-tool type '#{tool}'")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.config_path(host, config_level)
|
|
44
|
+
|
|
45
|
+
puppetlabs_dir = 'puppetlabs'
|
|
46
|
+
puppetlabs_dir.prepend('.') if config_level == 'user'
|
|
47
|
+
client_tools_path_array = [puppetlabs_dir, 'client-tools']
|
|
48
|
+
|
|
49
|
+
case config_level
|
|
50
|
+
|
|
51
|
+
when /global/
|
|
52
|
+
@base_path = global_base_path(host)
|
|
53
|
+
when /user/
|
|
54
|
+
@base_path = home_dir(host)
|
|
55
|
+
else
|
|
56
|
+
raise ArgumentError.new("Unknown config level #{config_level}")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
client_tools_dir = client_tools_path_array.unshift(@base_path).join(path_separator(host))
|
|
60
|
+
opts = {:cmdexe => true}
|
|
61
|
+
|
|
62
|
+
if host.platform =~ /win/
|
|
63
|
+
host.exec(Beaker::Command.new('MD', [client_tools_dir.gsub('\\', '\\\\\\')], opts), :accept_all_exit_codes => true)
|
|
64
|
+
else
|
|
65
|
+
host.exec(Beaker::Command.new("mkdir -p #{client_tools_dir}", [], opts), :accept_all_exit_codes => true)
|
|
66
|
+
end
|
|
67
|
+
client_tools_dir
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.home_dir(host)
|
|
71
|
+
|
|
72
|
+
if (host.platform =~ /win/) then
|
|
73
|
+
@cmd = Beaker::Command.new('echo', ['%userprofile%'], :cmdexe => true)
|
|
74
|
+
else
|
|
75
|
+
@cmd = Beaker::Command.new('echo', ['$HOME'])
|
|
76
|
+
end
|
|
77
|
+
host.exec(@cmd).stdout.chomp
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def self.global_base_path(host)
|
|
81
|
+
|
|
82
|
+
(host.platform =~ /win/) ?host.exec(Beaker::Command.new('echo', ['%PROGRAMDATA%'], :cmdexe => true)).stdout.chomp : '/etc//'
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.path_separator(host)
|
|
86
|
+
|
|
87
|
+
(host.platform =~ /win/) ? '\\' : '/'
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
require "beaker/dsl/patterns"
|
|
2
|
+
require "beaker/dsl/helpers"
|
|
3
|
+
require "beaker/dsl/wrappers"
|
|
4
|
+
|
|
5
|
+
module Beaker
|
|
6
|
+
module DSL
|
|
7
|
+
module PEClientTools
|
|
8
|
+
module ExecutableHelper
|
|
9
|
+
|
|
10
|
+
# puppet-access helper win/lin/osx
|
|
11
|
+
# @param [BEAKER::Host] host The SUT that should run the puppet-access command
|
|
12
|
+
# @param [String] args The arguments to puppet-access
|
|
13
|
+
# @param [Hash] opts options hash to the Beaker Command
|
|
14
|
+
# @param [Block] &block optional block
|
|
15
|
+
def puppet_access_on(*args, &block)
|
|
16
|
+
Private.new.tool(:access, *args, &block)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# puppet-code helper win/lin/osx
|
|
20
|
+
# @param [BEAKER::Host] host The SUT that should run the puppet-code command
|
|
21
|
+
# @param [String] args The arguments to puppet-code
|
|
22
|
+
# @param [Hash] opts options hash to the Beaker Command
|
|
23
|
+
# @param [Block] &block optional block
|
|
24
|
+
def puppet_code_on(*args, &block)
|
|
25
|
+
Private.new.tool(:code, *args, &block)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# puppet-job helper win/lin/osx
|
|
29
|
+
# @param [BEAKER::Host] host The SUT that should run the puppet-job command
|
|
30
|
+
# @param [String] args The arguments to puppet-job
|
|
31
|
+
# @param [Hash] opts options hash to the Beaker Command
|
|
32
|
+
# @param [Block] &block optional block
|
|
33
|
+
def puppet_job_on(*args, &block)
|
|
34
|
+
Private.new.tool(:job, *args, &block)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# puppet-app helper win/lin/osx
|
|
38
|
+
# @param [BEAKER::Host] host The SUT that should run the puppet-app command
|
|
39
|
+
# @param [String] args The arguments to puppet-app
|
|
40
|
+
# @param [Hash] opts options hash to the Beaker Command
|
|
41
|
+
# @param [Block] &block optional block
|
|
42
|
+
def puppet_app_on(*args, &block)
|
|
43
|
+
Private.new.tool(:app, *args, &block)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# puppet-db helper win/lin/osx
|
|
47
|
+
# @param [BEAKER::Host] host The SUT that should run the puppet-db command
|
|
48
|
+
# @param [String] args The arguments to puppet-db
|
|
49
|
+
# @param [Hash] opts options hash to the Beaker Command
|
|
50
|
+
# @param [Block] &block optional block
|
|
51
|
+
def puppet_db_on(*args, &block)
|
|
52
|
+
Private.new.tool(:db, *args, &block)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# puppet-query helper win/lin/osx
|
|
56
|
+
# @param [BEAKER::Host] host The SUT that should run the puppet-query command
|
|
57
|
+
# @param [String] args The arguments to puppet-query
|
|
58
|
+
# @param [Hash] opts options hash to the Beaker Command
|
|
59
|
+
# @param [Block] &block optional block
|
|
60
|
+
def puppet_query_on(*args, &block)
|
|
61
|
+
Private.new.tool(:query, *args, &block)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Logs a user in on a SUT with puppet-access/RBAC API (windows)
|
|
65
|
+
# @param [Beaker::Host] host The SUT to perform the login on
|
|
66
|
+
# @param [Scooter::HttpDispatchers::ConsoleDispatcher] credentialed_dispatcher A Scooter dispatcher that has credentials for the user
|
|
67
|
+
# @option attribute_hash [String] :name The environment variable
|
|
68
|
+
# @option attribute_hash [String] :default The default value for the environment variable
|
|
69
|
+
# @option attribute_hash [String] :message A message describing the use of this variable
|
|
70
|
+
# @option attribute_hash [Boolean] :required Used internally by CommandFlag, ignored for a standalone EnvVar
|
|
71
|
+
def login_with_puppet_access_on(host, credentialed_dispatcher, opts={})
|
|
72
|
+
|
|
73
|
+
lifetime = opts[:lifetime] || nil
|
|
74
|
+
unless host.platform =~ /win/
|
|
75
|
+
|
|
76
|
+
user = credentialed_dispatcher.credentials.login
|
|
77
|
+
password = credentialed_dispatcher.credentials.password
|
|
78
|
+
puppet_access_on(host, 'login', {:stdin => "#{user}\n#{password}\n"})
|
|
79
|
+
else
|
|
80
|
+
|
|
81
|
+
# this is a hack
|
|
82
|
+
# puppet-access needs to support alternative to interactive login
|
|
83
|
+
# create .puppetlabs dir
|
|
84
|
+
cmd = Beaker::Command.new('echo', ['%userprofile%'], :cmdexe => true)
|
|
85
|
+
user_home_dir = host.exec(cmd).stdout.chomp
|
|
86
|
+
win_token_path = "#{user_home_dir}\\.puppetlabs\\"
|
|
87
|
+
host.exec(Beaker::Command.new('MD', [win_token_path.gsub('\\', '\\\\\\')], :cmdexe => true), :accept_all_exit_codes => true)
|
|
88
|
+
|
|
89
|
+
token = credentialed_dispatcher.acquire_token_with_credentials(lifetime)
|
|
90
|
+
create_remote_file(host, "#{win_token_path}\\token", token)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
class Private
|
|
95
|
+
|
|
96
|
+
include Beaker::DSL
|
|
97
|
+
include Beaker::DSL::Wrappers
|
|
98
|
+
include Beaker::DSL::Helpers::HostHelpers
|
|
99
|
+
include Beaker::DSL::Patterns
|
|
100
|
+
|
|
101
|
+
attr_accessor :logger
|
|
102
|
+
|
|
103
|
+
def tool(tool, *args, &block)
|
|
104
|
+
|
|
105
|
+
host = args.shift
|
|
106
|
+
@logger = host.logger
|
|
107
|
+
options = {}
|
|
108
|
+
options.merge!(args.pop) if args.last.is_a?(Hash)
|
|
109
|
+
|
|
110
|
+
if host.platform =~ /win/i
|
|
111
|
+
|
|
112
|
+
program_files = host.exec(Beaker::Command.new('echo', ['%PROGRAMFILES%'], :cmdexe => true)).stdout.chomp
|
|
113
|
+
client_tools_dir = "#{program_files}\\#{['Puppet Labs', 'Client', 'tools', 'bin'].join('\\')}\\"
|
|
114
|
+
tool_executable = "\"#{client_tools_dir}puppet-#{tool.to_s}.exe\""
|
|
115
|
+
|
|
116
|
+
#TODO does this need to be more detailed to pass exit codes????
|
|
117
|
+
# TODO make batch file direct output to separate file
|
|
118
|
+
batch_contents =<<-EOS
|
|
119
|
+
call #{tool_executable} #{args.join(' ')}
|
|
120
|
+
EOS
|
|
121
|
+
|
|
122
|
+
@command = build_win_batch_command( host, batch_contents, {:cmdexe => true})
|
|
123
|
+
else
|
|
124
|
+
|
|
125
|
+
tool_executable = '/opt/puppetlabs/client-tools/bin/' << "puppet-#{tool.to_s}"
|
|
126
|
+
@command = Beaker::Command.new(tool_executable, args, {:cmdexe => true})
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
result = host.exec(@command, options)
|
|
130
|
+
|
|
131
|
+
# Also, let additional checking be performed by the caller.
|
|
132
|
+
if block_given?
|
|
133
|
+
case block.arity
|
|
134
|
+
#block with arity of 0, just hand back yourself
|
|
135
|
+
when 0
|
|
136
|
+
yield self
|
|
137
|
+
#block with arity of 1 or greater, hand back the result object
|
|
138
|
+
else
|
|
139
|
+
yield result
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
result
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def build_win_batch_command( host, batch_contents, command_options)
|
|
146
|
+
timestamp = Time.new.strftime('%Y-%m-%d_%H.%M.%S')
|
|
147
|
+
# Create Temp file
|
|
148
|
+
# make file fully qualified
|
|
149
|
+
batch_file = "#{host.system_temp_path}\\#{timestamp}.bat"
|
|
150
|
+
create_remote_file(host, batch_file, batch_contents)
|
|
151
|
+
Beaker::Command.new("\"#{batch_file}\"", [], command_options)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Beaker
|
|
2
|
+
module DSL
|
|
3
|
+
module InstallUtils
|
|
4
|
+
module PEClientTools
|
|
5
|
+
|
|
6
|
+
def install_pe_client_tools_on(hosts, opts = {})
|
|
7
|
+
# FIXME: accomodate production released location(s)
|
|
8
|
+
#{{{
|
|
9
|
+
product = 'pe-client-tools'
|
|
10
|
+
required_keys = [:puppet_collection, :pe_client_tools_sha, :pe_client_tools_version]
|
|
11
|
+
|
|
12
|
+
unless required_keys.all? { |opt| opts.keys.include?(opt) }
|
|
13
|
+
raise ArgumentError, "The keys #{required_keys.to_s} are required in the opts hash"
|
|
14
|
+
end
|
|
15
|
+
urls = { :dev_builds_url => "http://builds.delivery.puppetlabs.net",
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
opts = urls.merge(opts)
|
|
19
|
+
|
|
20
|
+
block_on hosts do |host|
|
|
21
|
+
package_name = nil
|
|
22
|
+
variant, version, arch, codename = host['platform'].to_array
|
|
23
|
+
case host['platform']
|
|
24
|
+
when /el-|fedora|sles|centos|cisco_/
|
|
25
|
+
release_path = "#{opts[:dev_builds_url]}/#{product}/#{ opts[:pe_client_tools_sha] }/artifacts/#{variant}/#{version}/#{opts[:puppet_collection]}/#{arch}"
|
|
26
|
+
package_name = product.dup
|
|
27
|
+
package_name << "-#{opts[:pe_client_tools_version]}-1.#{variant}#{version}.#{arch}.rpm" if opts[:pe_client_tools_version]
|
|
28
|
+
when /debian|ubuntu|cumulus|huaweios/
|
|
29
|
+
release_path = "#{opts[:dev_builds_url]}/#{product}/#{ opts[:pe_client_tools_sha] }/artifacts/deb/#{codename}/#{opts[:puppet_collection]}"
|
|
30
|
+
package_name = product.dup
|
|
31
|
+
package_name << "_#{opts[:pe_client_tools_version]}-1#{host['platform'].codename}_#{arch}.deb" if opts[:pe_client_tools_version]
|
|
32
|
+
when /windows/
|
|
33
|
+
release_path = "#{opts[:dev_builds_url]}/#{product}/#{ opts[:pe_client_tools_sha] }/artifacts/#{variant}/#{opts[:puppet_collection]}/x#{arch}"
|
|
34
|
+
package_name = product.dup
|
|
35
|
+
package_name << "-#{opts[:pe_client_tools_version]}.1-x#{arch}_VANAGON.msi" if opts[:pe_client_tools_version]
|
|
36
|
+
when /osx/
|
|
37
|
+
release_path = "#{opts[:dev_builds_url]}/#{product}/#{ opts[:pe_client_tools_sha] }/artifacts/apple/#{version}/#{opts[:puppet_collection]}/#{arch}"
|
|
38
|
+
package_base = product.dup
|
|
39
|
+
package_base << "-#{opts[:pe_client_tools_version]}" if opts[:pe_client_tools_version]
|
|
40
|
+
package_name = package_base.dup
|
|
41
|
+
package_name << '-1' if opts[:pe_client_tools_version]
|
|
42
|
+
installer = package_name + '-installer.pkg'
|
|
43
|
+
package_name << ".#{variant}#{version}.dmg" if opts[:pe_client_tools_version]
|
|
44
|
+
else
|
|
45
|
+
raise "install_puppet_agent_on() called for unsupported " +
|
|
46
|
+
"platform '#{host['platform']}' on '#{host.name}'"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
if package_name
|
|
50
|
+
case host['platform']
|
|
51
|
+
when /windows/
|
|
52
|
+
generic_install_msi_on(host, File.join(release_path, package_name), {}, {:debug => true})
|
|
53
|
+
else
|
|
54
|
+
copy_dir_local = File.join('tmp', 'repo_configs')
|
|
55
|
+
fetch_http_file(release_path, package_name, copy_dir_local)
|
|
56
|
+
scp_to host, File.join(copy_dir_local, package_name), host.external_copy_base
|
|
57
|
+
|
|
58
|
+
if host['platform'] =~ /debian|ubuntu|cumulus|huaweios/
|
|
59
|
+
on host, "dpkg -i #{package_name}"
|
|
60
|
+
elsif host['platform'] =~ /osx/
|
|
61
|
+
host.generic_install_dmg(package_name, package_base, installer)
|
|
62
|
+
else
|
|
63
|
+
host.install_package( package_name )
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
#}}}
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
data/lib/beaker-pe/version.rb
CHANGED
|
@@ -866,6 +866,10 @@ describe ClassMixedWithDSLInstallUtils do
|
|
|
866
866
|
}, 2)
|
|
867
867
|
hosts[0][:roles] = ['master', 'database', 'dashboard']
|
|
868
868
|
hosts[1][:platform] = Beaker::Platform.new('el-6-x86_64')
|
|
869
|
+
opts[:HOSTS] = {}
|
|
870
|
+
hosts.each do |host|
|
|
871
|
+
opts[:HOSTS][host.name] = host
|
|
872
|
+
end
|
|
869
873
|
|
|
870
874
|
allow( subject ).to receive( :hosts ).and_return( hosts )
|
|
871
875
|
allow( subject ).to receive( :options ).and_return(Beaker::Options::Presets.new.presets)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'beaker'
|
|
3
|
+
|
|
4
|
+
class MixedWithConfigFileHelper
|
|
5
|
+
include Beaker::DSL::PEClientTools::ConfigFileHelper
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe MixedWithConfigFileHelper do
|
|
9
|
+
|
|
10
|
+
it 'has a method to write a config file' do
|
|
11
|
+
expect(subject.respond_to?('write_client_tool_config_on')).not_to be(false)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'beaker'
|
|
3
|
+
|
|
4
|
+
class MixedWithExecutableHelper
|
|
5
|
+
include Beaker::DSL::PEClientTools::ExecutableHelper
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe MixedWithExecutableHelper do
|
|
9
|
+
|
|
10
|
+
let(:method_name) { "puppet_#{tool}_on"}
|
|
11
|
+
|
|
12
|
+
shared_examples 'pe-client-tool'do
|
|
13
|
+
|
|
14
|
+
it 'has a method to execute the tool' do
|
|
15
|
+
expect(subject.respond_to?(method_name)).not_to be(false)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'puppet-code' do
|
|
20
|
+
let(:tool) {'code'}
|
|
21
|
+
|
|
22
|
+
it_behaves_like 'pe-client-tool'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context 'puppet-access' do
|
|
26
|
+
let(:tool) {'access'}
|
|
27
|
+
|
|
28
|
+
it_behaves_like 'pe-client-tool'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context 'puppet-job' do
|
|
32
|
+
let(:tool) {'job'}
|
|
33
|
+
|
|
34
|
+
it_behaves_like 'pe-client-tool'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'puppet-app' do
|
|
38
|
+
let(:tool) {'app'}
|
|
39
|
+
|
|
40
|
+
it_behaves_like 'pe-client-tool'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context 'puppet-db' do
|
|
44
|
+
let(:tool) {'db'}
|
|
45
|
+
|
|
46
|
+
it_behaves_like 'pe-client-tool'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'puppet-query' do
|
|
50
|
+
let(:tool) {'query'}
|
|
51
|
+
|
|
52
|
+
it_behaves_like 'pe-client-tool'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'has a method to login with puppet access' do
|
|
56
|
+
expect(subject.respond_to?('login_with_puppet_access_on')).not_to be(false)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'beaker/host'
|
|
3
|
+
class ClassPEClientToolsMixedWithPatterns
|
|
4
|
+
include Beaker::DSL::InstallUtils::PEClientTools
|
|
5
|
+
include Beaker::DSL::Patterns
|
|
6
|
+
end
|
|
7
|
+
describe ClassPEClientToolsMixedWithPatterns do
|
|
8
|
+
describe "#install_pe_client_tools_on" do
|
|
9
|
+
let(:hosts) do
|
|
10
|
+
make_hosts({:platform => platform })
|
|
11
|
+
end
|
|
12
|
+
opts = {
|
|
13
|
+
:puppet_collection => 'PC1',
|
|
14
|
+
:pe_client_tools_sha => '12345',
|
|
15
|
+
:pe_client_tools_version => '1.0.0-g12345'
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
before do
|
|
19
|
+
allow(subject). to receive(:scp_to)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context 'on el-6' do
|
|
23
|
+
let(:platform) { Beaker::Platform.new('el-6-x86_64') }
|
|
24
|
+
it 'installs' do
|
|
25
|
+
hosts.each do |host|
|
|
26
|
+
allow(subject). to receive(:fetch_http_file).with("http://builds.delivery.puppetlabs.net/pe-client-tools/#{opts[:pe_client_tools_sha]}/artifacts/el/6/PC1/x86_64", "pe-client-tools-#{opts[:pe_client_tools_version]}-1.el6.x86_64.rpm", "tmp/repo_configs")
|
|
27
|
+
allow(host). to receive(:external_copy_base)
|
|
28
|
+
expect(host).to receive(:install_package).with("pe-client-tools-#{opts[:pe_client_tools_version]}-1.el6.x86_64.rpm")
|
|
29
|
+
subject.install_pe_client_tools_on(host, opts)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context 'on ubuntu' do
|
|
35
|
+
let(:platform) { Beaker::Platform.new('ubuntu-1604-x86_64') }
|
|
36
|
+
it 'installs' do
|
|
37
|
+
hosts.each do |host|
|
|
38
|
+
allow(subject). to receive(:fetch_http_file).with("http://builds.delivery.puppetlabs.net/pe-client-tools/#{opts[:pe_client_tools_sha]}/artifacts/deb/xenial/PC1", "pe-client-tools_#{opts[:pe_client_tools_version]}-1xenial_x86_64.deb", "tmp/repo_configs")
|
|
39
|
+
allow(host). to receive(:external_copy_base)
|
|
40
|
+
expect(subject).to receive(:on).with(host, "dpkg -i pe-client-tools_#{opts[:pe_client_tools_version]}-1xenial_x86_64.deb")
|
|
41
|
+
subject.install_pe_client_tools_on(host, opts)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context 'on windows' do
|
|
47
|
+
let(:platform) { Beaker::Platform.new('windows-2012r2-x86_64') }
|
|
48
|
+
it 'installs' do
|
|
49
|
+
hosts.each do |host|
|
|
50
|
+
allow(subject). to receive(:fetch_http_file).with("http://builds.delivery.puppetlabs.net/pe-client-tools/#{opts[:pe_client_tools_sha]}/artifacts/deb/xenial/PC1", "pe-client-tools_#{opts[:pe_client_tools_version]}-1xenial_x86_64.deb", "tmp/repo_configs")
|
|
51
|
+
allow(host). to receive(:external_copy_base)
|
|
52
|
+
expect(subject).to receive(:generic_install_msi_on).with( host,
|
|
53
|
+
"http://builds.delivery.puppetlabs.net/pe-client-tools/#{opts[:pe_client_tools_sha]}/artifacts/windows/PC1/xx86_64/pe-client-tools-#{opts[:pe_client_tools_version]}.1-xx86_64_VANAGON.msi",
|
|
54
|
+
{},
|
|
55
|
+
{ :debug => true }
|
|
56
|
+
)
|
|
57
|
+
subject.install_pe_client_tools_on(host, opts)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context 'on OS X' do
|
|
63
|
+
let(:platform) { Beaker::Platform.new('osx-1111-x86_64') }
|
|
64
|
+
it 'installs' do
|
|
65
|
+
hosts.each do |host|
|
|
66
|
+
allow(subject). to receive(:fetch_http_file).with("http://builds.delivery.puppetlabs.net/pe-client-tools/#{opts[:pe_client_tools_sha]}/artifacts/apple/1111/PC1/x86_64", "pe-client-tools-#{opts[:pe_client_tools_version]}-1.osx1111.dmg", "tmp/repo_configs")
|
|
67
|
+
allow(host). to receive(:external_copy_base)
|
|
68
|
+
expect(host).to receive(:generic_install_dmg).with("pe-client-tools-#{opts[:pe_client_tools_version]}-1.osx1111.dmg", "pe-client-tools-#{opts[:pe_client_tools_version]}", "pe-client-tools-#{opts[:pe_client_tools_version]}-1-installer.pkg")
|
|
69
|
+
subject.install_pe_client_tools_on(host, opts)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: beaker-pe
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.8.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Puppetlabs
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-08-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rspec
|
|
@@ -173,10 +173,16 @@ files:
|
|
|
173
173
|
- lib/beaker-pe.rb
|
|
174
174
|
- lib/beaker-pe/install/pe_utils.rb
|
|
175
175
|
- lib/beaker-pe/options/pe_version_scraper.rb
|
|
176
|
+
- lib/beaker-pe/pe-client-tools/config_file_helper.rb
|
|
177
|
+
- lib/beaker-pe/pe-client-tools/executable_helper.rb
|
|
178
|
+
- lib/beaker-pe/pe-client-tools/install_helper.rb
|
|
176
179
|
- lib/beaker-pe/version.rb
|
|
177
180
|
- spec/beaker-pe/helpers_spec.rb
|
|
178
181
|
- spec/beaker-pe/install/pe_utils_spec.rb
|
|
179
182
|
- spec/beaker-pe/options/pe_version_scaper_spec.rb
|
|
183
|
+
- spec/beaker-pe/pe-client-tools/config_file_helper_spec.rb
|
|
184
|
+
- spec/beaker-pe/pe-client-tools/executable_helper_spec.rb
|
|
185
|
+
- spec/beaker-pe/pe-client-tools/installer_helper_spec.rb
|
|
180
186
|
- spec/helpers.rb
|
|
181
187
|
- spec/spec_helper.rb
|
|
182
188
|
homepage: https://github.com/puppetlabs/beaker-pe
|
|
@@ -204,4 +210,3 @@ signing_key:
|
|
|
204
210
|
specification_version: 4
|
|
205
211
|
summary: Beaker PE DSL Helpers!
|
|
206
212
|
test_files: []
|
|
207
|
-
has_rdoc:
|