auser-poolparty 0.1.2 → 0.2.2
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/History.txt +22 -0
- data/License.txt +20 -0
- data/README.txt +52 -0
- data/Rakefile +4 -109
- data/bin/cloud +31 -0
- data/bin/cloud-add-keypair +23 -0
- data/bin/cloud-configure +35 -0
- data/bin/cloud-contract +27 -0
- data/bin/cloud-expand +27 -0
- data/bin/cloud-list +32 -0
- data/bin/cloud-maintain +36 -0
- data/bin/cloud-provision +30 -0
- data/bin/cloud-reconfigure +24 -0
- data/bin/cloud-ssh +18 -0
- data/bin/cloud-start +29 -0
- data/bin/pool +23 -75
- data/bin/pool-console +12 -0
- data/bin/pool-describe +9 -0
- data/bin/pool-list +28 -0
- data/bin/pool-provision +34 -0
- data/bin/pool-spec +17 -0
- data/bin/pool-start +32 -0
- data/examples/basic.rb +20 -0
- data/examples/plugin_without_plugin_directory.rb +13 -0
- data/examples/poolparty.rb +12 -0
- data/examples/with_apache_plugin.rb +22 -0
- data/generators/poolspec/USAGE +5 -0
- data/generators/poolspec/poolspec_generator.rb +65 -0
- data/generators/poolspec/templates/pool_spec_template.erb +9 -0
- data/lib/erlang/eb_server.erl +27 -0
- data/lib/poolparty.rb +40 -116
- data/lib/poolparty/base_packages/haproxy.rb +41 -0
- data/lib/poolparty/base_packages/heartbeat.rb +43 -0
- data/lib/poolparty/base_packages/poolparty.rb +18 -0
- data/lib/poolparty/base_packages/ruby.rb +27 -0
- data/lib/poolparty/core/array.rb +24 -0
- data/lib/{core → poolparty/core}/exception.rb +0 -0
- data/lib/{core → poolparty/core}/float.rb +0 -0
- data/lib/poolparty/core/hash.rb +29 -0
- data/lib/poolparty/core/kernel.rb +34 -0
- data/lib/{core → poolparty/core}/module.rb +18 -0
- data/lib/poolparty/core/my_open_struct.rb +18 -0
- data/lib/poolparty/core/object.rb +54 -0
- data/lib/poolparty/core/proc.rb +2 -0
- data/lib/poolparty/core/string.rb +72 -0
- data/lib/poolparty/core/symbol.rb +8 -0
- data/lib/{core → poolparty/core}/time.rb +15 -0
- data/lib/poolparty/exceptions/RemoteException.rb +12 -0
- data/lib/poolparty/exceptions/ResourceException.rb +7 -0
- data/lib/poolparty/exceptions/RuntimeException.rb +7 -0
- data/lib/poolparty/exceptions/SpecException.rb +7 -0
- data/lib/poolparty/exceptions/TemplateNotFound.rb +7 -0
- data/lib/poolparty/helpers/binary.rb +30 -0
- data/lib/poolparty/helpers/console.rb +30 -0
- data/lib/poolparty/helpers/display.rb +25 -0
- data/lib/poolparty/helpers/optioner.rb +61 -0
- data/lib/poolparty/helpers/provisioner_base.rb +226 -0
- data/lib/poolparty/helpers/provisioners/master.rb +120 -0
- data/lib/poolparty/helpers/provisioners/slave.rb +52 -0
- data/lib/poolparty/modules/cloud_resourcer.rb +72 -0
- data/lib/poolparty/modules/configurable.rb +34 -0
- data/lib/poolparty/modules/definable_resource.rb +59 -0
- data/lib/poolparty/modules/file_writer.rb +55 -0
- data/lib/poolparty/modules/method_missing_sugar.rb +17 -0
- data/lib/poolparty/modules/output.rb +13 -0
- data/lib/poolparty/modules/pretty_printer.rb +38 -0
- data/lib/{core/string.rb → poolparty/modules/s3_string.rb} +5 -29
- data/lib/{modules → poolparty/modules}/safe_instance.rb +0 -0
- data/lib/poolparty/monitors/base_monitor.rb +16 -0
- data/lib/poolparty/net/remote.rb +35 -0
- data/lib/poolparty/net/remote_bases/ec2.rb +145 -0
- data/lib/poolparty/net/remote_instance.rb +68 -0
- data/lib/poolparty/net/remoter.rb +209 -0
- data/lib/poolparty/net/remoter_base.rb +117 -0
- data/lib/poolparty/plugins/gem_package.rb +39 -0
- data/lib/poolparty/plugins/line.rb +76 -0
- data/lib/poolparty/plugins/svn.rb +48 -0
- data/lib/poolparty/pool/base.rb +74 -0
- data/lib/poolparty/pool/cloud.rb +132 -0
- data/lib/poolparty/pool/custom_resource.rb +61 -0
- data/lib/poolparty/pool/loggable.rb +29 -0
- data/lib/poolparty/pool/plugin.rb +42 -0
- data/lib/poolparty/pool/plugin_model.rb +48 -0
- data/lib/poolparty/pool/pool.rb +55 -0
- data/lib/poolparty/pool/resource.rb +235 -0
- data/lib/poolparty/pool/resources/class_package.rb +60 -0
- data/lib/poolparty/pool/resources/cron.rb +14 -0
- data/lib/poolparty/pool/resources/directory.rb +23 -0
- data/lib/poolparty/pool/resources/exec.rb +26 -0
- data/lib/poolparty/pool/resources/file.rb +23 -0
- data/lib/poolparty/pool/resources/gem.rb +14 -0
- data/lib/poolparty/pool/resources/host.rb +14 -0
- data/lib/poolparty/pool/resources/package.rb +14 -0
- data/lib/poolparty/pool/resources/remote_file.rb +20 -0
- data/lib/poolparty/pool/resources/service.rb +21 -0
- data/lib/poolparty/pool/resources/sshkey.rb +19 -0
- data/lib/poolparty/pool/resources/variable.rb +27 -0
- data/lib/poolparty/pool/script.rb +21 -0
- data/{config/heartbeat_authkeys.conf → lib/poolparty/templates/authkeys} +0 -0
- data/lib/poolparty/templates/cib.xml +1 -0
- data/lib/poolparty/templates/fileserver.conf +4 -0
- data/{config/heartbeat.conf → lib/poolparty/templates/ha.cf} +3 -1
- data/{config → lib/poolparty/templates}/haproxy.conf +13 -6
- data/lib/poolparty/templates/namespaceauth.conf +19 -0
- data/lib/poolparty/templates/puppet.conf +13 -0
- data/lib/poolparty/version.rb +9 -0
- data/lib/poolpartycl.rb +3 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +82 -0
- data/{lib/poolparty/tasks → tasks}/cloud.rake +1 -1
- data/tasks/deployment.rake +34 -0
- data/tasks/development.rake +78 -0
- data/{lib/poolparty/tasks → tasks}/ec2.rake +1 -1
- data/tasks/environment.rake +7 -0
- data/{lib/poolparty/tasks → tasks}/instance.rake +0 -0
- data/{lib/poolparty/tasks → tasks}/server.rake +0 -0
- data/tasks/spec.rake +17 -0
- data/tasks/website.rake +17 -0
- metadata +154 -249
- data/CHANGELOG +0 -23
- data/LICENSE +0 -22
- data/README +0 -139
- data/assets/clouds.png +0 -0
- data/bin/instance +0 -68
- data/bin/poolnotify +0 -34
- data/config/cloud_master_takeover +0 -17
- data/config/create_proxy_ami.sh +0 -582
- data/config/installers/ubuntu_install.sh +0 -77
- data/config/monit.conf +0 -9
- data/config/monit/haproxy.monit.conf +0 -8
- data/config/monit/nginx.monit.conf +0 -0
- data/config/nginx.conf +0 -24
- data/config/reconfigure_instances_script.sh +0 -37
- data/config/sample-config.yml +0 -23
- data/config/scp_instances_script.sh +0 -12
- data/lib/core/array.rb +0 -16
- data/lib/core/hash.rb +0 -11
- data/lib/core/kernel.rb +0 -12
- data/lib/core/object.rb +0 -21
- data/lib/core/proc.rb +0 -15
- data/lib/helpers/plugin_spec_helper.rb +0 -58
- data/lib/modules/callback.rb +0 -133
- data/lib/modules/ec2_wrapper.rb +0 -108
- data/lib/modules/file_writer.rb +0 -38
- data/lib/modules/sprinkle_overrides.rb +0 -27
- data/lib/modules/vlad_override.rb +0 -83
- data/lib/poolparty/application.rb +0 -199
- data/lib/poolparty/init.rb +0 -6
- data/lib/poolparty/master.rb +0 -492
- data/lib/poolparty/monitors.rb +0 -11
- data/lib/poolparty/monitors/cpu.rb +0 -23
- data/lib/poolparty/monitors/memory.rb +0 -33
- data/lib/poolparty/monitors/web.rb +0 -29
- data/lib/poolparty/optioner.rb +0 -20
- data/lib/poolparty/plugin.rb +0 -78
- data/lib/poolparty/provider.rb +0 -104
- data/lib/poolparty/provider/essential.rb +0 -6
- data/lib/poolparty/provider/git.rb +0 -8
- data/lib/poolparty/provider/haproxy.rb +0 -9
- data/lib/poolparty/provider/heartbeat.rb +0 -6
- data/lib/poolparty/provider/rsync.rb +0 -8
- data/lib/poolparty/provider/ruby.rb +0 -65
- data/lib/poolparty/provider/s3fuse.rb +0 -22
- data/lib/poolparty/remote_instance.rb +0 -250
- data/lib/poolparty/remoter.rb +0 -171
- data/lib/poolparty/remoting.rb +0 -137
- data/lib/poolparty/scheduler.rb +0 -93
- data/lib/poolparty/tasks.rb +0 -47
- data/lib/poolparty/tasks/development.rake +0 -78
- data/lib/poolparty/tasks/plugins.rake +0 -30
- data/lib/poolparty/thread_pool.rb +0 -94
- data/lib/s3/s3_object_store_folders.rb +0 -44
- data/poolparty.gemspec +0 -71
- data/spec/files/describe_response +0 -37
- data/spec/files/multi_describe_response +0 -69
- data/spec/files/remote_desc_response +0 -37
- data/spec/helpers/ec2_mock.rb +0 -57
- data/spec/lib/core/core_spec.rb +0 -26
- data/spec/lib/core/kernel_spec.rb +0 -24
- data/spec/lib/core/string_spec.rb +0 -28
- data/spec/lib/modules/callback_spec.rb +0 -213
- data/spec/lib/modules/file_writer_spec.rb +0 -74
- data/spec/lib/poolparty/application_spec.rb +0 -135
- data/spec/lib/poolparty/ec2_wrapper_spec.rb +0 -110
- data/spec/lib/poolparty/master_spec.rb +0 -479
- data/spec/lib/poolparty/optioner_spec.rb +0 -34
- data/spec/lib/poolparty/plugin_spec.rb +0 -115
- data/spec/lib/poolparty/poolparty_spec.rb +0 -60
- data/spec/lib/poolparty/provider_spec.rb +0 -74
- data/spec/lib/poolparty/remote_instance_spec.rb +0 -178
- data/spec/lib/poolparty/remoter_spec.rb +0 -72
- data/spec/lib/poolparty/remoting_spec.rb +0 -148
- data/spec/lib/poolparty/scheduler_spec.rb +0 -70
- data/spec/monitors/cpu_monitor_spec.rb +0 -39
- data/spec/monitors/memory_spec.rb +0 -51
- data/spec/monitors/misc_monitor_spec.rb +0 -51
- data/spec/monitors/web_spec.rb +0 -40
- data/spec/spec_helper.rb +0 -53
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
-
|
|
3
|
-
class TestClass
|
|
4
|
-
include FileWriter
|
|
5
|
-
end
|
|
6
|
-
describe "FileWriter" do
|
|
7
|
-
before(:each) do
|
|
8
|
-
# Application.reset!
|
|
9
|
-
@instance = RemoteInstance.new
|
|
10
|
-
@instance.stub!(:name).and_return "node0"
|
|
11
|
-
@instance.stub!(:ip).and_return "127.0.0.1"
|
|
12
|
-
@test = TestClass.new
|
|
13
|
-
end
|
|
14
|
-
describe "writing to the temp directory with a string" do
|
|
15
|
-
before(:each) do
|
|
16
|
-
@test.write_to_file_for("haproxy", @instance, "topical")
|
|
17
|
-
@outfile = "#{@test.base_tmp_dir}/node0-haproxy"
|
|
18
|
-
end
|
|
19
|
-
after(:each) do
|
|
20
|
-
FileUtils.rm @outfile
|
|
21
|
-
end
|
|
22
|
-
it "should be able to write a file to the tmp directory with a string" do
|
|
23
|
-
File.file?(@outfile).should == true
|
|
24
|
-
end
|
|
25
|
-
it "should be able to write to the file with the string" do
|
|
26
|
-
open(@outfile).read.should == "topical"
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
describe "writing to the temp directory with a block" do
|
|
31
|
-
before(:each) do
|
|
32
|
-
@test.write_to_file_for("haproxy", @instance) do
|
|
33
|
-
"Hello topical"
|
|
34
|
-
end
|
|
35
|
-
@outfile = "#{@test.base_tmp_dir}/node0-haproxy"
|
|
36
|
-
end
|
|
37
|
-
after(:each) do
|
|
38
|
-
FileUtils.rm @outfile
|
|
39
|
-
end
|
|
40
|
-
it "should be able to write a file to the tmp directory with a string" do
|
|
41
|
-
File.file?(@outfile).should == true
|
|
42
|
-
end
|
|
43
|
-
it "should be able to write to the file with the string" do
|
|
44
|
-
open(@outfile).read.should == "Hello topical"
|
|
45
|
-
end
|
|
46
|
-
describe "for output of block" do
|
|
47
|
-
before(:each) do
|
|
48
|
-
@test.write_to_file_for("haproxy", @instance) do
|
|
49
|
-
"Fix and me"
|
|
50
|
-
"Hello topical"
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
it "should just write the final output of the block to the file" do
|
|
54
|
-
open(@outfile).read.should == "Hello topical"
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
describe "without a node" do
|
|
60
|
-
before(:each) do
|
|
61
|
-
@test.write_to_file_for("haproxy") do
|
|
62
|
-
"Hello topical"
|
|
63
|
-
end
|
|
64
|
-
@outfile = "#{@test.base_tmp_dir}/haproxy"
|
|
65
|
-
end
|
|
66
|
-
after(:each) do
|
|
67
|
-
FileUtils.rm @outfile
|
|
68
|
-
end
|
|
69
|
-
it "should write to the master file without a node name" do
|
|
70
|
-
File.file?(@outfile).should == true
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
end
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
-
|
|
3
|
-
describe "Application" do
|
|
4
|
-
before(:each) do
|
|
5
|
-
stub_option_load
|
|
6
|
-
Application.reset!
|
|
7
|
-
Application.stub!(:keypair).and_return("testappkeypair")
|
|
8
|
-
end
|
|
9
|
-
describe "command line options" do
|
|
10
|
-
it "should destroy the default options with the commandline options" do
|
|
11
|
-
ARGV << ["-k", "testappkeypair"]
|
|
12
|
-
ARGV.should_receive(:dup).and_return ARGV
|
|
13
|
-
PoolParty.options.keypair.should == "testappkeypair"
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
it "should have the root_dir defined" do
|
|
17
|
-
PoolParty.root_dir.should_not be_nil
|
|
18
|
-
end
|
|
19
|
-
it "should be able to call on the haproxy_config_file" do
|
|
20
|
-
Application.haproxy_config_file.should_not be_nil
|
|
21
|
-
end
|
|
22
|
-
it "should be able to find the client_port" do
|
|
23
|
-
Application.options.should_receive(:client_port).and_return(7788)
|
|
24
|
-
Application.client_port.should == 7788
|
|
25
|
-
end
|
|
26
|
-
it "should always have cloud_master_takeover in the managed services list" do
|
|
27
|
-
Application.master_managed_services.should =~ /cloud_master_takeover/
|
|
28
|
-
end
|
|
29
|
-
it "should be able to say it is in development mode if it is in dev mode" do
|
|
30
|
-
Application.stub!(:environment).and_return("development")
|
|
31
|
-
Application.development?.should == true
|
|
32
|
-
end
|
|
33
|
-
it "should be able to say it is in production if it is in production" do
|
|
34
|
-
Application.stub!(:environment).and_return("production")
|
|
35
|
-
Application.production?.should == true
|
|
36
|
-
end
|
|
37
|
-
describe "keypair" do
|
|
38
|
-
before(:each) do
|
|
39
|
-
Application.stub!(:ec2_dir).and_return("~/.ec2")
|
|
40
|
-
Application.stub!(:keypair).and_return("poolparty")
|
|
41
|
-
end
|
|
42
|
-
it "should be able to say it's keypair path is in the $HOME/ directory" do
|
|
43
|
-
Application.keypair_path.should == "~/.ec2/id_rsa-poolparty"
|
|
44
|
-
end
|
|
45
|
-
it "should be able to say the keypair is of the structure id_rsa-keyname" do
|
|
46
|
-
Application.keypair_name.should == "id_rsa-poolparty"
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
it "should be able to show the version of the gem" do
|
|
50
|
-
Application.version.should_not be_nil
|
|
51
|
-
end
|
|
52
|
-
it "should show the version as a string" do
|
|
53
|
-
Application.version.class.should == String
|
|
54
|
-
end
|
|
55
|
-
describe "User data" do
|
|
56
|
-
before(:each) do
|
|
57
|
-
@str = ":access_key: 3.14159\n:secret_access_key: pi"
|
|
58
|
-
Application.options = nil
|
|
59
|
-
Application.stub!(:open).with("http://169.254.169.254/latest/user-data").and_return(@str)
|
|
60
|
-
@str.stub!(:read).and_return ":access_key: 3.14159\n:secret_access_key: pi"
|
|
61
|
-
end
|
|
62
|
-
describe "added data keypair_path" do
|
|
63
|
-
before(:each) do
|
|
64
|
-
@str.stub!(:read).and_return ":access_key: 3.14159\n:secret_access_key: pi\n:keypair_path: hopscotch"
|
|
65
|
-
end
|
|
66
|
-
it "should use the options keypair_path if it exists" do
|
|
67
|
-
Application.keypair_path.should == "hopscotch"
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
it "should try to load the user data into a yaml hash" do
|
|
71
|
-
YAML.should_receive(:load).with(":access_key: 3.14159\n:secret_access_key: pi")
|
|
72
|
-
Application.local_user_data
|
|
73
|
-
end
|
|
74
|
-
it "should be able to start instances with the the key access information on the user-data" do
|
|
75
|
-
Application.launching_user_data.should =~ /:access_key/
|
|
76
|
-
Application.launching_user_data.should =~ /:secret_access_key/
|
|
77
|
-
end
|
|
78
|
-
it "should be able to pull out the access_key from the user data" do
|
|
79
|
-
Application.local_user_data[:access_key].should == 3.14159
|
|
80
|
-
end
|
|
81
|
-
it "should be able tp pull out the secret_access_key from the user-data" do
|
|
82
|
-
Application.local_user_data[:secret_access_key].should == "pi"
|
|
83
|
-
end
|
|
84
|
-
it "should not have the application name in the user-data" do
|
|
85
|
-
Application.local_user_data[:application_name].should be_nil
|
|
86
|
-
end
|
|
87
|
-
it "should have the application_name in the options even though it is nil in the application" do
|
|
88
|
-
Application.options.app_name.should_not be_nil
|
|
89
|
-
end
|
|
90
|
-
it "should overwrite the default_options when passing in to the instance data" do
|
|
91
|
-
Application.stub!(:default_options).and_return({:access_key => 42})
|
|
92
|
-
Application.options.access_key.should == 3.14159
|
|
93
|
-
end
|
|
94
|
-
it "should have the required lauching hash" do
|
|
95
|
-
Application.hash_to_launch_with.should == {:access_key=>3.14159, :keypair_path=>"/mnt", :keypair=>"testappkeypair", :secret_access_key=>"pi", :user_data=>"", :polling_time=>"30.seconds"}
|
|
96
|
-
end
|
|
97
|
-
it "should create the hash_to_launch_with a YAML string" do
|
|
98
|
-
Application.launching_user_data.should == Application.hash_to_launch_with.to_yaml
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
it "should parse and use a config file if it is given for the options" do
|
|
102
|
-
YAML.should_receive(:load).at_least(1).and_return({:config_file => "config/sample-config.yml"})
|
|
103
|
-
Application.make_options(:config_file => "config/sample-config.yml")
|
|
104
|
-
end
|
|
105
|
-
describe "config file" do
|
|
106
|
-
before(:each) do
|
|
107
|
-
@str = ":access_key: 3.14159\n:secret_access_key: pi"
|
|
108
|
-
Application.options = nil
|
|
109
|
-
@str.stub!(:read).and_return ":access_key: 3.14159\n:secret_access_key: pi"
|
|
110
|
-
Application.make_options
|
|
111
|
-
end
|
|
112
|
-
it "should read the config file and use the options in the config file if it exists" do
|
|
113
|
-
Application.access_key.should == 3.14159
|
|
114
|
-
end
|
|
115
|
-
it "should set the secret_access_key if the config file exists" do
|
|
116
|
-
Application.secret_access_key.should == "pi"
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
it "should not read the config file if it is not passed and doesn't exist" do
|
|
120
|
-
File.stub!(:file?).and_return false
|
|
121
|
-
YAML.should_not_receive(:load).with("config/config.yml")
|
|
122
|
-
Application.make_options
|
|
123
|
-
end
|
|
124
|
-
it "should not read the config file if it is passed and doesn't exist" do
|
|
125
|
-
File.stub!(:file?).and_return false
|
|
126
|
-
YAML.should_not_receive(:load).with("config/config.yml")
|
|
127
|
-
Application.make_options(:config_file => "ted")
|
|
128
|
-
end
|
|
129
|
-
describe "defaults" do
|
|
130
|
-
it "should if EC2_HOME ENV is empty, then default to ~/.ec2" do
|
|
131
|
-
Application.make_options
|
|
132
|
-
Application.ec2_dir.should =~ /\/\.ec2/
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
-
require File.dirname(__FILE__) + "/../../helpers/ec2_mock"
|
|
3
|
-
|
|
4
|
-
class EC2Test
|
|
5
|
-
include Ec2Wrapper
|
|
6
|
-
|
|
7
|
-
def get_non_empty_instance_description
|
|
8
|
-
@resp ||= EC2::Response.parse(:xml => read_file("describe_response"))
|
|
9
|
-
end
|
|
10
|
-
def get_non_empty_instances_description
|
|
11
|
-
@resp2 ||= EC2::Response.parse(:xml => read_file("multi_describe_response"))
|
|
12
|
-
end
|
|
13
|
-
def get_remote_inst_desc
|
|
14
|
-
@resp3 = EC2::Response.parse(:xml => read_file("remote_desc_response"))
|
|
15
|
-
end
|
|
16
|
-
def read_file(name)
|
|
17
|
-
open("#{File.dirname(__FILE__)}/../../files/#{name}").read
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
describe "EC2ResponseObject" do
|
|
21
|
-
before(:each) do
|
|
22
|
-
@test = EC2Test.new
|
|
23
|
-
@r = @test.get_non_empty_instance_description
|
|
24
|
-
@rs = @test.get_non_empty_instances_description
|
|
25
|
-
@rst = @test.get_remote_inst_desc
|
|
26
|
-
end
|
|
27
|
-
describe "single instance" do
|
|
28
|
-
it "should be able to get the response object from the query" do
|
|
29
|
-
EC2ResponseObject.get_response_from(@r).should_not be_nil
|
|
30
|
-
end
|
|
31
|
-
it "should return an EC2:Response from EC2ResponseObject.get_response_from" do
|
|
32
|
-
EC2ResponseObject.get_response_from(@r).class.should == EC2::Response
|
|
33
|
-
end
|
|
34
|
-
it "should be able to grab the keypair name from the response object" do
|
|
35
|
-
EC2ResponseObject.get_response_from(@r).instancesSet.item.instanceId.should == "i-60bc6a09"
|
|
36
|
-
end
|
|
37
|
-
it "should be able to list out the running instances" do
|
|
38
|
-
EC2ResponseObject.get_descriptions(@r)
|
|
39
|
-
end
|
|
40
|
-
it "should return an array of instances" do
|
|
41
|
-
EC2ResponseObject.get_descriptions(@r).class.should == Array
|
|
42
|
-
end
|
|
43
|
-
it "should be able to iterate through the instances" do
|
|
44
|
-
EC2ResponseObject.get_descriptions(@r).select {|a| a[:keypair] == "auser"}.should_not be_empty
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
describe "multiple responses" do
|
|
48
|
-
it "should be able to get the response object from the query" do
|
|
49
|
-
EC2ResponseObject.get_response_from(@r).should_not be_nil
|
|
50
|
-
end
|
|
51
|
-
it "should return an EC2:Response from EC2ResponseObject.get_response_from" do
|
|
52
|
-
EC2ResponseObject.get_response_from(@r).class.should == EC2::Response
|
|
53
|
-
end
|
|
54
|
-
it "should be able to grab the keypair name from the response object" do
|
|
55
|
-
EC2ResponseObject.get_response_from(@r).instancesSet.item.instanceId.should == "i-60bc6a09"
|
|
56
|
-
end
|
|
57
|
-
it "should be able to list out the running instances" do
|
|
58
|
-
EC2ResponseObject.get_descriptions(@r)
|
|
59
|
-
end
|
|
60
|
-
it "should return an array of instances" do
|
|
61
|
-
EC2ResponseObject.get_descriptions(@r).class.should == Array
|
|
62
|
-
end
|
|
63
|
-
it "should be able to iterate through the instances" do
|
|
64
|
-
EC2ResponseObject.get_descriptions(@r).select {|a| a[:keypair] == "auser"}.should_not be_empty
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
describe "multiple responses" do
|
|
68
|
-
it "should be able to get the response object from the query" do
|
|
69
|
-
EC2ResponseObject.get_response_from(@rst).should_not be_nil
|
|
70
|
-
end
|
|
71
|
-
it "should return an EC2:Response from EC2ResponseObject.get_response_from" do
|
|
72
|
-
EC2ResponseObject.get_response_from(@rst).class.should == EC2::Response
|
|
73
|
-
end
|
|
74
|
-
it "should be able to grab the keypair name from the response object" do
|
|
75
|
-
EC2ResponseObject.get_response_from(@rst).instancesSet.item.instanceId.should == "i-94f82efd"
|
|
76
|
-
end
|
|
77
|
-
it "should be able to list out the running instances" do
|
|
78
|
-
EC2ResponseObject.get_descriptions(@rst)
|
|
79
|
-
end
|
|
80
|
-
it "should return an array of instances" do
|
|
81
|
-
EC2ResponseObject.get_descriptions(@rst).class.should == Array
|
|
82
|
-
end
|
|
83
|
-
it "should be able to iterate through the instances" do
|
|
84
|
-
EC2ResponseObject.get_descriptions(@rst).select {|a| a[:keypair] == "auser"}.should_not be_empty
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
describe "launching" do
|
|
88
|
-
before(:each) do
|
|
89
|
-
@test.ec2.stub!(:run_instances).and_return true
|
|
90
|
-
end
|
|
91
|
-
it "should launch with the ami" do
|
|
92
|
-
Application.should_receive(:ami).once.and_return("ami-abcdefg")
|
|
93
|
-
end
|
|
94
|
-
it "should with the user data" do
|
|
95
|
-
Application.should_receive(:launching_user_data).once.and_return("")
|
|
96
|
-
end
|
|
97
|
-
it "should launch with the Application keypair" do
|
|
98
|
-
Application.should_receive(:keypair)
|
|
99
|
-
end
|
|
100
|
-
it "should launch with the requested size" do
|
|
101
|
-
Application.should_receive(:size)
|
|
102
|
-
end
|
|
103
|
-
it "should try to run the instances" do
|
|
104
|
-
@test.ec2.should_receive(:run_instances)
|
|
105
|
-
end
|
|
106
|
-
after do
|
|
107
|
-
@test.launch_new_instance!
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
|
@@ -1,479 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
-
require File.dirname(__FILE__) + '/../../helpers/ec2_mock'
|
|
3
|
-
|
|
4
|
-
describe "Master" do
|
|
5
|
-
before(:each) do
|
|
6
|
-
stub_option_load
|
|
7
|
-
Kernel.stub!(:system).and_return true
|
|
8
|
-
Kernel.stub!(:exec).and_return true
|
|
9
|
-
Kernel.stub!(:sleep).and_return true # WHy wait?, just do it
|
|
10
|
-
|
|
11
|
-
Application.options
|
|
12
|
-
|
|
13
|
-
Application.options.stub!(:contract_when).and_return("web > 30.0\n cpu > 0.80")
|
|
14
|
-
Application.options.stub!(:expand_when).and_return("web < 3.0\n cpu > 0.80")
|
|
15
|
-
@master = Master.new
|
|
16
|
-
end
|
|
17
|
-
after(:all) do
|
|
18
|
-
@master.cleanup_tmp_directory(nil)
|
|
19
|
-
end
|
|
20
|
-
it "should launch the first instances and set the first as the master and the rest as slaves" do
|
|
21
|
-
Application.stub!(:minimum_instances).and_return(1)
|
|
22
|
-
Application.stub!(:verbose).and_return(false) # Hide messages
|
|
23
|
-
Master.stub!(:new).and_return(@master)
|
|
24
|
-
|
|
25
|
-
@master.stub!(:number_of_running_instances).and_return(0);
|
|
26
|
-
@master.stub!(:number_of_pending_instances).and_return(0);
|
|
27
|
-
@master.stub!(:wait).and_return true
|
|
28
|
-
|
|
29
|
-
@master.should_receive(:launch_new_instance!).and_return(
|
|
30
|
-
{:instance_id => "i-5849ba", :ip => "127.0.0.1", :status => "running"})
|
|
31
|
-
@master.stub!(:list_of_nonterminated_instances).and_return(
|
|
32
|
-
[{:instance_id => "i-5849ba", :ip => "127.0.0.1", :status => "running"}])
|
|
33
|
-
|
|
34
|
-
node = RemoteInstance.new({:instance_id => "i-5849ba", :ip => "127.0.0.1", :status => "running"})
|
|
35
|
-
node.stub!(:scp).and_return "true"
|
|
36
|
-
node.stub!(:ssh).and_return "true"
|
|
37
|
-
|
|
38
|
-
@master.stub!(:number_of_pending_instances).and_return(0)
|
|
39
|
-
@master.stub!(:get_node).with(0).and_return node
|
|
40
|
-
@master.start_cloud!
|
|
41
|
-
|
|
42
|
-
@master.nodes.first.instance_id.should == "i-5849ba"
|
|
43
|
-
end
|
|
44
|
-
describe "Singleton methods" do
|
|
45
|
-
before(:each) do
|
|
46
|
-
@master = Master.new
|
|
47
|
-
@instance = RemoteInstance.new
|
|
48
|
-
@instance.stub!(:ip).and_return "127.0.0.1"
|
|
49
|
-
@blk = Proc.new {puts "new"}
|
|
50
|
-
Master.stub!(:new).once.and_return @master
|
|
51
|
-
end
|
|
52
|
-
it "should be able to run with_nodes" do
|
|
53
|
-
Master.should_receive(:new).once.and_return @master
|
|
54
|
-
@master.should_receive(:nodes).once.and_return []
|
|
55
|
-
Master.with_nodes &@blk
|
|
56
|
-
end
|
|
57
|
-
it "should run the block on each node" do
|
|
58
|
-
collection = [@instance]
|
|
59
|
-
@master.should_receive(:nodes).once.and_return collection
|
|
60
|
-
collection.should_receive(:each).once
|
|
61
|
-
Master.with_nodes &@blk
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
describe "with stubbed instances" do
|
|
65
|
-
before(:each) do
|
|
66
|
-
@master.stub!(:list_of_nonterminated_instances).and_return([
|
|
67
|
-
{:instance_id => "i-5849ba", :ip => "127.0.0.1", :status => "running"},
|
|
68
|
-
{:instance_id => "i-5849bb", :ip => "127.0.0.2", :status => "running"},
|
|
69
|
-
{:instance_id => "i-5849bc", :ip => "127.0.0.3", :status => "pending"}
|
|
70
|
-
])
|
|
71
|
-
Kernel.stub!(:exec).and_return true
|
|
72
|
-
@instance = RemoteInstance.new
|
|
73
|
-
@instance.stub!(:ip).and_return("127.0.0.1")
|
|
74
|
-
@instance.stub!(:name).and_return("node0")
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it "should be able to go through the instances and assign them numbers" do
|
|
78
|
-
i = 0
|
|
79
|
-
@master.nodes.each do |node|
|
|
80
|
-
node.number.should == i
|
|
81
|
-
i += 1
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
it "should be able to say that the master is the master" do
|
|
85
|
-
@master.nodes.first.master?.should == true
|
|
86
|
-
end
|
|
87
|
-
it "should be able to say that the slave is not a master" do
|
|
88
|
-
@master.nodes[1].master?.should == false
|
|
89
|
-
end
|
|
90
|
-
it "should be able to get a specific node in the nodes from the master" do
|
|
91
|
-
@master.get_node(2).instance_id.should == "i-5849bc"
|
|
92
|
-
end
|
|
93
|
-
it "should be able to get the next node" do
|
|
94
|
-
@master.get_next_node(@instance).instance_id.should == "i-5849bb"
|
|
95
|
-
end
|
|
96
|
-
it "should be able to build a hosts file" do
|
|
97
|
-
open(@master.build_hosts_file_for(@instance).path).read.should == "127.0.0.1 node0\n127.0.0.1 localhost.localdomain localhost ubuntu\n127.0.0.2 node1\n127.0.0.3 node2"
|
|
98
|
-
end
|
|
99
|
-
it "should be able to build a hosts file for a specific instance" do
|
|
100
|
-
open(@master.build_hosts_file_for(@instance).path).read.should =~ /127\.0\.0\.1 node0/
|
|
101
|
-
end
|
|
102
|
-
it "should be able to build a haproxy file" do
|
|
103
|
-
open(@master.build_haproxy_file.path).read.should =~ /server node0 127\.0\.0\.1:#{Application.client_port}/
|
|
104
|
-
end
|
|
105
|
-
it "should be able to reconfigure the instances (working on two files a piece)" do
|
|
106
|
-
@master.should_receive(:remote_configure_instances).and_return true
|
|
107
|
-
@master.stub!(:number_of_unconfigured_nodes).and_return 1
|
|
108
|
-
@master.reconfigure_cloud_when_necessary
|
|
109
|
-
end
|
|
110
|
-
it "should return the number of unconfigured nodes when asked" do
|
|
111
|
-
@master.nodes.each {|node| node.stub!(:stack_installed?).and_return(node.master? ? false : true) }
|
|
112
|
-
@master.number_of_unconfigured_nodes.should == 1
|
|
113
|
-
end
|
|
114
|
-
it "should be able to return the size of the cloud" do
|
|
115
|
-
@master.nodes.size.should == 3
|
|
116
|
-
end
|
|
117
|
-
# it "should be able to restart the running instances' services" do
|
|
118
|
-
# @master.nodes.each {|a| a.should_receive(:restart_with_monit).and_return true }
|
|
119
|
-
# @master.restart_running_instances_services
|
|
120
|
-
# end
|
|
121
|
-
it "should be able to build a heartbeat auth file" do
|
|
122
|
-
open(@master.build_and_copy_heartbeat_authkeys_file.path).read.should =~ /1 md5/
|
|
123
|
-
end
|
|
124
|
-
describe "configuration" do
|
|
125
|
-
describe "sending configuration files" do
|
|
126
|
-
before(:each) do
|
|
127
|
-
Master.stub!(:new).and_return(@master)
|
|
128
|
-
@master.stub!(:ssh)
|
|
129
|
-
@master.stub!(:scp)
|
|
130
|
-
@master.nodes.each do |node|
|
|
131
|
-
node.stub!(:ssh)
|
|
132
|
-
node.stub!(:scp)
|
|
133
|
-
node.stub!(:stack_installed?).and_return true
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
it "should be able to build a heartbeat resources file for the specific node" do
|
|
137
|
-
open(@master.build_heartbeat_resources_file_for(@master.nodes.first).path).read.should == "node0 127.0.0.1\nnode1 127.0.0.2"
|
|
138
|
-
end
|
|
139
|
-
it "should be able to build a heartbeat config file" do
|
|
140
|
-
open(@master.build_heartbeat_config_file_for(@master.nodes.first).path).read.should =~ /\nnode node0\nnode node1/
|
|
141
|
-
end
|
|
142
|
-
it "should be able to say if heartbeat is necessary with more than 1 server or not" do
|
|
143
|
-
Master.requires_heartbeat?.should == true
|
|
144
|
-
end
|
|
145
|
-
it "should be able to say that heartbeat is not necessary if there is 1 server" do
|
|
146
|
-
@master.stub!(:nodes).and_return([
|
|
147
|
-
{:instance_id => "i-5849ba", :ip => "127.0.0.1", :status => "running"}
|
|
148
|
-
])
|
|
149
|
-
Master.requires_heartbeat?.should == false
|
|
150
|
-
end
|
|
151
|
-
it "should only install the stack on nodes that don't have it marked locally as installed" do
|
|
152
|
-
@master.nodes.each {|i| i.should_receive(:stack_installed?).at_least(1).and_return(true)}
|
|
153
|
-
@master.should_not_receive(:reconfigure_running_instances)
|
|
154
|
-
@master.reconfigure_cloud_when_necessary
|
|
155
|
-
end
|
|
156
|
-
it "should install the stack on all the nodes (because it needs reconfiguring) if there is any node that needs the stack" do
|
|
157
|
-
@master.nodes.first.should_receive(:stack_installed?).at_least(1).and_return(false)
|
|
158
|
-
@master.should_receive(:configure_cloud).once.and_return(true)
|
|
159
|
-
@master.reconfigure_cloud_when_necessary
|
|
160
|
-
end
|
|
161
|
-
describe "rsync'ing the files to the instances" do
|
|
162
|
-
it "should cleanup the tmp directory before sending configuration to the nodes" do
|
|
163
|
-
@master.should_receive(:cleanup_tmp_directory).at_least(1)
|
|
164
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
165
|
-
end
|
|
166
|
-
it "should receive send_config_files_to_nodes after it builds the config files in the temp directory" do
|
|
167
|
-
@master.should_receive(:send_config_files_to_nodes).at_least(1)
|
|
168
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
169
|
-
end
|
|
170
|
-
it "should run_array_of_tasks(scp_tasks)" do
|
|
171
|
-
@master.should_receive(:run_array_of_tasks).at_least(1).and_return true
|
|
172
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
173
|
-
end
|
|
174
|
-
it "should compile a list of files to rsync" do
|
|
175
|
-
@master.stub!(:run_array_of_tasks).and_return true
|
|
176
|
-
@master.rsync_tasks("#{@master.base_tmp_dir}", "tmp")[0].should =~ /rsync/
|
|
177
|
-
end
|
|
178
|
-
end
|
|
179
|
-
describe "remote configuration" do
|
|
180
|
-
before(:each) do
|
|
181
|
-
@master.stub!(:nodes).and_return [@instance]
|
|
182
|
-
end
|
|
183
|
-
it "should call remote_configure_instances when configuring" do
|
|
184
|
-
@master.should_receive(:remote_configure_instances).and_return true
|
|
185
|
-
@master.configure_cloud
|
|
186
|
-
end
|
|
187
|
-
it "should change the configuration script into an executable and run it" do
|
|
188
|
-
@master.should_receive(:run_array_of_tasks).and_return true
|
|
189
|
-
@master.remote_configure_instances
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
describe "installation" do
|
|
196
|
-
it "should not install on the instances if the application doesn't say it should" do
|
|
197
|
-
Application.stub!(:install_on_load?).and_return false
|
|
198
|
-
Provider.should_not_receive(:install_poolparty)
|
|
199
|
-
@master.install_cloud
|
|
200
|
-
end
|
|
201
|
-
describe "when asked" do
|
|
202
|
-
before(:each) do
|
|
203
|
-
Application.stub!(:install_on_load?).and_return true
|
|
204
|
-
Sprinkle::Script.stub!(:sprinkle).and_return true
|
|
205
|
-
Provider.stub!(:install_poolparty).and_return true
|
|
206
|
-
@master.stub!(:ssh).and_return true
|
|
207
|
-
@master.nodes.each do |node|
|
|
208
|
-
node.stub!(:run_now).and_return true
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
after(:all) do
|
|
212
|
-
Kernel.system("ssh-add -d #{Application.keypair_path} >/dev/null 2>/dev/null")
|
|
213
|
-
end
|
|
214
|
-
it "should install on the instances if the application says it should" do
|
|
215
|
-
Provider.should_receive(:install_poolparty)
|
|
216
|
-
@master.install_cloud
|
|
217
|
-
end
|
|
218
|
-
it "should execute the remote tasks on all of the instances" do
|
|
219
|
-
@master.should_receive(:ssh).and_return true
|
|
220
|
-
@master.install_cloud
|
|
221
|
-
end
|
|
222
|
-
it "should store the ssh keypair before install" do
|
|
223
|
-
Kernel.should_receive(:system).with("ssh-add #{Application.keypair_path} >/dev/null 2>/dev/null").at_least(1).and_return true
|
|
224
|
-
@master.install_cloud
|
|
225
|
-
end
|
|
226
|
-
it "should delete the ssh keypair after configure_cloud" do
|
|
227
|
-
Kernel.should_receive_at_least_once(:system).with("ssh-add -d #{Application.keypair_name} >/dev/null 2>/dev/null").and_return true
|
|
228
|
-
@master.configure_cloud
|
|
229
|
-
end
|
|
230
|
-
describe "stubbing installation" do
|
|
231
|
-
before(:each) do
|
|
232
|
-
@master.stub!(:execute_tasks).and_return true
|
|
233
|
-
end
|
|
234
|
-
it "should install poolparty" do
|
|
235
|
-
Provider.should_receive(:install_poolparty).and_return true
|
|
236
|
-
@master.install_cloud
|
|
237
|
-
end
|
|
238
|
-
it "should install the user packages" do
|
|
239
|
-
Provider.should_receive(:install_poolparty).and_return true
|
|
240
|
-
@master.install_cloud
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
end
|
|
245
|
-
describe "displaying" do
|
|
246
|
-
it "should be able to list the cloud instances" do
|
|
247
|
-
@master.list.should =~ /CLOUD \(/
|
|
248
|
-
end
|
|
249
|
-
end
|
|
250
|
-
it "should be able to grab a list of the instances" do
|
|
251
|
-
@master.cloud_ips.should == %w(127.0.0.1 127.0.0.2 127.0.0.3)
|
|
252
|
-
end
|
|
253
|
-
describe "starting" do
|
|
254
|
-
before(:each) do
|
|
255
|
-
Kernel.stub!(:sleep).and_return true
|
|
256
|
-
end
|
|
257
|
-
it "should request to launch the minimum number of instances" do
|
|
258
|
-
Application.stub!(:minimum_instances).and_return 3
|
|
259
|
-
@master.stub!(:number_of_pending_and_running_instances).and_return 1
|
|
260
|
-
@master.should_receive(:request_launch_new_instances).with(2).and_return true
|
|
261
|
-
@master.launch_minimum_instances
|
|
262
|
-
end
|
|
263
|
-
end
|
|
264
|
-
describe "monitoring" do
|
|
265
|
-
it "should start the monitor when calling start_monitor!" do
|
|
266
|
-
@master.should_receive(:run_thread_loop).and_return(Proc.new {})
|
|
267
|
-
@master.start_monitor!
|
|
268
|
-
end
|
|
269
|
-
it "should request to launch a new instance" do
|
|
270
|
-
@master.should_receive(:add_instance_if_load_is_high).and_return(true)
|
|
271
|
-
@master.add_instance_if_load_is_high
|
|
272
|
-
end
|
|
273
|
-
it "should request to terminate a non-master instance if the load" do
|
|
274
|
-
@master.should_receive(:contract?).and_return(true)
|
|
275
|
-
@master.should_receive(:request_termination_of_instance).and_return(true)
|
|
276
|
-
@master.terminate_instance_if_load_is_low
|
|
277
|
-
end
|
|
278
|
-
it "should launch the minimum_instances when the minimum aren't launched"
|
|
279
|
-
it "should reconfigure the cloud if it's necessary to do so"
|
|
280
|
-
it "should try to scale the cloud when monitoring"
|
|
281
|
-
it "should check the stats of the cloud"
|
|
282
|
-
end
|
|
283
|
-
describe "expanding and contracting" do
|
|
284
|
-
before(:each) do
|
|
285
|
-
Application.options.stub!(:contract_when).and_return("web > 30.0\n cpu > 0.80")
|
|
286
|
-
Application.options.stub!(:expand_when).and_return("web < 3.0\n cpu > 0.80")
|
|
287
|
-
end
|
|
288
|
-
it "should be able to say that it should not contract" do
|
|
289
|
-
@master.stub!(:web).and_return(10.2)
|
|
290
|
-
@master.stub!(:cpu).and_return(0.32)
|
|
291
|
-
|
|
292
|
-
@master.contract?.should == false
|
|
293
|
-
end
|
|
294
|
-
# This works when run inside textmate or individually, but does not work
|
|
295
|
-
# when run solo using rake spec
|
|
296
|
-
it "should be able to say that it should contract"
|
|
297
|
-
# @master.should_receive(:cpu).at_least(1).and_return(0.95)
|
|
298
|
-
# @master.should_receive(:web).at_least(1).and_return(35.2)
|
|
299
|
-
#
|
|
300
|
-
# @master.contract?.should == true
|
|
301
|
-
# end
|
|
302
|
-
it "should be able to say that it should not expand if it shouldn't expand" do
|
|
303
|
-
@master.stub!(:web).and_return(30.2)
|
|
304
|
-
@master.stub!(:cpu).and_return(0.92)
|
|
305
|
-
|
|
306
|
-
@master.expand?.should == false
|
|
307
|
-
end
|
|
308
|
-
# This works when run inside textmate or individually, but does not work
|
|
309
|
-
# when run solo using rake spec
|
|
310
|
-
it "should be able to say that it should expand if it should expand"
|
|
311
|
-
# @master.stub!(:web).and_return(1.2)
|
|
312
|
-
# @master.stub!(:cpu).and_return(0.92)
|
|
313
|
-
#
|
|
314
|
-
# @master.should_receive(:web).once.and_return(1.2)
|
|
315
|
-
# @master.expand?.should == true
|
|
316
|
-
# end
|
|
317
|
-
describe "scaling" do
|
|
318
|
-
before(:each) do
|
|
319
|
-
Kernel.stub!(:sleep).and_return true
|
|
320
|
-
@master.stub!(:wait_for_all_instances_to_boot).and_return true
|
|
321
|
-
@master.stub!(:wait_for_all_instances_to_terminate).and_return true
|
|
322
|
-
end
|
|
323
|
-
it "should try to add a new instance" do
|
|
324
|
-
@master.should_receive(:add_instance_if_load_is_high).and_return true
|
|
325
|
-
@master.scale_cloud!
|
|
326
|
-
end
|
|
327
|
-
it "should try to terminate an instance" do
|
|
328
|
-
@master.should_receive(:terminate_instance_if_load_is_low).and_return true
|
|
329
|
-
@master.scale_cloud!
|
|
330
|
-
end
|
|
331
|
-
it "should try to grow the cloud by 1 node when asked" do
|
|
332
|
-
@master.should_receive(:request_launch_new_instances).once.and_return true
|
|
333
|
-
@master.should_receive(:configure_cloud).once.and_return true
|
|
334
|
-
@master.grow_by(1)
|
|
335
|
-
end
|
|
336
|
-
it "should try to shrink the cloud by 1 when asked" do
|
|
337
|
-
@master.should_receive(:request_termination_of_instance).and_return true
|
|
338
|
-
@master.should_receive(:configure_cloud).and_return true
|
|
339
|
-
@master.shrink_by(1)
|
|
340
|
-
end
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
describe "Configuration" do
|
|
344
|
-
before(:each) do
|
|
345
|
-
@instance = RemoteInstance.new
|
|
346
|
-
end
|
|
347
|
-
it "should be able to build the haproxy file" do
|
|
348
|
-
@master.build_haproxy_file
|
|
349
|
-
end
|
|
350
|
-
describe "by copying files to the poolpartytmp directory" do
|
|
351
|
-
it "should build and copy files to the tmp directory" do
|
|
352
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
353
|
-
File.directory?(@master.base_tmp_dir).should == true
|
|
354
|
-
end
|
|
355
|
-
it "should copy the cloud_master_takeover script to the tmp directory" do
|
|
356
|
-
@master.should_not_receive(:get_config_file_for)
|
|
357
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
358
|
-
end
|
|
359
|
-
it "should tar the plugin_dir into the tmp directory" do
|
|
360
|
-
FileUtils.mkdir_p Application.plugin_dir rescue ""
|
|
361
|
-
|
|
362
|
-
Kernel.should_receive(:system).with("tar -czf #{@master.base_tmp_dir}/plugins.tar.gz #{File.basename(Application.plugin_dir)}").and_return true
|
|
363
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
364
|
-
end
|
|
365
|
-
it "should try to copy the pem files" do
|
|
366
|
-
@master.should_receive(:copy_pem_files_to_tmp_dir).and_return true
|
|
367
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
368
|
-
end
|
|
369
|
-
it "should try to copy the cert file"
|
|
370
|
-
it "should try the copy the pk file"
|
|
371
|
-
describe "get configs" do
|
|
372
|
-
before(:each) do
|
|
373
|
-
@master.stub!(:user_dir).and_return("user")
|
|
374
|
-
@master.stub!(:root_dir).and_return("root")
|
|
375
|
-
end
|
|
376
|
-
it "should try to get the config file in the user directory before the root_dir" do
|
|
377
|
-
File.should_receive(:exists?).with("#{@master.user_dir}/config/config.yml").and_return true
|
|
378
|
-
@master.get_config_file_for("config.yml").should == "user/config/config.yml"
|
|
379
|
-
end
|
|
380
|
-
it "should try to get the config file in the root directory if it doesn't exist in the user directory" do
|
|
381
|
-
File.should_receive(:exists?).with("#{@master.user_dir}/config/config.yml").and_return false
|
|
382
|
-
@master.get_config_file_for("config.yml").should == "root/config/config.yml"
|
|
383
|
-
end
|
|
384
|
-
end
|
|
385
|
-
it "should copy the config file if it exists" do
|
|
386
|
-
Application.stub!(:config_file).and_return "config.yml"
|
|
387
|
-
File.stub!(:exists?).and_return true
|
|
388
|
-
File.should_receive(:copy).at_least(2).times.and_return true
|
|
389
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
390
|
-
end
|
|
391
|
-
describe "with copy_config_files_in_directory_to_tmp_dir method" do
|
|
392
|
-
before(:each) do
|
|
393
|
-
@instance2 = RemoteInstance.new
|
|
394
|
-
@instance2.stub!(:ip).and_return "127.0.0.2"
|
|
395
|
-
Master.stub!(:new).and_return @master
|
|
396
|
-
@master.stub!(:nodes).and_return [@instance, @instance2]
|
|
397
|
-
end
|
|
398
|
-
it "should be able to clean up after itself" do
|
|
399
|
-
File.open("#{@master.base_tmp_dir}/test", "w+") {|f| f << "hello world"}
|
|
400
|
-
@master.cleanup_tmp_directory(nil)
|
|
401
|
-
File.file?("#{@master.base_tmp_dir}/test").should == false
|
|
402
|
-
end
|
|
403
|
-
it "should check to see if there is a directory in the user directory to grab the files from" do
|
|
404
|
-
File.stub!(:directory?).with("/Users/auser/Sites/work/citrusbyte/internal/gems/poolparty/pool/tmp/resource.d").and_return false
|
|
405
|
-
File.should_receive(:directory?).at_least(1).with("#{user_dir}/config/resource.d").at_least(1).and_return true
|
|
406
|
-
@master.copy_config_files_in_directory_to_tmp_dir("config/resource.d")
|
|
407
|
-
end
|
|
408
|
-
it "should copy all the files that are in the directory" do
|
|
409
|
-
Dir.stub!(:[]).and_return ["1","2","3"]
|
|
410
|
-
File.should_receive(:copy).exactly(3).times.and_return true
|
|
411
|
-
@master.copy_config_files_in_directory_to_tmp_dir("config/resource.d")
|
|
412
|
-
end
|
|
413
|
-
describe "building" do
|
|
414
|
-
it "should copy all the resource.d files from the monit directory to the tmp directory" do
|
|
415
|
-
@master.should_receive_at_least_once(:copy_config_files_in_directory_to_tmp_dir).with("config/resource.d").and_return true
|
|
416
|
-
end
|
|
417
|
-
it "should build the authkeys file for haproxy" do
|
|
418
|
-
@master.should_receive(:build_and_copy_heartbeat_authkeys_file).and_return true
|
|
419
|
-
end
|
|
420
|
-
it "should build the haproxy configuration file" do
|
|
421
|
-
@master.should_receive(:build_haproxy_file).and_return true
|
|
422
|
-
end
|
|
423
|
-
it "should build the nodes list file" do
|
|
424
|
-
@master.should_receive(:build_nodes_list).and_return true
|
|
425
|
-
end
|
|
426
|
-
it "should build the hosts file for nodes" do
|
|
427
|
-
@master.should_receive(:build_hosts_file_for).at_least(1).and_return true
|
|
428
|
-
end
|
|
429
|
-
it "should build the ssh reconfigure script" do
|
|
430
|
-
@master.should_receive(:build_reconfigure_instances_script_for).at_least(1).and_return ""
|
|
431
|
-
end
|
|
432
|
-
it "should build global files" do
|
|
433
|
-
Master.should_receive(:build_user_global_files).once
|
|
434
|
-
end
|
|
435
|
-
it "should build user node files" do
|
|
436
|
-
Master.should_receive(:build_user_node_files_for).at_least(1)
|
|
437
|
-
end
|
|
438
|
-
after(:each) do
|
|
439
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
440
|
-
end
|
|
441
|
-
end
|
|
442
|
-
describe "when the cloud requires heartbeat" do
|
|
443
|
-
before(:each) do
|
|
444
|
-
Master.stub!(:requires_heartbeat?).and_return true
|
|
445
|
-
end
|
|
446
|
-
it "should build the heartbeat configuration file" do
|
|
447
|
-
@master.should_receive(:build_heartbeat_config_file_for).at_least(1).and_return true
|
|
448
|
-
@master.build_and_send_config_files_in_temp_directory
|
|
449
|
-
end
|
|
450
|
-
end
|
|
451
|
-
end
|
|
452
|
-
describe "user define files" do
|
|
453
|
-
it "should have access to global_user_files as an array" do
|
|
454
|
-
Master.global_user_files.class.should == Array
|
|
455
|
-
end
|
|
456
|
-
it "should be able to add a global file to the array" do
|
|
457
|
-
Master.define_global_user_file(:box) {"box"}
|
|
458
|
-
Master.global_user_files.size.should == 1
|
|
459
|
-
end
|
|
460
|
-
it "should have access to user_node_files as an array" do
|
|
461
|
-
Master.user_node_files.class.should == Array
|
|
462
|
-
end
|
|
463
|
-
it "should be able to add a node file to the array" do
|
|
464
|
-
Master.define_node_user_file(:box) {|a| "#{a}.box"}
|
|
465
|
-
Master.user_node_files.size.should == 1
|
|
466
|
-
end
|
|
467
|
-
it "should write_to_file_for for each of the global_user_files" do
|
|
468
|
-
Master.should_receive(:write_to_file_for).once.and_return true
|
|
469
|
-
Master.build_user_global_files
|
|
470
|
-
end
|
|
471
|
-
it "should write_to_file_for for each of the user_node_files" do
|
|
472
|
-
Master.should_receive(:write_to_file_for).once.and_return true
|
|
473
|
-
Master.build_user_node_files_for(@instance)
|
|
474
|
-
end
|
|
475
|
-
end
|
|
476
|
-
end
|
|
477
|
-
end
|
|
478
|
-
end
|
|
479
|
-
end
|