sous-chef 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sous-chef (0.0.4)
4
+ sous-chef (0.0.6)
5
5
  knife-solo (~> 0.1.0)
6
6
  rake (~> 10.0.3)
7
7
 
data/README.md CHANGED
@@ -16,54 +16,61 @@ You may run `rake sous_chef:init` to generate sample `nodes.yml` to
16
16
  ## Configure
17
17
 
18
18
  Create configuration in knife-solo nodes dir e.g. `nodes/nodes.yml`. Node
19
- configuration is used for sshconfig as well as nodename. Example `nodes.yml`:
19
+ configuration is used for sshconfig as well as nodename. You can namespace
20
+ nodes however you want. Example `nodes.yml`:
20
21
 
21
22
  ```yaml
22
23
  # Format:
23
24
  #
24
25
  # <environment>:
25
- # <node name>:
26
- # node_config: <knife-solo node config e.g. nodes/someNode.json>
27
- # ssh_config:
28
- # <ssh config options>
29
- # e.g.
30
- # Host: <host alias. defaults to node name>
31
- # HostName: 12.34.56.789
32
- # Port: 1234
33
- # IdentityFile: ~/.ssh/other_id_rsa
26
+ # <other-namespace>:
27
+ # <node name>:
28
+ # node_config: <knife-solo node config e.g. nodes/someNode.json>
29
+ # ssh_config:
30
+ # <ssh config options>
31
+ # e.g.
32
+ # Host: <host alias. defaults to node name>
33
+ # HostName: 12.34.56.789
34
+ # Port: 1234
35
+ # IdentityFile: ~/.ssh/other_id_rsa
34
36
 
35
37
  production:
36
- SuperAwesomeNode:
37
- node_config: nodes/some_node.json
38
- ssh_config:
39
- HostName: 12.34.56.789
40
- Port 1234
41
- IdentityFile: ~/.ssh/other_id_rsa
42
-
38
+ web:
39
+ SuperAwesomeNode:
40
+ node_config: nodes/some_node.json
41
+ ssh_config:
42
+ HostName: 12.34.56.789
43
+ Port 1234
44
+ IdentityFile: ~/.ssh/other_id_rsa
45
+ staging:
43
46
  CoolWorld:
44
47
  node_config: nodes/some_node.json
45
48
  ssh_config:
46
49
  HostName: localhost
47
50
 
48
51
  vagrant:
49
- default:
50
- node_config: nodes/buildAgent.json
51
- ssh_config:
52
- HostName: 127.0.0.1
53
- User: vagrant
54
- Port: 2222
55
- UserKnownHostsFile: /dev/null
56
- StrictHostKeyChecking: "no"
57
- PasswordAuthentication: "no"
58
- IdentityFile: "~/.vagrant.d/insecure_private_key"
59
- IdentitiesOnly: "yes"
60
- ForwardAgent: "yes"
52
+ node_config: nodes/buildAgent.json
53
+ ssh_config:
54
+ HostName: 127.0.0.1
55
+ User: vagrant
56
+ Port: 2222
57
+ UserKnownHostsFile: /dev/null
58
+ StrictHostKeyChecking: "no"
59
+ PasswordAuthentication: "no"
60
+ IdentityFile: "~/.vagrant.d/insecure_private_key"
61
+ IdentitiesOnly: "yes"
62
+ ForwardAgent: "yes"
61
63
  ```
62
64
 
63
65
  ## Usage
64
66
 
65
67
  `rake -T` for a full list of tasks provided:
66
68
 
67
- `rake <environment>:all:<knife solo task>` will run on all nodes for a given
68
- environment.
69
+ ## Contributing
70
+
71
+ 1. Fork it
72
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
73
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
74
+ 4. Push to the branch (`git push origin my-new-feature`)
75
+ 5. Create new Pull Request
69
76
 
