cloudster 2.18.0 → 2.19.0
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/README.md +4 -0
- data/VERSION +1 -1
- data/cloudster.gemspec +2 -2
- data/lib/cloudster/cloud.rb +28 -0
- data/lib/cloudster/output.rb +10 -1
- data/spec/cloud_front_spec.rb +3 -3
- data/spec/cloud_spec.rb +34 -0
- data/spec/output_spec.rb +19 -2
- data/spec/s3_spec.rb +3 -3
- metadata +3 -3
data/README.md
CHANGED
@@ -93,6 +93,10 @@ Cloudster can also interact with the provisioned AWS Cloud :
|
|
93
93
|
|
94
94
|
cloud.delete(:stack_name => 'TestStack')
|
95
95
|
|
96
|
+
- Get the output attributes of each resource in the stack :
|
97
|
+
|
98
|
+
cloud.outputs(:stack_name => 'TestStack')
|
99
|
+
|
96
100
|
- Describe the events of a stack :
|
97
101
|
|
98
102
|
cloud.events(:stack_name => 'TestStack')
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.19.0
|
data/cloudster.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "cloudster"
|
8
|
-
s.version = "2.
|
8
|
+
s.version = "2.19.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 = "2013-01-
|
12
|
+
s.date = "2013-01-10"
|
13
13
|
s.description = "Cloudster is a Ruby gem that was born to cut the learning curve involved \n in writing your own CloudFormation templates. If you don't know what a CloudFormation template is, \n but know about the AWS Cloud offerings, you can still use cloudster to provision your stack. \n Still in infancy , cloudster can create a very basic stack like a breeze. All kinds of contribution welcome !"
|
14
14
|
s.email = "emil.soman@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/cloudster/cloud.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Cloudster
|
2
2
|
#Cloud objects have many resources. This class can generate the cloudformation template and provision the stack.
|
3
3
|
class Cloud
|
4
|
+
include Output
|
4
5
|
|
5
6
|
# Initialize a Cloud instance
|
6
7
|
#
|
@@ -334,6 +335,33 @@ module Cloudster
|
|
334
335
|
return @cloud_formation.describe_stacks('StackName' => options[:stack_name]).body["Stacks"][0] rescue nil
|
335
336
|
end
|
336
337
|
|
338
|
+
# Returns a hash containing the output values of each resource in the Stack
|
339
|
+
#
|
340
|
+
# ==== Examples
|
341
|
+
# cloud = Cloudster::Cloud.new(
|
342
|
+
# :access_key_id => 'aws_access_key_id',
|
343
|
+
# :secret_access_key => 'aws_secret_access_key',
|
344
|
+
# :region => 'us-east-1'
|
345
|
+
# )
|
346
|
+
# cloud.outputs(:stack_name => 'RDSStack')
|
347
|
+
#
|
348
|
+
# ==== Parameters
|
349
|
+
# * options<~Hash>
|
350
|
+
# * :stack_name : A string which will contain the name of the stack
|
351
|
+
#
|
352
|
+
# ==== Returns
|
353
|
+
# * Hash containing outputs of the stack
|
354
|
+
def outputs(options = {})
|
355
|
+
require_options(options, [:stack_name])
|
356
|
+
stack_description = describe(:stack_name => options[:stack_name])
|
357
|
+
outputs = stack_description["Outputs"] rescue nil
|
358
|
+
outputs_hash = {}
|
359
|
+
outputs.each do |output|
|
360
|
+
outputs_hash[output["OutputKey"]] = parse_outputs(output["OutputValue"])
|
361
|
+
end
|
362
|
+
return outputs_hash
|
363
|
+
end
|
364
|
+
|
337
365
|
# Returns the status of the stack
|
338
366
|
#
|
339
367
|
# ==== Examples
|
data/lib/cloudster/output.rb
CHANGED
@@ -7,11 +7,20 @@ module Cloudster
|
|
7
7
|
def output_template(outputs)
|
8
8
|
resource_name = outputs.keys[0]
|
9
9
|
outputs_array = outputs.values[0].collect
|
10
|
-
each_output_join = outputs_array.collect {|output| {"Fn::Join" => ["
|
10
|
+
each_output_join = outputs_array.collect {|output| {"Fn::Join" => ["|", output]}}
|
11
11
|
return resource_name => {
|
12
12
|
'Value' => { "Fn::Join" => [ ",", each_output_join] }
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
16
|
+
def parse_outputs(output)
|
17
|
+
output_hash = {}
|
18
|
+
output.split(',').each do |attribute|
|
19
|
+
key_value = attribute.split('|')
|
20
|
+
output_hash[key_value[0]] = key_value[1]
|
21
|
+
end
|
22
|
+
return output_hash
|
23
|
+
end
|
24
|
+
|
16
25
|
end
|
17
26
|
end
|
data/spec/cloud_front_spec.rb
CHANGED
@@ -40,9 +40,9 @@ describe Cloudster::ChefClient do
|
|
40
40
|
"Value"=>{
|
41
41
|
"Fn::Join"=>[",",
|
42
42
|
[
|
43
|
-
{"Fn::Join"=>["
|
44
|
-
{"Fn::Join"=>["
|
45
|
-
{"Fn::Join"=>["
|
43
|
+
{"Fn::Join"=>["|", ["bucket_name", {"Ref"=>"S3ResourceName"}]]},
|
44
|
+
{"Fn::Join"=>["|", ["dns_name", {"Fn::GetAtt"=>["S3ResourceName", "DomainName"]}]]},
|
45
|
+
{"Fn::Join"=>["|", ["website_url", {"Fn::GetAtt"=>["S3ResourceName", "WebsiteURL"]}]]}
|
46
46
|
]
|
47
47
|
]
|
48
48
|
}
|
data/spec/cloud_spec.rb
CHANGED
@@ -127,6 +127,40 @@ describe Cloudster::Cloud do
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
|
+
describe '#outputs' do
|
131
|
+
it "should raise argument error if resources not provided" do
|
132
|
+
cloud = Cloudster::Cloud.new(:access_key_id => 'test', :secret_access_key => 'test')
|
133
|
+
expect { cloud.outputs() }.to raise_error(ArgumentError, 'Missing required argument: stack_name')
|
134
|
+
end
|
135
|
+
it "should trigger 'describe stack' request" do
|
136
|
+
cloud_formation = double('CloudFormation')
|
137
|
+
Fog::AWS::CloudFormation.should_receive(:new).with(:aws_access_key_id => 'test', :aws_secret_access_key => 'test', :region => nil).and_return cloud_formation
|
138
|
+
cloud = Cloudster::Cloud.new(:access_key_id => 'test', :secret_access_key => 'test')
|
139
|
+
cloud.should_receive(:describe).with(:stack_name => 'stack_name').and_return ({
|
140
|
+
"Outputs"=>[{
|
141
|
+
"OutputValue"=>"bucket_name|teststack3-testbucket1,dns_name|teststack3-testbucket1.s3.amazonaws.com,website_url|http://teststack3-testbucket1.s3-website-us-east-1.amazonaws.com",
|
142
|
+
"OutputKey"=>"TestBucket1"
|
143
|
+
},{
|
144
|
+
"OutputValue"=>"bucket_name|teststack3-testbucket2,dns_name|teststack3-testbucket2.s3.amazonaws.com,website_url|http://teststack3-testbucket2.s3-website-us-east-1.amazonaws.com",
|
145
|
+
"OutputKey"=>"TestBucket2"
|
146
|
+
}]
|
147
|
+
})
|
148
|
+
output_hash = cloud.outputs(:stack_name => 'stack_name')
|
149
|
+
output_hash.should == ({
|
150
|
+
"TestBucket1" => {
|
151
|
+
"bucket_name" => "teststack3-testbucket1",
|
152
|
+
"dns_name" => "teststack3-testbucket1.s3.amazonaws.com",
|
153
|
+
"website_url" => "http://teststack3-testbucket1.s3-website-us-east-1.amazonaws.com"
|
154
|
+
},
|
155
|
+
"TestBucket2" => {
|
156
|
+
"bucket_name" => "teststack3-testbucket2",
|
157
|
+
"dns_name" => "teststack3-testbucket2.s3.amazonaws.com",
|
158
|
+
"website_url" => "http://teststack3-testbucket2.s3-website-us-east-1.amazonaws.com"
|
159
|
+
}
|
160
|
+
})
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
130
164
|
describe "#is_s3_bucket_name_available?" do
|
131
165
|
it "should return true if bucket is available" do
|
132
166
|
cloud = Cloudster::Cloud.new(:access_key_id => 'test', :secret_access_key => 'test')
|
data/spec/output_spec.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Cloudster::Output do
|
4
|
+
class Resource;end
|
5
|
+
Resource.extend(Cloudster::Output)
|
6
|
+
|
4
7
|
describe "output_template" do
|
5
8
|
it "should return the cloudformation template for the Outputs" do
|
6
9
|
resource_name = "S3ResourceName"
|
@@ -16,12 +19,26 @@ describe Cloudster::Output do
|
|
16
19
|
resource_name => {
|
17
20
|
"Value" => {
|
18
21
|
"Fn::Join" => [ ",",[
|
19
|
-
{"Fn::Join" => ["
|
20
|
-
{"Fn::Join" => ["
|
22
|
+
{"Fn::Join" => ["|", ['bucket_name', {"Ref" => resource_name } ] ]},
|
23
|
+
{"Fn::Join" => ["|", ['dns_name', {'Fn::GetAtt' => [resource_name, 'DomainName']} ] ]}
|
21
24
|
]]
|
22
25
|
}
|
23
26
|
}
|
24
27
|
}
|
25
28
|
end
|
26
29
|
end
|
30
|
+
|
31
|
+
describe "parse_outputs" do
|
32
|
+
it "should return a hash of outputs" do
|
33
|
+
outputs = "bucket_name|teststack3-testbucket1,dns_name|teststack3-testbucket1.s3.amazonaws.com,website_url|http://teststack3-testbucket1.s3-website-us-east-1.amazonaws.com"
|
34
|
+
class Resource;end
|
35
|
+
Resource.extend(Cloudster::Output)
|
36
|
+
Resource.parse_outputs(outputs).should == {
|
37
|
+
"bucket_name" => "teststack3-testbucket1",
|
38
|
+
"dns_name" => "teststack3-testbucket1.s3.amazonaws.com",
|
39
|
+
"website_url" => "http://teststack3-testbucket1.s3-website-us-east-1.amazonaws.com"
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
27
44
|
end
|
data/spec/s3_spec.rb
CHANGED
@@ -15,14 +15,14 @@ describe Cloudster::S3 do
|
|
15
15
|
s3 = Cloudster::S3.new(:name => 'bucket_name')
|
16
16
|
s3.template.should == {
|
17
17
|
'Resources' => {'bucket_name' => {'Type' => 'AWS::S3::Bucket', 'Properties' => {}}},
|
18
|
-
"Outputs" => {"bucket_name"=>{"Value"=>{"Fn::Join"=>[",", [{"Fn::Join"=>["
|
18
|
+
"Outputs" => {"bucket_name"=>{"Value"=>{"Fn::Join"=>[",", [{"Fn::Join"=>["|", ["bucket_name", {"Ref"=>"bucket_name"}]]}, {"Fn::Join"=>["|", ["dns_name", {"Fn::GetAtt"=>["bucket_name", "DomainName"]}]]}, {"Fn::Join"=>["|", ["website_url", {"Fn::GetAtt"=>["bucket_name", "WebsiteURL"]}]]}]]}}}
|
19
19
|
}
|
20
20
|
end
|
21
21
|
it "should return a ruby hash for the resource cloudformation template" do
|
22
22
|
s3 = Cloudster::S3.new(:name => 'bucket_name', :access_control => "PublicRead", :website_configuration => {"index_document" => "index.html", "error_document" => "error.html"} )
|
23
23
|
s3.template.should == {
|
24
24
|
'Resources' => {'bucket_name' => {'Type' => 'AWS::S3::Bucket', 'Properties' => {"AccessControl" => "PublicRead", "WebsiteConfiguration" => { "IndexDocument" => "index.html", "ErrorDocument" => "error.html" } }}},
|
25
|
-
"Outputs" => {"bucket_name"=>{"Value"=>{"Fn::Join"=>[",", [{"Fn::Join"=>["
|
25
|
+
"Outputs" => {"bucket_name"=>{"Value"=>{"Fn::Join"=>[",", [{"Fn::Join"=>["|", ["bucket_name", {"Ref"=>"bucket_name"}]]}, {"Fn::Join"=>["|", ["dns_name", {"Fn::GetAtt"=>["bucket_name", "DomainName"]}]]}, {"Fn::Join"=>["|", ["website_url", {"Fn::GetAtt"=>["bucket_name", "WebsiteURL"]}]]}]]}}}
|
26
26
|
}
|
27
27
|
end
|
28
28
|
end
|
@@ -35,7 +35,7 @@ describe Cloudster::S3 do
|
|
35
35
|
hash = Cloudster::S3.template(:name => 'bucket_name', :access_control => "PublicRead", :website_configuration => {"index_document" => "index.html", "error_document" => "error.html"} )
|
36
36
|
hash.should == {
|
37
37
|
'Resources' => {'bucket_name' => {'Type' => 'AWS::S3::Bucket', 'Properties' => {"AccessControl" => "PublicRead", "WebsiteConfiguration" => { "IndexDocument" => "index.html", "ErrorDocument" => "error.html" } }}},
|
38
|
-
"Outputs" => {"bucket_name"=>{"Value"=>{"Fn::Join"=>[",", [{"Fn::Join"=>["
|
38
|
+
"Outputs" => {"bucket_name"=>{"Value"=>{"Fn::Join"=>[",", [{"Fn::Join"=>["|", ["bucket_name", {"Ref"=>"bucket_name"}]]}, {"Fn::Join"=>["|", ["dns_name", {"Fn::GetAtt"=>["bucket_name", "DomainName"]}]]}, {"Fn::Join"=>["|", ["website_url", {"Fn::GetAtt"=>["bucket_name", "WebsiteURL"]}]]}]]}}}
|
39
39
|
}
|
40
40
|
end
|
41
41
|
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.
|
4
|
+
version: 2.19.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: 2013-01-
|
12
|
+
date: 2013-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fog
|
@@ -169,7 +169,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
169
|
version: '0'
|
170
170
|
segments:
|
171
171
|
- 0
|
172
|
-
hash:
|
172
|
+
hash: 136420239
|
173
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
174
|
none: false
|
175
175
|
requirements:
|