blitz 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{blitz}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["pcapr"]
@@ -34,6 +34,7 @@ Gem::Specification.new do |s|
34
34
  "lib/blitz/command/curl.rb",
35
35
  "lib/blitz/command/help.rb",
36
36
  "lib/blitz/curl/error.rb",
37
+ "lib/blitz/curl/rush.rb",
37
38
  "lib/blitz/curl/sprint.rb",
38
39
  "lib/blitz/helper.rb",
39
40
  "test/helper.rb",
@@ -1,9 +1,10 @@
1
1
  require 'rubygems'
2
2
  require 'hexy'
3
+ require 'pp'
3
4
 
4
5
  class Blitz
5
6
  require 'blitz/helper'
6
- Version = "0.1.0".freeze
7
+ Version = "0.1.1".freeze
7
8
 
8
9
  extend Blitz::Helper
9
10
 
@@ -28,4 +29,5 @@ end
28
29
  require 'blitz/client'
29
30
  require 'blitz/curl/error'
30
31
  require 'blitz/curl/sprint'
32
+ require 'blitz/curl/rush'
31
33
  require 'blitz/command'
@@ -15,7 +15,7 @@ class Curl < Command
15
15
  sprint args
16
16
  return
17
17
  else
18
- error "Rushing not supported yet, but coming soon"
18
+ rush args
19
19
  end
20
20
  end
21
21
 
@@ -25,19 +25,18 @@ class Curl < Command
25
25
  def authorize_error e
26
26
  base_url = "#{e.scheme}://#{e.host}:#{e.port}"
27
27
  puts
28
- error "You haven't verified that you are the devops dude for #{e.host}"
28
+ error "You haven't verified that you are the devops dude for #{e.host}. Make"
29
+ error "sure the following URL is reachable and returns the string '42'."
29
30
  error ""
30
- error "Make sure the following URL is reachable by us and returns the value 42."
31
31
  error "#{base_url}/#{e.uuid}"
32
32
  error ""
33
- error "If your app is RESTfully built with sinatra or rails, simply"
34
- error "add a route like so:"
33
+ error "If your app is RESTfully built with sinatra or rails, simply add this route:"
35
34
  error ""
36
35
  error "get '/#{e.uuid}' do"
37
36
  error " '42'"
38
37
  error "end"
39
38
  error ""
40
- error "And we'll be on our merry way to blitz #{e.host}"
39
+ error "Once this is done, you can blitz #{e.host} all you want."
41
40
  puts
42
41
  end
43
42
 
@@ -101,6 +100,50 @@ class Curl < Command
101
100
  end
102
101
  end
103
102
 
103
+ def rush args
104
+ continue = true
105
+ begin
106
+ [ 'INT', 'STOP', 'HUP' ].each do |s|
107
+ trap(s) { continue = false }
108
+ end
109
+ job = ::Blitz::Curl::Rush.execute args
110
+ msg "rushing from #{job.region}..."
111
+ job.result do |result|
112
+ print_rush_result result
113
+ sleep 1.0 if not continue
114
+ continue
115
+ end
116
+ puts
117
+ msg "[aborted]" if not continue
118
+ rescue ::Blitz::Curl::Error::Authorize => e
119
+ authorize_error e
120
+ rescue ::Blitz::Curl::Error::Region => e
121
+ error "#{e.region}: #{e.message}"
122
+ rescue ::Blitz::Curl::Error => e
123
+ error e.message
124
+ end
125
+ end
126
+
127
+ def print_rush_result result
128
+ recent = result.timeline[-1]
129
+ hits = "%u hits" % recent.hits
130
+ errors = recent.errors ? ", %u errors" % recent.errors : ''
131
+ timeouts = recent.timeouts ? ", %u timeouts" % recent.timeouts : ''
132
+ bandwidth = ''
133
+ if result.timeline.size > 1
134
+ last = result.timeline[-2]
135
+ elapsed = recent.timestamp - last.timestamp
136
+ bps = (recent.rxbytes + recent.txbytes) - (last.rxbytes + last.txbytes)/elapsed
137
+ bandwidth = " - %.2f bytes/sec" % bps
138
+ else
139
+ bps = (recent.rxbytes + recent.txbytes)/recent.timestamp
140
+ bandwidth = " - %.2f bytes/sec" % bps
141
+ end
142
+ duration = recent.duration >= 0 ? " @ %.2f sec" % recent.duration : ''
143
+ $stdout.print "#{hits}#{errors}#{timeouts}#{bandwidth}#{duration}\n"
144
+ $stdout.flush
145
+ end
146
+
104
147
  def help
