opendelivery 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,12 @@
1
- class Artifact
2
- def initialize
3
- end
1
+ module OpenDelivery
2
+ class Artifact
3
+ def initialize
4
+ end
4
5
 
5
- def add_timestamp(build_identifier, artifact)
6
- timestamp = Time.now.strftime("%Y.%m.%d.%H.%M.%S.%L")
7
- stamped_artifact = "#{artifact}-#{build_identifier}-#{timestamp}"
8
- return stamped_artifact
6
+ def add_timestamp(build_identifier, artifact)
7
+ timestamp = Time.now.strftime("%Y.%m.%d.%H.%M.%S.%L")
8
+ stamped_artifact = "#{artifact}-#{build_identifier}-#{timestamp}"
9
+ return stamped_artifact
10
+ end
9
11
  end
10
12
  end
@@ -1,44 +1,48 @@
1
1
  require 'aws-sdk'
2
2
 
3
- class Domain
4
-
5
- def initialize
6
- @sdb = AWS::SimpleDB.new
7
- end
8
-
9
- def create(domain_name)
10
- AWS::SimpleDB.consistent_reads do
11
- @sdb.domains.create(domain_name)
3
+ module OpenDelivery
4
+ class Domain
5
+
6
+ def initialize(region=nil)
7
+ if region.nil?
8
+ @sdb = AWS::SimpleDB.new
9
+ else
10
+ @sdb = AWS::SimpleDB.new(:region => region)
11
+ end
12
12
  end
13
- end
14
13
 
15
- def destroy(domain_name)
16
- @sdb.domains[domain_name].delete
17
- end
14
+ def create(domain)
15
+ AWS::SimpleDB.consistent_reads do
16
+ @sdb.domains.create(domain)
17
+ end
18
+ end
18
19
 
19
- def destroy_item(domain_name, item_name)
20
- @sdb.domains[domain_name].items[item_name].delete
21
- end
20
+ def destroy(domain)
21
+ @sdb.domains[domain].delete
22
+ end
22
23
 
23
- def get_property(sdb_domain, item_name, key)
24
- AWS::SimpleDB.consistent_reads do
25
- item = @sdb.domains[sdb_domain].items[item_name]
24
+ def destroy_item(domain, item_name)
25
+ @sdb.domains[domain].items[item_name].delete
26
+ end
26
27
 
27
- item.attributes.each_value do |name, value|
28
- if name == key
29
- @property_value = value.chomp
28
+ def get_property(domain, item_name, key)
29
+ AWS::SimpleDB.consistent_reads do
30
+ item = @sdb.domains[domain].items[item_name]
31
+ item.attributes.each_value do |name, value|
32
+ if name == key
33
+ @property_value = value.chomp
34
+ end
30
35
  end
31
36
  end
32
- end
33
37
 
34
- return @property_value
35
- end
36
-
37
- def set_property(sdb_domain, item_name, property, value)
38
- AWS::SimpleDB.consistent_reads do
39
- item = @sdb.domains[sdb_domain].items[item_name]
38
+ return @property_value
39
+ end
40
40
 
41
- item.attributes.set(property => [value])
41
+ def set_property(domain, item_name, property, value)
42
+ AWS::SimpleDB.consistent_reads do
43
+ item = @sdb.domains[domain].items[item_name]
44
+ item.attributes.set(property => [value])
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -1,28 +1,42 @@
1
- class Image
1
+ module OpenDelivery
2
+ class Image
2
3
 
3
- def initialize
4
- @ec2 = AWS::EC2.new
5
- @sdb = AWS::SimpleDB.new
6
- @auto_scale = AWS::AutoScaling.new
7
- end
8
-
9
- def create(as_group_name, image_name, sdb_domain, type, key)
10
- domain = Domain.new
11
- image = @ec2.images.create(
12
- instance_id: @auto_scale.groups[as_group_name].auto_scaling_instances.first.id,
13
- name: image_name
14
- )
4
+ def initialize(region=nil)
5
+ if region.nil?
6
+ @ec2 = AWS::EC2.new
7
+ @sdb = AWS::SimpleDB.new
8
+ @auto_scale = AWS::AutoScaling.new
9
+ else
10
+ @ec2 = AWS::EC2.new(:region => region)
11
+ @sdb = AWS::SimpleDB.new(:region => region)
12
+ @auto_scale = AWS::AutoScaling.new(:region => region)
13
+ end
14
+ end
15
15
 