@@ -0,0 +1,10 @@
1
+ module SousChef::NodeHelpers
2
+
3
+ def node?(settings)
4
+ settings.is_a? SousChef::Node or settings.has_key?('node_config') or
5
+ settings.has_key?('ssh_config')
6
+ end
7
+
8
+ module_function :node?
9
+ end
10
+
@@ -0,0 +1,12 @@
1
+ class SousChef::Collection
2
+ extend Forwardable
3
+
4
+ attr_reader :name
5
+ def_delegators :@children, :[], :[]=, :has_key?, :each
6
+
7
+ def initialize(name)
8
+ @name = name
9
+ @children = {}
10
+ end
11
+ end
12
+
@@ -0,0 +1,27 @@
1
+ class SousChef::NodeBuilder
2
+ include SousChef::NodeHelpers
3
+
4
+ def initialize(name, collection_hash)
5
+ @name = name
6
+ @collection_hash = collection_hash
7
+ end
8
+
9
+ def build
10
+ if node?(@collection_hash)
11
+ SousChef::Node.new(@name, @collection_hash)
12
+ else
13
+ build_nodes
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def build_nodes
20
+ nodes = SousChef::Collection.new(@name)
21
+ @collection_hash.each do |name, collection_hash|
22
+ nodes[name] = SousChef::NodeBuilder.new(name, collection_hash).build
23
+ end
24
+ nodes
25
+ end
26
+ end
27
+
@@ -0,0 +1,18 @@
1
+ class SousChef::NodeManager
2
+ attr_reader :parser, :nodes
3
+
4
+ def initialize(config_file)
5
+ @parser = SousChef::Parser.new(config_file)
6
+ @nodes = {}
7
+ initialize_node_collections
8
+ end
9
+
10
+ private
11
+
12
+ def initialize_node_collections
13
+ @parser.parse.each do |name, collection|
14
+ @nodes[name] = SousChef::NodeBuilder.new(name, collection).build
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,47 @@
1
+ require 'rake'
2
+
3
+ module SousChef::NodeTasks
4
+ include Rake::DSL
5
+
6
+ def build_node_task(node)
7
+ namespace node.name do
8
+ prepare_task(node)
9
+ cook_task(node)
10
+ bootstrap_task(node)
11
+ end
12
+ end
13
+
14
+ def cook_task(node)
15
+ desc "Run knife solo cook for #{node.name}"
16
+ task :cook do
17
+ run_knife 'cook', node
18
+ end
19
+ end
20
+
21
+ def bootstrap_task(node)
22
+ desc "Run knife solo bootstrap for #{node.name}"
23
+ task :bootstrap do
24
+ run_knife 'bootstrap', node
25
+ end
26
+ end
27
+
28
+ def prepare_task(node)
29
+ desc "Run knife solo prepare for #{node.name}"
30
+ task :prepare do
31
+ run_knife 'prepare', node
32
+ end
33
+ end
34
+
35
+ def run(command)
36
+ puts "Running: #{command}"
37
+ system command
38
+ raise "Failure! #{$?}" if $? != 0
39
+ end
40
+
41
+ def run_knife(command, node)
42
+ run "knife solo #{command} -F #{node.ssh_config_path} #{node.hostname} -N #{node.name} #{node.config}"
43
+ end
44
+
45
+ module_function :build_node_task, :cook_task, :bootstrap_task, :prepare_task, :run, :run_knife
46
+ end
47
+
@@ -0,0 +1,25 @@
1
+ class SousChef::TaskBuilder
2
+ include SousChef::NodeTasks
3
+ include SousChef::NodeHelpers
4
+
5
+ def initialize(nodes)
6
+ @nodes = nodes
7
+ end
8
+
9
+ def build_tasks
10
+ build_namespace(@nodes)
11
+ end
12
+
13
+ def build_namespace(collection)
14
+ collection.each do |name, collection|
15
+ if node?(collection)
16
+ build_node_task(collection)
17
+ else
18
+ namespace name do
19
+ build_namespace(collection)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
@@ -1,57 +1,2 @@
1
- require 'rake'
2
-
3
- def run(command)
4
- puts "Running: #{command}"
5
- system command
6
- raise "Failure! #{$?}" if $? != 0
7
- end
8
-
9
- def run_knife(command, node)
10
- run "knife solo #{command} -F #{node.ssh_config_path} #{node.hostname} -N #{node.name} #{node.config}"
11
- end
12
-
13
- def build_task_list(environment_name, names, task)
14
- names.map { |name| "#{environment_name}:#{name}:#{task}" }
15
- end
16
-
17
- SousChef::Manager.new(SousChef::CONFIG_FILE).envs.each do |environment_name, env|
18
- namespace environment_name do
19
- namespace :all do
20
- desc "Run knife solo prepare for all #{environment_name} nodes"
21
- multitask :prepare => build_task_list(environment_name, env.nodes.keys, "prepare")
22
-
23
- desc "Run knife solo cook for all #{environment_name} nodes"
24
- multitask :cook => build_task_list(environment_name, env.nodes.keys, "cook")
25
-
26
- desc "Run knife solo bootstrap for all #{environment_name} nodes"
27
- multitask :bootstrap => build_task_list(environment_name, env.nodes.keys, "bootstrap")
28
- end
29
-
30
- env.nodes.each do |node_name, node|
31
- namespace node_name do
32
- desc "Run knife solo prepare for #{node_name}"
33
- task :prepare do
34
- run_knife 'prepare', node
35
- end
36
-
37
- desc "Run knife solo cook for #{node_name}"
38
- task :cook do
39
- run_knife 'cook', node
40
- end
41
-
42
- desc "Run knife solo bootstrap for #{node_name}"
43
- task :bootstrap do
44
- run_knife 'bootstrap', node
45
- end
46
- end
47
- end
48
- end
49
- end
50
-
51
- namespace :sous_chef do
52
- desc "Generate nodes.yml example config"
53
- task :init do
54
- SousChef.create_config
55
- end
56
- end
1
+ Dir.glob(File.join(File.dirname(__FILE__), "../tasks/*.rake")).each { |r| import r }
57
2
 
