ironfan 3.1.0.rc1
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.
- data/.gitignore +51 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +130 -0
- data/Gemfile +26 -0
- data/LICENSE.md +201 -0
- data/README.md +328 -0
- data/Rakefile +104 -0
- data/TODO.md +16 -0
- data/VERSION +1 -0
- data/chefignore +41 -0
- data/cluster_chef-knife.gemspec +123 -0
- data/cluster_chef.gemspec +111 -0
- data/config/client.rb +59 -0
- data/config/proxy.pac +12 -0
- data/config/ubuntu10.04-ironfan.erb +157 -0
- data/config/ubuntu11.10-ironfan.erb +145 -0
- data/ironfan.gemspec +121 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-ironfan.erb +157 -0
- data/lib/chef/knife/bootstrap/ubuntu11.10-ironfan.erb +145 -0
- data/lib/chef/knife/cluster_bootstrap.rb +74 -0
- data/lib/chef/knife/cluster_kick.rb +94 -0
- data/lib/chef/knife/cluster_kill.rb +73 -0
- data/lib/chef/knife/cluster_launch.rb +164 -0
- data/lib/chef/knife/cluster_list.rb +50 -0
- data/lib/chef/knife/cluster_proxy.rb +126 -0
- data/lib/chef/knife/cluster_show.rb +61 -0
- data/lib/chef/knife/cluster_ssh.rb +141 -0
- data/lib/chef/knife/cluster_start.rb +40 -0
- data/lib/chef/knife/cluster_stop.rb +43 -0
- data/lib/chef/knife/cluster_sync.rb +77 -0
- data/lib/chef/knife/generic_command.rb +66 -0
- data/lib/chef/knife/knife_common.rb +195 -0
- data/lib/ironfan.rb +143 -0
- data/lib/ironfan/chef_layer.rb +299 -0
- data/lib/ironfan/cloud.rb +412 -0
- data/lib/ironfan/cluster.rb +118 -0
- data/lib/ironfan/compute.rb +153 -0
- data/lib/ironfan/deprecated.rb +33 -0
- data/lib/ironfan/discovery.rb +177 -0
- data/lib/ironfan/dsl_object.rb +124 -0
- data/lib/ironfan/facet.rb +144 -0
- data/lib/ironfan/fog_layer.rb +150 -0
- data/lib/ironfan/private_key.rb +130 -0
- data/lib/ironfan/role_implications.rb +58 -0
- data/lib/ironfan/security_group.rb +119 -0
- data/lib/ironfan/server.rb +281 -0
- data/lib/ironfan/server_slice.rb +260 -0
- data/lib/ironfan/volume.rb +157 -0
- data/spec/ironfan/cluster_spec.rb +13 -0
- data/spec/ironfan/facet_spec.rb +69 -0
- data/spec/ironfan/server_slice_spec.rb +19 -0
- data/spec/ironfan/server_spec.rb +112 -0
- data/spec/ironfan_spec.rb +193 -0
- data/spec/spec_helper.rb +50 -0
- data/spec/spec_helper/dummy_chef.rb +25 -0
- data/spec/test_config.rb +20 -0
- data/tasks/chef_config.rake +38 -0
- data/tasks/jeweler_use_alt_branch.rake +53 -0
- metadata +217 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Philip (flip) Kromer (<flip@infochimps.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Infochimps, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require File.expand_path(File.dirname(__FILE__)+"/knife_common.rb")
|
20
|
+
|
21
|
+
class Chef
|
22
|
+
class Knife
|
23
|
+
class ClusterList < Knife
|
24
|
+
include Ironfan::KnifeCommon
|
25
|
+
|
26
|
+
deps do
|
27
|
+
require 'formatador'
|
28
|
+
end
|
29
|
+
|
30
|
+
banner "knife cluster list (options)"
|
31
|
+
|
32
|
+
def run
|
33
|
+
load_ironfan
|
34
|
+
configure_dry_run
|
35
|
+
|
36
|
+
hash = Ironfan.cluster_filenames
|
37
|
+
|
38
|
+
table = []
|
39
|
+
hash.keys.sort.each do |key|
|
40
|
+
table.push( { :cluster => key, :path => hash[key] } )
|
41
|
+
end
|
42
|
+
|
43
|
+
ui.info "Cluster Path: #{ Ironfan.cluster_path.join ", " }"
|
44
|
+
|
45
|
+
Formatador.display_compact_table(table, [:cluster,:path])
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Philip (flip) Kromer (flip@infochimps.com)
|
3
|
+
# Copyright:: Copyright (c) 2011 Infochimps, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require File.expand_path(File.dirname(__FILE__)+"/knife_common.rb")
|
20
|
+
require File.expand_path(File.dirname(__FILE__)+"/cluster_ssh.rb")
|
21
|
+
require File.expand_path(File.dirname(__FILE__)+"/generic_command.rb")
|
22
|
+
|
23
|
+
class Chef
|
24
|
+
class Knife
|
25
|
+
#
|
26
|
+
# Runs the ssh command to open a SOCKS proxy to the given host, and writes a
|
27
|
+
# PAC (automatic proxy config) file to
|
28
|
+
# /tmp/ironfan_proxy-YOURNAME.pac. Only the first host is used, even if
|
29
|
+
# multiple match.
|
30
|
+
#
|
31
|
+
# Why not use Net::Ssh directly? The SOCKS proxy support was pretty
|
32
|
+
# bad. Though ugly, exec'ing the command works.
|
33
|
+
#
|
34
|
+
class ClusterProxy < Ironfan::Script
|
35
|
+
|
36
|
+
import_banner_and_options(Chef::Knife::ClusterSsh, :except => [:concurrency, ])
|
37
|
+
banner 'knife cluster proxy "CLUSTER [FACET [INDEXES]]" (options) - Runs the ssh command to open a SOCKS proxy to the given host, and writes a PAC (automatic proxy config) file to /tmp/ironfan_proxy-YOURNAME.pac. Only the first host is used, even if multiple match.'
|
38
|
+
|
39
|
+
option :background,
|
40
|
+
:long => "--[no-]background",
|
41
|
+
:description => "Requests ssh to go to background after setting up the proxy",
|
42
|
+
:boolean => true,
|
43
|
+
:default => true
|
44
|
+
|
45
|
+
option :socks_port,
|
46
|
+
:long => '--socks-port',
|
47
|
+
:short => '-D',
|
48
|
+
:description => 'Port to listen on for SOCKS5 proxy',
|
49
|
+
:default => '6666'
|
50
|
+
|
51
|
+
def relevant?(server)
|
52
|
+
server.sshable?
|
53
|
+
end
|
54
|
+
|
55
|
+
def perform_execution(target)
|
56
|
+
svr = target.first
|
57
|
+
cmd = command_for_target(svr)
|
58
|
+
|
59
|
+
dump_proxy_pac
|
60
|
+
exec(*cmd)
|
61
|
+
end
|
62
|
+
|
63
|
+
def command_for_target(svr)
|
64
|
+
config[:attribute] ||= Chef::Config[:knife][:ssh_address_attribute] || "fqdn"
|
65
|
+
config[:ssh_user] ||= Chef::Config[:knife][:ssh_user]
|
66
|
+
config[:identity_file] ||= svr.cloud.ssh_identity_file
|
67
|
+
config[:host_key_verify] ||= Chef::Config[:knife][:host_key_verify] || (not config[:no_host_key_verify]) # pre-vs-post 0.10.4
|
68
|
+
|
69
|
+
if (svr.cloud.public_ip) then address = svr.cloud.public_ip ; end
|
70
|
+
if (not address) && (svr.chef_node) then address = format_for_display( svr.chef_node )[config[:attribute]] ; end
|
71
|
+
if (not address) && (svr.fog_server) then address = svr.fog_server.public_ip_address ; end
|
72
|
+
|
73
|
+
cmd = [ 'ssh', '-N' ]
|
74
|
+
cmd += [ '-D', config[:socks_port].to_s ]
|
75
|
+
cmd += [ '-p', config[:port].to_s ] if config[:port].present?
|
76
|
+
cmd << '-f' if config[:background]
|
77
|
+
cmd << "-#{'v' * config[:verbosity].to_i}" if (config[:verbosity].to_i > 0)
|
78
|
+
cmd += %w[ -o StrictHostKeyChecking=no ] if config[:host_key_verify]
|
79
|
+
cmd += %w[ -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ControlPath=none ]
|
80
|
+
cmd += [ '-i', File.expand_path(config[:identity_file]) ] if config[:identity_file].present?
|
81
|
+
cmd << (config[:ssh_user] ? "#{config[:ssh_user]}@#{address}" : address)
|
82
|
+
|
83
|
+
Chef::Log.debug("Cluster proxy config: #{config.inspect}")
|
84
|
+
Chef::Log.debug("Cluster proxy command: #{cmd.inspect}")
|
85
|
+
ui.info(["SOCKS Proxy on",
|
86
|
+
"local port", ui.color(config[:socks_port], :cyan),
|
87
|
+
"for", ui.color(svr.name, :cyan),
|
88
|
+
"(#{address})"
|
89
|
+
].join(" "))
|
90
|
+
|
91
|
+
cmd
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# Write a .pac (automatic proxy configuration) file
|
96
|
+
# to /etc/ironfan_proxy-YOURNAME.pac
|
97
|
+
#
|
98
|
+
def dump_proxy_pac
|
99
|
+
pac_filename = File.expand_path(File.join('/tmp', "ironfan_proxy-#{ENV['USER']}.pac"))
|
100
|
+
ui.info("point your browser at PAC (automatic proxy config file) file://#{pac_filename}")
|
101
|
+
File.open(pac_filename, 'w') do |f|
|
102
|
+
f.print proxy_pac_contents
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
EC2_PROXY_PATTERNS = [ "*ec2*.amazonaws.com", "*ec2.internal*", "*compute-*.amazonaws.com", "*compute-*.internal*", "*domu*.internal*", "10.*",]
|
107
|
+
|
108
|
+
def proxy_pac_contents
|
109
|
+
proxy_patterns = EC2_PROXY_PATTERNS
|
110
|
+
proxy_patterns += Array(Chef::Config[:cluster_proxy_patterns])
|
111
|
+
rules = proxy_patterns.compact.map{|str| "(shExpMatch(host, %-28s))" % %Q{"#{str}"} }
|
112
|
+
%Q{function FindProxyForURL(url, host) {
|
113
|
+
if (#{rules.join(" ||\n ")}
|
114
|
+
) {
|
115
|
+
return "SOCKS5 localhost:#{config[:socks_port]}";
|
116
|
+
}
|
117
|
+
return "DIRECT";
|
118
|
+
}\n}
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Philip (flip) Kromer (<flip@infochimps.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Infochimps, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require File.expand_path(File.dirname(__FILE__)+"/knife_common.rb")
|
20
|
+
|
21
|
+
class Chef
|
22
|
+
class Knife
|
23
|
+
class ClusterShow < Knife
|
24
|
+
include Ironfan::KnifeCommon
|
25
|
+
deps do
|
26
|
+
Ironfan::KnifeCommon.load_deps
|
27
|
+
end
|
28
|
+
|
29
|
+
banner "knife cluster show CLUSTER_NAME [FACET_NAME [INDEXES]] (options)"
|
30
|
+
option :cloud,
|
31
|
+
:long => "--[no-]cloud",
|
32
|
+
:description => "Look up machines on AWS cloud (default is yes, look up machines; use --no-cloud to skip)",
|
33
|
+
:default => true,
|
34
|
+
:boolean => true
|
35
|
+
|
36
|
+
def run
|
37
|
+
load_ironfan
|
38
|
+
die(banner) if @name_args.empty?
|
39
|
+
configure_dry_run
|
40
|
+
|
41
|
+
# Load the cluster/facet/slice/whatever
|
42
|
+
target = get_slice(* @name_args)
|
43
|
+
|
44
|
+
#
|
45
|
+
# Dump entire contents of objects if -VV flag given
|
46
|
+
#
|
47
|
+
if config[:verbosity] >= 2
|
48
|
+
target.each do |svr|
|
49
|
+
Chef::Log.debug( "Server #{svr.name}: #{JSON.pretty_generate(svr.to_hash)}" )
|
50
|
+
Chef::Log.debug( "- cloud: #{JSON.pretty_generate(svr.cloud.to_hash)}" )
|
51
|
+
Chef::Log.debug( "- fog: #{JSON.pretty_generate(svr.fog_launch_description)}" )
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Display same
|
56
|
+
display(target)
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Chris Howe (<chris@infochimps.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Infochimps, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require File.expand_path(File.dirname(__FILE__)+"/knife_common.rb")
|
20
|
+
require 'chef/knife/ssh'
|
21
|
+
|
22
|
+
class Chef
|
23
|
+
class Knife
|
24
|
+
class ClusterSsh < Chef::Knife::Ssh
|
25
|
+
include Ironfan::KnifeCommon
|
26
|
+
|
27
|
+
deps do
|
28
|
+
Chef::Knife::Ssh.load_deps
|
29
|
+
Ironfan::KnifeCommon.load_deps
|
30
|
+
end
|
31
|
+
|
32
|
+
banner 'knife cluster ssh "CLUSTER [FACET [INDEXES]]" COMMAND (options)'
|
33
|
+
Chef::Knife::Ssh.options.each do |name, hsh|
|
34
|
+
next if name == :attribute
|
35
|
+
option name, hsh
|
36
|
+
end
|
37
|
+
|
38
|
+
option :attribute,
|
39
|
+
:short => "-a ATTR",
|
40
|
+
:long => "--attribute ATTR",
|
41
|
+
:description => "The attribute to use for opening the connection - default is fqdn (ec2 users may prefer cloud.public_hostname)"
|
42
|
+
|
43
|
+
def configure_session
|
44
|
+
predicate = @name_args[0].split(/[\s\-]+/,3).map(&:strip)
|
45
|
+
|
46
|
+
target = get_slice(*predicate).select(&:sshable?)
|
47
|
+
|
48
|
+
display(target) if config[:verbose]
|
49
|
+
|
50
|
+
config[:attribute] ||= Chef::Config[:knife][:ssh_address_attribute] || "fqdn"
|
51
|
+
config[:ssh_user] ||= Chef::Config[:knife][:ssh_user]
|
52
|
+
config[:identity_file] ||= target.ssh_identity_file
|
53
|
+
|
54
|
+
@action_nodes = target.chef_nodes
|
55
|
+
addresses = target.servers.map do |svr|
|
56
|
+
if (svr.cloud.public_ip) then address = svr.cloud.public_ip ; end
|
57
|
+
if (not address) && (svr.fog_server) then address = svr.fog_server.public_ip_address ; end
|
58
|
+
if (not address) && (svr.chef_node) then address = format_for_display( svr.chef_node )[config[:attribute]] ; end
|
59
|
+
address
|
60
|
+
end.compact
|
61
|
+
|
62
|
+
(ui.fatal("No nodes returned from search!"); exit 10) if addresses.nil? || addresses.length == 0
|
63
|
+
|
64
|
+
session_from_list(addresses)
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# Override the one in Chef::Knife::Ssh to allow an err flag (prints in red
|
69
|
+
# if non-null)
|
70
|
+
#
|
71
|
+
def print_data(host, data, err=nil)
|
72
|
+
if data =~ /\n/
|
73
|
+
data.split(/\n/).each { |d| print_data(host, d, err) }
|
74
|
+
else
|
75
|
+
padding = @longest - host.length
|
76
|
+
str = ui.color(host, :cyan) + (" " * (padding + 1)) + (err ? ui.color(data, :red) : data)
|
77
|
+
ui.msg(str)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Override the one in Chef::Knife::Ssh to give a big red warning if the
|
83
|
+
# process executes with badness
|
84
|
+
#
|
85
|
+
def ssh_command(command, subsession=nil)
|
86
|
+
subsession ||= session
|
87
|
+
command = fixup_sudo(command)
|
88
|
+
notifications = []
|
89
|
+
subsession.open_channel do |ch|
|
90
|
+
ch.request_pty
|
91
|
+
ch.exec command do |ch, success|
|
92
|
+
raise ArgumentError, "Cannot execute #{command}" unless success
|
93
|
+
# note: you can't do the stderr calback because requesting a pty
|
94
|
+
# squashes stderr and stdout together
|
95
|
+
ch.on_data do |ichannel, data|
|
96
|
+
print_data(ichannel[:host], data)
|
97
|
+
if data =~ /^knife sudo password: /
|
98
|
+
ichannel.send_data("#{get_password}\n")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
ch.on_request "exit-status" do |ichannel, data|
|
102
|
+
exit_status = data.read_long
|
103
|
+
if exit_status != 0
|
104
|
+
command_snippet = (command.length < 70) ? command : (command[0..45] + ' ... ' + command[-19..-1])
|
105
|
+
notifications << [ichannel[:host], "'#{command_snippet.gsub(/[\r\n]+/, "; ")}' terminated with error status #{exit_status}", :err]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
session.loop
|
111
|
+
notifications.each{|args| print_data(*args) }
|
112
|
+
end
|
113
|
+
|
114
|
+
def cssh
|
115
|
+
exec "cssh "+session.servers_for.map{|server| server.user ? "#{server.user}@#{server.host}" : server.host}.join(" ")
|
116
|
+
end
|
117
|
+
|
118
|
+
def run
|
119
|
+
load_ironfan
|
120
|
+
die(banner) if @name_args.empty?
|
121
|
+
extend Chef::Mixin::Command
|
122
|
+
|
123
|
+
@longest = 0
|
124
|
+
configure_session
|
125
|
+
|
126
|
+
case @name_args[1]
|
127
|
+
when "interactive" then interactive
|
128
|
+
when "screen" then screen
|
129
|
+
when "tmux" then tmux
|
130
|
+
when "macterm" then macterm
|
131
|
+
when "cssh" then cssh
|
132
|
+
else
|
133
|
+
ssh_command(@name_args[1..-1].join(" "))
|
134
|
+
end
|
135
|
+
|
136
|
+
session.close
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Philip (flip) Kromer (<flip@infochimps.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Infochimps, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require File.expand_path(File.dirname(__FILE__)+"/knife_common.rb")
|
20
|
+
require File.expand_path(File.dirname(__FILE__)+"/generic_command.rb")
|
21
|
+
|
22
|
+
class Chef
|
23
|
+
class Knife
|
24
|
+
class ClusterStart < Ironfan::Script
|
25
|
+
import_banner_and_options(Ironfan::Script)
|
26
|
+
|
27
|
+
def relevant?(server)
|
28
|
+
server.startable?
|
29
|
+
end
|
30
|
+
|
31
|
+
def perform_execution(target)
|
32
|
+
section("Starting machines")
|
33
|
+
super(target)
|
34
|
+
section("Announcing Chef nodes as started")
|
35
|
+
target.send(:delegate_to_servers, :announce_as_started)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Philip (flip) Kromer (<flip@infochimps.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Infochimps, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
require File.expand_path(File.dirname(__FILE__)+"/generic_command.rb")
|
19
|
+
|
20
|
+
class Chef
|
21
|
+
class Knife
|
22
|
+
class ClusterStop < Ironfan::Script
|
23
|
+
import_banner_and_options(Ironfan::Script)
|
24
|
+
|
25
|
+
def relevant?(server)
|
26
|
+
server.running?
|
27
|
+
end
|
28
|
+
|
29
|
+
def perform_execution(target)
|
30
|
+
section("Stopping machines")
|
31
|
+
super(target)
|
32
|
+
section("Announcing Chef nodes as stopped")
|
33
|
+
target.send(:delegate_to_servers, :announce_as_stopped)
|
34
|
+
end
|
35
|
+
|
36
|
+
def confirm_execution(target)
|
37
|
+
ui.info " Unless these nodes are backed by EBS volumes, this will result in loss of all data"
|
38
|
+
ui.info " not saved elsewhere. Even if they are EBS backed, there may still be some data loss."
|
39
|
+
confirm_or_exit("Are you absolutely certain that you want to perform this action? (Type 'Yes' to confirm) ", 'Yes')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|