ironfan 4.3.4 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +7 -0
- data/ELB.md +121 -0
- data/Gemfile +1 -0
- data/Rakefile +4 -0
- data/VERSION +1 -1
- data/ironfan.gemspec +48 -3
- data/lib/chef/knife/cluster_launch.rb +5 -0
- data/lib/chef/knife/cluster_proxy.rb +3 -3
- data/lib/chef/knife/cluster_sync.rb +4 -0
- data/lib/chef/knife/ironfan_knife_common.rb +17 -6
- data/lib/chef/knife/ironfan_script.rb +29 -11
- data/lib/ironfan.rb +2 -2
- data/lib/ironfan/broker/computer.rb +8 -3
- data/lib/ironfan/dsl/ec2.rb +133 -2
- data/lib/ironfan/headers.rb +4 -0
- data/lib/ironfan/provider.rb +48 -3
- data/lib/ironfan/provider/ec2.rb +23 -8
- data/lib/ironfan/provider/ec2/elastic_load_balancer.rb +239 -0
- data/lib/ironfan/provider/ec2/iam_server_certificate.rb +101 -0
- data/lib/ironfan/provider/ec2/machine.rb +8 -0
- data/lib/ironfan/provider/ec2/security_group.rb +3 -5
- data/lib/ironfan/requirements.rb +2 -0
- data/notes/Home.md +45 -0
- data/notes/INSTALL-cloud_setup.md +103 -0
- data/notes/INSTALL.md +134 -0
- data/notes/Ironfan-Roadmap.md +70 -0
- data/notes/advanced-superpowers.md +16 -0
- data/notes/aws_servers.jpg +0 -0
- data/notes/aws_user_key.png +0 -0
- data/notes/cookbook-versioning.md +11 -0
- data/notes/core_concepts.md +200 -0
- data/notes/declaring_volumes.md +3 -0
- data/notes/design_notes-aspect_oriented_devops.md +36 -0
- data/notes/design_notes-ci_testing.md +169 -0
- data/notes/design_notes-cookbook_event_ordering.md +249 -0
- data/notes/design_notes-meta_discovery.md +59 -0
- data/notes/ec2-pricing_and_capacity.md +69 -0
- data/notes/ec2-pricing_and_capacity.numbers +0 -0
- data/notes/homebase-layout.txt +102 -0
- data/notes/knife-cluster-commands.md +18 -0
- data/notes/named-cloud-objects.md +11 -0
- data/notes/opscode_org_key.png +0 -0
- data/notes/opscode_user_key.png +0 -0
- data/notes/philosophy.md +13 -0
- data/notes/rake_tasks.md +24 -0
- data/notes/renamed-recipes.txt +142 -0
- data/notes/silverware.md +85 -0
- data/notes/style_guide.md +300 -0
- data/notes/tips_and_troubleshooting.md +92 -0
- data/notes/version-3_2.md +273 -0
- data/notes/walkthrough-hadoop.md +168 -0
- data/notes/walkthrough-web.md +166 -0
- data/spec/fixtures/ec2/elb/snakeoil.crt +35 -0
- data/spec/fixtures/ec2/elb/snakeoil.key +51 -0
- data/spec/integration/minimal-chef-repo/chefignore +41 -0
- data/spec/integration/minimal-chef-repo/environments/_default.json +12 -0
- data/spec/integration/minimal-chef-repo/knife/credentials/knife-org.rb +19 -0
- data/spec/integration/minimal-chef-repo/knife/credentials/knife-user-ironfantester.rb +9 -0
- data/spec/integration/minimal-chef-repo/knife/knife.rb +66 -0
- data/spec/integration/minimal-chef-repo/roles/systemwide.rb +10 -0
- data/spec/integration/spec/elb_build_spec.rb +95 -0
- data/spec/integration/spec_helper.rb +16 -0
- data/spec/integration/spec_helper/launch_cluster.rb +55 -0
- data/spec/ironfan/ec2/elb_spec.rb +95 -0
- data/spec/ironfan/ec2/security_group_spec.rb +0 -6
- metadata +60 -3
@@ -0,0 +1,35 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIGKDCCBBACAgKaMA0GCSqGSIb3DQEBBQUAMIH4MQswCQYDVQQGEwJVUzETMBEG
|
3
|
+
A1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEYMBYGA1UE
|
4
|
+
ChMPR2V0U2F0aXNmYWN0aW9uMTYwNAYDVQQLEy1EZXBhcnRtZW50IG9mIE5lcmRz
|
5
|
+
LCBGcmlzYmVlcywgYW5kIEtlZ2VyYXRvcnMxKzApBgNVBAMTIkdldFNhdCBOZXJk
|
6
|
+
cyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxPTA7BgkqhkiG9w0BCQEWLm5lcmRzK2Nl
|
7
|
+
cnRpZmljYXRlYXV0aG9yaXR5QGdldHNhdGlzZmFjdGlvbi5jb20wHhcNMTIxMDEy
|
8
|
+
MDMyMDE3WhcNMjIxMDEwMDMyMDE3WjCBuTELMAkGA1UEBhMCVVMxEzARBgNVBAgT
|
9
|
+
CkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xGDAWBgNVBAoTD1Nu
|
10
|
+
YWtlIE9pbCwgSW5jLjEmMCQGA1UECxMdRGVwYXJ0bWVudCBvZiBTaGlmdHkgUHJv
|
11
|
+
ZHVjdHMxFzAVBgNVBAMUDiouc25ha2VvaWwuY29tMSIwIAYJKoZIhvcNAQkBFhNz
|
12
|
+
aGlmdHlAc25ha2VvaWwuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
|
13
|
+
AgEApW4tKF5XhrsnbKEAeVqNxedNj3jWFU/ZRwl0MnyUH3y1LgrASXO25x8OrmLV
|
14
|
+
FO4un2ufhHlxg+e1DNkurQnvIYIaDA97SPtyMg/SCerBo3F1pB6gKtgfGF8z3UTs
|
15
|
+
z28ioXJz+5NkI864sHF7An2H1HJfU9q8xnSf4ClxdpcNVPXtz3Um4ZO33j4D393D
|
16
|
+
KeUeZbXXprr4UN0QdCfM8/wB4KxZCRiGGvjDT4qHMr/pLxl0jWxrZwJqi+mwsVTR
|
17
|
+
U+AQGT0K3l0pYRUO1IknOxmgbOVHGuv+iFd+mq3LSerq5eYIvi69BraE1dUC95cK
|
18
|
+
dpOrCGxkyIRIgpBEzL3UJuMR8bMPKLojbTFQ+b86+El5S+dGugMGFH3S0wGAc8zo
|
19
|
+
wrAZM0nmaPg+4lp3m7+tb9SdzvCWX+fPz9qEUOXTUYza2LjKpu4fj7FBY1RCxF+c
|
20
|
+
C9Fff1mjXkq0abI1/KSbr9D8hfd2dWKF0LMX6UyySjSCjeLUBLNtB/uWwrFRzWes
|
21
|
+
hThVz04U3pqvbMYOtzYlv3BpJLr8CTe19jt6F75TNXr8FxWadoUhtrRNioyjJuFN
|
22
|
+
5pICWf40YswitMbw/QvC7ez6+NqyNMSTzfZGPVVFGwT97nGOrrfQO0Bj93W2STYM
|
23
|
+
q7Ta/NYCf0LcS89EW5UU7F89YF+eKyGCwA5aBWPjm8t11qcCAwEAATANBgkqhkiG
|
24
|
+
9w0BAQUFAAOCAgEAXLO2YmQDfNdog2AWB3u8Bbu6oM5dim/My+nacklkAPh/PeWj
|
25
|
+
byoWdWAX8nQ+MUxG42E8BfHcHOq6iLHlYKGXV5koichsBQ52G3/9JR93aP0DeN9z
|
26
|
+
5Xlv0bnGtwqrS/pk3uVcwE1Scf7t8Zsk6u1oGsGzBaV+5s9fnXzr0eKhqMThZRoE
|
27
|
+
XkBnANb56FwvJTWQu1kbyMgCn0dVjY7LzXjqItLd4m3GGFnJEAzBPq9ayvFeO9QW
|
28
|
+
hPL9p8IksFlurZD2GuvEUQJo6yUtYFDwgJOQzx3EzbCfgShInuRmhsx3yprLQNyA
|
29
|
+
+rUYiLp7TM7wbedAkBh3Qyombi6XEhs8A4Qqo9/pjqhlkgVU88XWyTCTfhjfoK+A
|
30
|
+
zFysPZ+uiZWwXcGFMl1qlWXHmEgckKvD28YQEzibeiHapwYnjzBnmhGPN/ygzLTp
|
31
|
+
txTSg0TBx4aRKKsRtEd5l2XtkOTYCN4ieYnLQaheq8LeP6866+HbU04E6WHpAzeY
|
32
|
+
KLCLMOVQ1BHX8buOnhEIqXH03oIfNmmG3DFB2RCT2YWP8eJhfvOW8YlVZelD5MKX
|
33
|
+
kBhY8KdPfW2AXdvKZ+5MzGIyGEsNKD/z4VLNnylIQD1gUdlILBkiPv3y53f7nRHg
|
34
|
+
aKaEX1x2BZWXPeMXPCLDaer+zs2GfAMIS9OVtOZcL4BIFivUNmDzPr6h0Vg=
|
35
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,51 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
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
|
51
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Put files/directories that should be ignored in this file.
|
2
|
+
# Lines that start with '# ' are comments.
|
3
|
+
|
4
|
+
## OS
|
5
|
+
.DS_Store
|
6
|
+
Icon?
|
7
|
+
nohup.out
|
8
|
+
|
9
|
+
## EDITORS
|
10
|
+
\#*
|
11
|
+
.#*
|
12
|
+
*~
|
13
|
+
*.sw[a-z]
|
14
|
+
*.bak
|
15
|
+
REVISION
|
16
|
+
TAGS*
|
17
|
+
tmtags
|
18
|
+
*_flymake.*
|
19
|
+
*_flymake
|
20
|
+
*.tmproj
|
21
|
+
.project
|
22
|
+
.settings
|
23
|
+
mkmf.log
|
24
|
+
|
25
|
+
## COMPILED
|
26
|
+
a.out
|
27
|
+
*.o
|
28
|
+
*.pyc
|
29
|
+
*.so
|
30
|
+
|
31
|
+
## OTHER SCM
|
32
|
+
*/.bzr/*
|
33
|
+
*/.hg/*
|
34
|
+
*/.svn/*
|
35
|
+
|
36
|
+
## Don't send rspecs up in cookbook
|
37
|
+
.watchr
|
38
|
+
.rspec
|
39
|
+
spec/*
|
40
|
+
spec/fixtures/*
|
41
|
+
features/*
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Put your own AWS credentials in knife-user-ironfantester.rb, not here.
|
3
|
+
#
|
4
|
+
Chef::Config.instance_eval do
|
5
|
+
organization "ironfantest"
|
6
|
+
chef_server_url "https://api.opscode.com/organizations/#{organization}"
|
7
|
+
validation_client_name "#{organization}-validator"
|
8
|
+
validation_key "#{credentials_path}/#{organization}-validator.pem"
|
9
|
+
|
10
|
+
Chef::Config[:ec2_image_info] ||= {}
|
11
|
+
ec2_image_info.merge!({
|
12
|
+
%w[us-east-1 64-bit ebs alestic-precise] => { :image_id => 'ami-b0d309d9', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu12.04-gems", },
|
13
|
+
})
|
14
|
+
Chef::Log.debug("Loaded #{__FILE__}, now have #{ec2_image_info.size} ec2 images")
|
15
|
+
|
16
|
+
# Don't complain about ssh known_hosts
|
17
|
+
knife[:host_key_verify] = false # yeah... so 0.10.7+ uses one, 0.10.4 the other.
|
18
|
+
knife[:no_host_key_verify] = true
|
19
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Chef::Config.instance_eval do
|
2
|
+
organization "infochimps_test"
|
3
|
+
chef_server_url "https://api.opscode.com/organizations/#{organization}"
|
4
|
+
knife[:aws_account_id] = "346633265723"
|
5
|
+
|
6
|
+
knife[:aws_access_key_id] = "AKIAIFPVHWHGTQDXOF6Q"
|
7
|
+
knife[:aws_secret_access_key] = "f8e/XwVSIx9ApupaZaoW/xGme64YuQhKWZM/nn5Y"
|
8
|
+
end
|
9
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#
|
2
|
+
# organization - selects your cloud environment.
|
3
|
+
# username - selects your client key and user-specific overrides
|
4
|
+
# homebase - default location for clusters, cookbooks and so forth
|
5
|
+
#
|
6
|
+
username ENV['CHEF_USER'] || ENV['USER']
|
7
|
+
homebase ENV['CHEF_HOMEBASE'] ? File.expand_path(ENV['CHEF_HOMEBASE']) : File.expand_path("..", File.realdirpath(File.dirname(__FILE__)))
|
8
|
+
|
9
|
+
#
|
10
|
+
# Additional settings and overrides
|
11
|
+
#
|
12
|
+
|
13
|
+
#
|
14
|
+
# Clusters, cookbooks and roles
|
15
|
+
#
|
16
|
+
cluster_path [ "#{homebase}/clusters" ]
|
17
|
+
cookbook_path [ "#{homebase}/cookbooks" ]
|
18
|
+
role_path [ "#{homebase}/roles" ]
|
19
|
+
|
20
|
+
#
|
21
|
+
# Keys and cloud-specific settings.
|
22
|
+
# Be sure all your .pem files are non-readable (mode 0600)
|
23
|
+
#
|
24
|
+
credentials_path File.expand_path("credentials", File.realdirpath(File.dirname(__FILE__)))
|
25
|
+
client_key_dir "#{credentials_path}/client_keys"
|
26
|
+
ec2_key_dir "#{credentials_path}/ec2_keys"
|
27
|
+
|
28
|
+
#
|
29
|
+
# Load the vendored ironfan lib if present
|
30
|
+
#
|
31
|
+
if File.exists?("#{homebase}/vendor/ironfan-knife/lib")
|
32
|
+
$LOAD_PATH.unshift("#{homebase}/vendor/ironfan-knife/lib")
|
33
|
+
end
|
34
|
+
|
35
|
+
verbosity 1
|
36
|
+
log_level :info
|
37
|
+
log_location STDOUT
|
38
|
+
node_name username
|
39
|
+
client_key "#{credentials_path}/#{username}.pem"
|
40
|
+
cache_type 'BasicFile'
|
41
|
+
cache_options :path => "/tmp/chef-checksums-#{username}"
|
42
|
+
|
43
|
+
#
|
44
|
+
# Configure client bootstrapping
|
45
|
+
#
|
46
|
+
bootstrap_runs_chef_client true
|
47
|
+
bootstrap_chef_version "~> 0.10.4"
|
48
|
+
|
49
|
+
def load_if_exists(file) ; load(file) if File.exists?(file) ; end
|
50
|
+
|
51
|
+
# Organization-sepecific settings -- Chef::Config[:ec2_image_info] and so forth
|
52
|
+
#
|
53
|
+
# This must do at least these things:
|
54
|
+
#
|
55
|
+
# * define Chef::Config.chef_server
|
56
|
+
# * define Chef::Config.organization
|
57
|
+
#
|
58
|
+
#
|
59
|
+
load_if_exists "#{credentials_path}/knife-org.rb"
|
60
|
+
|
61
|
+
# User-specific knife info or credentials
|
62
|
+
load_if_exists "#{credentials_path}/knife-user-#{username}.rb"
|
63
|
+
|
64
|
+
[:aws_access_key_id, :aws_secret_access_key, :aws_account_id].each do |k|
|
65
|
+
raise "Chef::Config.knife[:#{k}] not defined, please define it in #{credentials_path}/knife-user-#{username}.rb" unless Chef::Config.knife.has_key?(k)
|
66
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
Ironfan.cluster "elb" do
|
4
|
+
|
5
|
+
cloud(:ec2) do
|
6
|
+
availability_zones ('b'..'d').map { |z| "us-east-1#{z}" }
|
7
|
+
flavor 't1.micro'
|
8
|
+
backing 'ebs'
|
9
|
+
image_name 'alestic-precise'
|
10
|
+
chef_client_script 'client.rb'
|
11
|
+
iam_server_certificate "snake-oil" do
|
12
|
+
certificate IO.read(File.expand_path('../../../fixtures/ec2/elb/snakeoil.crt', __FILE__))
|
13
|
+
private_key IO.read(File.expand_path('../../../fixtures/ec2/elb/snakeoil.key', __FILE__))
|
14
|
+
end
|
15
|
+
security_group :systemwide
|
16
|
+
security_group :ssh do
|
17
|
+
authorize_port_range(22..22)
|
18
|
+
end
|
19
|
+
mount_ephemerals
|
20
|
+
end
|
21
|
+
|
22
|
+
facet :web do
|
23
|
+
instances 2
|
24
|
+
cloud(:ec2) do
|
25
|
+
|
26
|
+
elastic_load_balancer "simple-elb" do
|
27
|
+
map_port('HTTP', 80, 'HTTP', 81)
|
28
|
+
map_port('HTTPS', 443, 'HTTP', 81, 'snake-oil')
|
29
|
+
disallowed_ciphers %w[ RC4-SHA ]
|
30
|
+
|
31
|
+
health_check do
|
32
|
+
ping_protocol 'HTTP'
|
33
|
+
ping_port 82
|
34
|
+
ping_path '/healthcheck'
|
35
|
+
timeout 4
|
36
|
+
interval 10
|
37
|
+
unhealthy_threshold 3
|
38
|
+
healthy_threshold 2
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
launch_cluster 'elb' do |cluster, computers|
|
48
|
+
describe "the elb cluster" do
|
49
|
+
|
50
|
+
it "should have the correct number of running computers"
|
51
|
+
# it "should have the correct number of running computers" do
|
52
|
+
# computers.size.should == cluster.facets[:web].instances
|
53
|
+
# computers.values.reject { |c| c.running? }.should be_empty
|
54
|
+
# end
|
55
|
+
|
56
|
+
describe "the snake-oil certificate" do
|
57
|
+
before :each do
|
58
|
+
@iss = Ironfan::Provider::Ec2::IamServerCertificate.recall('ironfan-elb-snake-oil')
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should exist"
|
62
|
+
# it "should exist" do
|
63
|
+
# @iss.should_not be_nil
|
64
|
+
# end
|
65
|
+
|
66
|
+
it "should be retrievable by ARN"
|
67
|
+
# it "should be retrievable by ARN" do
|
68
|
+
# @iss.should == Ironfan::Provider::Ec2::IamServerCertificate.recall("#{Ironfan::Provider::Ec2::IamServerCertificate::ARN_PREFIX}:#{@iss['Arn']}")
|
69
|
+
# end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "the ELB" do
|
74
|
+
before :each do
|
75
|
+
@elb = Ironfan::Provider::Ec2::ElasticLoadBalancer.recall('ironfan-elb-simple-elb')
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should exist"
|
79
|
+
# it "should exist" do
|
80
|
+
# @elb.should_not be_nil
|
81
|
+
# end
|
82
|
+
|
83
|
+
it "should have two instances"
|
84
|
+
# @elb.instances.size.should == cluster.facets[:web].instances
|
85
|
+
# end
|
86
|
+
|
87
|
+
it "should use the snake-oil certificate"
|
88
|
+
# it "should use the snake-oil certificate" do
|
89
|
+
# iss = Ironfan::Provider::Ec2::IamServerCertificate.recall('ironfan-elb-snake-oil')
|
90
|
+
# @elb.listeners.map(&:ssl_id).include?(iss['Arn']).should be_true
|
91
|
+
# end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
this_dir = File.realpath(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../../lib', this_dir)
|
4
|
+
require 'chef'
|
5
|
+
require 'chef/knife'
|
6
|
+
require 'fog'
|
7
|
+
|
8
|
+
ENV['KNIFE_HOME'] = File.expand_path('minimal-chef-repo/knife', this_dir)
|
9
|
+
ENV['CHEF_USER'] = 'ironfantester'
|
10
|
+
Chef::Knife.new.configure_chef
|
11
|
+
|
12
|
+
require 'ironfan'
|
13
|
+
Ironfan.ui = Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
|
14
|
+
Ironfan.chef_config = { :verbosity => 0 }
|
15
|
+
|
16
|
+
Dir.glob(File.expand_path('spec_helper/*.rb', this_dir)).each { |file| load(file) }
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'chef/knife/cluster_launch'
|
2
|
+
require 'chef/knife/cluster_kill'
|
3
|
+
|
4
|
+
def launch_cluster(name, options = {}, &block)
|
5
|
+
raise "No block given!" unless block_given?
|
6
|
+
|
7
|
+
cluster = Ironfan.cluster(name)
|
8
|
+
|
9
|
+
# Make sure that the cluster is clobbered before trying to launch it
|
10
|
+
begin
|
11
|
+
Chef::Knife::ClusterKill.new(['--yes', name]).run
|
12
|
+
rescue Exception => e
|
13
|
+
Chef::Log.fatal("Unable to terminate existing instance of cluster #{name}: #{e.inspect}")
|
14
|
+
end
|
15
|
+
|
16
|
+
# Launch the cluster and then yield to the testing block
|
17
|
+
begin
|
18
|
+
|
19
|
+
# In the case of a normal shutdown, destroy the cluster to save moolah
|
20
|
+
RSpec.configure do |config|
|
21
|
+
config.after(:all) do
|
22
|
+
Chef::Log.info("Shutting down #{name} cluster")
|
23
|
+
begin
|
24
|
+
Chef::Knife::ClusterKill.new(['--yes', name]).run
|
25
|
+
rescue Exception => failed_termination
|
26
|
+
Chef::Log.fatal("Unable to kill cluster #{name} after test run: #{failed_termination.inspect}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Chef::Log.info("Launching #{name} cluster")
|
32
|
+
launcher = Chef::Knife::ClusterLaunch.new([name])
|
33
|
+
launcher.run
|
34
|
+
|
35
|
+
Chef::Log.info("Running tests against #{name} cluster")
|
36
|
+
yield cluster, Ironfan.broker.discover!(cluster)
|
37
|
+
|
38
|
+
rescue Exception => launchfail
|
39
|
+
|
40
|
+
Chef::Log.warn("Exception occurred while launching cluster #{name}: #{launchfail.inspect}")
|
41
|
+
|
42
|
+
# Failed tests should not result in wasted Chef/IAAS resources
|
43
|
+
if ENV['IRONFAN_PRESERVE_TESTING_CORPSES']
|
44
|
+
Chef::Log.warn("Failed to launch #{name} cluster, but NOT terminating cluster so that you have a chance to inspect it")
|
45
|
+
Chef::Log.warn(launchfail.inspect)
|
46
|
+
else
|
47
|
+
begin
|
48
|
+
Chef::Knife::ClusterKill.new([name, '--yes'])
|
49
|
+
rescue Exception => death
|
50
|
+
Chef::Log.fatal("Unable to kill cluster #{name} after failed test run: #{death.inspect}")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'ironfan'
|
4
|
+
|
5
|
+
cert = IO.read(File.realpath(File.join(File.dirname(__FILE__), '../../fixtures/ec2/elb/snakeoil.crt')))
|
6
|
+
key = IO.read(File.realpath(File.join(File.dirname(__FILE__), '../../fixtures/ec2/elb/snakeoil.key')))
|
7
|
+
|
8
|
+
describe Ironfan::Dsl::Cluster do
|
9
|
+
let (:cluster) do
|
10
|
+
|
11
|
+
Ironfan.cluster "sparky" do
|
12
|
+
|
13
|
+
cloud(:ec2) do
|
14
|
+
iam_server_certificate "snake-oil" do
|
15
|
+
certificate cert
|
16
|
+
private_key key
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
facet :web do
|
21
|
+
instances 2
|
22
|
+
cloud(:ec2) do
|
23
|
+
|
24
|
+
elastic_load_balancer "sparky-elb" do
|
25
|
+
map_port('HTTP', 80, 'HTTP', 81)
|
26
|
+
map_port('HTTPS', 443, 'HTTP', 81, 'snake-oil')
|
27
|
+
disallowed_ciphers %w[ RC4-SHA ]
|
28
|
+
|
29
|
+
health_check do
|
30
|
+
ping_protocol 'HTTP'
|
31
|
+
ping_port 82
|
32
|
+
ping_path '/healthcheck'
|
33
|
+
timeout 4
|
34
|
+
interval 10
|
35
|
+
unhealthy_threshold 3
|
36
|
+
healthy_threshold 2
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'cluster definition' do
|
46
|
+
subject { cluster }
|
47
|
+
|
48
|
+
its(:name) { should eql "sparky" }
|
49
|
+
its(:environment) { should eql :_default }
|
50
|
+
its(:run_list) { should eql [] }
|
51
|
+
|
52
|
+
it "should have one IAM server certificate" do
|
53
|
+
cluster.clouds.values.first.iam_server_certificates.values.length.should == 1
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'facets' do
|
57
|
+
before { @facets = cluster.facets }
|
58
|
+
subject { @facets.values }
|
59
|
+
its(:length) { should eql 1 }
|
60
|
+
|
61
|
+
describe 'web facet' do
|
62
|
+
before { @facet = @facets.values.first }
|
63
|
+
subject { @facet }
|
64
|
+
its(:name) { should eql "web" }
|
65
|
+
describe "elastic load balancers" do
|
66
|
+
|
67
|
+
before { @elb = @facet.clouds.values.first.elastic_load_balancers.values.first }
|
68
|
+
subject { @elb }
|
69
|
+
its(:name) { should eql "sparky-elb" }
|
70
|
+
|
71
|
+
it "should have two port mappings" do
|
72
|
+
@elb.port_mappings.length.should == 2
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should have just one disallowed SSL cipher" do
|
76
|
+
@elb.disallowed_ciphers.length.should == 1
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "health check" do
|
80
|
+
before { @hc = @elb.health_check }
|
81
|
+
subject { @hc }
|
82
|
+
its(:ping_protocol) { should eql 'HTTP' }
|
83
|
+
its(:ping_port) { should eql 82 }
|
84
|
+
its(:ping_path) { should eql '/healthcheck' }
|
85
|
+
its(:timeout) { should eql 4 }
|
86
|
+
its(:interval) { should eql 10 }
|
87
|
+
its(:unhealthy_threshold) { should eql 3 }
|
88
|
+
its(:healthy_threshold) { should eql 2 }
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|