engineyard 0.4.0 → 0.5.0
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/engineyard.rb +1 -1
- data/lib/engineyard/api.rb +12 -1
- data/lib/engineyard/cli.rb +116 -48
- data/lib/engineyard/cli/recipes.rb +37 -7
- data/lib/engineyard/cli/ui.rb +8 -0
- data/lib/engineyard/cli/web.rb +41 -0
- data/lib/engineyard/error.rb +8 -1
- data/lib/engineyard/model/environment.rb +32 -6
- data/lib/engineyard/model/instance.rb +39 -20
- data/lib/engineyard/repo.rb +7 -3
- data/lib/engineyard/thor.rb +55 -2
- data/spec/engineyard/api_spec.rb +2 -2
- data/spec/engineyard/cli/api_spec.rb +1 -1
- data/spec/engineyard/model/environment_spec.rb +8 -6
- data/spec/ey/deploy_spec.rb +46 -81
- data/spec/ey/ey_spec.rb +2 -2
- data/spec/ey/list_environments_spec.rb +1 -1
- data/spec/ey/logs_spec.rb +11 -21
- data/spec/ey/rebuild_spec.rb +8 -33
- data/spec/ey/recipes/apply_spec.rb +8 -33
- data/spec/ey/recipes/download_spec.rb +29 -0
- data/spec/ey/recipes/upload_spec.rb +8 -25
- data/spec/ey/rollback_spec.rb +10 -40
- data/spec/ey/ssh_spec.rb +17 -34
- data/spec/ey/web/disable_spec.rb +18 -0
- data/spec/ey/web/enable_spec.rb +18 -0
- data/spec/spec_helper.rb +7 -3
- data/spec/support/fake_awsm.ru +18 -0
- data/spec/support/helpers.rb +13 -0
- data/spec/support/shared_behavior.rb +132 -0
- metadata +8 -3
data/spec/spec_helper.rb
CHANGED
@@ -22,6 +22,7 @@ require 'engineyard'
|
|
22
22
|
|
23
23
|
# Spec stuff
|
24
24
|
require 'spec/autorun'
|
25
|
+
require 'tmpdir'
|
25
26
|
require 'yaml'
|
26
27
|
require 'pp'
|
27
28
|
support = Dir[File.join(EY_ROOT,'/spec/support/*.rb')]
|
@@ -30,6 +31,7 @@ support.each{|helper| require helper }
|
|
30
31
|
Spec::Runner.configure do |config|
|
31
32
|
config.include Spec::Helpers
|
32
33
|
config.extend Spec::GitRepo
|
34
|
+
config.extend Spec::Helpers::SemanticNames
|
33
35
|
|
34
36
|
config.before(:all) do
|
35
37
|
FakeWeb.allow_net_connect = false
|
@@ -65,7 +67,7 @@ EY.define_git_repo("default") do |git_dir|
|
|
65
67
|
system("git commit -m 'initial commit' >/dev/null 2>&1")
|
66
68
|
end
|
67
69
|
|
68
|
-
shared_examples_for "
|
70
|
+
shared_examples_for "integration without an eyrc file" do
|
69
71
|
use_git_repo('default')
|
70
72
|
|
71
73
|
before(:all) do
|
@@ -84,8 +86,8 @@ shared_examples_for "an integration test without an eyrc file" do
|
|
84
86
|
end
|
85
87
|
|
86
88
|
# Use this in conjunction with the 'ey' helper method
|
87
|
-
shared_examples_for "
|
88
|
-
|
89
|
+
shared_examples_for "integration" do
|
90
|
+
given "integration without an eyrc file"
|
89
91
|
|
90
92
|
before(:all) do
|
91
93
|
token = { ENV['CLOUD_URL'] => {
|
@@ -99,3 +101,5 @@ shared_examples_for "it has an api" do
|
|
99
101
|
@api = EY::API.new('asdf')
|
100
102
|
end
|
101
103
|
end
|
104
|
+
|
105
|
+
|
data/spec/support/fake_awsm.ru
CHANGED
@@ -54,6 +54,24 @@ class FakeAwsm < Sinatra::Base
|
|
54
54
|
{"logs" => @@scenario.logs(params[:env_id])}.to_json
|
55
55
|
end
|
56
56
|
|
57
|
+
get "/api/v2/environments/:env_id/recipes" do
|
58
|
+
redirect '/fakes3/recipe'
|
59
|
+
end
|
60
|
+
|
61
|
+
get "/fakes3/recipe" do
|
62
|
+
content_type "binary/octet-stream"
|
63
|
+
status(200)
|
64
|
+
|
65
|
+
tempdir = File.join(Dir.tmpdir, "ey_test_cmds_#{Time.now.tv_sec}#{Time.now.tv_usec}_#{$$}")
|
66
|
+
Dir.mkdir(tempdir)
|
67
|
+
Dir.mkdir("#{tempdir}/cookbooks")
|
68
|
+
File.open("#{tempdir}/cookbooks/README", 'w') do |f|
|
69
|
+
f.write "Remove this file to clone an upstream git repository of cookbooks\n"
|
70
|
+
end
|
71
|
+
|
72
|
+
Dir.chdir(tempdir) { `tar czf - cookbooks` }
|
73
|
+
end
|
74
|
+
|
57
75
|
post "/api/v2/environments/:env_id/recipes" do
|
58
76
|
if params[:file][:tempfile]
|
59
77
|
files = `tar --list -z -f "#{params[:file][:tempfile].path}"`.split(/\n/)
|
data/spec/support/helpers.rb
CHANGED
@@ -0,0 +1,132 @@
|
|
1
|
+
module Spec
|
2
|
+
module Helpers
|
3
|
+
module SharedIntegrationTestUtils
|
4
|
+
|
5
|
+
def run_ey(command_options, ey_options)
|
6
|
+
if respond_to?(:extra_ey_options) # needed for ssh tests
|
7
|
+
ey_options.merge!(extra_ey_options)
|
8
|
+
end
|
9
|
+
|
10
|
+
ey(command_to_run(command_options), ey_options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def make_scenario(hash)
|
14
|
+
# since nil will silently turn to empty string when interpolated,
|
15
|
+
# and there's a lot of string matching involved in integration
|
16
|
+
# testing, it would be nice to have early notification of typos.
|
17
|
+
scenario = Hash.new { |h,k| raise "Tried to get key #{k.inspect}, but it's missing!" }
|
18
|
+
scenario.merge!(hash)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
shared_examples_for "it takes an environment name" do
|
27
|
+
include Spec::Helpers::SharedIntegrationTestUtils
|
28
|
+
|
29
|
+
it "operates on the current environment by default" do
|
30
|
+
api_scenario "one app, one environment"
|
31
|
+
run_ey({:env => nil}, {:debug => true})
|
32
|
+
verify_ran(make_scenario({
|
33
|
+
:environment => 'giblets',
|
34
|
+
:application => 'rails232app',
|
35
|
+
:master_ip => '174.129.198.124',
|
36
|
+
:ssh_username => 'turkey',
|
37
|
+
}))
|
38
|
+
end
|
39
|
+
|
40
|
+
it "complains when you specify a nonexistent environment" do
|
41
|
+
api_scenario "one app, one environment"
|
42
|
+
run_ey({:env => 'typo-happens-here'}, {:expect_failure => true})
|
43
|
+
@err.should match(/no environment named 'typo-happens-here'/i)
|
44
|
+
end
|
45
|
+
|
46
|
+
context "given a piece of the environment name" do
|
47
|
+
before(:all) do
|
48
|
+
api_scenario "one app, many similarly-named environments"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "complains when the substring is ambiguous" do
|
52
|
+
run_ey({:env => 'staging'}, {:expect_failure => true})
|
53
|
+
@err.should match(/'staging' is ambiguous/)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "works when the substring is unambiguous" do
|
57
|
+
api_scenario "one app, many similarly-named environments"
|
58
|
+
run_ey({:env => 'prod'}, {:debug => true})
|
59
|
+
verify_ran(make_scenario({
|
60
|
+
:environment => 'railsapp_production',
|
61
|
+
:application => 'rails232app',
|
62
|
+
:master_ip => '174.129.198.124',
|
63
|
+
:ssh_username => 'turkey',
|
64
|
+
}))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it "complains when it can't guess the environment and its name isn't specified" do
|
69
|
+
api_scenario "one app, one environment, not linked"
|
70
|
+
run_ey({:env => nil}, {:expect_failure => true})
|
71
|
+
@err.should =~ /single environment/i
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
shared_examples_for "it invokes eysd" do
|
76
|
+
include Spec::Helpers::SharedIntegrationTestUtils
|
77
|
+
|
78
|
+
context "eysd install" do
|
79
|
+
before(:all) do
|
80
|
+
api_scenario "one app, one environment"
|
81
|
+
end
|
82
|
+
|
83
|
+
before(:each) do
|
84
|
+
ENV.delete "NO_SSH"
|
85
|
+
end
|
86
|
+
|
87
|
+
after(:each) do
|
88
|
+
ENV['NO_SSH'] = "true"
|
89
|
+
end
|
90
|
+
|
91
|
+
def exiting_ssh(exit_code)
|
92
|
+
"#!/usr/bin/env ruby\n exit!(#{exit_code}) if ARGV.to_s =~ /Base64.decode64/"
|
93
|
+
end
|
94
|
+
|
95
|
+
it "raises an error if SSH fails" do
|
96
|
+
run_ey({:env => 'giblets'},
|
97
|
+
{:prepend_to_path => {'ssh' => exiting_ssh(255)}, :expect_failure => true})
|
98
|
+
@err.should =~ /SSH connection to \S+ failed/
|
99
|
+
end
|
100
|
+
|
101
|
+
it "installs ey-deploy if it's missing" do
|
102
|
+
run_ey({:env => 'giblets'}, {:prepend_to_path => {'ssh' => exiting_ssh(104)}})
|
103
|
+
|
104
|
+
gem_install_command = @ssh_commands.find do |command|
|
105
|
+
command =~ /gem install ey-deploy/
|
106
|
+
end
|
107
|
+
gem_install_command.should_not be_nil
|
108
|
+
gem_install_command.should =~ %r{/usr/local/ey_resin/ruby/bin/gem install.*ey-deploy}
|
109
|
+
end
|
110
|
+
|
111
|
+
it "upgrades ey-deploy if it's too old" do
|
112
|
+
run_ey({:env => 'giblets'}, {:prepend_to_path => {'ssh' => exiting_ssh(70)}})
|
113
|
+
@ssh_commands.should have_command_like(/gem uninstall -a -x ey-deploy/)
|
114
|
+
@ssh_commands.should have_command_like(/gem install ey-deploy/)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "raises an error if ey-deploy is too new" do
|
118
|
+
run_ey({:env => 'giblets'},
|
119
|
+
{:prepend_to_path => {'ssh' => exiting_ssh(17)}, :expect_failure => true})
|
120
|
+
@ssh_commands.should_not have_command_like(/gem install ey-deploy/)
|
121
|
+
@ssh_commands.should_not have_command_like(/eysd deploy/)
|
122
|
+
@err.should match(/too new/i)
|
123
|
+
end
|
124
|
+
|
125
|
+
it "does not change ey-deploy if its version is satisfactory" do
|
126
|
+
run_ey({:env => 'giblets'}, {:prepend_to_path => {'ssh' => exiting_ssh(0)}})
|
127
|
+
@ssh_commands.should_not have_command_like(/gem install ey-deploy/)
|
128
|
+
@ssh_commands.should_not have_command_like(/gem uninstall.* ey-deploy/)
|
129
|
+
@ssh_commands.should have_command_like(/eysd deploy/)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 5
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.5.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- EY Cloud Team
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-16 00:00:00 -07:00
|
18
18
|
default_executable: ey
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- lib/engineyard/cli/recipes.rb
|
114
114
|
- lib/engineyard/cli/thor_fixes.rb
|
115
115
|
- lib/engineyard/cli/ui.rb
|
116
|
+
- lib/engineyard/cli/web.rb
|
116
117
|
- lib/engineyard/cli.rb
|
117
118
|
- lib/engineyard/collection/environments.rb
|
118
119
|
- lib/engineyard/collection.rb
|
@@ -177,12 +178,16 @@ test_files:
|
|
177
178
|
- spec/ey/logs_spec.rb
|
178
179
|
- spec/ey/rebuild_spec.rb
|
179
180
|
- spec/ey/recipes/apply_spec.rb
|
181
|
+
- spec/ey/recipes/download_spec.rb
|
180
182
|
- spec/ey/recipes/upload_spec.rb
|
181
183
|
- spec/ey/rollback_spec.rb
|
182
184
|
- spec/ey/ssh_spec.rb
|
185
|
+
- spec/ey/web/disable_spec.rb
|
186
|
+
- spec/ey/web/enable_spec.rb
|
183
187
|
- spec/spec_helper.rb
|
184
188
|
- spec/support/bundled_ey
|
185
189
|
- spec/support/fake_awsm.ru
|
186
190
|
- spec/support/git_repo.rb
|
187
191
|
- spec/support/helpers.rb
|
188
192
|
- spec/support/ruby_ext.rb
|
193
|
+
- spec/support/shared_behavior.rb
|