data/lib/sous-chef.rb CHANGED
@@ -1,23 +1,35 @@
1
1
 
2
2
  module SousChef
3
+ CONFIG_TEMPLATE = File.expand_path(File.join(File.dirname(__FILE__), 'templates', 'nodes.example.yml'))
3
4
  CONFIG_FILE = File.join(Dir.pwd, "nodes", "nodes.yml")
4
5
 
5
- class << self
6
- def create_config
7
- template = File.expand_path(File.join(File.dirname(__FILE__), 'templates', 'nodes.example.yml'))
8
- if File.exists?(CONFIG_FILE)
9
- puts "nodes.yml already exists"
10
- else
11
- puts "Coping example nodes.yml and placing in #{SousChef::CONFIG_FILE}"
12
- FileUtils.cp(template, CONFIG_FILE)
13
- end
6
+ def config_file_location
7
+ CONFIG_FILE
8
+ end
9
+
10
+ def config_template_location
11
+ CONFIG_TEMPLATE
12
+ end
13
+
14
+ def create_config
15
+ if File.exists?(config_file_location)
16
+ puts "nodes.yml already exists"
17
+ else
18
+ puts "Coping example nodes.yml and placing in #{config_file_location}"
19
+ FileUtils.cp(config_template_location, config_file_location)
14
20
  end
15
21
  end
22
+
23
+ module_function :create_config, :config_file_location, :config_template_location
16
24
  end
17
25
 
18
- require 'sous-chef/parser.rb'
19
- require 'sous-chef/node.rb'
20
- require 'sous-chef/environment.rb'
21
- require 'sous-chef/manager.rb'
22
- require 'sous-chef/tasks.rb'
26
+ require 'helpers/node_helpers'
27
+ require 'sous-chef/parser'
28
+ require 'sous-chef/node_tasks'
29
+ require 'sous-chef/node'
30
+ require 'sous-chef/collection'
31
+ require 'sous-chef/task_builder'
32
+ require 'sous-chef/node_builder'
33
+ require 'sous-chef/node_manager'
34
+ require 'sous-chef/tasks'
23
35
 
