stella 2.0.3.001 → 2.1.0.001
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/CHANGES.txt +11 -0
- data/VERSION.yml +2 -2
- data/bin/stella +10 -5
- data/lib/stella/api.rb +11 -6
- data/lib/stella/cli.rb +51 -10
- data/lib/stella/engine.rb +11 -8
- data/stella.gemspec +1 -1
- metadata +1 -1
data/CHANGES.txt
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
STELLA, CHANGES
|
|
2
2
|
|
|
3
|
+
#### 2.1.0 (2011-07-06) ###############################
|
|
4
|
+
|
|
5
|
+
* FIXED: Different CLI output when a testplan is specified
|
|
6
|
+
* ADDED: Handle bad or missing api credentials
|
|
7
|
+
* ADDED: Globals -A and -K for supplying API credentials
|
|
8
|
+
* CHANGE: Default output is now CLI (use -F json)
|
|
9
|
+
* CHANGE: Global -f is now -u (for usecase)
|
|
10
|
+
* CHANGE: Global -F is now -f (output format)
|
|
11
|
+
* CHANGE: STELLA_USER env var is now STELLA_ACCOUNT
|
|
12
|
+
|
|
13
|
+
|
|
3
14
|
#### 2.0.3 (2011-07-06) ###############################
|
|
4
15
|
|
|
5
16
|
* ADDED: Stella::API
|
data/VERSION.yml
CHANGED
data/bin/stella
CHANGED
|
@@ -44,10 +44,15 @@ class Stella::CLI::Definition
|
|
|
44
44
|
#global :H, :withheader, "Include X-Stella-ID request header"
|
|
45
45
|
#global :P, :withparam, "Include __stella query parameter header"
|
|
46
46
|
global :T, :timeout, Float, "HTTP request timeout (default: unlimited)"
|
|
47
|
-
global :F, :format, String, "Output format (partial support)"
|
|
48
47
|
global :R, :remote, "Run command remotely (via blamestella.com)"
|
|
49
|
-
global :
|
|
48
|
+
global :A, :account, String, "API account (overrides STELLA_ACCOUNT)"
|
|
49
|
+
global :K, :key, String, "API key (overrides STELLA_KEY)"
|
|
50
50
|
global :p, :testplan, String, "Path to testplan"
|
|
51
|
+
global :u, :usecase, String, "Only run usecases that match the given filter"
|
|
52
|
+
global :f, :format, String, "Output format (partial support)" do |v|
|
|
53
|
+
raise "Unsupported format: #{v}" unless ['csv', 'json', 'yaml'].member?(v)
|
|
54
|
+
v
|
|
55
|
+
end
|
|
51
56
|
global :n, :nocolor, "Disable output colors" do
|
|
52
57
|
String.disable_color
|
|
53
58
|
end
|
|
@@ -96,9 +101,9 @@ class Stella::CLI::Definition
|
|
|
96
101
|
|
|
97
102
|
after do |obj|
|
|
98
103
|
@elapsed = Time.now - @start
|
|
99
|
-
if @elapsed > 0.1 && Stella.noise >
|
|
100
|
-
|
|
101
|
-
end
|
|
104
|
+
#if @elapsed > 0.1 && Stella.noise > 3
|
|
105
|
+
# Stella.li "#{$/}Elapsed: %.2f seconds" % @elapsed.to_f
|
|
106
|
+
#end
|
|
102
107
|
code = obj.exit_code if obj.respond_to? :exit_code
|
|
103
108
|
exit code ||= 0
|
|
104
109
|
end
|
data/lib/stella/api.rb
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
require 'httparty'
|
|
2
2
|
require 'stella'
|
|
3
3
|
|
|
4
|
-
class Stella
|
|
4
|
+
class Stella
|
|
5
5
|
class API
|
|
6
6
|
include HTTParty
|
|
7
|
-
|
|
8
7
|
ssl_ca_file Stella::Client::SSL_CERT_PATH
|
|
9
8
|
format :json
|
|
10
9
|
attr_reader :httparty_opts, :response
|
|
11
|
-
def initialize
|
|
10
|
+
def initialize account=nil, key=nil, httparty_opts={}
|
|
12
11
|
self.class.base_uri ENV['STELLA_HOST'] || 'https://www.blamestella.com/api/v2'
|
|
13
|
-
@httparty_opts = httparty_opts
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
@httparty_opts = httparty_opts
|
|
13
|
+
account ||= ENV['STELLA_ACCOUNT']
|
|
14
|
+
key ||= ENV['STELLA_KEY']
|
|
15
|
+
unless account.to_s.empty? || key.to_s.empty?
|
|
16
|
+
@httparty_opts[:basic_auth] ||= { :username => account, :password => key }
|
|
17
|
+
end
|
|
16
18
|
end
|
|
17
19
|
def get path, params=nil
|
|
18
20
|
opts = httparty_opts
|
|
@@ -57,6 +59,9 @@ class Stella
|
|
|
57
59
|
def indifferent_hash
|
|
58
60
|
Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
|
|
59
61
|
end
|
|
62
|
+
|
|
63
|
+
class Unauthorized < RuntimeError
|
|
64
|
+
end
|
|
60
65
|
end
|
|
61
66
|
end
|
|
62
67
|
|
data/lib/stella/cli.rb
CHANGED
|
@@ -13,20 +13,38 @@ class Stella::CLI < Drydock::Command
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
def checkup
|
|
16
|
+
require 'stella/api'
|
|
16
17
|
base_uri = Stella.canonical_uri(@argv.first)
|
|
17
18
|
run_opts = {
|
|
18
19
|
:repetitions => @option.repetitions || 1,
|
|
19
20
|
:concurrency => @option.concurrency || 1,
|
|
20
21
|
:wait => @option.wait || 1
|
|
21
22
|
}
|
|
23
|
+
# NOTE ABOUT CLI OUTPUT:
|
|
24
|
+
# Output when a testplan is supplied comes from Engine.run
|
|
25
|
+
# while it's being executed. Otherwise it's generated from
|
|
26
|
+
# testrun.report after the generic testplan has run.
|
|
27
|
+
if @global.format || !@global.testplan
|
|
28
|
+
Stella.noise = 0
|
|
29
|
+
end
|
|
30
|
+
@global.remote ||= @global.account || @global.key
|
|
22
31
|
if @global.remote
|
|
23
|
-
|
|
24
|
-
@api = Stella::API.new
|
|
32
|
+
raise "Running a testplan remotely isn't supported yet (soon!)" if @global.testplan
|
|
33
|
+
@api = Stella::API.new @global.account, @global.key
|
|
25
34
|
ret = @api.post :checkup, :uri => base_uri
|
|
35
|
+
pp @api.response if Stella.debug
|
|
36
|
+
if @api.response.code >= 400
|
|
37
|
+
raise Stella::API::Unauthorized if @api.response.code == 401
|
|
38
|
+
STDERR.puts ret[:msg]
|
|
39
|
+
@exit_code = 1 and return
|
|
40
|
+
end
|
|
26
41
|
begin
|
|
27
42
|
run_hash = @api.get "/checkup/#{ret[:runid]}"
|
|
28
43
|
@run = Stella::Testrun.from_hash run_hash if run_hash
|
|
44
|
+
STDERR.print '.' unless Stella.quiet?
|
|
45
|
+
sleep 1 if @run && !@run.done?
|
|
29
46
|
end while @run && !@run.done?
|
|
47
|
+
STDERR.puts unless Stella.quiet?
|
|
30
48
|
else
|
|
31
49
|
if @global.testplan
|
|
32
50
|
unless File.owned?(@global.testplan)
|
|
@@ -34,7 +52,7 @@ class Stella::CLI < Drydock::Command
|
|
|
34
52
|
end
|
|
35
53
|
Stella.ld "Load #{@global.testplan}"
|
|
36
54
|
load @global.testplan
|
|
37
|
-
filter = @global.
|
|
55
|
+
filter = @global.usecase
|
|
38
56
|
planname = Stella::Testplan.plans.keys.first
|
|
39
57
|
@plan = Stella::Testplan.plan(planname)
|
|
40
58
|
if filter
|
|
@@ -53,18 +71,41 @@ class Stella::CLI < Drydock::Command
|
|
|
53
71
|
|
|
54
72
|
@report = @run.report
|
|
55
73
|
|
|
56
|
-
if Stella.quiet?
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
@global.format
|
|
60
|
-
|
|
74
|
+
@exit_code = @report.error_count if Stella.quiet?
|
|
75
|
+
|
|
76
|
+
unless @global.testplan
|
|
77
|
+
case @global.format
|
|
78
|
+
when 'csv'
|
|
61
79
|
metrics = @report.metrics_pack
|
|
62
80
|
puts metrics.dump(@global.format)
|
|
63
|
-
|
|
81
|
+
when 'json', 'yaml'
|
|
64
82
|
puts @run.dump(@global.format)
|
|
83
|
+
else
|
|
84
|
+
metrics = @report.metrics
|
|
85
|
+
# @run.planid.shorten(12), @run.runid.shorten(12),
|
|
86
|
+
args = [@report.statuses.values.first,
|
|
87
|
+
metrics.response_time.mean*1000,
|
|
88
|
+
metrics.socket_connect.mean*1000,
|
|
89
|
+
metrics.first_byte.mean*1000,
|
|
90
|
+
metrics.last_byte.mean*1000]
|
|
91
|
+
Stella.li "[%3s] %6.2fms (%5.2fms + %5.2fms + %5.2fms)" % args
|
|
92
|
+
if @global.verbose > 0 || @report.errors?
|
|
93
|
+
Stella.li ''
|
|
94
|
+
Stella.li ' Headers:'
|
|
95
|
+
Stella.li ' %s' % [@report.headers.request_headers.split(/\n/).join("\n ")]
|
|
96
|
+
Stella.li
|
|
97
|
+
Stella.li ' %s' % [@report.headers.response_headers.split(/\n/).join("\n ")]
|
|
98
|
+
end
|
|
99
|
+
#puts @report.metrics_pack.dump(:json)
|
|
65
100
|
end
|
|
66
101
|
end
|
|
67
|
-
|
|
102
|
+
rescue Stella::API::Unauthorized => ex
|
|
103
|
+
STDERR.puts "Please check your credentials!"
|
|
104
|
+
STDERR.puts " e.g."
|
|
105
|
+
STDERR.puts " export STELLA_ACCOUNT=youraccount"
|
|
106
|
+
STDERR.puts " export STELLA_KEY=yourapikey"
|
|
107
|
+
STDERR.puts " OR "
|
|
108
|
+
STDERR.puts " stella -A youraccount -K yourapikey checkup #{@argv.first}"
|
|
68
109
|
end
|
|
69
110
|
|
|
70
111
|
def example
|
data/lib/stella/engine.rb
CHANGED
|
@@ -49,28 +49,31 @@ class Stella
|
|
|
49
49
|
Benelux.current_track "client_#{client.clientid.shorten}"
|
|
50
50
|
begin
|
|
51
51
|
opts[:repetitions].times do |idx|
|
|
52
|
-
Stella.li '%-61s %s' % [testrun.plan.desc, testrun.plan.planid.shorten(12)] if Stella.noise >= 2
|
|
52
|
+
Stella.li '%-61s %s' % [testrun.plan.desc, testrun.plan.planid.shorten(12)] if Stella.noise >= 2 && !Stella.quiet?
|
|
53
53
|
testrun.plan.usecases.each_with_index do |uc,i|
|
|
54
54
|
if opts[:usecases].nil? || opts[:usecases].member?(uc.class)
|
|
55
55
|
Benelux.current_track.add_tags :usecase => uc.id
|
|
56
56
|
Stella.rescue {
|
|
57
|
-
Stella.li ' %-60s %s' % [uc.desc, uc.ucid.shorten(12)] if Stella.noise >=
|
|
57
|
+
Stella.li ' %-60s %s' % [uc.desc, uc.ucid.shorten(12)] if Stella.noise >= 1 && !Stella.quiet?
|
|
58
58
|
client.execute uc do |session|
|
|
59
|
-
Stella.li ' %3d
|
|
60
|
-
if Stella.noise >=
|
|
61
|
-
Stella.li '
|
|
59
|
+
Stella.li ' %3d %-4s %-76s' % [session.status, session.http_method.upcase, session.uri] if Stella.noise >= 1 && !Stella.quiet?
|
|
60
|
+
if Stella.noise >= 2 && !Stella.quiet?
|
|
61
|
+
Stella.li ' %s' % [session.req.header.dump.split(/\n/).join("\n ")]
|
|
62
62
|
Stella.li
|
|
63
|
-
Stella.li '
|
|
63
|
+
Stella.li ' %s' % [session.res.header.dump.split(/\n/).join("\n ")]
|
|
64
|
+
Stella.li ''
|
|
64
65
|
end
|
|
65
66
|
end
|
|
66
67
|
}
|
|
67
68
|
if client.exception
|
|
68
|
-
Stella.
|
|
69
|
+
if Stella.noise >= 1
|
|
70
|
+
Stella.li ' %4s %s (%s)' % ['', client.exception.message, client.exception.class]
|
|
71
|
+
end
|
|
69
72
|
# TODO: use a throw. This won't stop the next repetition.
|
|
70
73
|
break if Stella::TestplanQuit === client.exception
|
|
71
74
|
end
|
|
72
75
|
else
|
|
73
|
-
Stella.li ' %-60s %s' % ["#{uc.desc} (skipped)", uc.ucid.shorten(12)] if Stella.noise >= 2
|
|
76
|
+
#Stella.li ' %-60s %s' % ["#{uc.desc} (skipped)", uc.ucid.shorten(12)] if Stella.noise >= 2
|
|
74
77
|
end
|
|
75
78
|
Benelux.current_track.remove_tags :usecase
|
|
76
79
|
end
|
data/stella.gemspec
CHANGED