opendelivery 0.0.1 → 0.0.3

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.
@@ -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