@@ -0,0 +1,4 @@
1
+
2
+ nodes = SousChef::NodeManager.new(SousChef.config_file_location).nodes
3
+ SousChef::TaskBuilder.new(nodes).build_tasks
4
+
@@ -0,0 +1,7 @@
1
+ namespace :sous_chef do
2
+ desc "Generate nodes.yml example config"
3
+ task :init do
4
+ SousChef.create_config
5
+ end
6
+ end
7
+
@@ -1,27 +1,27 @@
1
1
  # Format:
2
2
  #
3
3
  # <environment>:
4
- # <node name>:
5
- # node_config: <knife-solo node config e.g. nodes/someNode.json>
6
- # ssh_config:
7
- # <ssh config options>
8
- # e.g.
9
- # Host: <host alias. defaults to node name>
10
- # HostName: 12.34.56.789
11
- # Port: 1234
12
- # IdentityFile: ~/.ssh/other_id_rsa
13
- #
4
+ # <other-namespace>:
5
+ # <node name>:
6
+ # node_config: <knife-solo node config e.g. nodes/someNode.json>
7
+ # ssh_config:
8
+ # <ssh config options>
9
+ # e.g.
10
+ # Host: <host alias. defaults to node name>
11
+ # HostName: 12.34.56.789
12
+ # Port: 1234
13
+ # IdentityFile: ~/.ssh/other_id_rsa
14
+
14
15
  # vagrant:
15
- # default:
16
- # node_config: nodes/buildAgent.json
17
- # ssh_config:
18
- # HostName: 127.0.0.1
19
- # User: vagrant
20
- # Port: 2222
21
- # UserKnownHostsFile: /dev/null
22
- # StrictHostKeyChecking: "no"
23
- # PasswordAuthentication: "no"
24
- # IdentityFile: "~/.vagrant.d/insecure_private_key"
25
- # IdentitiesOnly: "yes"
26
- # ForwardAgent: "yes"
16
+ # node_config: nodes/buildAgent.json
17
+ # ssh_config:
18
+ # HostName: 127.0.0.1
19
+ # User: vagrant
20
+ # Port: 2222
21
+ # UserKnownHostsFile: /dev/null
22
+ # StrictHostKeyChecking: "no"
23
+ # PasswordAuthentication: "no"
24
+ # IdentityFile: "~/.vagrant.d/insecure_private_key"
25
+ # IdentitiesOnly: "yes"
26
+ # ForwardAgent: "yes"
27
27
 
data/sous-chef.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.email = "shaun@substantail.com"
7
7
 
8
8
  s.name = 'sous-chef'
9
- s.version = "0.0.5"
9
+ s.version = "0.0.6"
10
10
  s.description = %q{Manage knife-solo nodes}