16
- sleep 10
16
+ protected
17
17
 
18
- while image.state != :available
18
+ def wait_for_image(image)
19
19
  sleep 10
20
- case image.state
21
- when :failed
22
- image.delete
23
- raise RuntimeError, 'Image Creation Failed'
20
+
21
+ while image.state != :available
22
+ sleep 10
23
+ case image.state
24
+ when :failed
25
+ image.delete
26
+ raise RuntimeError, 'Image Creation Failed'
27
+ end
28
+ end
29
+ end
30
+
31
+ def prep_instance(domain stack_name)
32
+ group_name = @domain.get_property(domain, stack_name, "AWS::AutoScaling::AutoScalingGroup")
33
+ instance = @auto_scale.groups[group_name].auto_scaling_instances.first.id
34
+ @ec2.instances[instance].stop
35
+
36
+ while @ec2.instances[instance].status != :stopped
37
+ sleep 10
24
38
  end
39
+ return instance
25
40
  end
26
- domain.set_property(sdb_domain, key, type, image.id)
27
41
  end
28
42
  end
@@ -1,46 +1,138 @@
1
- class Stack
1
+ require 'aws-sdk'
2
2
 
3
- def initialize
4
- @cfn = AWS::CloudFormation.new
5
- end
3
+ module OpenDelivery
4
+ class Stack
5
+
6
+ def initialize(region=nil, silent=false, sleep_time=30)
7
+ if region.nil?
8
+ @cfn = AWS::CloudFormation.new
9
+ else
10
+ @cfn = AWS::CloudFormation.new(:region => region)
11
+ end
12
+
13
+ @sleep_time = sleep_time
14
+ @silent = silent
15
+ end
16
+
17
+
18
+ SUCCESS_STATUSES = [ "CREATE_COMPLETE",
19
+ "UPDATE_COMPLETE" ]
20
+
21
+ FAILURE_STATUSES = [ "CREATED_FAILED",
22
+ "ROLLBACK_FAILED",
23
+ "ROLLBACK_COMPLETE",
24
+ "DELETED_FAILED",
25
+ "UPDATE_ROLLBACK_FAILED",
26
+ "UPDATE_ROLLBACK_COMPLETE",
27
+ "DELETE_COMPLETE" ]
6
28
 
7
- def create(template, stack_name, parameters = {}, wait=false)
8
- stack = @cfn.stacks.create(stack_name,
9
- File.open(template, "r").read,
10
- :parameters => parameters,
11
- :capabilities => ["CAPABILITY_IAM"],
12
- :disable_rollback => true)
29
+ PROGRESS_STATUSES = [ "CREATE_IN_PROGRESS",
30
+ "ROLLBACK_IN_PROGRESS",
31
+ "DELETE_IN_PROGRESS",
32
+ "UPDATE_IN_PROGRESS",
33
+ "UPDATE_COMPLETE_CLEANUP_IN_PROGRESS",
34
+ "UPDATE_ROLLBACK_IN_PROGRESS",
35
+ "UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS" ]
36
+
37
+ attr_accessor :sleep_time, :silent, :cfm
38
+
39
+ def watch stack_name
40
+ success = false
41
+ begin
42
+ stack = @cfn.stacks[stack_name]
43
+ success = watch_loop stack
44
+ rescue AWS::CloudFormation::Errors::ValidationError => msg
45
+ print_status "Exception raised: #{msg}"
46
+ success = false
47
+ end
48
+ return success
49
+ end
50
+
51
+
52
+ def create(template, stack_name, parameters = {}, wait=false)
53
+ stack = @cfn.stacks.create(stack_name,
54
+ File.open(template, "r").read,
55
+ :parameters => parameters,
56
+ :capabilities => ["CAPABILITY_IAM"],
57
+ :disable_rollback => true)
58
+
59
+ if wait
60
+ wait_for_stack(stack)
61
+ end
13
62
 
