knife_sous 0.0.1
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 +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +106 -0
- data/Guardfile +6 -0
- data/README.md +51 -0
- data/Rakefile +16 -0
- data/knife_sous.gemspec +28 -0
- data/lib/chef/knife/sous_bootstrap.rb +31 -0
- data/lib/chef/knife/sous_clean.rb +30 -0
- data/lib/chef/knife/sous_cook.rb +31 -0
- data/lib/chef/knife/sous_init.rb +39 -0
- data/lib/chef/knife/sous_list.rb +22 -0
- data/lib/chef/knife/sous_prepare.rb +31 -0
- data/lib/knife_sous/configure_command.rb +12 -0
- data/lib/knife_sous/dsl_definitions.rb +29 -0
- data/lib/knife_sous/dsl_wrapper.rb +8 -0
- data/lib/knife_sous/mixins/hash_mixins.rb +14 -0
- data/lib/knife_sous/namespace.rb +19 -0
- data/lib/knife_sous/namespace_presenter.rb +27 -0
- data/lib/knife_sous/node.rb +47 -0
- data/lib/knife_sous/node_command.rb +36 -0
- data/lib/knife_sous/node_presenter.rb +13 -0
- data/lib/knife_sous/processor_command.rb +52 -0
- data/lib/knife_sous.rb +3 -0
- data/lib/templates/nodes.example.rb +32 -0
- data/spec/lib/chef/knife/sous_bootstrap_spec.rb +42 -0
- data/spec/lib/chef/knife/sous_clean_spec.rb +41 -0
- data/spec/lib/chef/knife/sous_cook_spec.rb +52 -0
- data/spec/lib/chef/knife/sous_init_spec.rb +56 -0
- data/spec/lib/chef/knife/sous_list_spec.rb +33 -0
- data/spec/lib/chef/knife/sous_prepare_spec.rb +42 -0
- data/spec/lib/knife_sous/configure_command_spec.rb +27 -0
- data/spec/lib/knife_sous/dsl_definitions_spec.rb +52 -0
- data/spec/lib/knife_sous/dsl_wrapper_spec.rb +12 -0
- data/spec/lib/knife_sous/mixins/hash_mixins_spec.rb +23 -0
- data/spec/lib/knife_sous/namespace_presenter_spec.rb +57 -0
- data/spec/lib/knife_sous/namespace_spec.rb +59 -0
- data/spec/lib/knife_sous/node_presenter_spec.rb +18 -0
- data/spec/lib/knife_sous/node_spec.rb +63 -0
- data/spec/lib/knife_sous/processor_command_spec.rb +135 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/support/fixtures/nodes.rb +20 -0
- data/spec/support/knife_command_helpers.rb +11 -0
- data/spec/support/shared_examples/collection.rb +24 -0
- data/spec/support/shared_examples/dsl_wrapper.rb +11 -0
- data/spec/support/shared_examples/node_command.rb +66 -0
- metadata +178 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
tmp
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-1.9.3-p362@knife_sous
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
knife_sous (0.0.1)
|
5
|
+
knife-solo (~> 0.2.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
archive-tar-minitar (0.5.2)
|
11
|
+
chef (11.4.0)
|
12
|
+
erubis
|
13
|
+
highline (>= 1.6.9)
|
14
|
+
json (>= 1.4.4, <= 1.7.7)
|
15
|
+
mixlib-authentication (>= 1.3.0)
|
16
|
+
mixlib-cli (~> 1.3.0)
|
17
|
+
mixlib-config (>= 1.1.2)
|
18
|
+
mixlib-log (>= 1.3.0)
|
19
|
+
mixlib-shellout
|
20
|
+
net-ssh (~> 2.6)
|
21
|
+
net-ssh-multi (~> 1.1.0)
|
22
|
+
ohai (>= 0.6.0)
|
23
|
+
rest-client (>= 1.0.4, < 1.7.0)
|
24
|
+
yajl-ruby (~> 1.1)
|
25
|
+
coderay (1.0.8)
|
26
|
+
diff-lcs (1.1.3)
|
27
|
+
erubis (2.7.0)
|
28
|
+
guard (1.6.2)
|
29
|
+
listen (>= 0.6.0)
|
30
|
+
lumberjack (>= 1.0.2)
|
31
|
+
pry (>= 0.9.10)
|
32
|
+
terminal-table (>= 1.4.3)
|
33
|
+
thor (>= 0.14.6)
|
34
|
+
guard-rspec (2.4.0)
|
35
|
+
guard (>= 1.1)
|
36
|
+
rspec (~> 2.11)
|
37
|
+
highline (1.6.15)
|
38
|
+
ipaddress (0.8.0)
|
39
|
+
json (1.7.7)
|
40
|
+
knife-solo (0.2.0)
|
41
|
+
chef (>= 10.12)
|
42
|
+
librarian (~> 0.0.20)
|
43
|
+
net-ssh (>= 2.2.2, < 3.0)
|
44
|
+
librarian (0.0.26)
|
45
|
+
archive-tar-minitar (>= 0.5.2)
|
46
|
+
chef (>= 0.10)
|
47
|
+
highline
|
48
|
+
thor (~> 0.15)
|
49
|
+
listen (0.7.2)
|
50
|
+
lumberjack (1.0.2)
|
51
|
+
method_source (0.8.1)
|
52
|
+
mime-types (1.21)
|
53
|
+
mixlib-authentication (1.3.0)
|
54
|
+
mixlib-log
|
55
|
+
mixlib-cli (1.3.0)
|
56
|
+
mixlib-config (1.1.2)
|
57
|
+
mixlib-log (1.4.1)
|
58
|
+
mixlib-shellout (1.1.0)
|
59
|
+
net-ssh (2.6.5)
|
60
|
+
net-ssh-gateway (1.2.0)
|
61
|
+
net-ssh (>= 2.6.5)
|
62
|
+
net-ssh-multi (1.1)
|
63
|
+
net-ssh (>= 2.1.4)
|
64
|
+
net-ssh-gateway (>= 0.99.0)
|
65
|
+
ohai (6.16.0)
|
66
|
+
ipaddress
|
67
|
+
mixlib-cli
|
68
|
+
mixlib-config
|
69
|
+
mixlib-log
|
70
|
+
mixlib-shellout
|
71
|
+
systemu
|
72
|
+
yajl-ruby
|
73
|
+
pry (0.9.11.4)
|
74
|
+
coderay (~> 1.0.5)
|
75
|
+
method_source (~> 0.8)
|
76
|
+
slop (~> 3.4)
|
77
|
+
rake (10.0.3)
|
78
|
+
rb-fsevent (0.9.3)
|
79
|
+
rest-client (1.6.7)
|
80
|
+
mime-types (>= 1.16)
|
81
|
+
rspec (2.12.0)
|
82
|
+
rspec-core (~> 2.12.0)
|
83
|
+
rspec-expectations (~> 2.12.0)
|
84
|
+
rspec-mocks (~> 2.12.0)
|
85
|
+
rspec-core (2.12.2)
|
86
|
+
rspec-expectations (2.12.1)
|
87
|
+
diff-lcs (~> 1.1.3)
|
88
|
+
rspec-mocks (2.12.1)
|
89
|
+
slop (3.4.3)
|
90
|
+
systemu (2.5.2)
|
91
|
+
terminal-table (1.4.5)
|
92
|
+
thor (0.17.0)
|
93
|
+
yajl-ruby (1.1.0)
|
94
|
+
|
95
|
+
PLATFORMS
|
96
|
+
ruby
|
97
|
+
|
98
|
+
DEPENDENCIES
|
99
|
+
bundler (~> 1.1)
|
100
|
+
guard
|
101
|
+
guard-rspec
|
102
|
+
knife_sous!
|
103
|
+
pry
|
104
|
+
rake (~> 10.0.0)
|
105
|
+
rb-fsevent
|
106
|
+
rspec (~> 2.12.0)
|
data/Guardfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# Knife Sous
|
2
|
+
|
3
|
+
A Chef Knife plugin which uses a DSL to configure and manage
|
4
|
+
[knife-solo](http://matschaffer.github.com/knife-solo/) nodes.
|
5
|
+
|
6
|
+
## Usage
|
7
|
+
|
8
|
+
Simply ensure the gem is installed using:
|
9
|
+
|
10
|
+
gem install knife_sous
|
11
|
+
|
12
|
+
Or add this to your Gemfile if you use bundler:
|
13
|
+
|
14
|
+
gem 'knife_sous'
|
15
|
+
|
16
|
+
Having the gem installed will add Knife subcommands. Run `knife sous` with no
|
17
|
+
arguments to see a list of available commands.
|
18
|
+
|
19
|
+
|
20
|
+
## Configure
|
21
|
+
|
22
|
+
Node configuration is done in `nodes/nodes.rb`. It uses a DSL similar to Rake.
|
23
|
+
You can namespace your nodes however you want. Example `nodes.rb`:
|
24
|
+
|
25
|
+
```rb
|
26
|
+
namespace :production do |prod|
|
27
|
+
prod.namespace :web do |web|
|
28
|
+
web.node :nodetastic,
|
29
|
+
node_config: 'nodes/some_node.json',
|
30
|
+
hostname: 12.34.56.78,
|
31
|
+
user: 'deploy',
|
32
|
+
ssh_port: 1234
|
33
|
+
end
|
34
|
+
end
|
35
|
+
prod.namespace :db do |db|
|
36
|
+
db.node :database_node, node_config: 'nodes/database.json', hostname: 123.456.78
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
node :vagrant, node_config:'nodes/some_node.json'
|
41
|
+
|
42
|
+
```
|
43
|
+
|
44
|
+
## Contributing
|
45
|
+
|
46
|
+
1. Fork it
|
47
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
48
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
49
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
50
|
+
5. Create new Pull Request
|
51
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'bundler/gem_tasks'
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
|
8
|
+
desc 'Default: run unit tests.'
|
9
|
+
task :default => :spec
|
10
|
+
|
11
|
+
desc "Run all specs"
|
12
|
+
RSpec::Core::RakeTask.new do |t|
|
13
|
+
t.pattern = 'spec/**/*_spec.rb'
|
14
|
+
t.rspec_opts = '--color'
|
15
|
+
end
|
16
|
+
|
data/knife_sous.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.authors = "Shaun Dern"
|
6
|
+
s.email = "shaun@substantail.com"
|
7
|
+
|
8
|
+
s.name = 'knife_sous'
|
9
|
+
s.version = "0.0.1"
|
10
|
+
s.description = %q{Knife plugin for managing knife-solo nodes}
|
11
|
+
s.summary = %q{A Chef Knife plugin which uses a DSL to configure and
|
12
|
+
manage knife solo nodes. Run knife solo commands on one or multiple nodes.}
|
13
|
+
s.homepage = %q{http://github.com/substantial/knife_sous}
|
14
|
+
s.license = "MIT"
|
15
|
+
|
16
|
+
s.rubyforge_project = "knife_sous"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec", "~> 2.12.0"
|
24
|
+
s.add_development_dependency "rake", "~> 10.0.0"
|
25
|
+
s.add_development_dependency "bundler", "~> 1.1"
|
26
|
+
s.add_dependency "knife-solo", "~> 0.2.0"
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'knife_sous/processor_command'
|
3
|
+
require 'knife_sous/configure_command'
|
4
|
+
require 'knife_sous/node_command'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class SousBootstrap < Knife
|
9
|
+
include KnifeSous::ProcessorCommand
|
10
|
+
include KnifeSous::ConfigureCommand
|
11
|
+
include KnifeSous::NodeCommand
|
12
|
+
|
13
|
+
deps do
|
14
|
+
require 'chef/knife/solo_bootstrap'
|
15
|
+
end
|
16
|
+
|
17
|
+
banner "knife sous bootstrap [NAMESPACE] NODE"
|
18
|
+
|
19
|
+
def solo_bootstrap_node(node)
|
20
|
+
solo_bootstrap_command = configure_command(Chef::Knife::SoloBootstrap.new, node)
|
21
|
+
Chef::Knife::SoloBootstrap.load_deps
|
22
|
+
solo_bootstrap_command.name_args << node.hostname
|
23
|
+
solo_bootstrap_command.name_args << node.node_config
|
24
|
+
solo_bootstrap_command.run
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :solo_command, :solo_bootstrap_node
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'knife_sous/processor_command'
|
3
|
+
require 'knife_sous/configure_command'
|
4
|
+
require 'knife_sous/node_command'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class SousClean < Knife
|
9
|
+
include KnifeSous::ProcessorCommand
|
10
|
+
include KnifeSous::ConfigureCommand
|
11
|
+
include KnifeSous::NodeCommand
|
12
|
+
|
13
|
+
deps do
|
14
|
+
require 'chef/knife/solo_clean'
|
15
|
+
end
|
16
|
+
|
17
|
+
banner "knife sous clean [NAMESPACE] NODE"
|
18
|
+
|
19
|
+
def solo_clean_node(node)
|
20
|
+
solo_cook_command = configure_command(Chef::Knife::SoloClean.new, node)
|
21
|
+
Chef::Knife::SoloClean.load_deps
|
22
|
+
solo_cook_command.name_args << node.hostname
|
23
|
+
solo_cook_command.run
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :solo_command, :solo_clean_node
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'knife_sous/processor_command'
|
3
|
+
require 'knife_sous/configure_command'
|
4
|
+
require 'knife_sous/node_command'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class SousCook < Knife
|
9
|
+
include KnifeSous::ProcessorCommand
|
10
|
+
include KnifeSous::ConfigureCommand
|
11
|
+
include KnifeSous::NodeCommand
|
12
|
+
|
13
|
+
deps do
|
14
|
+
require 'chef/knife/solo_cook'
|
15
|
+
end
|
16
|
+
|
17
|
+
banner "knife sous cook [NAMESPACE] NODE"
|
18
|
+
|
19
|
+
def solo_cook_node(node)
|
20
|
+
solo_cook_command = configure_command(Chef::Knife::SoloCook.new, node)
|
21
|
+
Chef::Knife::SoloCook.load_deps
|
22
|
+
solo_cook_command.name_args << node.hostname
|
23
|
+
solo_cook_command.name_args << node.node_config
|
24
|
+
solo_cook_command.run
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :solo_command, :solo_cook_node
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'knife_sous/processor_command'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Knife
|
6
|
+
class SousInit < Knife
|
7
|
+
include KnifeSous::ProcessorCommand
|
8
|
+
|
9
|
+
banner "knife sous init [DIRECTORY]"
|
10
|
+
|
11
|
+
def node_manifest_example_path
|
12
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'templates', 'nodes.example.rb'))
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
unless name_args.empty?
|
17
|
+
target = File.expand_path(name_args.first)
|
18
|
+
else
|
19
|
+
target = File.expand_path(Dir.pwd, File.join('nodes'))
|
20
|
+
end
|
21
|
+
copy_template(target)
|
22
|
+
end
|
23
|
+
|
24
|
+
def copy_template(location)
|
25
|
+
FileUtils.mkdir_p(location)
|
26
|
+
|
27
|
+
target_file = File.join(location, 'nodes.example.rb' )
|
28
|
+
|
29
|
+
unless File.exists?(target_file)
|
30
|
+
FileUtils.cp(node_manifest_example_path, target_file)
|
31
|
+
ui.msg "Example nodes.rb copied to #{target_file}"
|
32
|
+
else
|
33
|
+
ui.error "File already exists: #{target_file}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'knife_sous/processor_command'
|
3
|
+
require 'knife_sous/namespace_presenter'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
class SousList < Knife
|
8
|
+
include KnifeSous::ProcessorCommand
|
9
|
+
|
10
|
+
banner "knife sous list"
|
11
|
+
|
12
|
+
def run
|
13
|
+
present_nodes
|
14
|
+
end
|
15
|
+
|
16
|
+
def present_nodes
|
17
|
+
ui.output(KnifeSous::NamespacePresenter.new(root_namespace).present)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'knife_sous/processor_command'
|
3
|
+
require 'knife_sous/configure_command'
|
4
|
+
require 'knife_sous/node_command'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class SousPrepare < Knife
|
9
|
+
include KnifeSous::ProcessorCommand
|
10
|
+
include KnifeSous::ConfigureCommand
|
11
|
+
include KnifeSous::NodeCommand
|
12
|
+
|
13
|
+
deps do
|
14
|
+
require 'chef/knife/solo_prepare'
|
15
|
+
end
|
16
|
+
|
17
|
+
banner "knife sous prepare [NAMESPACE] NODE"
|
18
|
+
|
19
|
+
def solo_prepare_node(node)
|
20
|
+
solo_cook_command = configure_command(Chef::Knife::SoloPrepare.new, node)
|
21
|
+
Chef::Knife::SoloPrepare.load_deps
|
22
|
+
solo_cook_command.name_args << node.hostname
|
23
|
+
solo_cook_command.name_args << node.node_config
|
24
|
+
solo_cook_command.run
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :solo_command, :solo_prepare_node
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'knife_sous/namespace'
|
2
|
+
require 'knife_sous/node'
|
3
|
+
|
4
|
+
module KnifeSous
|
5
|
+
module DSL
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
base.extend Forwardable
|
9
|
+
def_delegators :children, :<<, :first, :last, :[], :map, :each, :to_a, :keep_if, :empty?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def children
|
14
|
+
@children ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
def namespace(name, &block)
|
18
|
+
namespace = Namespace.new(name)
|
19
|
+
namespace.evaluate_block(&block)
|
20
|
+
children << namespace
|
21
|
+
end
|
22
|
+
|
23
|
+
def node(name, args={})
|
24
|
+
node = Node.new(name, args)
|
25
|
+
children << node
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'knife_sous/node'
|
2
|
+
|
3
|
+
require 'knife_sous/dsl_definitions'
|
4
|
+
require 'knife_sous/dsl_wrapper'
|
5
|
+
|
6
|
+
|
7
|
+
module KnifeSous
|
8
|
+
class Namespace
|
9
|
+
include DSL
|
10
|
+
include DSLWrapper
|
11
|
+
|
12
|
+
attr_reader :name
|
13
|
+
|
14
|
+
def initialize(name)
|
15
|
+
@name = name.to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'knife_sous/node_presenter'
|
2
|
+
|
3
|
+
module KnifeSous
|
4
|
+
class NamespacePresenter
|
5
|
+
attr_reader :namespace
|
6
|
+
|
7
|
+
def initialize(namespace)
|
8
|
+
@namespace = namespace
|
9
|
+
end
|
10
|
+
|
11
|
+
def present
|
12
|
+
return @namespace.name if @namespace.empty?
|
13
|
+
|
14
|
+
nodes = ""
|
15
|
+
@namespace.each do |child|
|
16
|
+
nodes << "#{@namespace.name} #{presenter(child).present}".lstrip
|
17
|
+
end
|
18
|
+
nodes
|
19
|
+
end
|
20
|
+
|
21
|
+
def presenter(item)
|
22
|
+
klass = item.is_a?(Node) ? NodePresenter : NamespacePresenter
|
23
|
+
klass.new(item)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'knife_sous/dsl_wrapper'
|
2
|
+
require 'knife_sous/mixins/hash_mixins'
|
3
|
+
|
4
|
+
module KnifeSous
|
5
|
+
class Node
|
6
|
+
include KnifeSous::HashMixins
|
7
|
+
|
8
|
+
attr_reader :name, :config
|
9
|
+
|
10
|
+
def initialize(name, config_args={})
|
11
|
+
@name = name.to_s
|
12
|
+
@config = {}
|
13
|
+
update_config(config_args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def update_config(other_config={})
|
17
|
+
config = convert_aliases(normalize_hash(other_config))
|
18
|
+
@config.merge!(config)
|
19
|
+
end
|
20
|
+
|
21
|
+
def convert_aliases(config_hash = {})
|
22
|
+
config_aliases.each do |key, value|
|
23
|
+
if config_hash.has_key?(key)
|
24
|
+
config_hash[value] = config_hash[key]
|
25
|
+
config_hash.delete(key)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
config_hash
|
29
|
+
end
|
30
|
+
|
31
|
+
def node_name
|
32
|
+
@config[:node_name] || @name
|
33
|
+
end
|
34
|
+
|
35
|
+
def method_missing(method_name, *args, &block)
|
36
|
+
@config[method_name.to_sym]
|
37
|
+
end
|
38
|
+
|
39
|
+
def config_aliases
|
40
|
+
{
|
41
|
+
ssh_config_file: :ssh_config,
|
42
|
+
ip: :hostname
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module KnifeSous
|
2
|
+
module NodeCommand
|
3
|
+
|
4
|
+
def search_for_target
|
5
|
+
result = search(name_args)
|
6
|
+
if result.nil?
|
7
|
+
ui.error "Can't find node. Run `knife sous list` to see nodes"
|
8
|
+
exit 1
|
9
|
+
end
|
10
|
+
result
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
check_args
|
15
|
+
search_result = search_for_target
|
16
|
+
process_result(search_result)
|
17
|
+
end
|
18
|
+
|
19
|
+
def process_result(result)
|
20
|
+
if result.is_a? KnifeSous::Namespace
|
21
|
+
result.each { |child| process_result(child) }
|
22
|
+
else
|
23
|
+
solo_command(result)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def check_args
|
28
|
+
unless name_args.size > 0
|
29
|
+
ui.fatal "You need to specificy a node or namespace"
|
30
|
+
show_usage
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'knife_sous/namespace'
|
2
|
+
|
3
|
+
module KnifeSous
|
4
|
+
module ProcessorCommand
|
5
|
+
def self.included(other)
|
6
|
+
other.class_eval do
|
7
|
+
option :node_manifest_file,
|
8
|
+
:long => '--node-manifest-file NODE_MANIFEST_FILE',
|
9
|
+
:description => 'Alternate location for node manifest config file',
|
10
|
+
:default => File.join("nodes", "nodes.rb")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate_config!
|
15
|
+
unless File.exists?(manifest_file_path)
|
16
|
+
ui.fatal("Couldn't find #{manifest_file_path}")
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
unless File.readable?(manifest_file_path)
|
20
|
+
ui.fatal("Can't read #{manifest_file_path}")
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
def search(target_qualifiers = [])
|
27
|
+
namespace = root_namespace
|
28
|
+
target_qualifiers.each do |target_qualifier|
|
29
|
+
return nil if namespace.nil?
|
30
|
+
namespace = namespace.keep_if { |item| item.name == target_qualifier }.first
|
31
|
+
end
|
32
|
+
namespace
|
33
|
+
end
|
34
|
+
|
35
|
+
def root_namespace
|
36
|
+
@root_namespace ||= process_config
|
37
|
+
end
|
38
|
+
|
39
|
+
def manifest_file_path
|
40
|
+
config[:node_manifest_file] ||= default_config[:node_manifest_file]
|
41
|
+
@manifest_file_path ||= File.expand_path(File.join(Dir.pwd, config[:node_manifest_file]))
|
42
|
+
end
|
43
|
+
|
44
|
+
def process_config
|
45
|
+
validate_config!
|
46
|
+
root_namespace = Namespace.new('')
|
47
|
+
root_namespace.instance_eval(File.read(manifest_file_path), manifest_file_path)
|
48
|
+
root_namespace
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
data/lib/knife_sous.rb
ADDED