11
11
  s.summary = %q{Manage knife-solo nodes by environment. Run knife solo
12
12
  commands on one or multiple nodes.}
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe SousChef::NodeHelpers do
4
+
5
+ describe "#node?" do
6
+ it "should consider hashes with ssh_config key as a node" do
7
+ SousChef::NodeHelpers.node?(SousChef::Node.new({'ssh_config' => true}, {})).should be_true
8
+ end
9
+
10
+ it "should consider hashes with node_config key as a node" do
11
+ SousChef::NodeHelpers.node?(SousChef::Node.new({'node_config' => true}, {})).should be_true
12
+ end
13
+
14
+ it "should consider Node objects as a node" do
15
+ SousChef::NodeHelpers.node?(SousChef::Node.new('some node', {})).should be_true
16
+ end
17
+
18
+ it "shouldn't consider empty hashes as a node" do
19
+ SousChef::NodeHelpers.node?({}).should be_false
20
+ end
21
+
22
+ it "shouldn't consider Collection objects as a node" do
23
+ SousChef::NodeHelpers.node?(SousChef::Collection.new('some collection')).should be_false
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe SousChef::Collection do
4
+ let(:nodes) { {} }
5
+ let(:collection) { SousChef::Collection.new('some collection') }
6
+
7
+ subject { collection }
8
+
9
+ describe "#initialize" do
10
+ it "should set the name" do
11
+ subject.name.should == 'some collection'
12
+ end
13
+ end
14
+
15
+ describe "#[]= & #[]" do
16
+ it "should behave like a hash" do
17
+ subject['foo'] = {bar: 'baz'}
18
+ subject['foo'].should == {bar: 'baz'}
19
+ end
20
+ end
21
+
22
+ describe "#has_key?" do
23
+ it "should behave like a hash" do
24
+ subject['some_key'] = true
25
+ subject.has_key?('some_key')
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe SousChef::NodeBuilder do
4
+ let(:node_builder) { SousChef::NodeBuilder.new('someNode', {}) }
5
+
6
+ describe "#build" do
7
+ subject { node_builder.build}
8
+
9
+ it "should return an Node instance" do
10
+ node_builder.stub(node?: true)
11
+ subject.should be_a SousChef::Node
12
+ end
13
+
14
+ it"should return a Collectyion instance" do
15
+ node_builder.stub(node?: false)
16
+ subject.should be_a SousChef::Collection
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe SousChef::NodeManager do
4
+ let(:node_manager) { SousChef::NodeManager.new(File.join(SPEC_ROOT, "support", "fixtures", "some_nodes.yml")) }
5
+
6
+ describe "#initialize" do
7
+ it "instantiates a parser with the config file" do
8
+ node_manager.parser.should be_a SousChef::Parser
9
+ end
10
+
11
+ it "instantiates nodes as a hash" do
12
+ node_manager.nodes.should be_a Hash
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe SousChef::NodeTasks do
4
+ before do
5
+ SousChef::NodeTasks.stub(:run)
6
+ end
7
+
8
+ describe "#run_knife" do
9
+ it "should run knife solo command for given node" do
10
+ node = double('node')
11
+ node.stub(name: 'foo')
12
+ node.stub(hostname: 'node_hostname')
13
+ node.stub(ssh_config_path: 'ssh_config_path')
14
+ node.stub(config: 'knife_solo_node_config')
15
+ SousChef::NodeTasks.should_receive(:run).with("knife solo some_command -F ssh_config_path node_hostname -N foo knife_solo_node_config")
16
+ SousChef::NodeTasks.run_knife('some_command', node)
17
+ end
18
+ end
19
+ end
20
+
@@ -10,10 +10,10 @@ describe SousChef::Parser do
10
10
  end
11
11
 
12
12
  describe "#parse" do
13
- subject { SousChef::Parser.new(File.join(SPEC_ROOT, "fixtures", "some_nodes.yml")).parse }
13
+ subject { SousChef::Parser.new(File.join(SPEC_ROOT, "support", "fixtures", "some_nodes.yml")).parse }
14
14
 
15
15
  it "parses yaml" do
16
- subject.keys.should =~ %w[production staging]
16
+ subject.should be_a Hash
17
17
  end
18
18
  end
19
19
  end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe SousChef do
