rubix 0.4.0 → 0.4.1
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/VERSION +1 -1
- data/lib/rubix/connection.rb +146 -14
- data/lib/rubix/models/host.rb +1 -0
- data/lib/rubix/models/model.rb +10 -0
- data/lib/rubix/models/template.rb +42 -0
- data/lib/rubix/models/time_series.rb +11 -1
- data/spec/data/test_template.xml +29 -0
- data/spec/requests/connection_request_spec.rb +38 -0
- data/spec/requests/template_request_spec.rb +5 -4
- data/spec/requests/time_series_request_spec.rb +8 -3
- data/spec/rubix/connection_spec.rb +42 -16
- data/spec/support/integration_helper.rb +13 -1
- metadata +4 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
data/lib/rubix/connection.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'uri'
|
2
|
+
require 'cgi'
|
2
3
|
require 'net/http'
|
3
4
|
require 'json'
|
4
5
|
|
@@ -11,6 +12,13 @@ module Rubix
|
|
11
12
|
|
12
13
|
include Logs
|
13
14
|
|
15
|
+
# The name of the cookie used by the Zabbix web application. Used
|
16
|
+
# when emulating a request from a browser.
|
17
|
+
COOKIE_NAME = 'zbx_sessionid'
|
18
|
+
|
19
|
+
# The content type header to send when emulating a browser.
|
20
|
+
CONTENT_TYPE = 'multipart/form-data'
|
21
|
+
|
14
22
|
# @return [URI] The URI for the Zabbix API.
|
15
23
|
attr_reader :uri
|
16
24
|
|
@@ -62,18 +70,33 @@ module Rubix
|
|
62
70
|
#
|
63
71
|
# @param [String] method the name of the Zabbix API method
|
64
72
|
# @param [Hash,Array] params parameters for the method call
|
65
|
-
# @
|
73
|
+
# @return [Rubix::Response]
|
66
74
|
def request method, params
|
75
|
+
authorize! unless authorized?
|
76
|
+
response = till_response do
|
77
|
+
send_api_request :jsonrpc => "2.0",
|
78
|
+
:id => request_id,
|
79
|
+
:method => method,
|
80
|
+
:params => params,
|
81
|
+
:auth => auth
|
82
|
+
end
|
83
|
+
Response.new(response)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Send a request to the Zabbix web application. The request is
|
87
|
+
# designed to emulate a web browser.
|
88
|
+
#
|
89
|
+
# Any values in +data+ which are file handles will trigger a
|
90
|
+
# multipart POST request, uploading those files.
|
91
|
+
#
|
92
|
+
# @param [String] verb one of "GET" or "POST"
|
93
|
+
# @param [String] path the path to send the request to
|
94
|
+
# @param [Hash] data the data to include in the request
|
95
|
+
# @return [Net::HTTP::Response]
|
96
|
+
def web_request verb, path, data={}
|
67
97
|
authorize! unless authorized?
|
68
98
|
till_response do
|
69
|
-
|
70
|
-
:jsonrpc => "2.0",
|
71
|
-
:id => request_id,
|
72
|
-
:method => method,
|
73
|
-
:params => params,
|
74
|
-
:auth => auth
|
75
|
-
}
|
76
|
-
send_raw_request(raw_params)
|
99
|
+
send_web_request(verb, path, data)
|
77
100
|
end
|
78
101
|
end
|
79
102
|
|
@@ -86,7 +109,7 @@ module Rubix
|
|
86
109
|
# Force the connection to execute an authorization request and
|
87
110
|
# renew (or set) the authorization token.
|
88
111
|
def authorize!
|
89
|
-
response = till_response {
|
112
|
+
response = Response.new(till_response { send_api_request(authorization_params) })
|
90
113
|
raise AuthenticationError.new("Could not authenticate with Zabbix API at #{uri}: #{response.error_message}") if response.error?
|
91
114
|
raise AuthenticationError.new("Malformed response from Zabbix API: #{response.body}") unless response.string?
|
92
115
|
@auth = response.result
|
@@ -145,7 +168,7 @@ module Rubix
|
|
145
168
|
when response.code.to_i >= 500
|
146
169
|
raise ConnectionError.new("Too many consecutive failed requests (#{max_attempts}) to the Zabbix API at (#{uri}).")
|
147
170
|
else
|
148
|
-
@last_response =
|
171
|
+
@last_response = response
|
149
172
|
end
|
150
173
|
end
|
151
174
|
|
@@ -153,21 +176,42 @@ module Rubix
|
|
153
176
|
#
|
154
177
|
# @param [Hash, #to_json] raw_params the complete parameters of the request.
|
155
178
|
# @return [Net::HTTP::Response]
|
156
|
-
def
|
179
|
+
def send_api_request raw_params
|
157
180
|
@request_id += 1
|
158
181
|
begin
|
159
|
-
raw_response = server.request(
|
182
|
+
raw_response = server.request(raw_api_request(raw_params))
|
160
183
|
rescue NoMethodError, SocketError => e
|
161
184
|
raise RequestError.new("Could not connect to Zabbix server at #{host_with_port}")
|
162
185
|
end
|
163
186
|
raw_response
|
164
187
|
end
|
188
|
+
|
189
|
+
# Send a Web request to Zabbix.
|
190
|
+
#
|
191
|
+
# The existing authorization token will be used to emulate a
|
192
|
+
# request sent by a browser.
|
193
|
+
#
|
194
|
+
# Any values in +data+ which are file handles will trigger a
|
195
|
+
# multipart POST request, uploading those files.
|
196
|
+
#
|
197
|
+
# @param [String] verb one of "GET" or "POST"
|
198
|
+
# @param [String] path the path to send the request to
|
199
|
+
# @param [Hash] data the data to include in the request
|
200
|
+
def send_web_request verb, path, data={}
|
201
|
+
# Don't increment this for web requests?
|
202
|
+
# @request_id += 1
|
203
|
+
begin
|
204
|
+
raw_response = server.request(raw_web_request(verb, path, data))
|
205
|
+
rescue NoMethodError, SocketError => e
|
206
|
+
raise RequestError.new("Could not connect to the Zabbix server at #{host_with_port}")
|
207
|
+
end
|
208
|
+
end
|
165
209
|
|
166
210
|
# Generate the raw POST request to send to the Zabbix API
|
167
211
|
#
|
168
212
|
# @param [Hash, #to_json] raw_params the complete parameters of the request.
|
169
213
|
# @return [Net::HTTP::Post]
|
170
|
-
def
|
214
|
+
def raw_api_request raw_params
|
171
215
|
json_body = raw_params.to_json
|
172
216
|
Rubix.logger.log(Logger::DEBUG, "SEND: #{json_body}") if Rubix.logger
|
173
217
|
Net::HTTP::Post.new(uri.path).tap do |req|
|
@@ -176,6 +220,94 @@ module Rubix
|
|
176
220
|
end
|
177
221
|
end
|
178
222
|
|
223
|
+
# Generate a raw web request to send to the Zabbix web application
|
224
|
+
# as though it came from a browser.
|
225
|
+
#
|
226
|
+
# @param [String] verb the HTTP verb, either "GET" (default) or "POST"
|
227
|
+
# @param [String] path the path on the server to send the request to
|
228
|
+
# @param [Hash] data the data for the request
|
229
|
+
def raw_web_request verb, path, data={}
|
230
|
+
case
|
231
|
+
when verb == "GET"
|
232
|
+
raw_get_request(path)
|
233
|
+
when verb == "POST" && data.values.any? { |value| value.respond_to?(:read) }
|
234
|
+
raw_multipart_post_request(path, data)
|
235
|
+
when verb == "POST"
|
236
|
+
raw_post_request(path, data)
|
237
|
+
else
|
238
|
+
raise Rubix::RequestError.new("Invalid HTTP verb: #{verb}")
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
# Generate an authenticated GET request emulating a browser.
|
243
|
+
#
|
244
|
+
# @param [String] path the path to send the request to.
|
245
|
+
# @return [Net::HTTP::Get]
|
246
|
+
def raw_get_request(path)
|
247
|
+
Net::HTTP::Get.new(path).tap do |req|
|
248
|
+
req['Content-Type'] = self.class::CONTENT_TYPE
|
249
|
+
req['Cookie'] = "#{self.class::COOKIE_NAME}=#{CGI::escape(auth.to_s)}"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
# Generate an authenticated POST request emulating a browser. It
|
254
|
+
# is assumed that +data+ is not multipart data.
|
255
|
+
#
|
256
|
+
# @param [String] path the path to send the request to.
|
257
|
+
# @param [Hash] data the data to send
|
258
|
+
# @return [Net::HTTP::Post]
|
259
|
+
def raw_post_request(path, data={})
|
260
|
+
Net::HTTP::Post.new(path).tap do |req|
|
261
|
+
req['Content-Type'] = self.class::CONTENT_TYPE
|
262
|
+
req['Cookie'] = "#{self.class::COOKIE_NAME}=#{CGI::escape(auth.to_s)}"
|
263
|
+
req.body = formatted_post_body(data)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
# Generate an authenticated POST request emulating a browser.
|
268
|
+
# Assumes data is multipart data, with some values being file
|
269
|
+
# handles.
|
270
|
+
#
|
271
|
+
# @param [String] path the path to send the request to.
|
272
|
+
# @param [Hash] data the data to send
|
273
|
+
# @return [Net::HTTP::Post::Multipart]
|
274
|
+
def raw_multipart_post_request(path, data={})
|
275
|
+
require 'net/http/post/multipart'
|
276
|
+
Net::HTTP::Post::Multipart.new(path, wrapped_multipart_post_data(data)).tap do |req|
|
277
|
+
req['Cookie'] = "#{self.class::COOKIE_NAME}=#{CGI::escape(auth.to_s)}"
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
# Wrap +data+ with +UploadIO+ objects so that it can be properly
|
282
|
+
# handled by the Net::HTTP::Post::Multipart class.
|
283
|
+
#
|
284
|
+
# @param [Hash] data
|
285
|
+
# @return [Hash]
|
286
|
+
def wrapped_multipart_post_data data
|
287
|
+
{}.tap do |wrapped|
|
288
|
+
data.each_pair do |key, value|
|
289
|
+
if value.respond_to?(:read)
|
290
|
+
# We are going to assume it's always XML we're uploading.
|
291
|
+
wrapped[key] = UploadIO.new(value, "application/xml", File.basename(value.path))
|
292
|
+
else
|
293
|
+
wrapped[key] = value
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
# Format +data+ as a POST data string.
|
300
|
+
#
|
301
|
+
# @param [Hash] data
|
302
|
+
# @return [String]
|
303
|
+
def formatted_post_body data
|
304
|
+
[].tap do |pairs|
|
305
|
+
data.each_pair do |key, value|
|
306
|
+
pairs << [key, value].map { |s| CGI::escape(s.to_s) }.join('=')
|
307
|
+
end
|
308
|
+
end.join('&')
|
309
|
+
end
|
310
|
+
|
179
311
|
# Used for generating helpful error messages.
|
180
312
|
#
|
181
313
|
# @return [String]
|
data/lib/rubix/models/host.rb
CHANGED
data/lib/rubix/models/model.rb
CHANGED
@@ -93,6 +93,16 @@ module Rubix
|
|
93
93
|
Rubix.connection && Rubix.connection.request(method, params)
|
94
94
|
end
|
95
95
|
|
96
|
+
# Send a web request to the Zabbix web application. This is just
|
97
|
+
# a convenience method for <tt>Rubix::Connection#web_request</tt>.
|
98
|
+
#
|
99
|
+
# @param [String] verb one of "GET" or "POST"
|
100
|
+
# @param [String] path the path to send the request to
|
101
|
+
# @param [Hash] data the data to include with the request
|
102
|
+
def self.web_request verb, path, data={}
|
103
|
+
Rubix.connection && Rubix.connection.web_request(verb, path, data)
|
104
|
+
end
|
105
|
+
|
96
106
|
# Is this a new record? We can tell because the ID must be blank.
|
97
107
|
#
|
98
108
|
# @return [true, false]
|
@@ -67,6 +67,48 @@ module Rubix
|
|
67
67
|
:host_group_ids => template['groups'].map { |group| group['groupid'].to_i }
|
68
68
|
})
|
69
69
|
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# == Import/Export ==
|
73
|
+
#
|
74
|
+
|
75
|
+
# Options which control the template import process and the Zabbix
|
76
|
+
# keys they need to be mapped to.
|
77
|
+
IMPORT_OPTIONS = {
|
78
|
+
:update_hosts => 'rules[host][exist]',
|
79
|
+
:add_hosts => 'rules[host][missed]',
|
80
|
+
:update_items => 'rules[item][exist]',
|
81
|
+
:add_items => 'rules[item][missed]',
|
82
|
+
:update_triggers => 'rules[trigger][exist]',
|
83
|
+
:add_triggers => 'rules[trigger][missed]',
|
84
|
+
:update_graphs => 'rules[graph][exist]',
|
85
|
+
:add_graphs => 'rules[graph][missed]',
|
86
|
+
:update_templates => 'rules[template][exist]'
|
87
|
+
}.freeze
|
88
|
+
|
89
|
+
# Import/update a template from XML contained in an open file
|
90
|
+
# handle +fh+.
|
91
|
+
#
|
92
|
+
# By default all hosts, items, triggers, and graphs the XML
|
93
|
+
# defines will be both added and updated. (Linked templates will
|
94
|
+
# also be updated.) This behavior matches the default behavior of
|
95
|
+
# the web interface in Zabbix 1.8.8.
|
96
|
+
#
|
97
|
+
# This can be controlled with options like <tt>:update_hosts</tt>
|
98
|
+
# or <tt>:add_graphs</tt>, all of which default to true. (Linked
|
99
|
+
# templates are controlled with <tt>:update_templates</tt>.)
|
100
|
+
def self.import fh, options={}
|
101
|
+
response = web_request("POST", "/templates.php", import_options(options).merge(:import_file => fh))
|
102
|
+
File.open('/tmp/output.html', 'w') { |f| f.puts(response.body) }
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.import_options options
|
106
|
+
{}.tap do |o|
|
107
|
+
self::IMPORT_OPTIONS.each_pair do |name, zabbix_name|
|
108
|
+
o[zabbix_name] = 'yes' unless options[name] == false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
70
112
|
|
71
113
|
end
|
72
114
|
end
|
@@ -13,6 +13,7 @@ module Rubix
|
|
13
13
|
super(properties)
|
14
14
|
@from = properties[:from]
|
15
15
|
@upto = properties[:upto]
|
16
|
+
@raw_data = properties[:raw_data]
|
16
17
|
|
17
18
|
self.item = properties[:item]
|
18
19
|
self.item_id = properties[:item_id]
|
@@ -37,6 +38,14 @@ module Rubix
|
|
37
38
|
def upto
|
38
39
|
@upto ||= self.class.default_upto
|
39
40
|
end
|
41
|
+
|
42
|
+
def history
|
43
|
+
@history ||= self.class.default_history(item)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.default_history item
|
47
|
+
item.respond_to?(:value_type) ? Item::VALUE_CODES[item.value_type] : 3
|
48
|
+
end
|
40
49
|
|
41
50
|
def raw_data
|
42
51
|
@raw_data ||= []
|
@@ -60,7 +69,8 @@ module Rubix
|
|
60
69
|
super().merge({
|
61
70
|
:itemids => [options[:item_id].to_s],
|
62
71
|
:time_from => (options[:from] || default_from).to_i.to_s,
|
63
|
-
:time_till => (options[:upto] || default_upto).to_i.to_s
|
72
|
+
:time_till => (options[:upto] || default_upto).to_i.to_s,
|
73
|
+
:history => (options[:history] || default_history(options[:item])).to_s
|
64
74
|
})
|
65
75
|
end
|
66
76
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<zabbix_export version="1.0" date="13.02.12" time="19.56">
|
3
|
+
<hosts>
|
4
|
+
<host name="test">
|
5
|
+
<proxy_hostid>0</proxy_hostid>
|
6
|
+
<useip>1</useip>
|
7
|
+
<dns></dns>
|
8
|
+
<ip>127.0.0.1</ip>
|
9
|
+
<port>10050</port>
|
10
|
+
<status>3</status>
|
11
|
+
<useipmi>0</useipmi>
|
12
|
+
<ipmi_ip>127.0.0.1</ipmi_ip>
|
13
|
+
<ipmi_port>623</ipmi_port>
|
14
|
+
<ipmi_authtype>0</ipmi_authtype>
|
15
|
+
<ipmi_privilege>2</ipmi_privilege>
|
16
|
+
<ipmi_username></ipmi_username>
|
17
|
+
<ipmi_password></ipmi_password>
|
18
|
+
<groups>
|
19
|
+
<group>Templates</group>
|
20
|
+
</groups>
|
21
|
+
<triggers/>
|
22
|
+
<items/>
|
23
|
+
<templates/>
|
24
|
+
<graphs/>
|
25
|
+
<macros/>
|
26
|
+
</host>
|
27
|
+
</hosts>
|
28
|
+
<dependencies/>
|
29
|
+
</zabbix_export>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubix::Connection do
|
4
|
+
|
5
|
+
before do
|
6
|
+
integration_test
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
truncate_all_tables
|
11
|
+
end
|
12
|
+
|
13
|
+
it "can perform an authorized GET request to the homepage" do
|
14
|
+
response = Rubix.connection.web_request("GET", "/")
|
15
|
+
response.should_not be_nil
|
16
|
+
response.code.to_i.should == 200
|
17
|
+
response.body.should_not include('guest')
|
18
|
+
response.body.should include($RUBIX_INTEGRATION_TEST['username'])
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can perform an authorized POST request to the homepage" do
|
22
|
+
response = Rubix.connection.web_request("POST", "/", :foo => 'bar', :baz => 'buzz')
|
23
|
+
response.should_not be_nil
|
24
|
+
response.code.to_i.should == 200
|
25
|
+
response.body.should_not include('guest')
|
26
|
+
response.body.should include($RUBIX_INTEGRATION_TEST['username'])
|
27
|
+
end
|
28
|
+
|
29
|
+
it "can perform an authorized multipart POST request to the homepage" do
|
30
|
+
response = Rubix.connection.web_request("POST", "/", :foo => File.new(data_path('test_template.xml')))
|
31
|
+
response.should_not be_nil
|
32
|
+
response.code.to_i.should == 200
|
33
|
+
response.body.should_not include('guest')
|
34
|
+
response.body.should include($RUBIX_INTEGRATION_TEST['username'])
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
@@ -22,6 +22,11 @@ describe "Templates" do
|
|
22
22
|
template = Rubix::Template.new(:name => 'rubix_spec_template_1', :host_groups => [@host_group_1])
|
23
23
|
template.save.should be_true
|
24
24
|
end
|
25
|
+
|
26
|
+
it "can be imported" do
|
27
|
+
Rubix::Template.import(File.new(data_path('test_template.xml')))
|
28
|
+
Rubix::Template.find(:name => 'test').should_not be_nil
|
29
|
+
end
|
25
30
|
|
26
31
|
end
|
27
32
|
|
@@ -45,8 +50,4 @@ describe "Templates" do
|
|
45
50
|
|
46
51
|
end
|
47
52
|
|
48
|
-
it "should be able to import and export a template" do
|
49
|
-
pending "Learning how to import/export XML via the API"
|
50
|
-
end
|
51
|
-
|
52
53
|
end
|
@@ -5,7 +5,7 @@ describe "TimeSeries" do
|
|
5
5
|
before do
|
6
6
|
integration_test
|
7
7
|
@host_group = ensure_save(Rubix::HostGroup.new(:name => 'rubix_spec_host_group_1'))
|
8
|
-
@host = ensure_save(Rubix::Host.new(:name => 'rubix_spec_host_1', :host_groups => [@host_group]))
|
8
|
+
@host = ensure_save(Rubix::Host.new(:name => 'rubix_spec_host_1', :host_groups => [@host_group]))
|
9
9
|
end
|
10
10
|
|
11
11
|
after do
|
@@ -18,6 +18,10 @@ describe "TimeSeries" do
|
|
18
18
|
Rubix::TimeSeries.new.from.should_not be_nil
|
19
19
|
Rubix::TimeSeries.new.upto.should_not be_nil
|
20
20
|
end
|
21
|
+
|
22
|
+
it "should set a default item type (history)" do
|
23
|
+
Rubix::TimeSeries.new.history.should_not be_nil
|
24
|
+
end
|
21
25
|
|
22
26
|
it "should accept a given timeframe when querying" do
|
23
27
|
Rubix::TimeSeries.find_params(:item_id => 100, :from => '1327543430', :upto => Time.at(1327543450))[:time_from].should == '1327543430'
|
@@ -41,13 +45,14 @@ describe "TimeSeries" do
|
|
41
45
|
|
42
46
|
before do
|
43
47
|
@item = ensure_save(Rubix::Item.new(:host_id => @host.id, :key => 'foo.bar.baz', :value_type => :unsigned_int, :description => "rubix item description"))
|
48
|
+
@history = create_history(@item)
|
44
49
|
end
|
45
50
|
|
46
51
|
it "should parse the results properly" do
|
47
52
|
@ts = Rubix::TimeSeries.find(:item_id => @item.id)
|
48
53
|
@ts.should_not be_nil
|
49
|
-
@ts.
|
50
|
-
@ts.parsed_data.should ==
|
54
|
+
@ts.raw_data.should == @history.reverse
|
55
|
+
@ts.parsed_data.should == @history.reverse.collect{|history| { 'time' => Time.at(history["clock"].to_i), 'value' => history["value"].to_i } }
|
51
56
|
end
|
52
57
|
|
53
58
|
end
|
@@ -20,24 +20,50 @@ describe Rubix::Connection do
|
|
20
20
|
@connection = Rubix::Connection.new('localhost/api.php', 'username', 'password')
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
@connection.should_receive(:authorize!)
|
25
|
-
@connection.request('foobar', {})
|
26
|
-
end
|
23
|
+
describe "sending API requests" do
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
25
|
+
it "should attempt to authorize itself without being asked" do
|
26
|
+
@connection.should_receive(:authorize!)
|
27
|
+
@connection.request('foobar', {})
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not repeatedly authorize itself" do
|
31
|
+
@mock_response.stub!(:body).and_return(@good_auth_response, @blah_response, @blah_response)
|
32
|
+
@connection.request('foobar', {})
|
33
|
+
@connection.should_not_receive(:authorize!)
|
34
|
+
@connection.request('foobar', {})
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should increment its request ID" do
|
38
|
+
@mock_response.stub!(:body).and_return(@good_auth_response, @blah_response, @blah_response)
|
39
|
+
@connection.request('foobar', {})
|
40
|
+
@connection.request('foobar', {})
|
41
|
+
@connection.request_id.should == 3 # it's the number used for the *next* request
|
42
|
+
end
|
34
43
|
|
35
|
-
it "should increment its request ID" do
|
36
|
-
@mock_response.stub!(:body).and_return(@good_auth_response, @blah_response, @blah_response)
|
37
|
-
@connection.request('foobar', {})
|
38
|
-
@connection.request('foobar', {})
|
39
|
-
@connection.request_id.should == 3 # it's the number used for the *next* request
|
40
44
|
end
|
41
45
|
|
42
|
-
|
46
|
+
describe "sending web requests" do
|
47
|
+
|
48
|
+
it "should attempt to authorize itself without being asked" do
|
49
|
+
@connection.should_receive(:authorize!)
|
50
|
+
@connection.web_request("GET", "/")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not repeatedly authorize itself" do
|
54
|
+
@mock_response.stub!(:body).and_return(@good_auth_response, @blah_response, @blah_response)
|
55
|
+
@connection.web_request("GET", "/")
|
56
|
+
@connection.should_not_receive(:authorize!)
|
57
|
+
@connection.web_request("GET", "/")
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should NOT increment its request ID" do
|
61
|
+
@mock_response.stub!(:body).and_return(@good_auth_response, @blah_response, @blah_response)
|
62
|
+
@connection.web_request("GET", "/")
|
63
|
+
@connection.web_request("GET", "/")
|
64
|
+
@connection.request_id.should == 1
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
43
68
|
|
69
|
+
end
|
@@ -46,6 +46,14 @@ module Rubix
|
|
46
46
|
raise e
|
47
47
|
end
|
48
48
|
end
|
49
|
+
|
50
|
+
def create_history item
|
51
|
+
(1..10).to_a.collect do |i|
|
52
|
+
history = { "itemid" => item.id.to_s, "clock" => (Time.now.to_i - 5*i).to_s, "value" => rand(100).to_s }
|
53
|
+
$RUBIX_MYSQL_CLIENT.query("INSERT INTO history_uint (#{history.keys.join(', ')}) VALUES (#{history.values.join(', ')})")
|
54
|
+
history
|
55
|
+
end
|
56
|
+
end
|
49
57
|
|
50
58
|
def self.setup_integration_tests test_yml_path
|
51
59
|
return unless File.exist?(test_yml_path)
|
@@ -68,7 +76,7 @@ module Rubix
|
|
68
76
|
$RUBIX_INTEGRATION_TEST = api_connection
|
69
77
|
end
|
70
78
|
|
71
|
-
RUBIX_TABLES_TO_TRUNCATE = %w[applications groups hostmacro hosts hosts_groups hosts_profiles hosts_profiles_ext hosts_templates items items_applications profiles triggers trigger_depends]
|
79
|
+
RUBIX_TABLES_TO_TRUNCATE = %w[applications groups hostmacro hosts hosts_groups hosts_profiles hosts_profiles_ext hosts_templates items items_applications profiles triggers trigger_depends history sessions]
|
72
80
|
|
73
81
|
def self.truncate_all_tables
|
74
82
|
return unless $RUBIX_INTEGRATION_TEST
|
@@ -78,6 +86,10 @@ module Rubix
|
|
78
86
|
def truncate_all_tables
|
79
87
|
IntegrationHelper.truncate_all_tables
|
80
88
|
end
|
89
|
+
|
90
|
+
def data_path *args
|
91
|
+
File.join(File.expand_path('../../data', __FILE__), *args)
|
92
|
+
end
|
81
93
|
|
82
94
|
end
|
83
95
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 4
|
8
|
-
-
|
9
|
-
version: 0.4.
|
8
|
+
- 1
|
9
|
+
version: 0.4.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Dhruv Bansal
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- spec/requests/item_request_spec.rb
|
135
135
|
- spec/requests/host_group_request_spec.rb
|
136
136
|
- spec/requests/user_macro_request_spec.rb
|
137
|
+
- spec/requests/connection_request_spec.rb
|
137
138
|
- spec/requests/template_request_spec.rb
|
138
139
|
- spec/requests/trigger_request_spec.rb
|
139
140
|
- spec/requests/host_request_spec.rb
|
@@ -142,6 +143,7 @@ files:
|
|
142
143
|
- spec/support/integration_helper.rb
|
143
144
|
- spec/support/response_helper.rb
|
144
145
|
- spec/support/configliere_helper.rb
|
146
|
+
- spec/data/test_template.xml
|
145
147
|
- LICENSE
|
146
148
|
- README.rdoc
|
147
149
|
- VERSION
|