mixlib-install 0.8.0.alpha.2 → 0.8.0.alpha.3
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 +4 -4
- data/README.md +9 -2
- data/Rakefile +5 -0
- data/acceptance/Gemfile +3 -1
- data/acceptance/Gemfile.lock +37 -5
- data/acceptance/current/.acceptance/acceptance-cookbook/recipes/provision.rb +3 -1
- data/acceptance/current/.kitchen.yml +18 -23
- data/acceptance/unstable/.acceptance/acceptance-cookbook/.gitignore +2 -0
- data/acceptance/unstable/.acceptance/acceptance-cookbook/metadata.rb +1 -0
- data/acceptance/unstable/.acceptance/acceptance-cookbook/recipes/destroy.rb +3 -0
- data/acceptance/unstable/.acceptance/acceptance-cookbook/recipes/provision.rb +3 -0
- data/acceptance/unstable/.acceptance/acceptance-cookbook/recipes/verify.rb +3 -0
- data/acceptance/unstable/.kitchen.yml +40 -0
- data/lib/mixlib/install.rb +35 -3
- data/lib/mixlib/install/backend/artifactory.rb +108 -34
- data/lib/mixlib/install/backend/omnitruck.rb +2 -2
- data/lib/mixlib/install/generator.rb +6 -1
- data/lib/mixlib/install/generator/base.rb +65 -0
- data/lib/mixlib/install/generator/bourne.rb +23 -14
- data/lib/mixlib/install/generator/bourne/scripts/artifactory_urls.sh.erb +31 -0
- data/lib/mixlib/install/generator/bourne/scripts/{fetch_metadata.sh → fetch_metadata.sh.erb} +1 -1
- data/lib/mixlib/install/generator/bourne/scripts/helpers.sh +7 -2
- data/lib/mixlib/install/generator/bourne/scripts/platform_detection.sh +8 -0
- data/lib/mixlib/install/generator/bourne/scripts/script_cli_parameters.sh +36 -0
- data/lib/mixlib/install/generator/powershell.rb +94 -0
- data/lib/mixlib/install/generator/powershell/scripts/get_project_metadata.ps1.erb +87 -0
- data/lib/mixlib/install/generator/powershell/scripts/get_project_metadata_for_artifactory.ps1.erb +83 -0
- data/lib/mixlib/install/generator/powershell/scripts/helpers.ps1 +69 -0
- data/lib/mixlib/install/generator/powershell/scripts/install_project.ps1 +96 -0
- data/lib/mixlib/install/options.rb +86 -23
- data/lib/mixlib/install/version.rb +1 -1
- metadata +17 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7db151f3905eb7a527cf687018366832a80a2811
|
4
|
+
data.tar.gz: 6186b2ea33ee9a2809084e768a33dcb57c162f00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc15e3ca92d5ad638a1e9a35ff30b8cd07a88ab091b26816eaebf1de9849db3e97ec88d98c4afdd9cd78eb723276b11e90698dcdf89847a3f87379319cf6caff
|
7
|
+
data.tar.gz: d98e85481f590f9e77357bfcf4223620bdfcd7ca623343b20f7a3f174e1b0350c720794b45249de50c9aafc0f964486b0b9608736f09ddeff9155a468b713aea
|
data/README.md
CHANGED
@@ -35,9 +35,16 @@ artifacts.first.url
|
|
35
35
|
# => "http://opscode-omnibus-packages-current.s3.amazonaws.com/mac_os_x/10.9/x86_64/chef-12.5.1%2B20151009083009-1.dmg"
|
36
36
|
```
|
37
37
|
|
38
|
+
## Unstable channel
|
39
|
+
The `:unstable` channel is currently only available when connected to Chef's internal network.
|
40
|
+
Configure Artifactory access by setting the following environment variables:
|
41
|
+
```
|
42
|
+
export ARTIFACTORY_USERNAME='username'
|
43
|
+
export ARTIFACTORY_PASSWORD='password'
|
44
|
+
```
|
38
45
|
|
39
|
-
|
40
|
-
Some
|
46
|
+
### Unstable channel specs
|
47
|
+
Some spec examples are tagged `:unstable` and can only run when connected to Chef's internal network. These are excluded by default. To run the `:unstable` tests run: `rake unstable`.
|
41
48
|
|
42
49
|
## Contributing
|
43
50
|
|
data/Rakefile
CHANGED
@@ -18,6 +18,11 @@ end
|
|
18
18
|
desc "Run all tests"
|
19
19
|
task test: [:rubocop, :spec]
|
20
20
|
|
21
|
+
desc "Run unstable channel tests"
|
22
|
+
task "unstable" do
|
23
|
+
system("bundle exec rspec -t unstable")
|
24
|
+
end
|
25
|
+
|
21
26
|
desc "Render product matrix documentation"
|
22
27
|
task "matrix" do
|
23
28
|
require "mixlib/install/product"
|
data/acceptance/Gemfile
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
3
|
gem "mixlib-install", path: "../"
|
4
|
-
gem "test-kitchen", github: "sersut/test-kitchen"
|
4
|
+
gem "test-kitchen", github: "sersut/test-kitchen", branch: "sersut/mixlib-install-update"
|
5
5
|
gem "chef-acceptance", github: "chef/chef-acceptance"
|
6
6
|
gem "pry"
|
7
7
|
|
8
8
|
group(:development) do
|
9
9
|
gem "kitchen-vagrant"
|
10
|
+
gem "windows_chef_zero"
|
11
|
+
gem "winrm-transport"
|
10
12
|
end
|
data/acceptance/Gemfile.lock
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
GIT
|
2
2
|
remote: git://github.com/chef/chef-acceptance.git
|
3
|
-
revision:
|
3
|
+
revision: 47f5f54e561981802122168ca01ae03907965312
|
4
4
|
specs:
|
5
5
|
chef-acceptance (0.2.0)
|
6
6
|
thor (~> 0.19)
|
7
7
|
|
8
8
|
GIT
|
9
9
|
remote: git://github.com/sersut/test-kitchen.git
|
10
|
-
revision:
|
10
|
+
revision: fd05389ec556fdcac96b92b1aea2a9ed48802e75
|
11
|
+
branch: sersut/mixlib-install-update
|
11
12
|
specs:
|
12
13
|
test-kitchen (1.4.3.dev.0)
|
13
|
-
mixlib-install (~> 0.7)
|
14
14
|
mixlib-shellout (>= 1.2, < 3.0)
|
15
15
|
net-scp (~> 1.1)
|
16
16
|
net-ssh (~> 2.7, < 2.10)
|
@@ -20,7 +20,7 @@ GIT
|
|
20
20
|
PATH
|
21
21
|
remote: ../
|
22
22
|
specs:
|
23
|
-
mixlib-install (0.8.0.alpha.
|
23
|
+
mixlib-install (0.8.0.alpha.2)
|
24
24
|
artifactory (~> 2.3.0)
|
25
25
|
mixlib-versioning (~> 1.1.0)
|
26
26
|
|
@@ -28,22 +28,52 @@ GEM
|
|
28
28
|
remote: https://rubygems.org/
|
29
29
|
specs:
|
30
30
|
artifactory (2.3.2)
|
31
|
+
builder (3.2.2)
|
31
32
|
coderay (1.1.0)
|
33
|
+
ffi (1.9.10)
|
34
|
+
gssapi (1.2.0)
|
35
|
+
ffi (>= 1.0.1)
|
36
|
+
gyoku (1.3.1)
|
37
|
+
builder (>= 2.1.2)
|
38
|
+
httpclient (2.7.0.1)
|
32
39
|
kitchen-vagrant (0.19.0)
|
33
40
|
test-kitchen (~> 1.4)
|
41
|
+
little-plugger (1.1.4)
|
42
|
+
logging (2.0.0)
|
43
|
+
little-plugger (~> 1.1)
|
44
|
+
multi_json (~> 1.10)
|
34
45
|
method_source (0.8.2)
|
35
|
-
mixlib-shellout (2.2.
|
46
|
+
mixlib-shellout (2.2.5)
|
36
47
|
mixlib-versioning (1.1.0)
|
48
|
+
multi_json (1.11.2)
|
37
49
|
net-scp (1.2.1)
|
38
50
|
net-ssh (>= 2.6.5)
|
39
51
|
net-ssh (2.9.2)
|
52
|
+
nori (2.6.0)
|
40
53
|
pry (0.10.3)
|
41
54
|
coderay (~> 1.1.0)
|
42
55
|
method_source (~> 0.8.1)
|
43
56
|
slop (~> 3.4)
|
57
|
+
rubyntlm (0.4.0)
|
58
|
+
rubyzip (1.1.7)
|
44
59
|
safe_yaml (1.0.4)
|
45
60
|
slop (3.6.0)
|
46
61
|
thor (0.19.1)
|
62
|
+
uuidtools (2.1.5)
|
63
|
+
windows_chef_zero (2.0.0)
|
64
|
+
test-kitchen (>= 1.2.1)
|
65
|
+
winrm (1.3.6)
|
66
|
+
builder (>= 2.1.2)
|
67
|
+
gssapi (~> 1.2)
|
68
|
+
gyoku (~> 1.0)
|
69
|
+
httpclient (~> 2.2, >= 2.2.0.2)
|
70
|
+
logging (>= 1.6.1, < 3.0)
|
71
|
+
nori (~> 2.0)
|
72
|
+
rubyntlm (~> 0.4.0)
|
73
|
+
uuidtools (~> 2.1.2)
|
74
|
+
winrm-transport (1.0.3)
|
75
|
+
rubyzip (~> 1.1, >= 1.1.7)
|
76
|
+
winrm (~> 1.3)
|
47
77
|
|
48
78
|
PLATFORMS
|
49
79
|
ruby
|
@@ -54,6 +84,8 @@ DEPENDENCIES
|
|
54
84
|
mixlib-install!
|
55
85
|
pry
|
56
86
|
test-kitchen!
|
87
|
+
windows_chef_zero
|
88
|
+
winrm-transport
|
57
89
|
|
58
90
|
BUNDLED WITH
|
59
91
|
1.10.6
|
@@ -7,39 +7,34 @@ driver:
|
|
7
7
|
|
8
8
|
provisioner:
|
9
9
|
name: chef_zero
|
10
|
-
product_name: chef
|
11
|
-
product_version: latest
|
12
|
-
channel: current
|
13
10
|
|
14
11
|
platforms:
|
15
12
|
- name: centos-6.5
|
16
13
|
run_list:
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
- name: debian-7.4
|
15
|
+
run_list:
|
16
|
+
- name: freebsd-10.0
|
17
|
+
run_list:
|
21
18
|
- name: ubuntu-14.04
|
22
19
|
run_list:
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
# require_chef_omnibus: 11.12.4
|
30
|
-
# driver:
|
31
|
-
# box: chef/windows-7-professional # private
|
20
|
+
- name: macosx-10.10
|
21
|
+
driver:
|
22
|
+
box: chef/macosx-10.10 # private
|
23
|
+
- name: windows-server-2012r2-standard
|
24
|
+
driver:
|
25
|
+
box: chef/windows-server-2012r2-standard # private
|
32
26
|
|
33
27
|
suites:
|
34
|
-
- name:
|
28
|
+
- name: chef-current-install
|
35
29
|
provisioner:
|
36
30
|
product_name: chef
|
37
31
|
product_version: latest
|
38
32
|
channel: current
|
39
33
|
run_list:
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
34
|
+
- name: chefdk-current-install
|
35
|
+
excludes: [ 'freebsd-10.0' ]
|
36
|
+
provisioner:
|
37
|
+
product_name: chefdk
|
38
|
+
product_version: latest
|
39
|
+
channel: current
|
40
|
+
run_list:
|
@@ -0,0 +1 @@
|
|
1
|
+
name 'acceptance-cookbook'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
driver:
|
2
|
+
name: vagrant
|
3
|
+
forward_agent: yes
|
4
|
+
customize:
|
5
|
+
cpus: 2
|
6
|
+
memory: 1024
|
7
|
+
|
8
|
+
provisioner:
|
9
|
+
name: chef_zero
|
10
|
+
|
11
|
+
platforms:
|
12
|
+
- name: centos-6.5
|
13
|
+
run_list:
|
14
|
+
- name: debian-7.4
|
15
|
+
run_list:
|
16
|
+
- name: freebsd-10.0
|
17
|
+
run_list:
|
18
|
+
- name: ubuntu-14.04
|
19
|
+
run_list:
|
20
|
+
- name: macosx-10.10
|
21
|
+
driver:
|
22
|
+
box: chef/macosx-10.10 # private
|
23
|
+
- name: windows-server-2012r2-standard
|
24
|
+
driver:
|
25
|
+
box: chef/windows-server-2012r2-standard # private
|
26
|
+
|
27
|
+
suites:
|
28
|
+
- name: chef-unstable-install
|
29
|
+
provisioner:
|
30
|
+
product_name: chef
|
31
|
+
product_version: latest
|
32
|
+
channel: unstable
|
33
|
+
run_list:
|
34
|
+
- name: chefdk-unstable-install
|
35
|
+
excludes: [ 'freebsd-10.0' ]
|
36
|
+
provisioner:
|
37
|
+
product_name: chefdk
|
38
|
+
product_version: latest
|
39
|
+
channel: unstable
|
40
|
+
run_list:
|
data/lib/mixlib/install.rb
CHANGED
@@ -22,6 +22,8 @@ require "mixlib/versioning"
|
|
22
22
|
require "mixlib/install/backend"
|
23
23
|
require "mixlib/install/options"
|
24
24
|
require "mixlib/install/generator"
|
25
|
+
require "mixlib/install/generator/bourne"
|
26
|
+
require "mixlib/install/generator/powershell"
|
25
27
|
|
26
28
|
module Mixlib
|
27
29
|
class Install
|
@@ -56,10 +58,13 @@ module Mixlib
|
|
56
58
|
# @return [String] the installation directory for the project
|
57
59
|
#
|
58
60
|
def root
|
59
|
-
# TODO: Support root as "$env:systemdrive\\opscode\\chef" when on windows.
|
60
61
|
# This only works for chef and chefdk but they are the only projects
|
61
62
|
# we are supporting as of now.
|
62
|
-
|
63
|
+
if options.for_ps1?
|
64
|
+
"$env:systemdrive\\opscode\\#{options.product_name}"
|
65
|
+
else
|
66
|
+
"/opt/#{options.product_name}"
|
67
|
+
end
|
63
68
|
end
|
64
69
|
|
65
70
|
#
|
@@ -72,7 +77,12 @@ module Mixlib
|
|
72
77
|
# install directory which can be different than the product name (e.g.
|
73
78
|
# chef-server -> /opt/opscode). But this is OK for now since
|
74
79
|
# chef & chefdk are the only supported products.
|
75
|
-
version_manifest_file =
|
80
|
+
version_manifest_file = if options.for_ps1?
|
81
|
+
"$env:systemdrive\\opscode\\#{options.product_name}\\version-manifest.json"
|
82
|
+
else
|
83
|
+
"/opt/#{options.product_name}/version-manifest.json"
|
84
|
+
end
|
85
|
+
|
76
86
|
if File.exist? version_manifest_file
|
77
87
|
JSON.parse(File.read(version_manifest_file))["build_version"]
|
78
88
|
end
|
@@ -88,5 +98,27 @@ module Mixlib
|
|
88
98
|
current_ver = Mixlib::Versioning.parse(current_version)
|
89
99
|
(available_ver > current_ver)
|
90
100
|
end
|
101
|
+
|
102
|
+
#
|
103
|
+
# Returns the install.sh script
|
104
|
+
# Supported context parameters:
|
105
|
+
# ------------------
|
106
|
+
# base_url [String]
|
107
|
+
# url pointing to the omnitruck to be queried by the script.
|
108
|
+
#
|
109
|
+
def self.install_sh(context = {})
|
110
|
+
Mixlib::Install::Generator::Bourne.install_sh(context)
|
111
|
+
end
|
112
|
+
|
113
|
+
#
|
114
|
+
# Returns the install.ps1 script
|
115
|
+
# Supported context parameters:
|
116
|
+
# ------------------
|
117
|
+
# base_url [String]
|
118
|
+
# url pointing to the omnitruck to be queried by the script.
|
119
|
+
#
|
120
|
+
def self.install_ps1(context = {})
|
121
|
+
Mixlib::Install::Generator::PowerShell.install_ps1(context)
|
122
|
+
end
|
91
123
|
end
|
92
124
|
end
|
@@ -25,64 +25,138 @@ module Mixlib
|
|
25
25
|
class Install
|
26
26
|
class Backend
|
27
27
|
class Artifactory
|
28
|
-
|
28
|
+
class ConnectionError < StandardError; end
|
29
|
+
class AuthenticationError < StandardError; end
|
29
30
|
|
30
|
-
|
31
|
-
|
31
|
+
ENDPOINT = "http://artifactory.chef.co".freeze
|
32
|
+
|
33
|
+
attr_accessor :options
|
32
34
|
|
33
35
|
def initialize(options)
|
34
36
|
@options = options
|
35
|
-
@client = ::Artifactory::Client.new(endpoint: ARTIFACTORY_ENDPOINT)
|
36
37
|
end
|
37
38
|
|
39
|
+
# Create filtered list of artifacts
|
40
|
+
#
|
41
|
+
# @return [Array<ArtifactInfo>] list of artifacts for the configured
|
42
|
+
# channel, product name, and product version.
|
43
|
+
# @return [ArtifactInfo] arifact info for the configured
|
44
|
+
# channel, product name, product version and platform info
|
45
|
+
#
|
38
46
|
def info
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
which is currently only accessible through Chef's internal network."
|
47
|
+
artifacts = artifactory_info.collect { |a| create_artifact(a) }
|
48
|
+
|
49
|
+
artifacts_for_version = artifacts.find_all do |a|
|
50
|
+
a.version == options.resolved_version(artifacts)
|
44
51
|
end
|
45
52
|
|
46
53
|
if options.platform
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
54
|
+
artifacts_for_version.find do |a|
|
55
|
+
a.platform == options.platform &&
|
56
|
+
a.platform_version == options.platform_version &&
|
57
|
+
a.architecture == options.architecture
|
51
58
|
end
|
59
|
+
else
|
60
|
+
artifacts_for_version
|
52
61
|
end
|
53
62
|
end
|
54
63
|
|
55
|
-
|
64
|
+
# Fetches all artifacts from the configured Artifactory repository using
|
65
|
+
# channel and product name as search criteria
|
66
|
+
#
|
67
|
+
# @return [Array<Hash>] list of artifactory hash data
|
68
|
+
#
|
69
|
+
# Hash data:
|
70
|
+
# download_uri: The full url download path
|
71
|
+
# <property_name>: The names of the properties associcated to the artifact
|
72
|
+
#
|
73
|
+
def artifactory_info
|
74
|
+
query = <<-QUERY
|
75
|
+
items.find(
|
76
|
+
{"repo": "omnibus-#{options.channel}-local"},
|
77
|
+
{"@omnibus.project": "#{options.product_name}"}
|
78
|
+
).include("repo", "path", "name", "property")
|
79
|
+
QUERY
|
56
80
|
|
57
|
-
|
81
|
+
results = artifactory_request do
|
82
|
+
client.post("/api/search/aql", query, "Content-Type" => "text/plain")
|
83
|
+
end
|
84
|
+
|
85
|
+
# Merge artifactory properties and downloadUri to a flat Hash
|
86
|
+
results["results"].collect do |result|
|
87
|
+
{ "downloadUri" => generate_download_uri(result) }.merge(
|
88
|
+
map_properties(result["properties"])
|
89
|
+
)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_artifact(artifact_map)
|
58
94
|
ArtifactInfo.new(
|
59
|
-
md5:
|
60
|
-
sha256:
|
61
|
-
version:
|
62
|
-
platform:
|
63
|
-
platform_version:
|
64
|
-
architecture:
|
65
|
-
url:
|
95
|
+
md5: artifact_map["omnibus.md5"],
|
96
|
+
sha256: artifact_map["omnibus.sha256"],
|
97
|
+
version: artifact_map["omnibus.version"],
|
98
|
+
platform: artifact_map["omnibus.platform"],
|
99
|
+
platform_version: artifact_map["omnibus.platform_version"],
|
100
|
+
architecture: artifact_map["omnibus.architecture"],
|
101
|
+
url: artifact_map["downloadUri"]
|
66
102
|
)
|
67
103
|
end
|
68
104
|
|
69
|
-
|
70
|
-
params = {
|
71
|
-
"repos" => "omnibus-current-local",
|
72
|
-
"omnibus.version" => options.product_version
|
73
|
-
}
|
105
|
+
private
|
74
106
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
107
|
+
# Converts Array<Hash> where the Hash is a key pair and
|
108
|
+
# value pair to a simplifed key/pair Hash
|
109
|
+
#
|
110
|
+
def map_properties(properties)
|
111
|
+
return {} if properties.nil?
|
112
|
+
properties.each_with_object({}) do |prop, h|
|
113
|
+
h[prop["key"]] = prop["value"]
|
79
114
|
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Construct the downloadUri from raw artifactory data
|
118
|
+
#
|
119
|
+
def generate_download_uri(result)
|
120
|
+
uri = []
|
121
|
+
uri << endpoint.sub(/\/$/, "")
|
122
|
+
uri << result["repo"]
|
123
|
+
uri << result["path"]
|
124
|
+
uri << result["name"]
|
125
|
+
uri.join("/")
|
126
|
+
end
|
80
127
|
|
81
|
-
|
128
|
+
def client
|
129
|
+
@client ||= ::Artifactory::Client.new(
|
130
|
+
endpoint: endpoint,
|
131
|
+
username: ENV["ARTIFACTORY_USERNAME"],
|
132
|
+
password: ENV["ARTIFACTORY_PASSWORD"]
|
133
|
+
)
|
82
134
|
end
|
83
135
|
|
84
|
-
def
|
85
|
-
|
136
|
+
def endpoint
|
137
|
+
@endpoint ||= ENV.fetch("ARTIFACTORY_ENDPOINT", ENDPOINT)
|
138
|
+
end
|
139
|
+
|
140
|
+
def artifactory_request
|
141
|
+
begin
|
142
|
+
results = yield
|
143
|
+
rescue Errno::ETIMEDOUT, ::Artifactory::Error::ConnectionError
|
144
|
+
raise ConnectionError, <<-EOS
|
145
|
+
Artifactory endpoint '#{::Artifactory.endpoint}' is unreachable. Check that
|
146
|
+
the endpoint is correct and there is an open connection to Chef's private network.
|
147
|
+
EOS
|
148
|
+
rescue ::Artifactory::Error::HTTPError => e
|
149
|
+
if e.code == 401 && e.message =~ /Bad credentials/
|
150
|
+
raise AuthenticationError, <<-EOS
|
151
|
+
Artifactory server denied credentials. Verify ARTIFACTORY_USERNAME and
|
152
|
+
ARTIFACTORY_PASSWORD environment variables are configured properly.
|
153
|
+
EOS
|
154
|
+
else
|
155
|
+
raise e
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
results
|
86
160
|
end
|
87
161
|
end
|
88
162
|
end
|