4
+ describe "#create_config" do
5
+ let(:template_location) { SousChef::CONFIG_TEMPLATE }
6
+ let(:config_location) { SousChef::CONFIG_FILE }
7
+
8
+ it "should copy nodes.yml if none exist" do
9
+ File.stub(exists?: false)
10
+ FileUtils.should_receive(:cp).with(template_location, config_location)
11
+ SousChef.create_config
12
+ end
13
+
14
+ it "shouldn't copy nodes.yml if one already exists" do
15
+ File.stub(exists?: true)
16
+ FileUtils.should_not_receive(:cp).with(template_location, config_location)
17
+ SousChef.create_config
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe SousChef::TaskBuilder do
4
+ let(:node_collection) do
5
+ nodes = SousChef::Collection.new("web")
6
+ nodes['other_node'] = SousChef::Node.new("other_node", {})
7
+ nodes
8
+ end
9
+ let(:node) { SousChef::Node.new("nodetastic", {}) }
10
+ let(:collection) { { node.name => node, node_collection.name => node_collection} }
11
+ let(:builder) { SousChef::TaskBuilder.new(collection) }
12
+
13
+ describe "#build_namespace" do
14
+ it "should call #build_node_task for nodes" do
15
+ builder.should_receive(:build_node_task).twice
16
+ builder.build_namespace(collection)
17
+ end
18
+
19
+ it "should call #build_namespace for each Collection" do
20
+ builder.should_receive(:build_namespace).once
21
+ builder.build_namespace(collection)
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe "sous_chef.rake" do
4
+ before(:all) do
5
+ @rake = Rake::Application.new
6
+ Rake.application = @rake
7
+ @rake.rake_require "lib/tasks/sous_chef", [File.expand_path(File.join(SPEC_ROOT, '..'))]
8
+ end
9
+
10
+ it "should have sous_chef:init rake task" do
11
+ rake_tasks = @rake.tasks.map(&:name)
12
+ rake_tasks.should include "sous_chef:init"
13
+ end
14
+
15
+ describe "#sous_chef:init" do
16
+ it "should call #SousChef.create_config" do
17
+ SousChef.should_receive(:create_config)
18
+ @rake['sous_chef:init'].invoke
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "generated node tasks" do
24
+ let(:rake_tasks) { @rake.tasks.map(&:name) }
25
+
26
+ before(:all) do
27
+ SousChef.stub(config_file_location: File.join(SPEC_ROOT, "support", "fixtures", "some_nodes.yml"))
28
+ @rake = Rake::Application.new
29
+ Rake.application = @rake
30
+ @rake.rake_require "lib/tasks/node_tasks", [File.expand_path(File.join(SPEC_ROOT, '..'))]
31
+ end
32
+
33
+ it "should build tasks for nodes in nodes.yml" do
34
+ rake_tasks.should include "vagrant:bootstrap"
35
+ end
36
+
37
+ it "should namespace nodes tasks" do
38
+ rake_tasks.should include "production:web:OtherAwesome:bootstrap"
39
+ end
40
+ end
41
+
File without changes
@@ -0,0 +1,18 @@
1
+ production:
2
+ web:
3
+ OtherAwesome:
4
+ node_config: some/path/to/node/config
5
+ ssh_config:
6
+ HostName: localhost
7
+ CoolWorld:
8
+ node_config: some/path/to/node/config
9
+ ssh_config:
10
+ HostName: Some Ip
11
+
12
+ vagrant:
13
+ node_config: some/path/to/node/config
14
+ ssh_config:
15
+ HostName: 12.34.56.789
16
+ Port: 1234
17
+ IdentityFile: ~/.ssh/other_id_rsa
18
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sous-chef
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
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-01-25 00:00:00.000000000 Z
12
+ date: 2013-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -102,22 +102,33 @@ files:
102
102
  - Gemfile.lock
103
103
  - README.md
104
104
  - Rakefile
105
+ - lib/helpers/node_helpers.rb
105
106
  - lib/sous-chef.rb
106
- - lib/sous-chef/environment.rb
107
- - lib/sous-chef/manager.rb
107
+ - lib/sous-chef/collection.rb
108
108
  - lib/sous-chef/node.rb
109
+ - lib/sous-chef/node_builder.rb
110
+ - lib/sous-chef/node_manager.rb
111
+ - lib/sous-chef/node_tasks.rb
109
112
  - lib/sous-chef/parser.rb
113
+ - lib/sous-chef/task_builder.rb
110
114
  - lib/sous-chef/tasks.rb
111
- - lib/tasks/sous-chef.rake
115
+ - lib/tasks/node_tasks.rake
116
+ - lib/tasks/sous_chef.rake
112
117
  - lib/templates/nodes.example.yml
113
118
  - sous-chef.gemspec
114
- - spec/fixtures/single_node.yml
115
- - spec/fixtures/some_nodes.yml
116
- - spec/sous-chef/environment_spec.rb
117
- - spec/sous-chef/manager_spec.rb
119
+ - spec/helpers/node_helpers_spec.rb
120
+ - spec/sous-chef/collection_spec.rb
121
+ - spec/sous-chef/node_builder_spec.rb
122
+ - spec/sous-chef/node_manager_spec.rb
118
123
  - spec/sous-chef/node_spec.rb
124
+ - spec/sous-chef/node_tasks_spec.rb
119
125
  - spec/sous-chef/parser_spec.rb
