dew 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/LICENSE +22 -0
  2. data/README.md +38 -0
  3. data/Rakefile +26 -0
  4. data/bin/dew +87 -0
  5. data/config/cucumber.yaml +4 -0
  6. data/features/create-ami.feature +16 -0
  7. data/features/create-environments.feature +46 -0
  8. data/features/deploy-puge.feature +16 -0
  9. data/features/step_definitions/aws-steps.rb +101 -0
  10. data/features/step_definitions/deploy-puge-steps.rb +27 -0
  11. data/features/support/env.rb +38 -0
  12. data/features/support/hooks.rb +10 -0
  13. data/lib/dew.rb +7 -0
  14. data/lib/dew/aws_resources.yaml +122 -0
  15. data/lib/dew/base_command.rb +24 -0
  16. data/lib/dew/cloud.rb +79 -0
  17. data/lib/dew/commands.rb +6 -0
  18. data/lib/dew/commands/ami.rb +67 -0
  19. data/lib/dew/commands/console.rb +17 -0
  20. data/lib/dew/commands/console/irb_override.rb +24 -0
  21. data/lib/dew/commands/deploy.rb +114 -0
  22. data/lib/dew/commands/deploy/templates/apache.conf.erb +28 -0
  23. data/lib/dew/commands/deploy/templates/known_hosts +2 -0
  24. data/lib/dew/commands/deploy/templates/rvmrc +2 -0
  25. data/lib/dew/commands/environments.rb +110 -0
  26. data/lib/dew/commands/tidy.rb +35 -0
  27. data/lib/dew/controllers.rb +3 -0
  28. data/lib/dew/controllers/amis_controller.rb +82 -0
  29. data/lib/dew/controllers/deploy_controller.rb +10 -0
  30. data/lib/dew/controllers/environments_controller.rb +48 -0
  31. data/lib/dew/models.rb +7 -0
  32. data/lib/dew/models/account.rb +30 -0
  33. data/lib/dew/models/database.rb +32 -0
  34. data/lib/dew/models/deploy.rb +2 -0
  35. data/lib/dew/models/deploy/puge.rb +61 -0
  36. data/lib/dew/models/deploy/run.rb +19 -0
  37. data/lib/dew/models/environment.rb +199 -0
  38. data/lib/dew/models/fog_model.rb +23 -0
  39. data/lib/dew/models/profile.rb +60 -0
  40. data/lib/dew/models/server.rb +134 -0
  41. data/lib/dew/password.rb +7 -0
  42. data/lib/dew/tasks/spec.rake +14 -0
  43. data/lib/dew/validations.rb +8 -0
  44. data/lib/dew/version.rb +3 -0
  45. data/lib/dew/view.rb +39 -0
  46. data/lib/tasks/spec.rake +14 -0
  47. data/spec/dew/cloud_spec.rb +90 -0
  48. data/spec/dew/controllers/amis_controller_spec.rb +137 -0
  49. data/spec/dew/controllers/deploy_controller_spec.rb +38 -0
  50. data/spec/dew/controllers/environments_controller_spec.rb +133 -0
  51. data/spec/dew/models/account_spec.rb +47 -0
  52. data/spec/dew/models/database_spec.rb +58 -0
  53. data/spec/dew/models/deploy/puge_spec.rb +72 -0
  54. data/spec/dew/models/deploy/run_spec.rb +38 -0
  55. data/spec/dew/models/environment_spec.rb +374 -0
  56. data/spec/dew/models/fog_model_spec.rb +24 -0
  57. data/spec/dew/models/profile_spec.rb +85 -0
  58. data/spec/dew/models/server_spec.rb +190 -0
  59. data/spec/dew/password_spec.rb +11 -0
  60. data/spec/dew/spec_helper.rb +22 -0
  61. data/spec/dew/view_spec.rb +38 -0
  62. metadata +284 -0
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
2
+
3
+ describe FogModel do
4
+ let (:fog_object) { double('Fog Object', :id => 'i-12345') }
5
+
6
+ before :each do
7
+ @model = FogModel.new(fog_object)
8
+ end
9
+
10
+ it { @model.id.should == fog_object.id }
11
+
12
+ describe :wait_until_ready do
13
+ it "should call Fog's wait_for method to check that the object is ready" do
14
+ fog_object.should_receive(:wait_for)
15
+ @model.wait_until_ready
16
+ end
17
+ end
18
+
19
+ it "should pass unrecognized methods on to its child object" do
20
+ fog_object.should_receive(:wibble).with('hello').and_return('goodbye')
21
+ @model.wibble('hello').should == 'goodbye'
22
+ end
23
+ end
24
+
@@ -0,0 +1,85 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
2
+
3
+ describe Profile do
4
+
5
+ it "should look for profile file in the profiles dir" do
6
+ File.should_receive(:read).with("#{ENV['HOME']}/.dew/profiles/puge.yaml").and_return("---")
7
+ Profile.read('puge')
8
+ end
9
+
10
+ describe "parsing yaml" do
11
+
12
+ # TODO: This can be refactored to use subject to reduce lines of code.
13
+
14
+ let (:yaml) { "blank: blank" }
15
+
16
+ before :each do
17
+ File.stub(:read).and_return(yaml)
18
+ Cloud.stub(:region => 'ap-southeast-1')
19
+ Cloud.stub_chain(:compute, :flavors, :detect => double(:flavor, :ram => 1.7, :cores => 5, :disk => 350, :bits => 32 ))
20
+ end
21
+
22
+ subject { Profile.read('development') }
23
+
24
+ describe "with an instances section" do
25
+ let (:yaml) {
26
+ "
27
+ instances:
28
+ amis:
29
+ ap-southeast-1: ami-ccf405a5
30
+ size: c1.medium
31
+ count: 2
32
+ security-groups:
33
+ - non_default
34
+ keypair: id_revo
35
+ "
36
+ }
37
+
38
+ it { subject.ami.should == 'ami-ccf405a5' }
39
+ it { subject.count.should == 2 }
40
+ it { subject.size.should == 'c1.medium' }
41
+ it { subject.security_groups.should == %w{non_default} }
42
+ it { subject.keypair.should == 'id_revo' }
43
+
44
+ it "should have a to_s" do
45
+ subject.to_s.should == <<EOF
46
+ +-----------------+----------------------------------------------------------------------------------------------------+
47
+ | 2 instances | "c1.medium" (1.7 GB memory, 5 ECUs processor, 350 GB storage, 32-bit platform, ?? I/O performance) |
48
+ | disk image | "ami-ccf405a5" |
49
+ | security groups | ["non_default"] |
50
+ | keypair | "id_revo" |
51
+ +-----------------+----------------------------------------------------------------------------------------------------+
52
+ EOF
53
+ end
54
+ end
55
+
56
+ describe "without an elb or RDS section" do
57
+ it { subject.has_elb?.should be_false }
58
+ it { subject.has_rds?.should be_false }
59
+ end
60
+
61
+ describe "with an elb section" do
62
+ let (:yaml) {
63
+ "
64
+ elb:
65
+ listener_ports:
66
+ - 80
67
+ - 443
68
+ "
69
+ }
70
+ it { subject.has_elb?.should be_true }
71
+ it { subject.elb_listener_ports.should == [80, 443] }
72
+ end
73
+
74
+ describe "with an RDS section" do
75
+ let (:yaml) {
76
+ "
77
+ rds:
78
+ size: db.m1.small
79
+ "
80
+ }
81
+ it { subject.has_rds?.should be_true }
82
+ it { subject.rds_size.should == 'db.m1.small' }
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,190 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
2
+
3
+ describe Server do
4
+
5
+ let (:compute) { double('Compute', :servers => double('ComputeServers'), :images => double('ComputeImages'), :tags => double('ComputeTags')) }
6
+ let (:id) { 'i-12345' }
7
+ let (:endpoint) { '10.4.5.6' }
8
+ let (:key_name) { 'mykey'}
9
+ let (:fog_server) { double('FogServer', :id => id, :public_ip_address => endpoint, :key_name => key_name, :state => 'running', :tags => { 'Creator' => 'foo'} )}
10
+
11
+ before :each do
12
+ compute.servers.stub(:create => fog_server)
13
+ Cloud.stub(:compute => compute)
14
+ end
15
+
16
+ describe ".create!" do
17
+ it "should ask Fog to create a new server with the provided AMI, size and keypair" do
18
+ compute.servers.should_receive(:create).with(:image_id => 'ami', :flavor_id => 'size', :key_name => key_name, :groups => %(non_default))
19
+ Server.create!('ami', 'size', key_name, %(non_default))
20
+ end
21
+
22
+ it "should return a new server object with an ID" do
23
+ server = Server.create!('ami', 'size', key_name, %(non_default))
24
+ server.id.should == id
25
+ end
26
+ end
27
+
28
+ describe ".find" do
29
+ it "should return an instance for each server return from fog matching our tag" do
30
+ compute.servers.should_receive(:all).with('tag:Environment' => 'hello').and_return([fog_server])
31
+ Server.should_receive(:new).with(fog_server).and_return('server')
32
+ Server.find('Environment', 'hello').should == ['server']
33
+ end
34
+
35
+ it "should filter out servers that are not running or pending" do
36
+ terminated_fog_server = double('Terminated Fog Server', :state => 'terminated')
37
+ Server.should_receive(:new).with(fog_server).and_return('server')
38
+ compute.servers.stub(:all => [fog_server, terminated_fog_server])
39
+ Server.find('Environment', 'hello').should == ['server']
40
+ end
41
+ end
42
+
43
+ context "with an already created server" do
44
+ let (:ssh) { double('SSH') }
45
+
46
+ before :each do
47
+ @server = Server.create!('ami', 'size', key_name, %(non_default))
48
+ Gofer::Host.stub(:new => ssh)
49
+ Cloud.stub(:keyfile_path => '')
50
+ File.stub(:read => nil)
51
+ end
52
+
53
+ describe :username do
54
+ it "should always be 'ubuntu'" do
55
+ @server.username.should == 'ubuntu'
56
+ end
57
+ end
58
+
59
+ describe :creator do
60
+ it "should return the creator from the fog_object's tags" do
61
+ @server.creator.should == 'foo'
62
+ end
63
+ end
64
+
65
+ describe :add_tag do
66
+ it "should ask our compute handler to tag an instance with each key value pair provided" do
67
+ compute.tags.should_receive(:create).with(:resource_id => id, :key => 'A', :value => 'b')
68
+ @server.add_tag('A', 'b')
69
+ end
70
+ end
71
+
72
+ describe :credentials do
73
+ context "server has no key" do
74
+ let(:key_name) { nil }
75
+
76
+ it { @server.credentials.should be_false }
77
+ end
78
+
79
+ context "server has a key" do
80
+ before do
81
+ @path = '/key/path'
82
+ Cloud.should_receive(:keyfile_path).with(key_name).and_return(@path)
83
+ end
84
+
85
+ context "key file exists" do
86
+ let(:file_stat) { double(:stat, :mode => 600, :uid => Process.euid) }
87
+ before do
88
+ File.should_receive(:stat).with(@path).and_return(file_stat)
89
+ File.should_receive(:chmod).with(0600, @path).and_return(true)
90
+ end
91
+
92
+ it { @server.credentials.should == "-i /key/path -o StrictHostKeyChecking=no ubuntu@10.4.5.6" }
93
+ end
94
+
95
+ context "key file does not exist" do
96
+ let(:file_stat) { double(:stat, :mode => 600, :uid => Process.euid) }
97
+ before do
98
+ File.should_receive(:stat).with(@path).and_raise(Errno::ENOENT)
99
+ end
100
+
101
+ it { lambda { @server.credentials }.should raise_error /Can't find keyfile/ }
102
+ end
103
+ end
104
+ end
105
+
106
+ it "should delegate some methods to our fog object" do
107
+ %w{availability_zone public_ip_address}.each do |method_name|
108
+ fog_server.should_receive(method_name).with('args').and_return('hello')
109
+ @server.send(method_name, 'args').should == 'hello'
110
+ end
111
+ end
112
+
113
+ # TODO: AMI should be refactored out in to its own class.
114
+ describe :create_ami do
115
+ let (:ami_name) { 'my-new-ami' }
116
+ let (:ami) { double('AMI', :id => 'ami-12345', :wait_for => nil)}
117
+ let (:ami_create_response) {double('response', :body => {'imageId' => ami.id})}
118
+
119
+ before :each do
120
+ compute.stub(:create_image => ami_create_response)
121
+ compute.images.stub(:get => ami)
122
+ Account.stub(:user_ids => [])
123
+ end
124
+
125
+ after :each do
126
+ @server.create_ami ami_name
127
+ end
128
+
129
+ it "should create an AMI from the server image" do
130
+ compute.should_receive(:create_image).with(@server.id, ami_name, //).and_return(ami_create_response)
131
+ compute.images.should_receive(:get).with(ami.id).and_return(ami)
132
+ end
133
+
134
+ it "should wait for the AMI to become ready" do
135
+ ami.should_receive(:wait_for)
136
+ end
137
+
138
+ it "should share the AMI with the other known accounts" do
139
+ Account.should_receive(:user_ids).and_return(['11', '22'])
140
+ compute.should_receive(:modify_image_attributes).with(ami.id, 'launchPermission', 'add', 'UserId' => '11')
141
+ compute.should_receive(:modify_image_attributes).with(ami.id, 'launchPermission', 'add', 'UserId' => '22')
142
+ end
143
+
144
+ end
145
+
146
+ describe :ssh do
147
+ it "should open a new Gofer::Host connection using the hostname, default username and key data" do
148
+ Cloud.should_receive(:keyfile_path).with(key_name).and_return('/key/path')
149
+ File.should_receive(:read).with('/key/path').and_return('key data')
150
+ Gofer::Host.should_receive(:new).with(endpoint, 'ubuntu', hash_including(:key_data => ['key data'])).and_return 'ssh'
151
+ @server.ssh.should == 'ssh'
152
+ end
153
+ end
154
+
155
+ describe :configure_for_database do
156
+ it "should open up an SSH connection and populate /etc/environment with database credentials" do
157
+ database = double('Database')
158
+ database.should_receive(:db_environment_file).with('password').and_return('environment file contents')
159
+ ssh.should_receive(:write).with('environment file contents', '/tmp/envfile')
160
+ ssh.should_receive(:run).with('sudo mv /tmp/envfile /etc/environment')
161
+ @server.configure_for_database database, 'password'
162
+ end
163
+ end
164
+
165
+ describe :wait_until_ready do
166
+ let (:gofer) { double('Gofer::Host') }
167
+
168
+ before :each do
169
+ fog_server.stub(:wait_for => nil)
170
+ Gofer::Host.stub(:new).and_return(gofer)
171
+ end
172
+
173
+ context "with SSH responding correctly" do
174
+ it "should return successfully" do
175
+ gofer.should_receive(:run)
176
+ @server.wait_until_ready
177
+ end
178
+ end
179
+
180
+ context "with SSH timing out" do
181
+ it "should return the underlying error" do
182
+ # Use a very low timeout to avoid the test taking forever.
183
+ gofer.should_receive(:run).at_least(1).and_raise Timeout::Error
184
+ lambda {@server.wait_until_ready(1)}.should raise_error /SSH Timeout/
185
+ end
186
+ end
187
+
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe Password do
4
+
5
+ describe :random do
6
+ it "should return a random string of characters each time it is called" do
7
+ Password.random.should_not == Password.random
8
+ end
9
+ end
10
+ end
11
+
@@ -0,0 +1,22 @@
1
+
2
+ # From https://github.com/colszowka/simplecov#readme
3
+ if ENV['RSPEC_COVERED']
4
+ require 'simplecov'
5
+ SimpleCov.start 'rails' do
6
+ # bug: changing the coverage_dir here breaks coverage recording.
7
+ add_filter "/commands/"
8
+ add_filter "/base_command.rb"
9
+
10
+ at_exit do
11
+ SimpleCov.result.format!
12
+ if SimpleCov.result.covered_percent < 100
13
+ $stderr.puts "Coverage not 100%, build failed."
14
+ exit 1
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ #require File.expand_path(File.join(File.dirname(__FILE__), '..', 'env'))
21
+ require 'dew'
22
+ Inform.level = :error
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe String do
4
+ describe :indent do
5
+ it { "Hi there\nHow are you?\n".indent(2).should == " Hi there\n How are you?\n" }
6
+ it { " Hi there\n How are you?\n".indent(-2).should == "Hi there\nHow are you?\n" }
7
+ end
8
+ end
9
+
10
+ describe View do
11
+ subject {
12
+ View.new('Test', [double(:id => 1, :name => 'one'), double(:id => 2, :name => 'two')], [:id, :name]) }
13
+
14
+ describe :index do
15
+ it { subject.index.should == <<EOF
16
+ Test:
17
+ +----+-------+
18
+ | id | name |
19
+ +----+-------+
20
+ | 1 | "one" |
21
+ | 2 | "two" |
22
+ +----+-------+
23
+ EOF
24
+ }
25
+ end
26
+
27
+ describe :show do
28
+ it {
29
+ subject.show(0).should == <<EOF
30
+ Test:
31
+ +------+-------+
32
+ | id | 1 |
33
+ | name | "one" |
34
+ +------+-------+
35
+ EOF
36
+ }
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,284 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dew
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - PlayUp Devops
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-17 00:00:00 +10:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: inform
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 0.0.1
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: clamp
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 0.2.0
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: fog
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 0.8.2
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: gofer
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: 0.2.5
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: highline
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.6.2
69
+ type: :runtime
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: terminal-table
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: 1.4.2
80
+ type: :runtime
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: nokogiri
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ type: :runtime
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: rake
95
+ prerelease: false
96
+ requirement: &id008 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 0.8.7
102
+ type: :development
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
105
+ name: rspec
106
+ prerelease: false
107
+ requirement: &id009 !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ~>
111
+ - !ruby/object:Gem::Version
112
+ version: 2.6.0
113
+ type: :development
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
116
+ name: cucumber
117
+ prerelease: false
118
+ requirement: &id010 !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ~>
122
+ - !ruby/object:Gem::Version
123
+ version: 0.10.3
124
+ type: :development
125
+ version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ prerelease: false
129
+ requirement: &id011 !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ~>
133
+ - !ruby/object:Gem::Version
134
+ version: 0.4.0
135
+ type: :development
136
+ version_requirements: *id011
137
+ - !ruby/object:Gem::Dependency
138
+ name: flay
139
+ prerelease: false
140
+ requirement: &id012 !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 1.4.2
146
+ type: :development
147
+ version_requirements: *id012
148
+ - !ruby/object:Gem::Dependency
149
+ name: geminabox
150
+ prerelease: false
151
+ requirement: &id013 !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: "0"
157
+ type: :development
158
+ version_requirements: *id013
159
+ description: |
160
+ Dew is a layer between fog and the ground
161
+
162
+ email:
163
+ - devops@playup.com
164
+ executables:
165
+ - dew
166
+ extensions: []
167
+
168
+ extra_rdoc_files: []
169
+
170
+ files:
171
+ - lib/dew/commands.rb
172
+ - lib/dew/controllers/deploy_controller.rb
173
+ - lib/dew/controllers/environments_controller.rb
174
+ - lib/dew/controllers/amis_controller.rb
175
+ - lib/dew/base_command.rb
176
+ - lib/dew/models/deploy/puge.rb
177
+ - lib/dew/models/deploy/run.rb
178
+ - lib/dew/models/deploy.rb
179
+ - lib/dew/models/server.rb
180
+ - lib/dew/models/profile.rb
181
+ - lib/dew/models/environment.rb
182
+ - lib/dew/models/account.rb
183
+ - lib/dew/models/database.rb
184
+ - lib/dew/models/fog_model.rb
185
+ - lib/dew/password.rb
186
+ - lib/dew/controllers.rb
187
+ - lib/dew/commands/ami.rb
188
+ - lib/dew/commands/deploy/templates/known_hosts
189
+ - lib/dew/commands/deploy/templates/rvmrc
190
+ - lib/dew/commands/deploy/templates/apache.conf.erb
191
+ - lib/dew/commands/deploy.rb
192
+ - lib/dew/commands/environments.rb
193
+ - lib/dew/commands/console.rb
194
+ - lib/dew/commands/tidy.rb
195
+ - lib/dew/commands/console/irb_override.rb
196
+ - lib/dew/tasks/spec.rake
197
+ - lib/dew/view.rb
198
+ - lib/dew/models.rb
199
+ - lib/dew/aws_resources.yaml
200
+ - lib/dew/version.rb
201
+ - lib/dew/validations.rb
202
+ - lib/dew/cloud.rb
203
+ - lib/tasks/spec.rake
204
+ - lib/dew.rb
205
+ - README.md
206
+ - LICENSE
207
+ - Rakefile
208
+ - spec/dew/controllers/deploy_controller_spec.rb
209
+ - spec/dew/controllers/amis_controller_spec.rb
210
+ - spec/dew/controllers/environments_controller_spec.rb
211
+ - spec/dew/models/profile_spec.rb
212
+ - spec/dew/models/deploy/puge_spec.rb
213
+ - spec/dew/models/deploy/run_spec.rb
214
+ - spec/dew/models/environment_spec.rb
215
+ - spec/dew/models/fog_model_spec.rb
216
+ - spec/dew/models/account_spec.rb
217
+ - spec/dew/models/server_spec.rb
218
+ - spec/dew/models/database_spec.rb
219
+ - spec/dew/password_spec.rb
220
+ - spec/dew/cloud_spec.rb
221
+ - spec/dew/spec_helper.rb
222
+ - spec/dew/view_spec.rb
223
+ - features/support/hooks.rb
224
+ - features/support/env.rb
225
+ - features/deploy-puge.feature
226
+ - features/step_definitions/deploy-puge-steps.rb
227
+ - features/step_definitions/aws-steps.rb
228
+ - features/create-ami.feature
229
+ - features/create-environments.feature
230
+ - config/cucumber.yaml
231
+ - bin/dew
232
+ has_rdoc: true
233
+ homepage: http://github.com/playup/dew
234
+ licenses: []
235
+
236
+ post_install_message:
237
+ rdoc_options: []
238
+
239
+ require_paths:
240
+ - lib
241
+ required_ruby_version: !ruby/object:Gem::Requirement
242
+ none: false
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: "0"
247
+ required_rubygems_version: !ruby/object:Gem::Requirement
248
+ none: false
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: "0"
253
+ requirements: []
254
+
255
+ rubyforge_project:
256
+ rubygems_version: 1.6.2
257
+ signing_key:
258
+ specification_version: 3
259
+ summary: Uses fog to access the cloud
260
+ test_files:
261
+ - Rakefile
262
+ - spec/dew/controllers/deploy_controller_spec.rb
263
+ - spec/dew/controllers/amis_controller_spec.rb
264
+ - spec/dew/controllers/environments_controller_spec.rb
265
+ - spec/dew/models/profile_spec.rb
266
+ - spec/dew/models/deploy/puge_spec.rb
267
+ - spec/dew/models/deploy/run_spec.rb
268
+ - spec/dew/models/environment_spec.rb
269
+ - spec/dew/models/fog_model_spec.rb
270
+ - spec/dew/models/account_spec.rb
271
+ - spec/dew/models/server_spec.rb
272
+ - spec/dew/models/database_spec.rb
273
+ - spec/dew/password_spec.rb
274
+ - spec/dew/cloud_spec.rb
275
+ - spec/dew/spec_helper.rb
276
+ - spec/dew/view_spec.rb
277
+ - features/support/hooks.rb
278
+ - features/support/env.rb
279
+ - features/deploy-puge.feature
280
+ - features/step_definitions/deploy-puge-steps.rb
281
+ - features/step_definitions/aws-steps.rb
282
+ - features/create-ami.feature
283
+ - features/create-environments.feature
284
+ - config/cucumber.yaml