cloudster 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -19,10 +19,13 @@ Create AWS EC2 resources as shown here:
19
19
  :image_id => 'ami_image_id',
20
20
  :instance_type => 't1.micro'
21
21
  )
22
- app_server_2 = Cloudster::Ec2.new(:name => 'AppServer',
22
+ app_server_2 = Cloudster::Ec2.new(:name => 'AppServer2',
23
23
  :key_name => 'mykey',
24
24
  :image_id => 'ami_image_id'
25
25
  )
26
+ load_balancer = Cloudster::Elb.new(:name => 'LoadBalancer',
27
+ :instance_names => ['AppServer', 'AppServer2']
28
+ )
26
29
 
27
30
  Create a stack out of the resources :
28
31
 
@@ -35,15 +38,11 @@ Now you can do stuff like :
35
38
  app_server.template
36
39
  - Get the CloudFormation template for the stack :
37
40
 
38
- stack.template(:resources => [app_server, app_server_2], :description => 'Description of the stack')
41
+ stack.template(:resources => [app_server, app_server_2, load_balancer], :description => 'Description of the stack')
39
42
 
40
43
  - Provision the stack :
41
44
 
42
- stack.provision(:resources => [app_server, app_server_2], :stack_name => 'TestStack', :description => 'Description of the stack')
43
-
44
- - Update the stack :
45
-
46
- stack.update(:resources => [app_server, app_server_2], :stack_name => 'TestStack', :description => 'Description of the stack')
45
+ stack.provision(:resources => [app_server, app_server_2, load_balancer], :stack_name => 'TestStack', :description => 'Description of the stack')
47
46
 
48
47
  - You can get the events of a stack using :
49
48
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.3.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "cloudster"
8
- s.version = "2.2.0"
8
+ s.version = "2.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Emil Soman"]
12
- s.date = "2012-10-29"
12
+ s.date = "2012-10-30"
13
13
  s.description = "Cloudster uses the AWS APIs to provision stacks on Amazon Cloud."
14
14
  s.email = "emil.soman@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -29,9 +29,11 @@ Gem::Specification.new do |s|
29
29
  "lib/cloudster.rb",
30
30
  "lib/cloudster/cloud.rb",
31
31
  "lib/cloudster/ec2.rb",
32
+ "lib/cloudster/elb.rb",
32
33
  "lib/cloudster/options_manager.rb",
33
34
  "spec/cloud_spec.rb",
34
35
  "spec/ec2_spec.rb",
36
+ "spec/elb_spec.rb",
35
37
  "spec/spec_helper.rb"
36
38
  ]
37
39
  s.homepage = "http://github.com/emilsoman/cloudster"
@@ -5,4 +5,5 @@ require 'fog'
5
5
  require 'cloudster/options_manager'
6
6
  include OptionsManager
7
7
  require 'cloudster/ec2'
8
+ require 'cloudster/elb'
8
9
  require 'cloudster/cloud'
