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.
- data/lib/opendelivery/artifact.rb +9 -7
- data/lib/opendelivery/domain.rb +34 -30
- data/lib/opendelivery/image.rb +34 -20
- data/lib/opendelivery/stack.rb +121 -29
- data/lib/opendelivery/storage.rb +24 -16
- data/lib/opendelivery/version.rb +2 -2
- data/lib/opendelivery.rb +5 -3
- metadata +18 -5
- data/lib/opendelivery/database.rb +0 -10
- data/lib/opendelivery/instance.rb +0 -19
- data/lib/opendelivery/key_pair.rb +0 -16
@@ -1,10 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module OpenDelivery
|
2
|
+
class Artifact
|
3
|
+
def initialize
|
4
|
+
end
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
data/lib/opendelivery/domain.rb
CHANGED
@@ -1,44 +1,48 @@
|
|
1
1
|
require 'aws-sdk'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
16
|
-
|
17
|
-
|
14
|
+
def create(domain)
|
15
|
+
AWS::SimpleDB.consistent_reads do
|
16
|
+
@sdb.domains.create(domain)
|
17
|
+
end
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
def destroy(domain)
|
21
|
+
@sdb.domains[domain].delete
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
def destroy_item(domain, item_name)
|
25
|
+
@sdb.domains[domain].items[item_name].delete
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
35
|
-
|
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
|
-
|
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
|
data/lib/opendelivery/image.rb
CHANGED
@@ -1,28 +1,42 @@
|
|
1
|
-
|
1
|
+
module OpenDelivery
|
2
|
+
class Image
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
16
|
+
protected
|
17
17
|
|
18
|
-
|
18
|
+
def wait_for_image(image)
|
19
19
|
sleep 10
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
data/lib/opendelivery/stack.rb
CHANGED
@@ -1,46 +1,138 @@
|
|
1
|
-
|
1
|
+
require 'aws-sdk'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
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
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
data/lib/opendelivery/storage.rb
CHANGED
@@ -1,26 +1,34 @@
|
|
1
|
-
|
1
|
+
require 'aws-sdk'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
end
|
3
|
+
module OpenDelivery
|
4
|
+
class Storage
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
16
|
-
|
22
|
+
def download(bucket, key, output_directory)
|
23
|
+
obj = @s3.buckets[bucket].objects[key]
|
17
24
|
|
18
|
-
|
25
|
+
base = Pathname.new("#{obj.key}").basename
|
19
26
|
|
20
|
-
|
27
|
+
Dir.mkdir(output_directory) unless File.exists?(output_directory)
|
21
28
|
|
22
|
-
|
23
|
-
|
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
|
data/lib/opendelivery/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = '0.0.
|
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.
|
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-
|
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,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
|