hugo 0.1.11 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/hugo/app.rb +104 -51
- data/lib/hugo/aws/ec2.rb +6 -3
- data/lib/hugo/aws/rds.rb +1 -1
- data/lib/hugo/balancer.rb +32 -0
- data/lib/hugo/cloud.rb +6 -6
- data/lib/hugo/database.rb +54 -2
- data/spec/lib/hugo/app_spec.rb +66 -2
- data/spec/lib/hugo/balancer_spec.rb +8 -0
- data/spec/lib/hugo/database_spec.rb +90 -25
- data/spec/lib/hugo_spec.rb +25 -0
- metadata +1 -1
data/lib/hugo/app.rb
CHANGED
@@ -3,9 +3,16 @@ module Hugo; end
|
|
3
3
|
class Hugo::App
|
4
4
|
include Singleton
|
5
5
|
include Hugo::Mixin::ParamsValidate
|
6
|
+
|
7
|
+
AMI = ENV['EC2_AMI_ID'] || 'ami-1515f67c'
|
8
|
+
ZONE = "us-east-1c"
|
9
|
+
TYPE = "m1.small"
|
10
|
+
|
6
11
|
|
7
12
|
attr_accessor :dna
|
8
13
|
|
14
|
+
# How many servers do you want in your cloud
|
15
|
+
# This function will give and take away servers
|
9
16
|
def servers(instances=1)
|
10
17
|
if lb
|
11
18
|
if instances > lb.instances.length
|
@@ -18,30 +25,50 @@ class Hugo::App
|
|
18
25
|
end
|
19
26
|
end
|
20
27
|
|
28
|
+
# Setup will install chef-solo on server instance
|
21
29
|
def setup
|
22
30
|
if lb
|
23
31
|
lb.instances.each do |i|
|
24
32
|
setup_ec2(i)
|
25
33
|
end
|
26
34
|
else
|
27
|
-
puts instance
|
28
35
|
setup_ec2(instance)
|
29
36
|
end
|
30
|
-
puts "Setup Completed"
|
37
|
+
# puts "Setup Completed"
|
31
38
|
end
|
32
39
|
|
40
|
+
# deploy will run you json with chef-sole against your cookbooks
|
33
41
|
def deploy
|
42
|
+
raise ArgumentError, "app.key_name Required" unless key_name
|
43
|
+
raise ArgumentError, "app.key_path Required" unless key_path
|
44
|
+
raise ArgumentError, "app.cookbook Required" unless cookbook
|
45
|
+
raise ArgumentError, "app.run_list Required" unless run_list
|
46
|
+
|
34
47
|
deploy_ec2
|
35
|
-
puts "Deploy Completed"
|
48
|
+
#puts "Deploy Completed"
|
36
49
|
end
|
37
50
|
|
51
|
+
# will kill all app servers
|
38
52
|
def destroy
|
39
|
-
lb
|
40
|
-
|
41
|
-
|
53
|
+
if lb
|
54
|
+
lb.instances.each do |i|
|
55
|
+
Hugo::Aws::Ec2.find(i).destroy
|
56
|
+
end
|
57
|
+
else
|
58
|
+
Hugo::Aws::Ec2.find(instance).destroy
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def clear
|
64
|
+
@key_name = nil
|
65
|
+
@key_path = nil
|
66
|
+
@cookbook = nil
|
67
|
+
@run_list = nil
|
42
68
|
end
|
43
69
|
|
44
70
|
|
71
|
+
# Dyanamically add recipes to your json
|
45
72
|
def add_recipe(name, options=nil)
|
46
73
|
run_list [] if run_list.nil?
|
47
74
|
run_list << "recipe[#{name}]"
|
@@ -52,29 +79,34 @@ class Hugo::App
|
|
52
79
|
end
|
53
80
|
end
|
54
81
|
|
82
|
+
# Set the instance if you only are deploying one server
|
55
83
|
def instance(arg=nil)
|
56
84
|
set_or_return(:instance, arg, :kind_of => [String])
|
57
85
|
end
|
58
86
|
|
87
|
+
# Name of app - should relate to github repository
|
59
88
|
def name(arg=nil)
|
60
89
|
set_or_return(:name, arg, :kind_of => [String])
|
61
90
|
end
|
62
91
|
|
92
|
+
# Load Balancer Object
|
63
93
|
def lb(arg=nil)
|
64
94
|
set_or_return(:lb, arg, :kind_of => [Hugo::Aws::Elb])
|
65
95
|
end
|
66
96
|
|
97
|
+
# Database Object
|
67
98
|
def db(arg=nil)
|
68
|
-
set_or_return(:db, arg, :kind_of => [Hugo::
|
99
|
+
set_or_return(:db, arg, :kind_of => [Hugo::Database])
|
69
100
|
end
|
70
101
|
|
71
|
-
|
72
|
-
|
73
|
-
|
102
|
+
# URI of
|
103
|
+
# def uri(arg=nil)
|
104
|
+
# set_or_return(:uri, arg, :kind_of => [String])
|
105
|
+
# end
|
74
106
|
|
75
|
-
def type(arg=nil)
|
76
|
-
|
77
|
-
end
|
107
|
+
# def type(arg=nil)
|
108
|
+
# set_or_return(:type, arg, :kind_of => [String])
|
109
|
+
# end
|
78
110
|
|
79
111
|
def zone(arg=nil)
|
80
112
|
set_or_return(:zone, arg, :kind_of => [String])
|
@@ -84,18 +116,10 @@ class Hugo::App
|
|
84
116
|
set_or_return(:image_id, arg, :kind_of => [String])
|
85
117
|
end
|
86
118
|
|
87
|
-
def application(arg=nil)
|
88
|
-
set_or_return(:application, arg, :kind_of => [String])
|
89
|
-
end
|
90
|
-
|
91
119
|
def security_group(arg=nil)
|
92
120
|
set_or_return(:security_group, arg, :kind_of => [String])
|
93
121
|
end
|
94
|
-
|
95
|
-
def cloud_name(arg=nil)
|
96
|
-
set_or_return(:cloud_name, arg, :kind_of => [String])
|
97
|
-
end
|
98
|
-
|
122
|
+
|
99
123
|
def key_name(arg=nil)
|
100
124
|
set_or_return(:key_name, arg, :kind_of => [String])
|
101
125
|
end
|
@@ -105,19 +129,61 @@ class Hugo::App
|
|
105
129
|
end
|
106
130
|
|
107
131
|
def key_path(arg=nil)
|
108
|
-
set_or_return(:
|
132
|
+
set_or_return(:key_path, arg, :kind_of => [String])
|
109
133
|
end
|
110
134
|
|
111
135
|
def run_list(arg=nil)
|
112
136
|
set_or_return(:run_list, arg, :kind_of => [Array])
|
113
137
|
end
|
138
|
+
|
114
139
|
|
115
|
-
def
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
140
|
+
def help
|
141
|
+
x = <<HELP
|
142
|
+
|
143
|
+
Hugo app
|
144
|
+
-----------------
|
145
|
+
There are two ways to run hugo app, a single instance mode, or
|
146
|
+
with a balancer. If you do not use a balancer, then after your
|
147
|
+
initial run, which creates the server instance, you need to enter
|
148
|
+
the server instance into your config, so it will not create a new
|
149
|
+
ec2 everytime
|
150
|
+
|
151
|
+
Required attributes
|
152
|
+
-----------------
|
153
|
+
key_name
|
154
|
+
key_path
|
155
|
+
cookbook
|
156
|
+
run_list
|
157
|
+
|
158
|
+
Methods
|
159
|
+
------------------
|
160
|
+
servers
|
161
|
+
|
162
|
+
deploy
|
163
|
+
|
164
|
+
add_recipe
|
165
|
+
|
166
|
+
destroy
|
167
|
+
|
168
|
+
help
|
169
|
+
|
170
|
+
Optional Attributes
|
171
|
+
-----------------
|
172
|
+
|
173
|
+
instance
|
174
|
+
lb
|
175
|
+
db
|
176
|
+
uri
|
177
|
+
type
|
178
|
+
zone
|
179
|
+
image_id
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
HELP
|
184
|
+
puts x
|
185
|
+
x
|
186
|
+
end
|
121
187
|
|
122
188
|
|
123
189
|
private
|
@@ -133,9 +199,9 @@ private
|
|
133
199
|
end
|
134
200
|
|
135
201
|
def create_ec2
|
136
|
-
ec2 = Hugo::Aws::Ec2.new(:type => type,
|
137
|
-
:zone => zone,
|
138
|
-
:image_id => image_id,
|
202
|
+
ec2 = Hugo::Aws::Ec2.new(:type => type || TYPE,
|
203
|
+
:zone => zone || ZONE,
|
204
|
+
:image_id => image_id || AMI,
|
139
205
|
:key_name => key_name,
|
140
206
|
:security_group => "default").create
|
141
207
|
|
@@ -169,7 +235,7 @@ private
|
|
169
235
|
commands << 'if [ -d "./hugo-repos" ]; then echo "setup already run"; else sudo gem install git --no-ri --no-rdoc; fi'
|
170
236
|
commands << "if [ -d \"./hugo-repos\" ]; then echo \"setup already run\"; else git clone #{self.cookbook} ~/hugo-repos; fi"
|
171
237
|
ec2 = Hugo::Aws::Ec2.find(instance_id)
|
172
|
-
puts ec2.uri
|
238
|
+
#puts ec2.uri
|
173
239
|
ec2.ssh(commands, nil, File.join(key_path, key_name))
|
174
240
|
end
|
175
241
|
|
@@ -179,25 +245,16 @@ private
|
|
179
245
|
commands << "cd hugo-repos && git reset --hard && git pull"
|
180
246
|
commands << 'sudo chef-solo -c /home/ubuntu/hugo-repos/config/solo.rb -j /home/ubuntu/dna.json'
|
181
247
|
|
182
|
-
database_info = {
|
183
|
-
:uri => db.uri,
|
184
|
-
:name => db.db,
|
185
|
-
:user => db.user,
|
186
|
-
:password => db.password } unless db.nil?
|
187
248
|
|
188
249
|
self.dna = {} if self.dna.nil?
|
189
|
-
self.dna.merge!(
|
250
|
+
self.dna.merge!(
|
251
|
+
:run_list => run_list,
|
190
252
|
:git => cookbook,
|
191
253
|
:access_key => Hugo::Aws::Ec2::ACCESS_KEY,
|
192
254
|
:secret_key => Hugo::Aws::Ec2::SECRET_KEY,
|
193
|
-
:database =>
|
194
|
-
|
195
|
-
:application => name,
|
196
|
-
:customer => cloud_name,
|
197
|
-
|
198
|
-
:app => deploy_info
|
255
|
+
:database => db ? db.info : {}
|
199
256
|
)
|
200
|
-
|
257
|
+
|
201
258
|
if lb
|
202
259
|
lb.instances.each do |i|
|
203
260
|
Hugo::Aws::Ec2.find(i).ssh(commands, dna, File.join(key_path, key_name))
|
@@ -216,10 +273,6 @@ private
|
|
216
273
|
|
217
274
|
end
|
218
275
|
end
|
219
|
-
|
220
|
-
def get_instance(uri)
|
221
|
-
nil
|
222
|
-
end
|
223
|
-
|
276
|
+
|
224
277
|
|
225
278
|
end
|
data/lib/hugo/aws/ec2.rb
CHANGED
@@ -21,16 +21,19 @@ module Hugo
|
|
21
21
|
|
22
22
|
if options["placement"] and options["placement"]["availabilityZone"]
|
23
23
|
@zone = options["placement"]["availabilityZone"]
|
24
|
+
elsif options[:zone]
|
25
|
+
@zone = option[:zone]
|
24
26
|
else
|
25
27
|
@zone = ZONE
|
26
28
|
end
|
27
29
|
|
28
30
|
@uri = options["dnsName"] || ""
|
29
|
-
@type = options["instanceType"]
|
30
|
-
@image_id = options["imageId"]
|
31
|
+
@type = options[:type] || options["instanceType"]
|
32
|
+
@image_id = options[:image_id] || options["imageId"]
|
33
|
+
@key_name = options[:key_name] || options["keyName"]
|
34
|
+
|
31
35
|
@create_time = options["launchTime"] || nil
|
32
36
|
|
33
|
-
@key_name = options[:key_name] || options["keyName"] || KEY_NAME
|
34
37
|
if options["instanceState"] and options["instanceState"]["name"]
|
35
38
|
@status = options["instanceState"]["name"]
|
36
39
|
else
|
data/lib/hugo/aws/rds.rb
CHANGED
data/lib/hugo/balancer.rb
CHANGED
@@ -28,6 +28,38 @@ class Hugo::Balancer
|
|
28
28
|
)
|
29
29
|
end
|
30
30
|
|
31
|
+
def help
|
32
|
+
x = <<HELP
|
33
|
+
|
34
|
+
Hugo balancer
|
35
|
+
-----------------
|
36
|
+
|
37
|
+
optional attributes
|
38
|
+
-----------------
|
39
|
+
zone - zone
|
40
|
+
port - app server port
|
41
|
+
web - balancer port
|
42
|
+
ssl_port - ssl app server port
|
43
|
+
ssl_web - ssl balancer port
|
44
|
+
type - port type
|
45
|
+
|
46
|
+
|
47
|
+
defaults
|
48
|
+
-----------------
|
49
|
+
DEFAULT_ZONE = 'us-east-1c'
|
50
|
+
DEFAULT_PORT = '8080'
|
51
|
+
DEFAULT_WEB = '80'
|
52
|
+
DEFAULT_TYPE = 'http'
|
53
|
+
DEFAULT_SSL_PORT = '8443'
|
54
|
+
DEFAULT_SSL_WEB = '443'
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
HELP
|
59
|
+
puts x
|
60
|
+
x
|
61
|
+
end
|
62
|
+
|
31
63
|
def name(arg=nil)
|
32
64
|
set_or_return(:name, arg, :kind_of => [String])
|
33
65
|
end
|
data/lib/hugo/cloud.rb
CHANGED
@@ -9,7 +9,7 @@ class Hugo::Cloud
|
|
9
9
|
|
10
10
|
end
|
11
11
|
|
12
|
-
def database(db_name, &block)
|
12
|
+
def database(db_name, &block)
|
13
13
|
database = Hugo::Database.instance
|
14
14
|
|
15
15
|
database.db_security_group name
|
@@ -18,8 +18,7 @@ class Hugo::Cloud
|
|
18
18
|
|
19
19
|
database.instance_eval(&block) if block_given?
|
20
20
|
db database.deploy
|
21
|
-
|
22
|
-
|
21
|
+
|
23
22
|
end
|
24
23
|
|
25
24
|
def balancer(&block)
|
@@ -34,7 +33,7 @@ class Hugo::Cloud
|
|
34
33
|
app_info.name name
|
35
34
|
app_info.lb lb
|
36
35
|
app_info.db db
|
37
|
-
app_info.cloud_name name
|
36
|
+
#app_info.cloud_name name
|
38
37
|
app_info.instance_eval(&block) if block_given?
|
39
38
|
cloud_app app_info
|
40
39
|
|
@@ -49,9 +48,10 @@ class Hugo::Cloud
|
|
49
48
|
end
|
50
49
|
|
51
50
|
def delete
|
52
|
-
[
|
51
|
+
[cloud_app, lb].each do |s|
|
53
52
|
s.destroy if s
|
54
53
|
end
|
54
|
+
db.rds.destroy
|
55
55
|
end
|
56
56
|
|
57
57
|
|
@@ -108,7 +108,7 @@ REPORT
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def db(arg=nil)
|
111
|
-
set_or_return(:db, arg, :kind_of => [Hugo::
|
111
|
+
set_or_return(:db, arg, :kind_of => [Hugo::Database])
|
112
112
|
end
|
113
113
|
|
114
114
|
def lb(arg=nil)
|
data/lib/hugo/database.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Hugo; end
|
2
2
|
|
3
|
+
# Lauch Database Servers
|
3
4
|
class Hugo::Database
|
4
5
|
include Singleton
|
5
6
|
include Hugo::Mixin::ParamsValidate
|
@@ -8,16 +9,25 @@ class Hugo::Database
|
|
8
9
|
DEFAULT_SIZE = 5
|
9
10
|
DEFAULT_ZONE = 'us-east-1c'
|
10
11
|
|
12
|
+
attr_accessor :rds
|
11
13
|
|
14
|
+
# initialize defaults
|
12
15
|
def initialize
|
13
16
|
size DEFAULT_SIZE
|
14
17
|
zone DEFAULT_ZONE
|
15
18
|
server DEFAULT_SERVER
|
16
19
|
db_security_group "default"
|
17
20
|
end
|
18
|
-
|
21
|
+
|
22
|
+
# deploy using AWS RDS
|
19
23
|
def deploy
|
20
|
-
|
24
|
+
raise ArgumentError, "database.name Required" unless name
|
25
|
+
raise ArgumentError, "database.server Required" unless server
|
26
|
+
raise ArgumentError, "database.user Required" unless user
|
27
|
+
raise ArgumentError, "database.password Required" unless password
|
28
|
+
|
29
|
+
|
30
|
+
@rds = Hugo::Aws::Rds.find_or_create( :name => name,
|
21
31
|
:server => server,
|
22
32
|
:user => user,
|
23
33
|
:password => password,
|
@@ -25,8 +35,50 @@ class Hugo::Database
|
|
25
35
|
:zone => zone,
|
26
36
|
:db_security_group => db_security_group
|
27
37
|
)
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
# clear attributes of database object
|
42
|
+
def clear
|
43
|
+
@user = nil
|
44
|
+
@password = nil
|
45
|
+
@server = nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def help
|
49
|
+
|
50
|
+
x = <<HELP
|
51
|
+
Welcome to Hugo::Database
|
52
|
+
-------------------------
|
53
|
+
|
54
|
+
Required Methods:
|
55
|
+
-------------------------
|
56
|
+
name - Name of Database
|
57
|
+
server - Name of Server
|
58
|
+
user - A Valid User of RDS Server
|
59
|
+
password - A Valid Password of RDS Server
|
60
|
+
|
61
|
+
Optional Methods:
|
62
|
+
-------------------------
|
63
|
+
size - Storage Size of you db server
|
64
|
+
zone - Zone of the AWS:RDS
|
65
|
+
|
66
|
+
HELP
|
67
|
+
puts x
|
68
|
+
x
|
28
69
|
end
|
29
70
|
|
71
|
+
def info
|
72
|
+
{
|
73
|
+
:uri => @rds.uri,
|
74
|
+
:name => @rds.db,
|
75
|
+
:user => @rds.user,
|
76
|
+
:password => @rds.password
|
77
|
+
}
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
|
30
82
|
def name(arg=nil)
|
31
83
|
set_or_return(:name, arg, :kind_of => [String])
|
32
84
|
end
|
data/spec/lib/hugo/app_spec.rb
CHANGED
@@ -9,10 +9,25 @@ describe "Hugo App" do
|
|
9
9
|
|
10
10
|
block = lambda do
|
11
11
|
cloud "my_cloud" do
|
12
|
+
database "my_db" do
|
13
|
+
server "my_server"
|
14
|
+
user "hello"
|
15
|
+
password "world"
|
16
|
+
end
|
17
|
+
|
12
18
|
balancer
|
19
|
+
|
13
20
|
app "testapp" do
|
21
|
+
clear
|
22
|
+
|
23
|
+
key_name "ec2-keypair"
|
24
|
+
key_path "~/.ec2"
|
25
|
+
cookbook "git@github.com:jackhq/hugo-cookbooks.git"
|
26
|
+
|
14
27
|
servers 0
|
15
28
|
end
|
29
|
+
#deploy
|
30
|
+
#print
|
16
31
|
end
|
17
32
|
end
|
18
33
|
|
@@ -21,6 +36,55 @@ describe "Hugo App" do
|
|
21
36
|
end.should_not raise_error
|
22
37
|
end
|
23
38
|
|
39
|
+
it "should raise error requiring key_name" do
|
40
|
+
lambda do
|
41
|
+
Hugo do
|
42
|
+
cloud "my_cloud" do
|
43
|
+
app "testapp" do
|
44
|
+
clear
|
45
|
+
key_path "~/.ec2"
|
46
|
+
cookbook "my_cookbook"
|
47
|
+
run_list ["role[base_rack_apache]"]
|
48
|
+
end
|
49
|
+
deploy
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end.should raise_error('app.key_name Required')
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should raise error requiring key_path" do
|
56
|
+
lambda do
|
57
|
+
Hugo do
|
58
|
+
cloud "my_cloud" do
|
59
|
+
app "testapp" do
|
60
|
+
clear
|
61
|
+
key_name "ec2-keypair"
|
62
|
+
cookbook "my_cookbook"
|
63
|
+
run_list ["role[base_rack_apache]"]
|
64
|
+
end
|
65
|
+
deploy
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end.should raise_error('app.key_path Required')
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should raise error requiring cookbook" do
|
72
|
+
lambda do
|
73
|
+
Hugo do
|
74
|
+
cloud "my_cloud" do
|
75
|
+
app "testapp" do
|
76
|
+
clear
|
77
|
+
key_name "ec2-keypair"
|
78
|
+
key_path "~/.ec2"
|
79
|
+
run_list ["role[base_rack_apache]"]
|
80
|
+
end
|
81
|
+
deploy
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end.should raise_error('app.cookbook Required')
|
85
|
+
end
|
86
|
+
|
87
|
+
|
24
88
|
it "should save dna" do
|
25
89
|
block = lambda do
|
26
90
|
cloud "my_cloud" do
|
@@ -28,8 +92,8 @@ describe "Hugo App" do
|
|
28
92
|
app "testapp" do
|
29
93
|
add_recipe "s3fs", :s3 => {:bucket => "samIam"}
|
30
94
|
servers 0
|
31
|
-
puts run_list
|
32
|
-
puts dna.inspect
|
95
|
+
#puts run_list
|
96
|
+
#puts dna.inspect
|
33
97
|
end
|
34
98
|
end
|
35
99
|
end
|
@@ -16,6 +16,7 @@ describe "Hugo Balancer" do
|
|
16
16
|
Hugo &block
|
17
17
|
end.should_not raise_error
|
18
18
|
end
|
19
|
+
|
19
20
|
|
20
21
|
it "should raise error for balancer block not wrapped in cloud block" do
|
21
22
|
block = lambda do
|
@@ -34,4 +35,11 @@ describe "Hugo Balancer" do
|
|
34
35
|
|
35
36
|
end
|
36
37
|
|
38
|
+
it "should print help for balancer" do
|
39
|
+
lb = Hugo::Balancer.instance
|
40
|
+
lb.name "myserver"
|
41
|
+
lb.help.should =~ /^Hugo balancer/
|
42
|
+
|
43
|
+
end
|
44
|
+
|
37
45
|
end
|
@@ -5,46 +5,80 @@ describe "Hugo Database" do
|
|
5
5
|
mocks
|
6
6
|
end
|
7
7
|
|
8
|
+
it "should raise error requiring user" do
|
9
|
+
lambda do
|
10
|
+
Hugo do
|
11
|
+
cloud "my_cloud" do
|
12
|
+
database "testapp" do
|
13
|
+
clear
|
14
|
+
server "server"
|
15
|
+
password "test_password"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end.should raise_error('database.user Required')
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should raise error requiring password" do
|
23
|
+
lambda do
|
24
|
+
Hugo do
|
25
|
+
cloud "my_cloud" do
|
26
|
+
database "testapp" do
|
27
|
+
clear
|
28
|
+
server "server"
|
29
|
+
user "test_user"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end.should raise_error('database.password Required')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should raise error requiring server" do
|
37
|
+
lambda do
|
38
|
+
Hugo do
|
39
|
+
cloud "my_cloud" do
|
40
|
+
database "testapp" do
|
41
|
+
clear
|
42
|
+
password "test_password"
|
43
|
+
user "test_user"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end.should raise_error('database.server Required')
|
48
|
+
end
|
49
|
+
|
8
50
|
it "should be valid" do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
51
|
+
|
52
|
+
lambda do
|
53
|
+
Hugo do
|
54
|
+
cloud "my_cloud" do
|
55
|
+
database "testapp" do
|
56
|
+
server "serverx"
|
57
|
+
user "test_user"
|
58
|
+
password "test_password"
|
59
|
+
end
|
16
60
|
end
|
17
61
|
end
|
18
|
-
end
|
19
|
-
|
20
|
-
lambda do
|
21
|
-
Hugo &block
|
22
62
|
end.should_not raise_error
|
23
63
|
end
|
24
64
|
|
25
65
|
it "should raise error for database block not wrapped in cloud block" do
|
26
|
-
block = lambda do
|
27
|
-
database "mydb" do end
|
28
|
-
end
|
29
|
-
|
30
66
|
lambda do
|
31
|
-
Hugo
|
67
|
+
Hugo { database "mydb" }
|
32
68
|
end.should raise_error
|
33
69
|
end
|
34
70
|
|
35
71
|
it "should not raise error for database block wrapped in cloud block" do
|
36
|
-
block = lambda do
|
37
|
-
cloud "mycloud" do
|
38
|
-
database "mydb" do end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
72
|
lambda do
|
43
|
-
Hugo
|
73
|
+
Hugo do
|
74
|
+
cloud "mycloud" do
|
75
|
+
database "mydb" do end
|
76
|
+
end
|
77
|
+
end
|
44
78
|
end.should be_true
|
45
79
|
end
|
46
80
|
end
|
47
|
-
|
81
|
+
#
|
48
82
|
describe Hugo::Database do
|
49
83
|
before(:each) do
|
50
84
|
mocks
|
@@ -58,9 +92,40 @@ describe Hugo::Database do
|
|
58
92
|
db.name "mydb"
|
59
93
|
db.user "admin"
|
60
94
|
db.password "test"
|
61
|
-
db.deploy.should be_a_kind_of(Hugo::
|
95
|
+
db.deploy.should be_a_kind_of(Hugo::Database)
|
62
96
|
end
|
63
97
|
|
98
|
+
it "should clear required attributes" do
|
99
|
+
db = Hugo::Database.instance
|
100
|
+
db.server "myserver"
|
101
|
+
db.name "mydb"
|
102
|
+
db.user "admin"
|
103
|
+
db.password "test"
|
104
|
+
db.clear
|
105
|
+
db.server.should be_nil
|
106
|
+
db.user.should be_nil
|
107
|
+
db.password.should be_nil
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should print help for database" do
|
112
|
+
db = Hugo::Database.instance
|
113
|
+
db.name "myserver"
|
114
|
+
db.help.should =~ /^Welcome to Hugo/
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should return an info hash" do
|
119
|
+
db = Hugo::Database.instance
|
120
|
+
db.server "myserver"
|
121
|
+
db.name "mydb"
|
122
|
+
db.user "admin"
|
123
|
+
db.password "test"
|
124
|
+
db.deploy
|
125
|
+
db.info.inspect.should == '{:user=>"user", :uri=>"test.cwrzj6lxowfj.us-east-1.rds.amazonaws.com", :password=>"test", :name=>"mydb"}'
|
126
|
+
end
|
127
|
+
|
128
|
+
|
64
129
|
|
65
130
|
end
|
66
131
|
|
data/spec/lib/hugo_spec.rb
CHANGED
@@ -23,6 +23,31 @@ describe "Hugo DSL" do
|
|
23
23
|
end.should be_true
|
24
24
|
end
|
25
25
|
|
26
|
+
it "should deploy a single server app" do
|
27
|
+
block = lambda do
|
28
|
+
cloud "my_cloud" do
|
29
|
+
database "db_name" do
|
30
|
+
server "db_server"
|
31
|
+
user "admin"
|
32
|
+
password "mypassword"
|
33
|
+
end
|
34
|
+
|
35
|
+
balancer
|
36
|
+
|
37
|
+
app "app_name" do
|
38
|
+
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
lambda do
|
45
|
+
Hugo &block
|
46
|
+
end.should be_true
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
|
26
51
|
|
27
52
|
|
28
53
|
it "should deploy infrastructure" do
|