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,19 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require IRONFAN_DIR("lib/ironfan")
|
3
|
+
|
4
|
+
describe Ironfan::ServerSlice do
|
5
|
+
before do
|
6
|
+
@slice = Ironfan.slice('webserver_demo')
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'attributes' do
|
10
|
+
it 'security groups' do
|
11
|
+
@slice.security_groups.keys.sort.should == [
|
12
|
+
"default",
|
13
|
+
"webserver_demo", "webserver_demo-awesome_website", "webserver_demo-dbnode", "webserver_demo-esnode",
|
14
|
+
"webserver_demo-redis_client", "webserver_demo-redis_server",
|
15
|
+
"webserver_demo-webnode", "nfs_client", "ssh"
|
16
|
+
]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require IRONFAN_DIR("lib/ironfan")
|
3
|
+
|
4
|
+
describe Ironfan::Server do
|
5
|
+
include_context 'dummy_chef'
|
6
|
+
|
7
|
+
Ironfan::Server.class_eval do
|
8
|
+
def chef_node
|
9
|
+
Chef::Node.new
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Ironfan::DryRunnable.class_eval do
|
14
|
+
def unless_dry_run
|
15
|
+
puts "Not doing that"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
before do
|
20
|
+
Ironfan::Server.stub!(:chef_node).and_return( "HI" )
|
21
|
+
Chef::Config.stub!(:validation_key).and_return("I_AM_VALID")
|
22
|
+
|
23
|
+
foo = Ironfan::Server.new(Ironfan::Facet.new(Ironfan::Cluster.new('hi'),'there'),0)
|
24
|
+
puts foo.inspect
|
25
|
+
puts foo.chef_node
|
26
|
+
@cluster = get_example_cluster('webserver_demo')
|
27
|
+
@cluster.resolve!
|
28
|
+
@facet = @cluster.facet(:dbnode)
|
29
|
+
@server = @facet.server(0)
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'volumes' do
|
33
|
+
describe '#composite_volumes' do
|
34
|
+
it 'assembles cluster, facet and server volumes' do
|
35
|
+
@server.composite_volumes.length.should == 5
|
36
|
+
@cluster.volumes.length.should == 4
|
37
|
+
@facet.volumes.length.should == 1
|
38
|
+
@server.volumes.length.should == 1
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'composites server attributes onto a volume defined in the facet' do
|
42
|
+
vol = @server.composite_volumes[:data]
|
43
|
+
vol.to_hash.should == {
|
44
|
+
:name => :data,
|
45
|
+
:tags => {},
|
46
|
+
:snapshot_id => "snap-d9c1edb1",
|
47
|
+
:size => 50,
|
48
|
+
:keep => true,
|
49
|
+
:device => "/dev/sdi",
|
50
|
+
:mount_point => "/data/db",
|
51
|
+
:mount_options => "defaults,nouuid,noatime",
|
52
|
+
:fs_type => "xfs",
|
53
|
+
:availability_zone => "us-east-1d"
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'makes block_device_mapping for non-ephemeral storage' do
|
58
|
+
vol = @server.composite_volumes[:data]
|
59
|
+
vol.block_device_mapping.should == {
|
60
|
+
"DeviceName" => "/dev/sdi",
|
61
|
+
"Ebs.SnapshotId" => "snap-d9c1edb1",
|
62
|
+
"Ebs.VolumeSize" => 50,
|
63
|
+
"Ebs.DeleteOnTermination" => "false"
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'skips block_device_mapping for non-ephemeral storage if volume id is present' do
|
68
|
+
vol = @facet.server(1).composite_volumes[:data]
|
69
|
+
vol.block_device_mapping.should be_nil
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'launch' do
|
76
|
+
describe '#fog_launch_description' do
|
77
|
+
it 'has right attributes' do
|
78
|
+
|
79
|
+
hsh = @server.fog_launch_description
|
80
|
+
hsh.delete(:user_data)
|
81
|
+
hsh.should == {
|
82
|
+
:image_id => "ami-08f40561",
|
83
|
+
:flavor_id => "m1.large",
|
84
|
+
:groups => ["webserver_demo-redis_client", "webserver_demo-dbnode", "default", "ssh", "nfs_client", "webserver_demo"],
|
85
|
+
:key_name => :webserver_demo,
|
86
|
+
:tags => {:cluster=>:webserver_demo, :facet=>:dbnode, :index=>0},
|
87
|
+
:block_device_mapping => [
|
88
|
+
{"DeviceName"=>"/dev/sdi", "Ebs.SnapshotId"=>"snap-d9c1edb1", "Ebs.VolumeSize"=>50, "Ebs.DeleteOnTermination"=>"false"},
|
89
|
+
{"DeviceName"=>"/dev/sdb", "VirtualName"=>"ephemeral0"},
|
90
|
+
{"DeviceName"=>"/dev/sdc", "VirtualName"=>"ephemeral1"},
|
91
|
+
{"DeviceName"=>"/dev/sdd", "VirtualName"=>"ephemeral2"},
|
92
|
+
{"DeviceName"=>"/dev/sde", "VirtualName"=>"ephemeral3"},
|
93
|
+
],
|
94
|
+
:availability_zone => "us-east-1d",
|
95
|
+
:monitoring => nil
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'has right user_data' do
|
100
|
+
hsh = @server.fog_launch_description
|
101
|
+
user_data_hsh = JSON.parse( hsh[:user_data] )
|
102
|
+
user_data_hsh.keys.should == ["chef_server", "validation_client_name", "validation_key", "attributes"]
|
103
|
+
user_data_hsh["attributes"].keys.sort.should == [
|
104
|
+
"cluster_name", "facet_name", "facet_index",
|
105
|
+
"node_name",
|
106
|
+
"webnode_count",
|
107
|
+
]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,193 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
require IRONFAN_DIR("lib/ironfan")
|
4
|
+
|
5
|
+
describe "ironfan" do
|
6
|
+
describe 'successfuly runs example' do
|
7
|
+
|
8
|
+
describe 'webserver_demo:' do
|
9
|
+
before :all do
|
10
|
+
@cluster = get_example_cluster(:webserver_demo)
|
11
|
+
@cluster.resolve!
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'loads successfuly' do
|
15
|
+
@cluster.should be_a(Ironfan::Cluster)
|
16
|
+
@cluster.name.should == :webserver_demo
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'cluster is right' do
|
20
|
+
@cluster.to_hash.should == {
|
21
|
+
:name => :webserver_demo,
|
22
|
+
:run_list => ["role[base_role]", "role[chef_client]", "role[ssh]", "role[nfs_client]", "role[big_package]", "role[webserver_demo_cluster]"],
|
23
|
+
:chef_attributes => { :webnode_count => 6 },
|
24
|
+
:facet_name => "webserver_demo_cluster",
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'defaults cluster' do
|
29
|
+
defaults_cluster = Ironfan.cluster(:defaults)
|
30
|
+
cloud_hash = defaults_cluster.cloud.to_hash
|
31
|
+
[:security_groups, :user_data].each{|k| cloud_hash.delete k }
|
32
|
+
cloud_hash.should == {
|
33
|
+
:availability_zones => ['us-east-1d'],
|
34
|
+
:region => "us-east-1",
|
35
|
+
:flavor => "m1.small",
|
36
|
+
:image_name => "lucid",
|
37
|
+
:backing => "ebs",
|
38
|
+
:disable_api_termination => false,
|
39
|
+
:public_ip => false,
|
40
|
+
:bootstrap_distro => "ubuntu10.04-ironfan",
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'cluster cloud is right' do
|
45
|
+
cloud_hash = @cluster.cloud.to_hash
|
46
|
+
[:security_groups, :user_data].each{|k| cloud_hash.delete k }
|
47
|
+
cloud_hash.should == {
|
48
|
+
:availability_zones => ['us-east-1d'],
|
49
|
+
:region => "us-east-1",
|
50
|
+
:flavor => "t1.micro",
|
51
|
+
:image_name => "maverick",
|
52
|
+
:backing => "instance",
|
53
|
+
:disable_api_termination => false,
|
54
|
+
:public_ip => false,
|
55
|
+
:bootstrap_distro => "ubuntu10.04-ironfan",
|
56
|
+
:keypair => :webserver_demo,
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'facet cloud is right' do
|
61
|
+
cloud_hash = @cluster.facet(:webnode).cloud.to_hash
|
62
|
+
[:security_groups, :user_data].each{|k| cloud_hash.delete k }
|
63
|
+
cloud_hash.should == {
|
64
|
+
:backing => "ebs",
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'webnode facets are right' do
|
69
|
+
@cluster.facets.length.should == 3
|
70
|
+
fct = @cluster.facet(:webnode)
|
71
|
+
fct.to_hash.should == {
|
72
|
+
:name => :webnode,
|
73
|
+
:run_list => ["role[nginx]", "role[redis_client]", "role[mysql_client]", "role[elasticsearch_client]", "role[awesome_website]", "role[webserver_demo_webnode]"],
|
74
|
+
:chef_attributes => {:split_testing=>{:group=>"A"}},
|
75
|
+
:facet_role => "webserver_demo_webnode",
|
76
|
+
:instances => 6,
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'dbnode facets are right' do
|
81
|
+
fct = @cluster.facet(:dbnode)
|
82
|
+
fct.to_hash.should == {
|
83
|
+
:name => :dbnode,
|
84
|
+
:run_list => ["role[mysql_server]", "role[redis_client]", "role[webserver_demo_dbnode]" ],
|
85
|
+
:chef_attributes => {},
|
86
|
+
:facet_role => "webserver_demo_dbnode",
|
87
|
+
:instances => 2,
|
88
|
+
}
|
89
|
+
fct.cloud.flavor.should == 'c1.xlarge'
|
90
|
+
fct.server(0).cloud.flavor.should == 'm1.large'
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'esnode facets are right' do
|
94
|
+
fct = @cluster.facet(:esnode)
|
95
|
+
fct.to_hash.should == {
|
96
|
+
:name => :esnode,
|
97
|
+
:run_list => ["role[nginx]", "role[redis_server]", "role[elasticsearch_data_esnode]", "role[elasticsearch_http_esnode]", "role[webserver_demo_esnode]"],
|
98
|
+
:chef_attributes => {},
|
99
|
+
:facet_role => "webserver_demo_esnode",
|
100
|
+
:instances => 1,
|
101
|
+
}
|
102
|
+
fct.cloud.flavor.should == 'm1.large'
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'cluster security groups are right' do
|
106
|
+
gg = @cluster.security_groups
|
107
|
+
gg.keys.should == ['default', 'ssh', 'nfs_client', 'webserver_demo']
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'facet webnode security groups are right' do
|
111
|
+
gg = @cluster.facet(:webnode).security_groups
|
112
|
+
gg.keys.sort.should == ["default", "webserver_demo", "webserver_demo-awesome_website", "webserver_demo-redis_client", "webserver_demo-webnode", "nfs_client", "ssh"]
|
113
|
+
gg['webserver_demo-awesome_website'].range_authorizations.should == [[80..80, "0.0.0.0/0", "tcp"], [443..443, "0.0.0.0/0", "tcp"]]
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'facet dbnode security groups are right' do
|
117
|
+
gg = @cluster.facet(:dbnode).security_groups
|
118
|
+
gg.keys.sort.should == ["default", "webserver_demo", "webserver_demo-dbnode", "webserver_demo-redis_client", "nfs_client", "ssh"]
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'facet esnode security groups are right' do
|
122
|
+
gg = @cluster.facet(:esnode).security_groups
|
123
|
+
gg.keys.sort.should == ["default", "webserver_demo", "webserver_demo-esnode", "webserver_demo-redis_server", "nfs_client", "ssh"]
|
124
|
+
gg['webserver_demo-redis_server'][:name].should == "webserver_demo-redis_server"
|
125
|
+
gg['webserver_demo-redis_server'][:description].should == "ironfan generated group webserver_demo-redis_server"
|
126
|
+
gg['webserver_demo-redis_server'].group_authorizations.should == [['webserver_demo-redis_client', nil]]
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'has servers' do
|
130
|
+
@cluster.servers.map(&:fullname).should == [
|
131
|
+
"webserver_demo-dbnode-0", "webserver_demo-dbnode-1",
|
132
|
+
"webserver_demo-esnode-0",
|
133
|
+
"webserver_demo-webnode-0", "webserver_demo-webnode-1", "webserver_demo-webnode-2", "webserver_demo-webnode-3", "webserver_demo-webnode-4", "webserver_demo-webnode-5"
|
134
|
+
]
|
135
|
+
end
|
136
|
+
|
137
|
+
describe 'resolving servers gets right' do
|
138
|
+
before do
|
139
|
+
@server = @cluster.slice(:webnode, 5).first
|
140
|
+
@server.cloud.stub!(:validation_key).and_return("I_AM_VALID")
|
141
|
+
@server.resolve!
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'attributes' do
|
145
|
+
@server.to_hash.should == {
|
146
|
+
:name => 'webserver_demo-webnode-5',
|
147
|
+
:run_list => ["role[base_role]", "role[chef_client]", "role[ssh]", "role[nfs_client]", "role[big_package]", "role[webserver_demo_cluster]", "role[nginx]", "role[redis_client]", "role[mysql_client]", "role[elasticsearch_client]", "role[awesome_website]", "role[webserver_demo_webnode]"],
|
148
|
+
:instances => 6,
|
149
|
+
:chef_attributes => {
|
150
|
+
:split_testing => {:group=>"B"},
|
151
|
+
:webnode_count => 6,
|
152
|
+
:node_name => "webserver_demo-webnode-5",
|
153
|
+
:cluster_name => :webserver_demo, :facet_name => :webnode, :facet_index => 5,
|
154
|
+
},
|
155
|
+
}
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'security groups' do
|
159
|
+
@server.security_groups.keys.sort.should == ['default', 'webserver_demo', 'webserver_demo-awesome_website', 'webserver_demo-redis_client', 'webserver_demo-webnode', 'nfs_client', 'ssh']
|
160
|
+
end
|
161
|
+
it 'run list' do
|
162
|
+
@server.run_list.should == ["role[base_role]", "role[chef_client]", "role[ssh]", "role[nfs_client]", "role[big_package]", "role[webserver_demo_cluster]", "role[nginx]", "role[redis_client]", "role[mysql_client]", "role[elasticsearch_client]", "role[awesome_website]", "role[webserver_demo_webnode]"]
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'user_data' do
|
166
|
+
@server.cloud.user_data.should == {
|
167
|
+
"chef_server" => "https://api.opscode.com/organizations/infochimps",
|
168
|
+
"validation_client_name" => "chef-validator",
|
169
|
+
"validation_key" => "I_AM_VALID",
|
170
|
+
}
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'cloud settings' do
|
174
|
+
hsh = @server.cloud.to_hash
|
175
|
+
hsh.delete(:security_groups)
|
176
|
+
hsh.delete(:user_data)
|
177
|
+
hsh.should == {
|
178
|
+
:availability_zones => ["us-east-1c"],
|
179
|
+
:region => "us-east-1",
|
180
|
+
:flavor => "t1.micro",
|
181
|
+
:image_name => "maverick",
|
182
|
+
:backing => "ebs",
|
183
|
+
:disable_api_termination => false,
|
184
|
+
:public_ip => false,
|
185
|
+
:bootstrap_distro => "ubuntu10.04-ironfan",
|
186
|
+
:keypair => :webserver_demo,
|
187
|
+
}
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rubygems' unless defined?(Gem)
|
2
|
+
require 'bundler'
|
3
|
+
# begin
|
4
|
+
# Bundler.setup(:default, :development)
|
5
|
+
# rescue Bundler::BundlerError => e
|
6
|
+
# $stderr.puts e.message
|
7
|
+
# $stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
# exit e.status_code
|
9
|
+
# end
|
10
|
+
require 'spork'
|
11
|
+
|
12
|
+
unless defined?(IRONFAN_DIR)
|
13
|
+
IRONFAN_DIR = File.expand_path(File.dirname(__FILE__)+'/..')
|
14
|
+
def IRONFAN_DIR(*paths) File.join(IRONFAN_DIR, *paths); end
|
15
|
+
# load from vendored libraries, if present
|
16
|
+
Dir[IRONFAN_DIR("vendor/*/lib")].each{|dir| p dir ; $LOAD_PATH.unshift(File.expand_path(dir)) } ; $LOAD_PATH.uniq!
|
17
|
+
end
|
18
|
+
|
19
|
+
Spork.prefork do # This code is run only once when the spork server is started
|
20
|
+
|
21
|
+
require 'rspec'
|
22
|
+
require 'chef'
|
23
|
+
require 'chef/knife'
|
24
|
+
require 'fog'
|
25
|
+
|
26
|
+
Fog.mock!
|
27
|
+
Fog::Mock.delay = 0
|
28
|
+
|
29
|
+
CHEF_CONFIG_FILE = File.expand_path(IRONFAN_DIR('spec/test_config.rb')) unless defined?(CHEF_CONFIG_FILE)
|
30
|
+
Chef::Config.from_file(CHEF_CONFIG_FILE)
|
31
|
+
|
32
|
+
# Requires custom matchers & macros, etc from files in ./spec_helper/
|
33
|
+
Dir[IRONFAN_DIR("spec/spec_helper/*.rb")].each {|f| require f}
|
34
|
+
|
35
|
+
def load_example_cluster(name)
|
36
|
+
require(IRONFAN_DIR('clusters', "#{name}.rb"))
|
37
|
+
end
|
38
|
+
def get_example_cluster name
|
39
|
+
load_example_cluster(name)
|
40
|
+
Ironfan.cluster(name)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Configure rspec
|
44
|
+
RSpec.configure do |config|
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
Spork.each_run do
|
49
|
+
# This code will be run each time you run your specs.
|
50
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
shared_context 'dummy_chef' do
|
2
|
+
before(:each) do
|
3
|
+
Chef::Log.logger = Logger.new(StringIO.new)
|
4
|
+
|
5
|
+
Chef::Config[:node_name] = "webmonkey.example.com"
|
6
|
+
Ironfan.ui = Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
|
7
|
+
Ironfan.ui.stub!(:puts)
|
8
|
+
Ironfan.ui.stub!(:print)
|
9
|
+
Chef::Log.stub!(:init)
|
10
|
+
Chef::Log.stub!(:level)
|
11
|
+
[:debug, :info, :warn, :error, :crit].each do |level_sym|
|
12
|
+
Chef::Log.stub!(level_sym)
|
13
|
+
end
|
14
|
+
Chef::Knife.stub!(:puts)
|
15
|
+
@stdout = StringIO.new
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
let(:node_name){ 'a_dummy_node' }
|
20
|
+
let(:dummy_node){ Chef::Node.new }
|
21
|
+
before(:each) do
|
22
|
+
# Ironfan::Cluster.stub!(:chef_nodes).and_return( [dummy_node] )
|
23
|
+
Ironfan::Server.stub!(:chef_node).and_return( dummy_node )
|
24
|
+
end
|
25
|
+
end
|
data/spec/test_config.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
current_dir = File.expand_path('~/.chef')
|
2
|
+
organization = 'infochimps'
|
3
|
+
username = 'mrflip'
|
4
|
+
|
5
|
+
cookbook_root = ENV['PATH_TO_COOKBOOK_REPOS'] || File.expand_path('~/ics/sysadmin')
|
6
|
+
|
7
|
+
ironfan_path File.expand_path(cookbook_root+'/ironfan')
|
8
|
+
keypair_path File.expand_path(current_dir+"/keypairs")
|
9
|
+
cookbook_path [
|
10
|
+
"ironfan/cookbooks", "ironfan/site-cookbooks",
|
11
|
+
].map{|path| File.join(cookbook_root, path) }
|
12
|
+
cluster_path [
|
13
|
+
'ironfan/clusters',
|
14
|
+
].map{|path| File.join(cookbook_root, path) }
|
15
|
+
|
16
|
+
node_name username
|
17
|
+
validation_client_name "chef-validator"
|
18
|
+
validation_key "#{keypair_path}/#{organization}-validator.pem"
|
19
|
+
client_key "#{keypair_path}/#{username}-client_key.pem"
|
20
|
+
chef_server_url "https://api.opscode.com/organizations/#{organization}"
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Configure the Rakefile's tasks.
|
2
|
+
|
3
|
+
###
|
4
|
+
# Company and SSL Details
|
5
|
+
# Used with the ssl_cert task.
|
6
|
+
###
|
7
|
+
|
8
|
+
# The company name - used for SSL certificates, and in srvious other places
|
9
|
+
COMPANY_NAME = "Infochimps, Inc"
|
10
|
+
|
11
|
+
# The Country Name to use for SSL Certificates
|
12
|
+
SSL_COUNTRY_NAME = "US"
|
13
|
+
|
14
|
+
# The State Name to use for SSL Certificates
|
15
|
+
SSL_STATE_NAME = "Several"
|
16
|
+
|
17
|
+
# The Locality Name for SSL - typically, the city
|
18
|
+
SSL_LOCALITY_NAME = "Locality"
|
19
|
+
|
20
|
+
# What department?
|
21
|
+
SSL_ORGANIZATIONAL_UNIT_NAME = "Operations"
|
22
|
+
|
23
|
+
# The SSL contact email address
|
24
|
+
SSL_EMAIL_ADDRESS = "coders@infochimps.com"
|
25
|
+
|
26
|
+
# License for new Cookbooks
|
27
|
+
# Can be :apachev2 or :none
|
28
|
+
NEW_COOKBOOK_LICENSE = :apachev2
|
29
|
+
|
30
|
+
###
|
31
|
+
# Useful Extras (which you probably don't need to change)
|
32
|
+
###
|
33
|
+
|
34
|
+
# The top of the repository checkout
|
35
|
+
TOPDIR = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
36
|
+
|
37
|
+
# Where to store certificates generated with ssl_cert
|
38
|
+
CADIR = File.expand_path(File.join(TOPDIR, "certificates"))
|