126
+ - spec/sous-chef/sous-chef_spec.rb
127
+ - spec/sous-chef/task_builder_spec.rb
128
+ - spec/sous-chef/tasks_spec.rb
120
129
  - spec/spec_helper.rb
130
+ - spec/support/fixtures/single_node.yml
131
+ - spec/support/fixtures/some_nodes.yml
121
132
  homepage: http://github.com/substantial/sous-chef
122
133
  licenses:
123
134
  - MIT
@@ -145,10 +156,16 @@ specification_version: 3
145
156
  summary: Manage knife-solo nodes by environment. Run knife solo commands on one or
146
157
  multiple nodes.
147
158
  test_files:
148
- - spec/fixtures/single_node.yml
149
- - spec/fixtures/some_nodes.yml
150
- - spec/sous-chef/environment_spec.rb
151
- - spec/sous-chef/manager_spec.rb
159
+ - spec/helpers/node_helpers_spec.rb
160
+ - spec/sous-chef/collection_spec.rb
161
+ - spec/sous-chef/node_builder_spec.rb
162
+ - spec/sous-chef/node_manager_spec.rb
152
163
  - spec/sous-chef/node_spec.rb
164
+ - spec/sous-chef/node_tasks_spec.rb
153
165
  - spec/sous-chef/parser_spec.rb
166
+ - spec/sous-chef/sous-chef_spec.rb
167
+ - spec/sous-chef/task_builder_spec.rb
168
+ - spec/sous-chef/tasks_spec.rb
154
169
  - spec/spec_helper.rb
170
+ - spec/support/fixtures/single_node.yml
171
+ - spec/support/fixtures/some_nodes.yml
@@ -1,20 +0,0 @@
1
- module SousChef
2
- class Environment
3
- attr_reader :nodes, :name
4
-
5
- def initialize(name, nodes)
6
- @nodes = {}
7
- @name = name
8
- initialize_nodes(nodes)
9
- end
10
-
11
- private
12
-
13
- def initialize_nodes(nodes)
14
- nodes.each do |name, settings|
15
- @nodes[name] = Node.new(name, settings)
16
- end
17
- end
18
- end
19
- end
20
-
@@ -1,20 +0,0 @@
1
- module SousChef
2
- class Manager
3
- attr_reader :envs, :parser
4
-
5
- def initialize(config_file)
6
- @parser = Parser.new(config_file)
7
- @envs = {}
8
- initialize_environments
9
- end
10
-
11
- private
12
-
13
- def initialize_environments
14
- @parser.parse.each do |name, nodes|
15
- @envs[name] = Environment.new(name, nodes)
16
- end
17
- end
18
- end
19
- end
20
-
@@ -1,2 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'sous-chef', 'tasks'))
2
-
@@ -1,19 +0,0 @@
1
- production:
2
- OtherAwesome:
3
- node_config: some/path/to/node/config
4
- ssh_config:
5
- HostName: localhost
6
-
7
- CoolWorld:
8
- node_config: some/path/to/node/config
9
- ssh_config:
10
- HostName: Some Ip
11
-
12
- staging:
13
- AwesomeDBServer:
14
- node_config: some/path/to/node/config
15
- ssh_config:
16
- HostName: 12.34.56.789
17
- Port: 1234
18
- IdentityFile: ~/.ssh/other_id_rsa
19
-
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SousChef::Environment do
4
- let(:nodes) { {} }
5
- let(:environment) { SousChef::Environment.new('some environment', nodes) }
6
-
7
- describe "#initialize" do
8
- it "sets the name" do
9
- environment.name.should == 'some environment'
10
- end
11
-
12
- it "has nodes" do
13
- environment.nodes.should be_a Hash
14
- end
15
- end
16
- end
17
-
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SousChef::Manager do
4
- let(:manager) { SousChef::Manager.new(File.join(SPEC_ROOT, "fixtures", "some_nodes.yml")) }
5
-
6
- describe "#initialize" do
7
- it "instantiates a parser with the config file" do
8
- manager.parser.should be_a SousChef::Parser
9
- end
10
-
11
- it "has environments" do
12
- manager.envs.should be_a Hash
13
- end
14
- end
15
- end
16
-