rhc 1.1.11 → 1.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/features/cartridge.feature +14 -1
- data/features/domain.feature +1 -1
- data/features/lib/rhc_helper.rb +3 -3
- data/features/lib/rhc_helper/app.rb +11 -3
- data/features/lib/rhc_helper/cartridge.rb +8 -0
- data/features/lib/rhc_helper/domain.rb +8 -15
- data/features/lib/rhc_helper/httpify.rb +11 -6
- data/features/lib/rhc_helper/runnable.rb +43 -7
- data/features/sshkey.feature +3 -4
- data/features/step_definitions/application_steps.rb +5 -5
- data/features/step_definitions/cartridge_steps.rb +12 -0
- data/features/step_definitions/client_steps.rb +3 -2
- data/features/step_definitions/sshkey_steps.rb +3 -3
- data/features/support/assumptions.rb +11 -11
- data/features/support/before_hooks.rb +23 -5
- data/features/support/env.rb +14 -4
- data/lib/rhc-common.rb +5 -2
- data/lib/rhc/cartridge_helpers.rb +7 -1
- data/lib/rhc/command_runner.rb +8 -4
- data/lib/rhc/commands.rb +6 -0
- data/lib/rhc/commands/app.rb +15 -7
- data/lib/rhc/commands/base.rb +3 -3
- data/lib/rhc/commands/cartridge.rb +78 -2
- data/lib/rhc/commands/port-forward.rb +137 -24
- data/lib/rhc/exceptions.rb +23 -8
- data/lib/rhc/helpers.rb +25 -4
- data/lib/rhc/output_helpers.rb +23 -0
- data/lib/rhc/rest.rb +38 -19
- data/lib/rhc/rest/base.rb +7 -3
- data/lib/rhc/rest/cartridge.rb +10 -1
- data/lib/rhc/usage_templates/command_help.erb +12 -12
- data/lib/rhc/usage_templates/command_syntax_help.erb +1 -1
- data/lib/rhc/usage_templates/help.erb +3 -3
- data/lib/rhc/usage_templates/missing_help.erb +1 -1
- data/lib/rhc/version.rb +1 -5
- data/lib/rhc/wizard.rb +4 -32
- data/spec/rest_spec_helper.rb +18 -4
- data/spec/rhc/commands/cartridge_spec.rb +91 -0
- data/spec/rhc/commands/domain_spec.rb +6 -2
- data/spec/rhc/commands/port-forward_spec.rb +95 -54
- data/spec/rhc/commands/snapshot_spec.rb +5 -0
- data/spec/rhc/rest_spec.rb +23 -2
- data/spec/rhc/wizard_spec.rb +9 -12
- data/spec/spec_helper.rb +5 -0
- metadata +228 -224
data/features/cartridge.feature
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
@single_cartridge @domain_required
|
1
|
+
@single_cartridge @domain_required @cartridge_storage_user_required
|
2
2
|
Feature: Single Cartridge Tests
|
3
3
|
|
4
4
|
# Need to keep these outlines duplicated until we update cucumber to allow tagged examples
|
@@ -32,3 +32,16 @@ Feature: Single Cartridge Tests
|
|
32
32
|
| php-5.3 | PHP 5.3 |
|
33
33
|
| mongodb-2.2 | MongoDB NoSQL |
|
34
34
|
| cron-1.4 | Cron 1.4 |
|
35
|
+
|
36
|
+
# Commenting this out for US2438
|
37
|
+
# Scenario Outline: Cartridge Storage
|
38
|
+
# Given we have a running mysql-5.1 cartridge
|
39
|
+
# When we <action> storage for the mysql-5.1 cartridge
|
40
|
+
# Then the additional cartridge storage amount should be <total>
|
41
|
+
#
|
42
|
+
# Examples:
|
43
|
+
# | action | total |
|
44
|
+
# | show | None |
|
45
|
+
# | add 5GB | 5GB |
|
46
|
+
# | remove 3GB | 2GB |
|
47
|
+
# | set 4GB | 4GB |
|
data/features/domain.feature
CHANGED
@@ -17,7 +17,7 @@ Feature: Existing Domain Operations
|
|
17
17
|
|
18
18
|
Scenario: Domain Create Fails
|
19
19
|
When rhc domain create is called
|
20
|
-
Then the domain command should fail with an exitcode of
|
20
|
+
Then the domain command should fail with an exitcode of 103
|
21
21
|
|
22
22
|
Scenario: Domain Delete
|
23
23
|
When domain is deleted
|
data/features/lib/rhc_helper.rb
CHANGED
@@ -6,13 +6,13 @@ require 'tmpdir'
|
|
6
6
|
module RHCHelper
|
7
7
|
TEMP_DIR = File.join(Dir.tmpdir, "rhc") unless const_defined?(:TEMP_DIR)
|
8
8
|
# The regex to parse the UUID output from the create app results
|
9
|
-
UUID_OUTPUT_PATTERN =
|
9
|
+
UUID_OUTPUT_PATTERN = /UUID\s*(?:\:|=)\s*(.+)/i unless const_defined?(:UUID_OUTPUT_PATTERN)
|
10
10
|
# The regex to parse the Gear Profile output from the create app results
|
11
|
-
GEAR_PROFILE_OUTPUT_PATTERN =
|
11
|
+
GEAR_PROFILE_OUTPUT_PATTERN = /Info.*Gear Size\s*(?:\:|=)\s*(\w+)/m unless const_defined?(:GEAR_PROFILE_OUTPUT_PATTERN)
|
12
12
|
# Regex to parse passwords out of logging messages
|
13
13
|
PASSWORD_REGEX = / -p [^\s]* / unless const_defined?(:PASSWORD_REGEX)
|
14
14
|
end
|
15
|
-
|
15
|
+
\
|
16
16
|
require 'rhc_helper/loggable'
|
17
17
|
require 'rhc_helper/commandify'
|
18
18
|
require 'rhc_helper/httpify'
|
@@ -36,15 +36,23 @@ module RHCHelper
|
|
36
36
|
# 2 - password
|
37
37
|
# 3 - upload SSH keys
|
38
38
|
# 4 - if no namespace is found, create namespace? (blank is no)
|
39
|
+
args = [$username, $password]
|
40
|
+
args << 'yes' unless ($keyed_users ||= []).include?($username)
|
41
|
+
puts "User #{$username} has no keys" if args.length == 3
|
42
|
+
args << '' # always skip namespace
|
39
43
|
if $namespace
|
40
44
|
# Namespace is already created, so don't pass anything in
|
41
45
|
logger.info("Namespace (#{$namespace}) should be found by the wizard")
|
42
|
-
run("rhc setup", nil,
|
46
|
+
run("rhc setup", nil, args) do |exitstatus, out, err, arg|
|
47
|
+
raise "Unmatched namespace #{$namespace}" unless out.include?($namespace)
|
48
|
+
end
|
43
49
|
else
|
44
50
|
# Pass in a blank value for namespace to create in the next step
|
51
|
+
args << ''
|
45
52
|
logger.info("Skipping namespace creation")
|
46
|
-
run("rhc setup", nil,
|
53
|
+
run("rhc setup", nil, args)
|
47
54
|
end
|
55
|
+
$keyed_users << $username
|
48
56
|
end
|
49
57
|
|
50
58
|
def self.create_unique(type, scalable, gear_profile=nil, prefix="test")
|
@@ -58,7 +66,7 @@ module RHCHelper
|
|
58
66
|
test_names << app.name if app.name.start_with?(prefix)
|
59
67
|
end
|
60
68
|
end
|
61
|
-
|
69
|
+
|
62
70
|
loop do
|
63
71
|
# Generate a random application name
|
64
72
|
chars = ("1".."9").to_a
|
@@ -78,6 +78,14 @@ module RHCHelper
|
|
78
78
|
status
|
79
79
|
end
|
80
80
|
|
81
|
+
def storage(cartridge, args)
|
82
|
+
output = nil
|
83
|
+
rhc_cartridge("storage #{cartridge} #{args}") do |exitstatus, out, err, arg|
|
84
|
+
output = out.split(" ")[-1]
|
85
|
+
end
|
86
|
+
output
|
87
|
+
end
|
88
|
+
|
81
89
|
def show
|
82
90
|
result = ""
|
83
91
|
rhc_cartridge('show') do |exitstatus, out, err, arg|
|
@@ -27,13 +27,14 @@ module RHCHelper
|
|
27
27
|
|
28
28
|
def self.create_if_needed(prefix="test")
|
29
29
|
unless $namespace
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
client = RHC::Rest::Client.new($end_point, $username, $password)
|
31
|
+
domain = client.domains.first
|
32
|
+
if domain
|
33
|
+
$namespace = domain.id
|
34
|
+
else
|
35
|
+
$namespace = unique_namespace(prefix)
|
36
|
+
# Create the domain
|
37
|
+
rhc_domain_create
|
37
38
|
end
|
38
39
|
end
|
39
40
|
end
|
@@ -45,9 +46,6 @@ module RHCHelper
|
|
45
46
|
def self.delete
|
46
47
|
rhc_domain_delete
|
47
48
|
$namespace = nil
|
48
|
-
# Write the new domain to a file in the temp directory
|
49
|
-
namespace_file = File.join(RHCHelper::TEMP_DIR, 'namespace')
|
50
|
-
File.delete(namespace_file) if File.exists?(namespace_file)
|
51
49
|
end
|
52
50
|
|
53
51
|
def self.update(prefix="update")
|
@@ -55,12 +53,7 @@ module RHCHelper
|
|
55
53
|
$namespace = unique_namespace(prefix)
|
56
54
|
rhc_domain_update
|
57
55
|
|
58
|
-
namespace_file = File.join(RHCHelper::TEMP_DIR, 'namespace')
|
59
56
|
if @exitcode == 0
|
60
|
-
# Write the new domain to a file in the temp directory
|
61
|
-
File.open(namespace_file, 'w') do |f|
|
62
|
-
f.write($namespace)
|
63
|
-
end
|
64
57
|
else
|
65
58
|
$namespace = $old_namespace
|
66
59
|
end
|
@@ -70,25 +70,26 @@ module RHCHelper
|
|
70
70
|
begin
|
71
71
|
timeout(options[:timeout]) do
|
72
72
|
loop do
|
73
|
+
logger.debug "HTTP_CHECK: Requesting: #{uri}"
|
73
74
|
# Send the HTTP request
|
74
75
|
response = begin
|
75
76
|
http = http_instance(uri,options[:http_timeout])
|
76
|
-
logger.debug "Requesting: #{uri}"
|
77
77
|
http.send_request(
|
78
78
|
options[:method].to_s.upcase, # Allow options to be a symbol
|
79
79
|
uri.request_uri, nil, headers
|
80
80
|
)
|
81
81
|
rescue Exception => e
|
82
82
|
# Pass these up so we can check them
|
83
|
-
|
83
|
+
e
|
84
84
|
end
|
85
|
-
|
85
|
+
logger.debug "HTTP_CHECK: Response: #{response.class}"
|
86
86
|
case response
|
87
87
|
# Catch any response if we're expecting it or redirection
|
88
88
|
when expected.class, Net::HTTPRedirection
|
89
89
|
break
|
90
90
|
# Retry these responses
|
91
|
-
when Net::HTTPServiceUnavailable, SocketError
|
91
|
+
when Net::HTTPServiceUnavailable, SocketError, Timeout::Error
|
92
|
+
logger.debug "HTTP_CHECK: Error #{response.message}"
|
92
93
|
my_sleep(response,expected,start,options)
|
93
94
|
else
|
94
95
|
case expected
|
@@ -123,13 +124,17 @@ module RHCHelper
|
|
123
124
|
|
124
125
|
def is_inaccessible?(options = {})
|
125
126
|
check_response(options.merge({
|
126
|
-
:expected => Net::HTTPServiceUnavailable
|
127
|
+
:expected => Net::HTTPServiceUnavailable,
|
128
|
+
:http_timeout => 2,
|
129
|
+
:timeout => 60,
|
127
130
|
}))
|
128
131
|
end
|
129
132
|
|
130
133
|
def is_accessible?(options = {})
|
131
134
|
check_response(options.merge({
|
132
|
-
:expected => Net::HTTPSuccess
|
135
|
+
:expected => Net::HTTPSuccess,
|
136
|
+
:http_timeout => 20,
|
137
|
+
:timeout => 180,
|
133
138
|
}))
|
134
139
|
end
|
135
140
|
|
@@ -1,10 +1,28 @@
|
|
1
1
|
require 'open4'
|
2
2
|
require 'timeout'
|
3
|
+
require 'iconv'
|
4
|
+
require 'rubygems'
|
3
5
|
|
4
6
|
module RHCHelper
|
5
7
|
module Runnable
|
6
8
|
include Loggable
|
7
9
|
|
10
|
+
class StringTee < StringIO
|
11
|
+
attr_reader :tee
|
12
|
+
def initialize(other)
|
13
|
+
@tee = other
|
14
|
+
super()
|
15
|
+
end
|
16
|
+
def <<(buf)
|
17
|
+
tee << buf
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def iconv_handler
|
23
|
+
@iconv ||= Iconv.new('UTF-8//IGNORE', 'UTF-8')
|
24
|
+
end
|
25
|
+
|
8
26
|
def run(cmd, arg=nil, input=[])
|
9
27
|
logger.info("Running: #{cmd}")
|
10
28
|
|
@@ -12,17 +30,35 @@ module RHCHelper
|
|
12
30
|
output = nil
|
13
31
|
|
14
32
|
# Don't let a command run more than 5 minutes
|
15
|
-
Timeout::timeout(
|
16
|
-
|
17
|
-
|
18
|
-
stdin.
|
33
|
+
Timeout::timeout(240) do
|
34
|
+
|
35
|
+
stdout, stderr = (ENV['VERBOSE'] ? [$stdout, $stderr] : [logger, logger]).map{ |t| StringTee.new(t) }
|
36
|
+
stdin = input.inject(StringIO.new){ |io, s| io.puts s; io }
|
37
|
+
stdin.close_write
|
38
|
+
stdin.rewind
|
39
|
+
status = Open4.spawn(cmd, 'stdout' => stdout, 'stderr' => stderr, 'stdin' => stdin, 'quiet' => true)
|
40
|
+
out, err = [stdout, stderr].map(&:string)
|
41
|
+
|
42
|
+
#pid, stdin, stdout, stderr = Open4::popen4 cmd
|
43
|
+
#input.each {|line| stdin.puts line}
|
44
|
+
#stdin.close
|
19
45
|
|
20
46
|
# Block until the command finishes
|
21
|
-
ignored, status = Process::waitpid2 pid
|
22
|
-
out = stdout.read.strip
|
23
|
-
err = stderr.read.strip
|
47
|
+
#ignored, status = Process::waitpid2 pid
|
48
|
+
#out = stdout.read.strip
|
49
|
+
#err = stderr.read.strip
|
24
50
|
stdout.close
|
25
51
|
stderr.close
|
52
|
+
|
53
|
+
# Force the output to ASCII-only characters or logger will barf.
|
54
|
+
if (Gem::Version.new(RUBY_VERSION.dup) <=> Gem::Version.new('1.9.3')) >= 0
|
55
|
+
out.encode!('UTF-8', 'UTF-8', :undef => :replace, :invalid => :replace)
|
56
|
+
err.encode!('UTF-8', 'UTF-8', :undef => :replace, :invalid => :replace)
|
57
|
+
else
|
58
|
+
out = iconv_handler.iconv(out + ' ')[0..-2]
|
59
|
+
err = iconv_handler.iconv(err + ' ')[0..-2]
|
60
|
+
end
|
61
|
+
|
26
62
|
logger.debug("Standard Output:\n#{out}")
|
27
63
|
logger.debug("Standard Error:\n#{err}")
|
28
64
|
|
data/features/sshkey.feature
CHANGED
@@ -28,7 +28,7 @@ As an OpenShift user, I want to manage SSH keys with 'rhc sshkey' commands.
|
|
28
28
|
@sshkey_add
|
29
29
|
Scenario: invalid key name is given
|
30
30
|
When a new SSH key "key1.pub" is added as "blah\\ss"
|
31
|
-
Then the command exits with status code
|
31
|
+
Then the command exits with status code 117
|
32
32
|
|
33
33
|
@sshkey_add
|
34
34
|
Scenario: invalid SSH key is added
|
@@ -43,14 +43,13 @@ As an OpenShift user, I want to manage SSH keys with 'rhc sshkey' commands.
|
|
43
43
|
@sshkey_add @key1
|
44
44
|
Scenario: SSH key with the same name already exists
|
45
45
|
When a new SSH key "key2.pub" is added as "key1"
|
46
|
-
Then the command exits with status code
|
46
|
+
Then the command exits with status code 120
|
47
47
|
|
48
48
|
@sshkey_add
|
49
49
|
Scenario: SSH key with the identical content already exists
|
50
50
|
Given a new SSH key "key1.pub" is added as "key1"
|
51
51
|
And a new SSH key "key1.pub" is added as "key2"
|
52
|
-
Then the command exits with status code
|
53
|
-
|
52
|
+
Then the command exits with status code 121
|
54
53
|
|
55
54
|
@sshkey_remove @key1
|
56
55
|
Scenario: SSH key is deleted successfully
|
@@ -25,9 +25,9 @@ Given /^an existing (or new )?(scaled )?(.+) (application with.*)$/ do |create,
|
|
25
25
|
@app = nil if @app.nil? or not @app.is_created?
|
26
26
|
|
27
27
|
if create && @app.nil?
|
28
|
-
|
28
|
+
step "a #{scaled}#{type} application is created"
|
29
29
|
embeds.each do |embed|
|
30
|
-
|
30
|
+
step "the #{embed} cartridge is added"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -45,7 +45,7 @@ end
|
|
45
45
|
When /^(\d+) (.+) applications are created$/ do |app_count, type|
|
46
46
|
old_app = @app
|
47
47
|
@apps = app_count.to_i.times.collect do
|
48
|
-
|
48
|
+
step "a #{type} application is created"
|
49
49
|
@app
|
50
50
|
end
|
51
51
|
@app = old_app
|
@@ -88,7 +88,7 @@ end
|
|
88
88
|
Then /^the applications should be accessible?$/ do
|
89
89
|
old_app = @app
|
90
90
|
@apps.each do |app|
|
91
|
-
|
91
|
+
step "the application should be accessible"
|
92
92
|
end
|
93
93
|
@app = old_app
|
94
94
|
end
|
@@ -110,7 +110,7 @@ Then /^it should succeed$/ do
|
|
110
110
|
end
|
111
111
|
|
112
112
|
Then /^the application should be scalable/ do
|
113
|
-
|
113
|
+
step "the haproxy-1.4 cartridge should be running"
|
114
114
|
end
|
115
115
|
|
116
116
|
Then /^the application should have a (.*) gear$/ do |gear_profile|
|
@@ -19,6 +19,8 @@ When /^the (.+) cartridge is (stopped|(?:re)?started)$/ do |name,command|
|
|
19
19
|
'start'
|
20
20
|
when :restarted
|
21
21
|
'restart'
|
22
|
+
else
|
23
|
+
raise "Unrecognized command type #{status}"
|
22
24
|
end
|
23
25
|
@app.cartridge(name).send(cmd)
|
24
26
|
end
|
@@ -31,6 +33,8 @@ Then /^the (.+) cartridge should be (.*)$/ do |name,status|
|
|
31
33
|
"(.+) stopped"
|
32
34
|
when :removed
|
33
35
|
"Invalid cartridge specified: '#{name}'"
|
36
|
+
else
|
37
|
+
raise "Unrecognized status type #{status}"
|
34
38
|
end
|
35
39
|
@app.cartridge(name).status.should match(expected)
|
36
40
|
end
|
@@ -51,6 +55,10 @@ When /^we list cartridges$/ do
|
|
51
55
|
@exitcode, @cartridge_output = Cartridge.list
|
52
56
|
end
|
53
57
|
|
58
|
+
When /^we (.+) storage for the (.+) cartridge$/ do |storage_action,cartridge|
|
59
|
+
@output = @app.cartridge(@cartridge_name).send(:storage, cartridge, "--#{storage_action}")
|
60
|
+
end
|
61
|
+
|
54
62
|
Then /^the (\w+) scaling value should be (.*)$/ do |minmax,value|
|
55
63
|
expected = {
|
56
64
|
:min => "Minimum",
|
@@ -65,6 +73,10 @@ Then /^the (\w+) scaling value should be (.*)$/ do |minmax,value|
|
|
65
73
|
@app.cartridge(@cartridge_name).send(:show).should match(regex)
|
66
74
|
end
|
67
75
|
|
76
|
+
Then /^the additional cartridge storage amount should be (\w+)$/ do |value|
|
77
|
+
@output.should == value
|
78
|
+
end
|
79
|
+
|
68
80
|
Then /^it should fail with code (\d+)$/ do |code|
|
69
81
|
@exitcode.should == code.to_i
|
70
82
|
end
|
@@ -22,6 +22,7 @@ Given /^the libra client tools$/ do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
When /^the setup wizard is run$/ do
|
25
|
+
puts "Running setup"
|
25
26
|
RHCHelper::App.rhc_setup
|
26
27
|
|
27
28
|
# Force a refresh of the loaded RHC state
|
@@ -29,10 +30,10 @@ When /^the setup wizard is run$/ do
|
|
29
30
|
end
|
30
31
|
|
31
32
|
Then /^the client tools should be setup( if needed)?$/ do |setup|
|
32
|
-
configured = (RHC::Config.
|
33
|
+
configured = (RHC::Config.default_rhlogin && RHC::Config.default_rhlogin == $username && $keyed_users.include?($username))
|
33
34
|
|
34
35
|
if !configured && setup
|
35
|
-
|
36
|
+
step 'the setup wizard is run'
|
36
37
|
configured = (RHC::Config.has_local_config? or RHC::Config.has_opts_config?)
|
37
38
|
end
|
38
39
|
|
@@ -9,7 +9,7 @@ When /^'rhc sshkey (\S+)( .*?)?'(?: command)? is run$/ do |subcommand, rest|
|
|
9
9
|
end
|
10
10
|
|
11
11
|
Given "the existing keys are listed" do
|
12
|
-
|
12
|
+
step "'rhc sshkey list' is run"
|
13
13
|
end
|
14
14
|
|
15
15
|
Given /^the key "(.*?)" is (.*)$/ do |key,cmd|
|
@@ -19,12 +19,12 @@ Given /^the key "(.*?)" is (.*)$/ do |key,cmd|
|
|
19
19
|
when "removed"
|
20
20
|
"remove"
|
21
21
|
end
|
22
|
-
|
22
|
+
step "'rhc sshkey #{cmd} \"#{key}\"' is run"
|
23
23
|
end
|
24
24
|
|
25
25
|
When /^a new SSH key "(.*?)" is added as "(.*)"$/ do |keyfile, name|
|
26
26
|
keyfile = Sshkey.keyfile_path(keyfile)
|
27
|
-
|
27
|
+
step "'rhc sshkey add #{name} #{keyfile}' is run"
|
28
28
|
end
|
29
29
|
|
30
30
|
Then /^the command exits with status code (\d+)$/ do |arg1|
|
@@ -1,16 +1,16 @@
|
|
1
1
|
Given 'we have the client tools setup' do
|
2
|
-
|
3
|
-
|
2
|
+
step 'the libra client tools'
|
3
|
+
step 'the client tools should be setup if needed'
|
4
4
|
end
|
5
5
|
|
6
6
|
Given 'we have an existing domain' do
|
7
|
-
|
8
|
-
|
7
|
+
step 'we have the client tools setup'
|
8
|
+
step 'a new domain is needed and created'
|
9
9
|
begin
|
10
|
-
|
11
|
-
|
10
|
+
step 'the key "key1" is shown'
|
11
|
+
step 'the output includes the key information for "key1"'
|
12
12
|
rescue Spec::Expectations::ExpectationNotMetError
|
13
|
-
|
13
|
+
step 'a new SSH key "key1.pub" is added as "key1"'
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -26,9 +26,9 @@ Given /^we have a (.*) (.*) cartridge$/ do |status,type|
|
|
26
26
|
# only try once
|
27
27
|
retried = false
|
28
28
|
begin
|
29
|
-
|
29
|
+
step "the #{type} cartridge should be #{status}"
|
30
30
|
rescue Spec::Expectations::ExpectationNotMetError
|
31
|
-
|
31
|
+
step "the #{type} cartridge is #{cmd}"
|
32
32
|
(retried = true && retry) unless retried
|
33
33
|
end
|
34
34
|
end
|
@@ -42,8 +42,8 @@ Given /^we have a (stopped|running) application$/ do |state|
|
|
42
42
|
end
|
43
43
|
|
44
44
|
begin
|
45
|
-
|
45
|
+
step "the application should #{before}"
|
46
46
|
rescue Spec::Expectations::ExpectationNotMetError
|
47
|
-
|
47
|
+
step "the application is #{after}"
|
48
48
|
end
|
49
49
|
end
|