14
- if wait
63
+ stack.resources.each do |resource|
64
+ @domain.set_property(domain, stack_name, resource.resource_type, resource.physical_resource_id)
65
+ end
66
+ end
67
+
68
+ def destroy(domain, stack_name)
69
+ stack = @cfn.stacks[stack_name]
70
+ stack.delete
71
+ while stack.exists?
72
+ sleep 20
73
+ end
74
+ @domain.destroy_item(domain, stack_name)
75
+ end
76
+
77
+ def list
78
+ @cfn.stacks.each do |stack|
79
+ puts "Stack Name: #{stack.name} | Status: #{stack.status}"
80
+ end
81
+ end
82
+
83
+ protected
84
+
85
+ def wait_for_stack(stack)
15
86
  while stack.status != "CREATE_COMPLETE"
16
- sleep 30
87
+ sleep 20
17
88
 
18
89
  case stack.status
19
- when "ROLLBACK_IN_PROGESS"
20
- stack.delete
21
- when "ROLLBACK_COMPLETE"
90
+ when "ROLLBACK_IN_PROGESS" || "ROLLBACK_COMPLETE"
22
91
  stack.delete
23
92
  end
24
93
  end
25
94
  end
26
- end
27
95
 
28
- def destroy(stack_name)
29
- stack = @cfn.stacks[stack_name]
30
- stack.delete
31
- while stack.exists?
32
- sleep 30
96
+ def print_status status
97
+ timestamp = Time.now.strftime("%Y.%m.%d %H:%M:%S:%L")
98
+ if (!@silent)
99
+ puts "#{timestamp}: #{status}"
100
+ end
33
101
  end
34
- end
35
102
 
36
- def list
37
- @cfn.stacks.each do |stack|
38
- case stack.status
39
- when "CREATE_COMPLETE"
40
- puts "Stack Name: #{stack.name} | Status: Available"
41
- when "CREATE_IN_PROGRESS"
42
- puts "Stack Name: #{stack.name} | Status: In Progress"
103
+ def watch_loop stack
104
+ keep_watching = true
105
+ success = false
106
+ abort_count = 10
107
+ while(keep_watching) do
108
+ begin
109
+ stack_status = stack.status
110
+ if (SUCCESS_STATUSES.include? stack_status)
111
+ print_status "Success: #{stack_status}"
112
+ success = true
113
+ keep_watching = false
114
+ elsif (PROGRESS_STATUSES.include? stack_status)
115
+ print_status "In Progress: #{stack_status}"
116
+ success = false
117
+ keep_watching = true
118
+ elsif (FAILURE_STATUSES.include? stack_status)
119
+ print_status "Failed: #{stack_status}"
120
+ success = false
121
+ keep_watching = false
122
+ else
123
+ print_status "didn't find #{stack_status} in the list of expected statuses"
124
+ success = false
125
+ abort_count = abort_count - 1
126
+ # if we get too many unknown statuses, assume something has gone horribly wrong and quit.
127
+ keep_watching = (abort_count > 0)
128
+ end
129
+ rescue AWS::CloudFormation::Errors::Throttling
130
+ print_status "Rate limit exceeded, retrying..."
131
+ sleep (@sleep_time * 0.1)
132
+ end
133
+ sleep(@sleep_time)
43
134
  end
135
+ return success
44
136
  end
45
137
  end
46
138
  end
@@ -1,26 +1,34 @@
1
- class Storage
1
+ require 'aws-sdk'
2
2
 
3
- def initialize
4
- @s3 = AWS::S3.new
5
- end
3
+ module OpenDelivery
4
+ class Storage
6
5
 
7
- def copy(bucket, key, desired_key)
8
- @s3.buckets[bucket].objects[key].copy_to(desired_key)
9
- end
6
+ def initialize(region=nil)
7
+ if region.nil?
8
+ @s3 = AWS::S3.new
9
+ else
10
+ @s3 = AWS::S3.new(:region => region)
11
+ end
12
+ end
10
13
 