105
148
  helps = [
106
149
  { :short => '-A', :long => '--user-agent', :value => '<string>', :help => 'User-Agent to send to server' },
@@ -111,7 +154,7 @@ class Curl < Command
111
154
  { :short => '-h', :long => '--help', :value => '', :help => 'Help on command line options' },
112
155
  { :short => '-H', :long => '--header', :value => '<string>', :help => 'Custom header to pass to server' },
113
156
  { :short => '-p', :long => '--pattern', :value => '<s>-<e>:<d>', :help => 'Ramp from s to e concurrent requests in d secs' },
114
- { :short => '-r', :long => '--region', :value => '<string>', :help => 'Choose one of california, virginia, singapore or ireland' },
157
+ { :short => '-r', :long => '--region', :value => '<string>', :help => 'california|virginia|singapore|ireland|japan' },
115
158
  { :short => '-s', :long => '--status', :value => '<number>', :help => 'Assert on the HTTP response status code' },
116
159
  { :short => '-T', :long => '--timeout', :value => '<ms>', :help => 'Wait time for both connect and responses' },
117
160
  { :short => '-u', :long => '--user', :value => '<user[:pass]>', :help => 'User and password for authentication' },
@@ -0,0 +1,102 @@
1
+ class Blitz
2
+ module Curl
3
+ class Rush
4
+ class Point
5
+ attr_reader :timestamp
6
+ attr_reader :duration
7
+ attr_reader :total
8
+ attr_reader :hits
9
+ attr_reader :errors
10
+ attr_reader :timeouts
11
+ attr_reader :volume
12
+ attr_reader :txbytes
13
+ attr_reader :rxbytes
14
+
15
+ def initialize json
16
+ @timestamp = json['timestamp']
17
+ @duration = json['duration']
18
+ @total = json['total']
19
+ @hits = json['executed']
20
+ @errors = json['errors']
21
+ @timeouts = json['timeouts']
22
+ @volume = json['volume']
23
+ @txbytes = json['txbytes']
24
+ @rxbytes = json['rxbytes']
25
+ end
26
+ end
27
+
28
+ class Result
29
+ attr_reader :region
30
+ attr_reader :timeline
31
+
32
+ def initialize json
33
+ result = json['result']
34
+ @region = result['region']
35
+ @timeline = result['timeline'].map { |p| Point.new p }
36
+ end
37
+ end
38
+
39
+ def self.execute args
40
+ if not args.member? 'pattern'
41
+ raise ArgumentError, 'missing pattern'
42
+ end
43
+
44
+ res = Command::API.client.curl_execute args
45
+ raise Error.new(res) if res['error']
46
+ return self.new res
47
+ end
48
+
49
+ attr_reader :job_id
50
+ attr_reader :region
51
+
52
+ def initialize json
53
+ @job_id = json['job_id']
54
+ @region = json['region']
55
+ end
56
+
57
+ def result
58
+ last = nil
59
+ while true
60
+ sleep 2.0
61
+
62
+ job = Command::API.client.job_status job_id
63
+ if job['error']
64
+ raise Error
65
+ end
66
+
67
+ result = job['result']
68
+ next if job['status'] == 'queued'
69
+ next if job['status'] == 'running' and not result
70
+
71
+ raise Error if not result
72
+
73
+ error = result['error']
74
+ if error
75
+ if error == 'dns'
76
+ raise Error::DNS.new(result)
77
+ elsif error == 'authorize'
78
+ raise Error::Authorize.new(result)
79
+ else
80
+ raise Error
81
+ end
82
+ end
83
+
84
+ last = Result.new(job)
85
+ continue = yield last rescue false
86
+ if not continue
87
+ abort!
88
+ break
89
+ end
90
+
91
+ break if job['status'] == 'completed'
92
+ end
93
+
94
+ return last
95
+ end
96
+
97
+ def abort!
98
+ Command::API.client.abort_job job_id rescue nil
99
+ end
100
+ end
101
+ end # Curl
102
+ end # Blitz
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blitz
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - pcapr
@@ -139,6 +139,7 @@ files:
139
139
  - lib/blitz/command/curl.rb
140
140
  - lib/blitz/command/help.rb
141
141
  - lib/blitz/curl/error.rb
142
+ - lib/blitz/curl/rush.rb
142
143
  - lib/blitz/curl/sprint.rb
143
144
  - lib/blitz/helper.rb
144
145
  - test/helper.rb