@@ -0,0 +1,94 @@
1
+ module Cloudster
2
+ #==Elb resource
3
+ class Elb
4
+
5
+ # Initialize an Elb instance
6
+ #
7
+ # ==== Notes
8
+ # options parameter must include values for :name, :instance_names
9
+ #
10
+ # ==== Examples
11
+ # elb = Cloudster::Elb.new(
12
+ # :name => 'LoadBalancer',
13
+ # :instance_names => ['AppServer1','AppServer2']
14
+ # )
15
+ #
16
+ # ==== Parameters
17
+ # * options<~Hash> -
18
+ # * :name: String containing the name for the Elb resource
19
+ # * :instance_names: Array containing the names of the Ec2 resources which will be added under the ELB
20
+ def initialize(options = {})
21
+ require_options(options, [:name, :instance_names])
22
+ @name = options[:name]
23
+ @instance_names = options[:instance_names]
24
+ end
25
+
26
+ # Returns a Ruby hash version of the Cloud Formation template for the resource instance
27
+ #
28
+ # ==== Examples
29
+ # elb = Cloudster::Elb.new(
30
+ # :name => 'LoadBalancer',
31
+ # :instance_names => ['AppServer1','AppServer2']
32
+ # )
33
+ # elb.template
34
+ #
35
+ # ==== Returns
36
+ # * Ruby hash version of the Cloud Formation template for the resource instance
37
+ def template
38
+ Elb.template({:name =>@name, :instance_names => @instance_names})
39
+ end
40
+
41
+ # Class method that returns a Ruby hash version of the Cloud Formation template
42
+ #
43
+ # ==== Examples
44
+ # template = Cloudster::Elb.template(
45
+ # :name => 'LoadBalances',
46
+ # :instance_names => ['AppServer1', 'AppServer2']
47
+ # )
48
+ #
49
+ # ==== Parameters
50
+ # * options<~Hash> -
51
+ # *Keys:
52
+ # * :name: String containing the name for the Elb resource
53
+ # * :instance_names: Array containing the names of the Ec2 resources which will be added under the ELB
54
+ #
55
+ # ==== Returns
56
+ # * Ruby hash version of the Cloud Formation template
57
+ def self.template(options = {})
58
+ require_options(options, [:name, :instance_names])
59
+ properties = {"AvailabilityZones" => { "Fn::GetAZs" => "" },
60
+ "Listeners" => [{ "LoadBalancerPort" => "80",
61
+ "InstancePort" => "80",
62
+ "Protocol" => "HTTP"
63
+ }],
64
+ "HealthCheck" => {
65
+ "Target" => { "Fn::Join" => [ "", ["HTTP:", "80", "/"]]},
66
+ "HealthyThreshold" => "3",
67
+ "UnhealthyThreshold" => "5",
68
+ "Interval" => "30",
69
+ "Timeout" => "5"
70
+ }
71
+ }
72
+ properties.merge!({"Instances" => get_instance_name_list_for_template(options[:instance_names])})
73
+ template = {'Resources' => {
74
+ options[:name] => {
75
+ 'Type' => 'AWS::ElasticLoadBalancing::LoadBalancer',
76
+ 'Properties' => properties
77
+ }
78
+ }
79
+ }
80
+ return template
81
+ end
82
+
83
+ private
84
+ #Gets the instance names in a format expected by the Template for ELB
85
+ def self.get_instance_name_list_for_template(instance_names)
86
+ instance_list = []
87
+ instance_names.each do |instance_name|
88
+ instance_list << {'Ref' => instance_name}
89
+ end
90
+ return instance_list
91
+ end
92
+
93
+ end
94
+ end
@@ -13,8 +13,47 @@ describe Cloudster::Cloud do
13
13
  it "should return a ruby hash for the stack cloudformation template" do
14
14
  ec2 = Cloudster::Ec2.new(:key_name => 'testkey', :image_id => 'image_id', name: 'name')
15
15
  ec2_1 = Cloudster::Ec2.new(:key_name => 'testkey1', :image_id => 'image_id1', name: 'name1')
16
+ elb = Cloudster::Elb.new(:name => 'ELB', :instance_names => ['name','name1'])
16
17
  cloud = Cloudster::Cloud.new(:access_key_id => 'test', :secret_access_key => 'test')
17
- cloud.template(:resources => [ec2, ec2_1], :description => 'test template').should == {"AWSTemplateFormatVersion"=>"2010-09-09", "Description"=>"test template", "Resources"=>{"name"=>{"Type"=>"AWS::EC2::Instance", "Properties"=>{"KeyName"=>"testkey", "ImageId"=>"image_id"}}, "name1"=>{"Type"=>"AWS::EC2::Instance", "Properties"=>{"KeyName"=>"testkey1", "ImageId"=>"image_id1"}}}}.to_json
18
+ cloud.template(:resources => [ec2, ec2_1, elb], :description => 'test template').should == {"AWSTemplateFormatVersion"=>"2010-09-09",
19
+ "Description"=>"test template",
20
+ "Resources"=>{
21
+ "name"=>{
22
+ "Type"=>"AWS::EC2::Instance",
23
+ "Properties"=>{
24
+ "KeyName"=>"testkey",
25
+ "ImageId"=>"image_id"}
26
+ },
27
+ "name1"=>{
28
+ "Type"=>"AWS::EC2::Instance",
29
+ "Properties"=>{
30
+ "KeyName"=>"testkey1",
31
+ "ImageId"=>"image_id1"
32
+ }
33
+ },
34
+ "ELB" => {
35
+ "Type" => "AWS::ElasticLoadBalancing::LoadBalancer",
36
+ "Properties" => {
37
+ "AvailabilityZones" => {
38
+ "Fn::GetAZs" => ""
39
+ },
40
+ "Listeners" => [{
41
+ "LoadBalancerPort" => "80",
42
+ "InstancePort" => "80",
43
+ "Protocol" => "HTTP"
44
+ }],
45
+ "HealthCheck" => {
46
+ "Target" => {
47
+ "Fn::Join" => ["",["HTTP:","80","/"]]
48
+ },
49
+ "HealthyThreshold" => "3",
50
+ "UnhealthyThreshold" => "5",
51
+ "Interval" => "30", "Timeout" => "5"
52
+ },
53
+ "Instances" => [{ "Ref" => "name"}, {"Ref" => "name1"}]}
54
+ }
55
+ }
56
+ }.to_json
18
57
  end
19
58
  end
20
59
 
@@ -28,9 +67,10 @@ describe Cloudster::Cloud do
28
67
  cloud_formation = double('CloudFormation')