11
- def upload(file, bucket, key)
12
- @s3.buckets[bucket].objects[key].write(:file => file)
13
- end
14
+ def copy(bucket, key, desired_key)
15
+ @s3.buckets[bucket].objects[key].copy_to(desired_key)
16
+ end
17
+
18
+ def upload(file, bucket, key)
19
+ @s3.buckets[bucket].objects[key].write(:file => file)
20
+ end
14
21
 
15
- def download(bucket, key, output_directory)
16
- obj = @s3.buckets[bucket].objects[key]
22
+ def download(bucket, key, output_directory)
23
+ obj = @s3.buckets[bucket].objects[key]
17
24
 
18
- base = Pathname.new("#{obj.key}").basename
25
+ base = Pathname.new("#{obj.key}").basename
19
26
 
20
- Dir.mkdir(output_directory) unless File.exists?(output_directory)
27
+ Dir.mkdir(output_directory) unless File.exists?(output_directory)
21
28
 
22
- File.open("#{output_directory}/#{base}", 'w') do |file|
23
- file.write(obj.read)
29
+ File.open("#{output_directory}/#{base}", 'w') do |file|
30
+ file.write(obj.read)
31
+ end
24
32
  end
25
33
  end
26
34
  end
@@ -1,3 +1,3 @@
1
- module Opendelivery
2
- VERSION = '0.0.1'
1
+ module OpenDelivery
2
+ VERSION = '0.0.3'
3
3
  end
data/lib/opendelivery.rb CHANGED
@@ -1,8 +1,10 @@
1
+ require 'opendelivery/version.rb'
1
2
  require 'opendelivery/artifact.rb'
2
- require 'opendelivery/database.rb'
3
3
  require 'opendelivery/domain.rb'
4
4
  require 'opendelivery/image.rb'
5
- require 'opendelivery/instance.rb'
6
- require 'opendelivery/key_pair.rb'
7
5
  require 'opendelivery/stack.rb'
8
6
  require 'opendelivery/storage.rb'
7
+
8
+
9
+ module OpenDelivery
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opendelivery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-08-15 00:00:00.000000000 Z
14
+ date: 2013-08-28 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: aws-sdk
@@ -45,6 +45,22 @@ dependencies:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
47
  version: 1.15.0
48
+ - !ruby/object:Gem::Dependency
49
+ name: json
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
48
64
  description: A collection of tools that are used in the Open Delivery platform.
49
65
  email: brian.jakovich@stelligent.com
50
66
  executables: []
@@ -53,11 +69,8 @@ extra_rdoc_files: []
53
69
  files:
54
70
  - lib/opendelivery.rb
55
71
  - lib/opendelivery/artifact.rb
56
- - lib/opendelivery/database.rb
57
72
  - lib/opendelivery/domain.rb
58
73
  - lib/opendelivery/image.rb
59
- - lib/opendelivery/instance.rb
60
- - lib/opendelivery/key_pair.rb
61
74
  - lib/opendelivery/stack.rb
62
75
  - lib/opendelivery/storage.rb
63
76
  - lib/opendelivery/version.rb
@@ -1,10 +0,0 @@
1
- class Database
2
- def initialize
3
- end
4
-
5
- def create
6
- end
7
-
8
- def destroy
9
- end
10
- end
@@ -1,19 +0,0 @@
1
- class Instance
2
- def initialize
3
- @ec2 = AWS::EC2.new
4
- @auto_scaling= AWS::AutoScaling.new
5
- end
6
-
7
- def destroy
8
- end
9
-
10
- def find_in_as_group(as_group_name)
11
- first_instance = @auto_scaling.groups[as_group_name].auto_scaling_instances.first.id
12
-
13
- return @ec2.instances[first_instance].ip_address
14
- end
15
-
16
- def find_sg_name(sg_id)
17
- @ec2.security_groups[sgid].name
18
- end
19
- end
@@ -1,16 +0,0 @@
1
- class KeyPair
2
- def initialize
3
- @ec2 = AWS::EC2.new
4
- end
5
-
6
- def create(name)
7
- key_pair = @ec2.key_pairs.create(name)
8
- File.open("/tmp/#{name}", "w") do |f|
9
- f.write(key_pair.private_key)
10
- end
11
- end
12
-
13
- def delete(name)
14
- @ec2.key_pairs[name].delete
15
- end
16
- end