opendelivery 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|