knife-solo 0.3.0.pre1 → 0.3.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +20 -0
- data/lib/chef/knife/solo_cook.rb +23 -1
- data/lib/chef/knife/solo_prepare.rb +20 -2
- data/lib/knife-solo/bootstraps.rb +30 -4
- data/lib/knife-solo/bootstraps/darwin.rb +0 -4
- data/lib/knife-solo/bootstraps/freebsd.rb +1 -5
- data/lib/knife-solo/bootstraps/linux.rb +1 -1
- data/lib/knife-solo/info.rb +1 -1
- data/test/bootstraps_test.rb +39 -12
- data/test/integration/cases/apache2_bootstrap.rb +1 -1
- data/test/solo_cook_test.rb +4 -0
- data/test/solo_prepare_test.rb +16 -9
- data/test/support/integration_test.rb +1 -8
- metadata +5 -2
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# 0.3.0: _In progress_
|
2
2
|
|
3
|
+
## Changes and new features
|
4
|
+
|
5
|
+
* Moved root path configuration into `knife[:solo_path]` and use $HOME/chef-solo by default (#197)
|
6
|
+
* `--prerelease` option to allow pre-release versions of chef omnibus or rubygem to be installed (#205)
|
7
|
+
* Prepare/bootstrap now installs the same version of Chef that the workstation is running (#186)
|
8
|
+
* Switch `--omnibus-version` flag to `--bootstrap-version` (#185)
|
9
|
+
* Support --override-runlist option (#204)
|
10
|
+
|
11
|
+
## Fixes
|
12
|
+
|
13
|
+
* FreeBSD 9.1 support
|
14
|
+
* Clear yum cache before installing rsync (#200)
|
15
|
+
|
16
|
+
## Thanks to our contributors!
|
17
|
+
|
18
|
+
* [David Kinzer][dkinzer]
|
19
|
+
* [Naoya Ito][naoya]
|
20
|
+
|
3
21
|
# 0.2.0: February 12, 2013
|
4
22
|
|
5
23
|
## Changes and new features
|
@@ -276,3 +294,5 @@ And a special thanks to [Teemu Matilainen][tmatilai] who is now on the list of d
|
|
276
294
|
[tmatilai]: https://github.com/tmatilai
|
277
295
|
[vjpr]: https://github.com/vjpr
|
278
296
|
[zeph]: https://github.com/zeph
|
297
|
+
[dkinzer]: https://github.com/dkinzer
|
298
|
+
[naoya]: https://github.com/naoya
|
data/lib/chef/knife/solo_cook.rb
CHANGED
@@ -51,6 +51,11 @@ class Chef
|
|
51
51
|
:long => '--why-run',
|
52
52
|
:description => 'Enable whyrun mode'
|
53
53
|
|
54
|
+
option :override_runlist,
|
55
|
+
:short => '-o RunlistItem,RunlistItem...,',
|
56
|
+
:long => '--override-runlist',
|
57
|
+
:description => 'Replace current run list with specified items'
|
58
|
+
|
54
59
|
def run
|
55
60
|
@solo_config = KnifeSolo::Config.new
|
56
61
|
|
@@ -85,6 +90,22 @@ class Chef
|
|
85
90
|
@chefignore ||= ::Chef::Cookbook::Chefignore.new("./")
|
86
91
|
end
|
87
92
|
|
93
|
+
# cygwin rsync path must be adjusted to work
|
94
|
+
def adjust_rsync_path(path)
|
95
|
+
path_s = path.to_s
|
96
|
+
path_s.gsub(/^(\w):/) { "/cygdrive/#{$1}" }
|
97
|
+
end
|
98
|
+
|
99
|
+
def adjust_rsync_path_on_node(path)
|
100
|
+
return path unless windows_node?
|
101
|
+
adjust_rsync_path(path)
|
102
|
+
end
|
103
|
+
|
104
|
+
def adjust_rsync_path_on_client(path)
|
105
|
+
return path unless windows_client?
|
106
|
+
adjust_rsync_path(path)
|
107
|
+
end
|
108
|
+
|
88
109
|
# see http://stackoverflow.com/questions/5798807/rsync-permission-denied-created-directories-have-no-permissions
|
89
110
|
def rsync_permissions
|
90
111
|
'--chmod=ugo=rwX' if windows_client?
|
@@ -138,7 +159,7 @@ class Chef
|
|
138
159
|
end
|
139
160
|
|
140
161
|
def rsync(source_path, target_path, extra_opts = '')
|
141
|
-
cmd = %Q
|
162
|
+
cmd = %Q{rsync -rl #{rsync_permissions} --rsh="ssh #{ssh_args}" #{extra_opts} #{rsync_excludes.collect{ |ignore| "--exclude #{ignore} " }.join} #{adjust_rsync_path_on_client(source_path)} :#{adjust_rsync_path_on_node(target_path)}}
|
142
163
|
ui.msg cmd if debug?
|
143
164
|
system! cmd
|
144
165
|
end
|
@@ -161,6 +182,7 @@ class Chef
|
|
161
182
|
cmd << " -l debug" if debug?
|
162
183
|
cmd << " -N #{config[:chef_node_name]}" if config[:chef_node_name]
|
163
184
|
cmd << " -W" if config[:why_run]
|
185
|
+
cmd << " -o #{config[:override_runlist]}" if config[:override_runlist]
|
164
186
|
|
165
187
|
result = stream_command cmd
|
166
188
|
raise "chef-solo failed. See output above." unless result.success?
|
@@ -18,6 +18,15 @@ class Chef
|
|
18
18
|
|
19
19
|
banner "knife solo prepare [USER@]HOSTNAME [JSON] (options)"
|
20
20
|
|
21
|
+
option :bootstrap_version,
|
22
|
+
:long => '--bootstrap-version VERSION',
|
23
|
+
:description => 'The version of Chef to install',
|
24
|
+
:proc => lambda {|v| Chef::Config[:knife][:bootstrap_version] = v}
|
25
|
+
|
26
|
+
option :prerelease,
|
27
|
+
:long => '--prerelease',
|
28
|
+
:description => 'Install the pre-release Chef version'
|
29
|
+
|
21
30
|
option :omnibus_url,
|
22
31
|
:long => '--omnibus-url URL',
|
23
32
|
:description => 'URL to download install.sh from'
|
@@ -28,11 +37,12 @@ class Chef
|
|
28
37
|
|
29
38
|
option :omnibus_version,
|
30
39
|
:long => '--omnibus-version VERSION',
|
31
|
-
:description => '
|
40
|
+
:description => 'Deprecated. Replaced with --bootstrap-check.'
|
32
41
|
|
33
42
|
def run
|
34
43
|
if config[:omnibus_version]
|
35
|
-
|
44
|
+
ui.warn '`--omnibus-version` is deprecated, please use `--bootstrap-version`.'
|
45
|
+
Chef::Config[:knife][:bootstrap_version] = config[:omnibus_version]
|
36
46
|
end
|
37
47
|
|
38
48
|
validate!
|
@@ -52,6 +62,14 @@ class Chef
|
|
52
62
|
def operating_system
|
53
63
|
run_command('uname -s').stdout.strip
|
54
64
|
end
|
65
|
+
|
66
|
+
def chef_version
|
67
|
+
if (v = Chef::Config[:knife][:bootstrap_version])
|
68
|
+
v.empty? ? nil : v
|
69
|
+
else
|
70
|
+
Chef::VERSION
|
71
|
+
end
|
72
|
+
end
|
55
73
|
end
|
56
74
|
end
|
57
75
|
end
|
@@ -35,6 +35,10 @@ module KnifeSolo
|
|
35
35
|
prepare.ui
|
36
36
|
end
|
37
37
|
|
38
|
+
def chef_version
|
39
|
+
prepare.chef_version
|
40
|
+
end
|
41
|
+
|
38
42
|
def prepare
|
39
43
|
@prepare
|
40
44
|
end
|
@@ -43,7 +47,7 @@ module KnifeSolo
|
|
43
47
|
module InstallCommands
|
44
48
|
|
45
49
|
def bootstrap!
|
46
|
-
run_pre_bootstrap_checks
|
50
|
+
run_pre_bootstrap_checks
|
47
51
|
send("#{distro[:type]}_install")
|
48
52
|
end
|
49
53
|
|
@@ -51,8 +55,9 @@ module KnifeSolo
|
|
51
55
|
raise "implement distro detection for #{self.class.name}"
|
52
56
|
end
|
53
57
|
|
58
|
+
# gems to install before chef
|
54
59
|
def gem_packages
|
55
|
-
|
60
|
+
[]
|
56
61
|
end
|
57
62
|
|
58
63
|
def http_client_get_url(url, file)
|
@@ -70,12 +75,24 @@ module KnifeSolo
|
|
70
75
|
file = File.basename(url)
|
71
76
|
http_client_get_url(url, file)
|
72
77
|
|
73
|
-
install_command = "sudo bash #{file} #{
|
78
|
+
install_command = "sudo bash #{file} #{omnibus_options}"
|
74
79
|
stream_command(install_command)
|
75
80
|
end
|
76
81
|
|
82
|
+
def omnibus_options
|
83
|
+
options = prepare.config[:omnibus_options] || ""
|
84
|
+
if prepare.config[:prerelease]
|
85
|
+
options << " -p"
|
86
|
+
elsif chef_version
|
87
|
+
options << " -v #{chef_version}"
|
88
|
+
end
|
89
|
+
options
|
90
|
+
end
|
91
|
+
|
77
92
|
def yum_omnibus_install
|
78
93
|
omnibus_install
|
94
|
+
# Avoid rsync not being found in package cache.
|
95
|
+
run_command("sudo yum clean all")
|
79
96
|
# Make sure we have rsync on builds that don't include it by default
|
80
97
|
# (for example Scientific Linux minimal, CentOS minimal)
|
81
98
|
run_command("sudo yum -y install rsync")
|
@@ -99,7 +116,16 @@ module KnifeSolo
|
|
99
116
|
run_command("tar zxf #{file}")
|
100
117
|
run_command("cd #{release} && sudo ruby setup.rb --no-format-executable")
|
101
118
|
run_command("sudo rm -rf #{release} #{file}")
|
102
|
-
run_command("sudo gem install --no-rdoc --no-ri #{gem_packages
|
119
|
+
run_command("sudo gem install --no-rdoc --no-ri #{gem_packages.join(' ')}") unless gem_packages.empty?
|
120
|
+
run_command("sudo gem install --no-rdoc --no-ri chef #{gem_options}")
|
121
|
+
end
|
122
|
+
|
123
|
+
def gem_options
|
124
|
+
if prepare.config[:prerelease]
|
125
|
+
"--prerelease"
|
126
|
+
elsif chef_version
|
127
|
+
"--version #{chef_version}"
|
128
|
+
end
|
103
129
|
end
|
104
130
|
end #InstallCommands
|
105
131
|
|
@@ -4,10 +4,6 @@ module KnifeSolo::Bootstraps
|
|
4
4
|
run_command("uname -sr").stdout.strip
|
5
5
|
end
|
6
6
|
|
7
|
-
def gem_packages
|
8
|
-
['chef']
|
9
|
-
end
|
10
|
-
|
11
7
|
def prepare_make_conf
|
12
8
|
ui.msg "Preparing make.conf"
|
13
9
|
run_command <<-EOF
|
@@ -47,7 +43,7 @@ module KnifeSolo::Bootstraps
|
|
47
43
|
def distro
|
48
44
|
return @distro if @distro
|
49
45
|
case issue
|
50
|
-
when %r{FreeBSD 9
|
46
|
+
when %r{FreeBSD 9\.[01]}
|
51
47
|
{:type => 'freebsd_port'}
|
52
48
|
else
|
53
49
|
raise "#{issue} not supported"
|
data/lib/knife-solo/info.rb
CHANGED
data/test/bootstraps_test.rb
CHANGED
@@ -6,7 +6,6 @@ class KnifeSolo::Bootstraps::StubOS < KnifeSolo::Bootstraps::Base
|
|
6
6
|
end
|
7
7
|
|
8
8
|
class KnifeSolo::Bootstraps::StubOS2 < KnifeSolo::Bootstraps::Base
|
9
|
-
def gem_packages ; ['chef'] ; end
|
10
9
|
def distro ; {:type => 'gem', :version => 'Fanny Faker'} ; end
|
11
10
|
def gem_install
|
12
11
|
# dont' actually install anything
|
@@ -15,19 +14,13 @@ end
|
|
15
14
|
|
16
15
|
class BootstrapsTest < TestCase
|
17
16
|
def test_bootstrap_class_exists_for
|
18
|
-
|
19
|
-
|
17
|
+
assert KnifeSolo::Bootstraps.class_exists_for?('Stub OS')
|
18
|
+
refute KnifeSolo::Bootstraps.class_exists_for?('Mythical OS')
|
20
19
|
end
|
21
20
|
|
22
21
|
def test_distro_raises_if_not_implemented
|
23
22
|
assert_raises RuntimeError do
|
24
|
-
bootstrap_instance.distro
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_gem_packages_raises_if_not_implemented
|
29
|
-
assert_raises RuntimeError do
|
30
|
-
bootstrap_instance.gem_packages()
|
23
|
+
bootstrap_instance.distro
|
31
24
|
end
|
32
25
|
end
|
33
26
|
|
@@ -47,8 +40,7 @@ class BootstrapsTest < TestCase
|
|
47
40
|
def test_bootstrap_delegates_to_knife_prepare
|
48
41
|
prepare = mock('chef::knife::prepare')
|
49
42
|
bootstrap = KnifeSolo::Bootstraps::StubOS2.new(prepare)
|
50
|
-
|
51
|
-
assert prepare == bootstrap.prepare
|
43
|
+
assert_equal prepare, bootstrap.prepare
|
52
44
|
end
|
53
45
|
|
54
46
|
def test_darwin_checks_for_xcode_install_and_barfs_if_missing
|
@@ -72,6 +64,7 @@ class BootstrapsTest < TestCase
|
|
72
64
|
bootstrap = bootstrap_instance
|
73
65
|
bootstrap.stubs(:distro).returns({:type => "omnibus"})
|
74
66
|
bootstrap.stubs(:http_client_get_url)
|
67
|
+
bootstrap.stubs(:chef_version)
|
75
68
|
|
76
69
|
options = "-v 10.16.4"
|
77
70
|
matcher = regexp_matches(/\s#{Regexp.quote(options)}(\s|$)/)
|
@@ -81,10 +74,44 @@ class BootstrapsTest < TestCase
|
|
81
74
|
bootstrap.bootstrap!
|
82
75
|
end
|
83
76
|
|
77
|
+
def test_combines_omnibus_options
|
78
|
+
bootstrap = bootstrap_instance
|
79
|
+
bootstrap.prepare.stubs(:chef_version).returns("0.10.8-3")
|
80
|
+
bootstrap.prepare.stubs(:config).returns({:omnibus_options => "-s"})
|
81
|
+
assert_equal "-s -v 0.10.8-3", bootstrap.omnibus_options
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_passes_prerelease_omnibus_version
|
85
|
+
bootstrap = bootstrap_instance
|
86
|
+
bootstrap.prepare.stubs(:chef_version).returns("10.18.3")
|
87
|
+
bootstrap.prepare.stubs(:config).returns({:prerelease => true})
|
88
|
+
assert_equal "-p", bootstrap.omnibus_options.strip
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_passes_gem_version
|
92
|
+
bootstrap = bootstrap_instance
|
93
|
+
bootstrap.prepare.stubs(:chef_version).returns("10.16.4")
|
94
|
+
assert_equal "--version 10.16.4", bootstrap.gem_options
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_passes_prereleaes_gem_version
|
98
|
+
bootstrap = bootstrap_instance
|
99
|
+
bootstrap.prepare.stubs(:chef_version).returns("10.18.1")
|
100
|
+
bootstrap.prepare.stubs(:config).returns({:prerelease => true})
|
101
|
+
assert_equal "--prerelease", bootstrap.gem_options
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_wont_pass_unset_gem_version
|
105
|
+
bootstrap = bootstrap_instance
|
106
|
+
bootstrap.prepare.stubs(:chef_version).returns(nil)
|
107
|
+
assert_equal "", bootstrap.gem_options.to_s
|
108
|
+
end
|
109
|
+
|
84
110
|
# ***
|
85
111
|
|
86
112
|
def bootstrap_instance
|
87
113
|
prepare = mock('Knife::Chef::SoloPrepare')
|
114
|
+
prepare.stubs(:config).returns({})
|
88
115
|
KnifeSolo::Bootstraps::StubOS.new(prepare)
|
89
116
|
end
|
90
117
|
end
|
@@ -8,7 +8,7 @@ module Apache2Bootstrap
|
|
8
8
|
|
9
9
|
def test_apache2
|
10
10
|
write_cheffile
|
11
|
-
assert_subcommand "bootstrap --run-list=recipe[apache2]
|
11
|
+
assert_subcommand "bootstrap --run-list=recipe[apache2]"
|
12
12
|
assert_match default_apache_message, http_response
|
13
13
|
end
|
14
14
|
end
|
data/test/solo_cook_test.rb
CHANGED
@@ -122,6 +122,10 @@ class SoloCookTest < TestCase
|
|
122
122
|
assert_chef_solo_option "--why-run", "-W"
|
123
123
|
end
|
124
124
|
|
125
|
+
def test_passes_override_runlist_to_chef_solo
|
126
|
+
assert_chef_solo_option "--override-runlist=sandbox::default", "-o sandbox::default"
|
127
|
+
end
|
128
|
+
|
125
129
|
# Asserts that the chef_solo_option is passed to chef-solo iff cook_option
|
126
130
|
# is specified for the cook command
|
127
131
|
def assert_chef_solo_option(cook_option, chef_solo_option)
|
data/test/solo_prepare_test.rb
CHANGED
@@ -12,17 +12,24 @@ class SoloPrepareTest < TestCase
|
|
12
12
|
@host = 'someuser@somehost.domain.com'
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
def test_uses_local_chef_version_by_default
|
16
|
+
Chef::Config[:knife][:bootstrap_version] = nil
|
17
|
+
assert_equal Chef::VERSION, command.chef_version
|
18
|
+
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
def test_uses_chef_version_from_knife_config
|
21
|
+
Chef::Config[:knife][:bootstrap_version] = "10.12.2"
|
22
|
+
assert_equal "10.12.2", command.chef_version
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
25
|
+
def test_uses_chef_version_from_command_line_option
|
26
|
+
Chef::Config[:knife][:bootstrap_version] = "10.16.2"
|
27
|
+
assert_equal "0.4.2", command("--bootstrap-version", "0.4.2").chef_version
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_chef_version_returns_nil_if_empty
|
31
|
+
Chef::Config[:knife][:bootstrap_version] = "10.12.2"
|
32
|
+
assert_nil command("--bootstrap-version", "").chef_version
|
26
33
|
end
|
27
34
|
|
28
35
|
def test_run_raises_if_operating_system_is_not_supported
|
@@ -72,14 +72,7 @@ class IntegrationTest < TestCase
|
|
72
72
|
|
73
73
|
# The prepare command to use on this server
|
74
74
|
def prepare_command
|
75
|
-
"prepare
|
76
|
-
end
|
77
|
-
|
78
|
-
def omnibus_options
|
79
|
-
return "" if ENV['CHEF_VERSION'].to_s.empty?
|
80
|
-
|
81
|
-
v = `knife --version`.split(':')
|
82
|
-
v[0].strip == 'Chef' ? "--omnibus-version=#{v[1].strip}" : ''
|
75
|
+
"prepare"
|
83
76
|
end
|
84
77
|
|
85
78
|
# Provides the path to the runner's key file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-solo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.0.
|
4
|
+
version: 0.3.0.pre2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -274,6 +274,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
274
274
|
- - ! '>='
|
275
275
|
- !ruby/object:Gem::Version
|
276
276
|
version: '0'
|
277
|
+
segments:
|
278
|
+
- 0
|
279
|
+
hash: -3096439346196899405
|
277
280
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
278
281
|
none: false
|
279
282
|
requirements:
|