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
@@ -0,0 +1,32 @@
|
|
1
|
+
# def vagrant_ssh_config_file
|
2
|
+
# @vagrant_ssh_config_file ||=begin
|
3
|
+
# config_file = Tempfile.new('vagrant_ssh_config')
|
4
|
+
# config_file.write(`vagrant ssh-config`)
|
5
|
+
# config_file.close
|
6
|
+
# at_exit { config_file.delete }
|
7
|
+
# config_file
|
8
|
+
# end
|
9
|
+
# @vagrant_ssh_config_file.path
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# def default_node_options
|
13
|
+
# {
|
14
|
+
# user: 'deploy',
|
15
|
+
# node_config: 'nodes/server.json'
|
16
|
+
# }
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# node :vagrant, node_config: 'nodes/something.json',
|
20
|
+
# hostname: 'default',
|
21
|
+
# ssh_config: vagrant_ssh_config_file
|
22
|
+
#
|
23
|
+
# namespace :production do |prod|
|
24
|
+
# prod.node :node_awesome, default_options.merge!(hostname: '00.12.34.56')
|
25
|
+
# prod.namespace :web do |web|
|
26
|
+
# web.node :nodetastic,
|
27
|
+
# hostname: "12.34.56.789",
|
28
|
+
# ssh_port: 22,
|
29
|
+
# identity_file: "path/to/identity"
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Knife::SousBootstrap do
|
4
|
+
include KnifeCommandHelpers
|
5
|
+
|
6
|
+
describe "#banner" do
|
7
|
+
it "should have display how to use command" do
|
8
|
+
command.banner.should == 'knife sous bootstrap [NAMESPACE] NODE'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
it_should_behave_like "a node command" do
|
12
|
+
let(:node_command) { command }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#solo_bootstrap_node" do
|
16
|
+
let(:node) { KnifeSous::Node.new('nodetastic') }
|
17
|
+
let(:cmd) { command }
|
18
|
+
let(:solo_bootstrap_command) { Chef::Knife::SoloBootstrap.new }
|
19
|
+
|
20
|
+
before do
|
21
|
+
Chef::Knife::SoloBootstrap.stub(new: solo_bootstrap_command)
|
22
|
+
solo_bootstrap_command.stub(:run)
|
23
|
+
cmd.stub(configure_command: solo_bootstrap_command)
|
24
|
+
node.update_config(
|
25
|
+
node_config: '/path/to/node/config',
|
26
|
+
hostname: 'host_ip'
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should provide name to args and run" do
|
31
|
+
solo_bootstrap_command.should_receive(:run)
|
32
|
+
cmd.solo_bootstrap_node(node)
|
33
|
+
|
34
|
+
solo_bootstrap_command.name_args.should == %w[host_ip /path/to/node/config]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def command(*args)
|
39
|
+
knife_command(Chef::Knife::SousBootstrap, *args)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Knife::SousClean do
|
4
|
+
include KnifeCommandHelpers
|
5
|
+
|
6
|
+
describe "#banner" do
|
7
|
+
it "should have display how to use command" do
|
8
|
+
command.banner.should == 'knife sous clean [NAMESPACE] NODE'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
it_should_behave_like "a node command" do
|
12
|
+
let(:node_command) { command }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#solo_clean_node" do
|
16
|
+
let(:node) { KnifeSous::Node.new('nodetastic') }
|
17
|
+
let(:cmd) { command }
|
18
|
+
let(:solo_clean_command) { Chef::Knife::SoloClean.new }
|
19
|
+
|
20
|
+
before do
|
21
|
+
Chef::Knife::SoloClean.stub(new: solo_clean_command)
|
22
|
+
solo_clean_command.stub(:run)
|
23
|
+
cmd.stub(configure_command: solo_clean_command)
|
24
|
+
node.update_config(
|
25
|
+
hostname: 'host_ip'
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should provide name to args and run" do
|
30
|
+
solo_clean_command.should_receive(:run)
|
31
|
+
cmd.solo_clean_node(node)
|
32
|
+
|
33
|
+
solo_clean_command.name_args.should == %w[host_ip]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def command(*args)
|
38
|
+
knife_command(Chef::Knife::SousClean, *args)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Knife::SousCook do
|
4
|
+
include KnifeCommandHelpers
|
5
|
+
|
6
|
+
describe "#banner" do
|
7
|
+
it "should have display how to use command" do
|
8
|
+
command.banner.should == 'knife sous cook [NAMESPACE] NODE'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#check_args" do
|
13
|
+
it "should print error, show usage and exit if no args are passed in" do
|
14
|
+
cmd = command
|
15
|
+
cmd.ui.should_receive(:fatal).with("You need to specificy a node or namespace")
|
16
|
+
cmd.should_receive(:show_usage)
|
17
|
+
lambda { cmd.check_args}.should raise_error SystemExit
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "a node command" do
|
22
|
+
let(:node_command) { command }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#solo_cook_node" do
|
26
|
+
let(:node) { KnifeSous::Node.new('nodetastic') }
|
27
|
+
let(:cmd) { command }
|
28
|
+
let(:solo_cook_command) { Chef::Knife::SoloCook.new }
|
29
|
+
|
30
|
+
before do
|
31
|
+
Chef::Knife::SoloCook.stub(new: solo_cook_command)
|
32
|
+
solo_cook_command.stub(:run)
|
33
|
+
cmd.stub(configure_command: solo_cook_command)
|
34
|
+
node.update_config(
|
35
|
+
node_config: '/path/to/node/config',
|
36
|
+
hostname: 'host_ip'
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should provide name to args and run" do
|
41
|
+
solo_cook_command.should_receive(:run)
|
42
|
+
cmd.solo_cook_node(node)
|
43
|
+
|
44
|
+
solo_cook_command.name_args.should == %w[host_ip /path/to/node/config]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def command(*args)
|
49
|
+
knife_command(Chef::Knife::SousCook, *args)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Knife::SousInit do
|
4
|
+
include KnifeCommandHelpers
|
5
|
+
|
6
|
+
describe "#banner" do
|
7
|
+
it "should have display how to use command" do
|
8
|
+
command.banner.should == 'knife sous init [DIRECTORY]'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#copy_template" do
|
13
|
+
before do
|
14
|
+
FileUtils.stub(:mkdir_p)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should copy template to location if location is empty" do
|
18
|
+
cmd = command
|
19
|
+
File.stub(exists?: false)
|
20
|
+
cmd.stub(node_manifest_example_path: 'example location')
|
21
|
+
|
22
|
+
FileUtils.should_receive(:cp).with('example location', 'some/location/nodes.example.rb')
|
23
|
+
cmd.ui.should_receive(:msg).with("Example nodes.rb copied to some/location/nodes.example.rb")
|
24
|
+
|
25
|
+
cmd.copy_template('some/location')
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should print an error and shouldn't copy if file already exists at destination" do
|
29
|
+
cmd = command
|
30
|
+
File.stub(exists?: true)
|
31
|
+
FileUtils.should_not_receive(:cp)
|
32
|
+
cmd.ui.should_receive(:error).with("File already exists: some/location/nodes.example.rb")
|
33
|
+
cmd.copy_template('some/location')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#run" do
|
38
|
+
it "should copy example config to default location, if no location specified" do
|
39
|
+
cmd = command
|
40
|
+
cmd.should_receive(:copy_template).with(File.expand_path(Dir.pwd, File.join('nodes')))
|
41
|
+
cmd.run
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should copy the example config to specified location" do
|
45
|
+
cmd = command
|
46
|
+
cmd.should_receive(:copy_template).with(File.expand_path("some/path"))
|
47
|
+
cmd.name_args << 'some/path'
|
48
|
+
cmd.run
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def command(*args)
|
53
|
+
knife_command(Chef::Knife::SousInit, *args)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Knife::SousList do
|
4
|
+
include KnifeCommandHelpers
|
5
|
+
|
6
|
+
describe "#banner" do
|
7
|
+
it "should have display how to use command" do
|
8
|
+
command.banner.should == 'knife sous list'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#run" do
|
13
|
+
it "should print out the list nodes" do
|
14
|
+
cmd = command
|
15
|
+
cmd.should_receive(:present_nodes)
|
16
|
+
cmd.run
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#present_nodes" do
|
21
|
+
it "should output presented nodes" do
|
22
|
+
cmd = command
|
23
|
+
cmd.config[:node_manifest_file] = 'spec/support/fixtures/nodes.rb'
|
24
|
+
cmd.ui.should_receive(:output).with("production node_awesome\nproduction web nodetastic\nvagrant\n")
|
25
|
+
cmd.present_nodes
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def command(*args)
|
30
|
+
knife_command(Chef::Knife::SousList, *args)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Knife::SousPrepare do
|
4
|
+
include KnifeCommandHelpers
|
5
|
+
|
6
|
+
describe "#banner" do
|
7
|
+
it "should have display how to use command" do
|
8
|
+
command.banner.should == 'knife sous prepare [NAMESPACE] NODE'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
it_should_behave_like "a node command" do
|
12
|
+
let(:node_command) { command }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#solo_prepare_node" do
|
16
|
+
let(:node) { KnifeSous::Node.new('nodetastic') }
|
17
|
+
let(:cmd) { command }
|
18
|
+
let(:solo_prepare_command) { Chef::Knife::SoloPrepare.new }
|
19
|
+
|
20
|
+
before do
|
21
|
+
Chef::Knife::SoloPrepare.stub(new: solo_prepare_command)
|
22
|
+
solo_prepare_command.stub(:run)
|
23
|
+
cmd.stub(configure_command: solo_prepare_command)
|
24
|
+
node.update_config(
|
25
|
+
node_config: '/path/to/node/config',
|
26
|
+
hostname: 'host_ip'
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should provide name to args and run" do
|
31
|
+
solo_prepare_command.should_receive(:run)
|
32
|
+
cmd.solo_prepare_node(node)
|
33
|
+
|
34
|
+
solo_prepare_command.name_args.should == %w[host_ip /path/to/node/config]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def command(*args)
|
39
|
+
knife_command(Chef::Knife::SousPrepare, *args)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class DummyCommand < Chef::Knife
|
4
|
+
end
|
5
|
+
|
6
|
+
describe KnifeSous::ConfigureCommand do
|
7
|
+
include KnifeCommandHelpers
|
8
|
+
|
9
|
+
describe "#configure_command" do
|
10
|
+
it "should be configured for a given node" do
|
11
|
+
node = KnifeSous::Node.new('some node',
|
12
|
+
foo: 'bar',
|
13
|
+
ssh_password: 'some_password')
|
14
|
+
|
15
|
+
cmd = command
|
16
|
+
KnifeSous::ConfigureCommand.configure_command(cmd, node)
|
17
|
+
|
18
|
+
cmd.config[:ssh_password].should == 'some_password'
|
19
|
+
cmd.config[:foo].should == 'bar'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def command(*args)
|
24
|
+
knife_command(DummyCommand, *args)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class DummyClass
|
4
|
+
include KnifeSous::DSL
|
5
|
+
end
|
6
|
+
|
7
|
+
describe KnifeSous::DSL do
|
8
|
+
it_should_behave_like "a collection object" do
|
9
|
+
let(:collection) { DummyClass.new }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#namespace" do
|
13
|
+
let(:some_block) { Proc.new { } }
|
14
|
+
let(:dummy_class) { DummyClass.new }
|
15
|
+
|
16
|
+
it "should instantiate a Namespace" do
|
17
|
+
namespace = KnifeSous::Namespace.new('stuff')
|
18
|
+
KnifeSous::Namespace.stub(new: namespace)
|
19
|
+
KnifeSous::Namespace.should_receive(:new).with('some name')
|
20
|
+
dummy_class.namespace('some name', &some_block)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have the Namespace evaluate the passed in block" do
|
24
|
+
namespace = KnifeSous::Namespace.new('stuff')
|
25
|
+
KnifeSous::Namespace.stub(new: namespace)
|
26
|
+
namespace.should_receive(:evaluate_block).with(&some_block)
|
27
|
+
dummy_class.namespace('some name', &some_block)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should add the Namespace to the collection" do
|
31
|
+
dummy_class.namespace('some name', &some_block)
|
32
|
+
dummy_class.first.should be_a KnifeSous::Namespace
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#node" do
|
37
|
+
let(:dummy_class) { DummyClass.new }
|
38
|
+
|
39
|
+
it "should instantiate a Node" do
|
40
|
+
node = KnifeSous::Node.new('stuff')
|
41
|
+
KnifeSous::Node.stub(new: node)
|
42
|
+
KnifeSous::Node.should_receive(:new).with('some name', {config: 'stuff'})
|
43
|
+
dummy_class.node('some name', config: 'stuff' )
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should add the Node to the collection" do
|
47
|
+
dummy_class.node('some name')
|
48
|
+
dummy_class.first.should be_a KnifeSous::Node
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe KnifeSous::HashMixins do
|
4
|
+
|
5
|
+
subject { KnifeSous::HashMixins }
|
6
|
+
|
7
|
+
describe "#sanitize_key"do
|
8
|
+
it "should return a lowercase, snake_case, symbol" do
|
9
|
+
subject.sanitize_key('SoMEthing-Ridic_uLous!').should == :something_ridic_ulous!
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#normalize_hash" do
|
14
|
+
it "should sanitize each key" do
|
15
|
+
subject.normalize_hash('GroS-key' => 'foo', OtherKey: 'bar').keys.should =~ [:gros_key, :otherkey]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should convert every value to string" do
|
19
|
+
subject.normalize_hash(number: 5, bar: 'baz').should == { number: '5', bar: 'baz' }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe KnifeSous::NamespacePresenter do
|
4
|
+
describe "#initialize" do
|
5
|
+
it "should keep track of the namespace" do
|
6
|
+
namespace = 'namespace'
|
7
|
+
KnifeSous::NamespacePresenter.new(namespace).namespace.should == 'namespace'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#presenter" do
|
12
|
+
it "should return a NodePresenter if item is a Node" do
|
13
|
+
root_namespace_presenter = KnifeSous::NamespacePresenter.new('foo namespace')
|
14
|
+
some_node = KnifeSous::Node.new('some node')
|
15
|
+
root_namespace_presenter.presenter(some_node).should be_a KnifeSous::NodePresenter
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return a NamespacePresenter if item is a Namespace" do
|
19
|
+
root_namespace_presenter = KnifeSous::NamespacePresenter.new('foo namespace')
|
20
|
+
some_namespace = KnifeSous::Namespace.new('some node')
|
21
|
+
root_namespace_presenter.presenter(some_namespace).should be_a KnifeSous::NamespacePresenter
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#present" do
|
26
|
+
it "should present its own name" do
|
27
|
+
namespace = KnifeSous::Namespace.new("some namespace")
|
28
|
+
KnifeSous::NamespacePresenter.new(namespace).present.should == "some namespace"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should present each of its children" do
|
32
|
+
root_namespace = KnifeSous::Namespace.new("")
|
33
|
+
namespaceA = KnifeSous::Namespace.new(:namespace_a)
|
34
|
+
namespaceB = KnifeSous::Namespace.new(:namespace_b)
|
35
|
+
|
36
|
+
node1 = KnifeSous::Node.new(:node_1)
|
37
|
+
node2 = KnifeSous::Node.new(:node_2)
|
38
|
+
node3 = KnifeSous::Node.new(:node_3)
|
39
|
+
node4 = KnifeSous::Node.new(:node_4)
|
40
|
+
|
41
|
+
root_namespace << namespaceA
|
42
|
+
namespaceA << node1
|
43
|
+
namespaceA << node2
|
44
|
+
namespaceA << namespaceB
|
45
|
+
namespaceB << node3
|
46
|
+
root_namespace << node4
|
47
|
+
|
48
|
+
KnifeSous::NamespacePresenter.new(root_namespace).present.should ==<<-TEXT
|
49
|
+
namespace_a node_1
|
50
|
+
namespace_a node_2
|
51
|
+
namespace_a namespace_b node_3
|
52
|
+
node_4
|
53
|
+
TEXT
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe KnifeSous::Namespace do
|
4
|
+
let(:namespace) { KnifeSous::Namespace.new("some namespace name") }
|
5
|
+
|
6
|
+
it_should_behave_like "a collection object" do
|
7
|
+
let(:collection) { namespace }
|
8
|
+
end
|
9
|
+
|
10
|
+
it_should_behave_like "dsl wrapper" do
|
11
|
+
let(:klass) { namespace }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#initialize" do
|
15
|
+
it "should set the name" do
|
16
|
+
KnifeSous::Namespace.new("some namespace name").name.should == 'some namespace name'
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should convert symbols to strings" do
|
20
|
+
KnifeSous::Namespace.new(:foo_bar).name.should == 'foo_bar'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "root namespace" do
|
25
|
+
it "should instance_eval DSL from file" do
|
26
|
+
root_namespace = KnifeSous::Namespace.new('')
|
27
|
+
root_namespace.instance_eval do
|
28
|
+
namespace :production do |prod|
|
29
|
+
prod.node :node_awesome
|
30
|
+
prod.namespace :web do |web|
|
31
|
+
web.node :web_node
|
32
|
+
end
|
33
|
+
end
|
34
|
+
node :vagrant, node_config: 'nodes/some_node.json', ssh_config: 'vagrant config'
|
35
|
+
end
|
36
|
+
|
37
|
+
prod_namespace = root_namespace[0]
|
38
|
+
prod_namespace.should be_a KnifeSous::Namespace
|
39
|
+
prod_namespace.name.should == 'production'
|
40
|
+
|
41
|
+
vagrant_node = root_namespace[1]
|
42
|
+
vagrant_node.should be_a KnifeSous::Node
|
43
|
+
vagrant_node.name.should == 'vagrant'
|
44
|
+
|
45
|
+
node_awesome = prod_namespace[0]
|
46
|
+
node_awesome.should be_a KnifeSous::Node
|
47
|
+
node_awesome.name.should == 'node_awesome'
|
48
|
+
|
49
|
+
web_namespace = prod_namespace[1]
|
50
|
+
web_namespace.should be_a KnifeSous::Namespace
|
51
|
+
web_namespace.name.should == 'web'
|
52
|
+
|
53
|
+
web_node = web_namespace[0]
|
54
|
+
web_node.should be_a KnifeSous::Node
|
55
|
+
web_node.name.should == 'web_node'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe KnifeSous::NodePresenter do
|
4
|
+
describe "#initialize" do
|
5
|
+
it "should keep track of the node" do
|
6
|
+
node = 'node'
|
7
|
+
KnifeSous::NodePresenter.new(node).node.should == 'node'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#present" do
|
12
|
+
it "should present the node name and a newline" do
|
13
|
+
node = KnifeSous::Node.new('Awesome node')
|
14
|
+
KnifeSous::NodePresenter.new(node).present.should == "Awesome node\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe KnifeSous::Node do
|
4
|
+
describe "#initialize" do
|
5
|
+
it "should set the name that was passed in" do
|
6
|
+
KnifeSous::Node.new('Node-Fuu').name.should == 'Node-Fuu'
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should convert symbols to strings" do
|
10
|
+
KnifeSous::Node.new(:node_tastic).name.should == 'node_tastic'
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should accept config arguments as a hash" do
|
14
|
+
options_hash = {ssh_config: 'stuff', other_something: 'foo' }
|
15
|
+
KnifeSous::Node.new(:node_tastic, options_hash).config.should == options_hash
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#node_name" do
|
20
|
+
it "should set the node name" do
|
21
|
+
node = KnifeSous::Node.new('some node', node_name: 'node_tastic')
|
22
|
+
node.node_name.should == 'node_tastic'
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should default to the node name" do
|
26
|
+
node = KnifeSous::Node.new('some node')
|
27
|
+
node.node_name.should == 'some node'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#update_config" do
|
32
|
+
it "should merge config options" do
|
33
|
+
node = KnifeSous::Node.new(:node_tastic, foo: 'bar', baz: 'stuff')
|
34
|
+
node.update_config(baz: 'new stuff')
|
35
|
+
node.config.should == { foo: 'bar', baz: 'new stuff' }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "config hash" do
|
40
|
+
it "should sanitize hash keys" do
|
41
|
+
KnifeSous::Node.new(:node_tastic, 'fOO-BAr' => 'baz').config.keys.should =~ [:foo_bar]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#method_missing" do
|
46
|
+
it "should try to access from config hash" do
|
47
|
+
KnifeSous::Node.new(:node_tastic, foo_bar: 'baz').foo_bar.should == 'baz'
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return nil if config doesn't exist" do
|
51
|
+
KnifeSous::Node.new(:node_tastic).foo_bar.should == nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#convert_aliases" do
|
56
|
+
it "should convert keys to their alias defined by #config_aliases" do
|
57
|
+
node = KnifeSous::Node.new(:foo)
|
58
|
+
node.stub(config_aliases: {foo: :bar})
|
59
|
+
node.convert_aliases(foo: 'baz').should == { bar: 'baz'}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|