29
68
  Fog::AWS::CloudFormation.should_receive(:new).with(:aws_access_key_id => 'test', :aws_secret_access_key => 'test').and_return cloud_formation
30
69
  ec2 = Cloudster::Ec2.new(:key_name => 'testkey', :image_id => 'image_id', name: 'name')
70
+ elb = Cloudster::Elb.new(:name => 'ELB', :instance_names => ['name','name1'])
31
71
  cloud = Cloudster::Cloud.new(:access_key_id => 'test', :secret_access_key => 'test')
32
- cloud_formation.should_receive('create_stack').with('stack_name', 'TemplateBody' => cloud.template(:resources => [ec2], :description => 'testDescription'))
33
- cloud.provision(:resources => [ec2], :stack_name => 'stack_name', :description => 'testDescription')
72
+ cloud_formation.should_receive('create_stack').with('stack_name', 'TemplateBody' => cloud.template(:resources => [ec2, elb], :description => 'testDescription'))
73
+ cloud.provision(:resources => [ec2, elb], :stack_name => 'stack_name', :description => 'testDescription')
34
74
  end
35
75
  end
36
76
 
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cloudster::Elb do
4
+ describe 'initialize' do
5
+ it "should raise argument error if no argument is not provided" do
6
+ expect { Cloudster::Elb.new() }.to raise_error(ArgumentError, 'Missing required argument: name,instance_names')
7
+ end
8
+ it "should not raise argument error if all arguments are provided" do
9
+ expect { Cloudster::Elb.new(:name => 'LoadBalancer', :instance_names => ['AppServer', 'AppServer2']) }.to_not raise_error
10
+ end
11
+ end
12
+ describe '#template' do
13
+ it "should return a ruby hash for the resource cloudformation template" do
14
+ elb = Cloudster::Elb.new(:name => 'LoadBalancer', :instance_names => ['AppServer', 'AppServer2'])
15
+ elb.template.should == {"Resources" => {"LoadBalancer"=>{"Type"=>"AWS::ElasticLoadBalancing::LoadBalancer", "Properties"=>{"AvailabilityZones"=>{"Fn::GetAZs"=>""}, "Listeners"=>[{"LoadBalancerPort"=>"80", "InstancePort"=>"80", "Protocol"=>"HTTP"}], "HealthCheck"=>{"Target"=>{"Fn::Join"=>["", ["HTTP:", "80", "/"]]}, "HealthyThreshold"=>"3", "UnhealthyThreshold"=>"5", "Interval"=>"30", "Timeout"=>"5"}, "Instances"=>[{"Ref"=>"AppServer"}, {"Ref"=>"AppServer2"}]}}}}
16
+ end
17
+ end
18
+ describe '.template' do
19
+ it "should raise argument error if no argument is not provided" do
20
+ expect { Cloudster::Elb.template() }.to raise_error(ArgumentError, 'Missing required argument: name,instance_names')
21
+ end
22
+ it "should return a ruby hash for the resource cloudformation template" do
23
+ hash = Cloudster::Elb.template(:name => 'LoadBalancer', :instance_names => ['AppServer', 'AppServer2'])
24
+ hash.should == {"Resources" => {"LoadBalancer"=>{"Type"=>"AWS::ElasticLoadBalancing::LoadBalancer", "Properties"=>{"AvailabilityZones"=>{"Fn::GetAZs"=>""}, "Listeners"=>[{"LoadBalancerPort"=>"80", "InstancePort"=>"80", "Protocol"=>"HTTP"}], "HealthCheck"=>{"Target"=>{"Fn::Join"=>["", ["HTTP:", "80", "/"]]}, "HealthyThreshold"=>"3", "UnhealthyThreshold"=>"5", "Interval"=>"30", "Timeout"=>"5"}, "Instances"=>[{"Ref"=>"AppServer"}, {"Ref"=>"AppServer2"}]}}}}
25
+ end
26
+ end
27
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudster
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-29 00:00:00.000000000 Z
12
+ date: 2012-10-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -143,9 +143,11 @@ files:
143
143
  - lib/cloudster.rb
144
144
  - lib/cloudster/cloud.rb
145
145
  - lib/cloudster/ec2.rb
146
+ - lib/cloudster/elb.rb
146
147
  - lib/cloudster/options_manager.rb
147
148
  - spec/cloud_spec.rb
148
149
  - spec/ec2_spec.rb
150
+ - spec/elb_spec.rb
149
151
  - spec/spec_helper.rb
150
152
  homepage: http://github.com/emilsoman/cloudster
151
153
  licenses:
@@ -162,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
162
164
  version: '0'
163
165
  segments:
164
166
  - 0
165
- hash: -972857553
167
+ hash: -954846317
166
168
  required_rubygems_version: !ruby/object:Gem::Requirement
167
169
  none: false
168
170
  requirements: