rubix 0.0.1 → 0.0.2
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.rb +9 -16
- data/lib/rubix/associations.rb +14 -0
- data/lib/rubix/associations/belongs_to_host.rb +32 -0
- data/lib/rubix/associations/has_many_applications.rb +32 -0
- data/lib/rubix/associations/has_many_host_groups.rb +37 -0
- data/lib/rubix/associations/has_many_hosts.rb +32 -0
- data/lib/rubix/associations/has_many_templates.rb +37 -0
- data/lib/rubix/associations/has_many_user_macros.rb +37 -0
- data/lib/rubix/log.rb +31 -18
- data/lib/rubix/models.rb +9 -0
- data/lib/rubix/models/application.rb +44 -50
- data/lib/rubix/models/host.rb +70 -74
- data/lib/rubix/models/host_group.rb +40 -51
- data/lib/rubix/models/item.rb +80 -69
- data/lib/rubix/models/model.rb +126 -0
- data/lib/rubix/models/template.rb +57 -55
- data/lib/rubix/models/user_macro.rb +84 -0
- data/lib/rubix/monitors.rb +5 -0
- data/lib/rubix/{monitor.rb → monitors/monitor.rb} +0 -0
- data/spec/requests/application_request_spec.rb +45 -0
- data/spec/requests/host_group_request_spec.rb +23 -0
- data/spec/requests/host_request_spec.rb +70 -0
- data/spec/requests/item_request_spec.rb +68 -0
- data/spec/requests/template_request_spec.rb +52 -0
- data/spec/requests/user_macro_request_spec.rb +36 -0
- data/spec/rubix/{monitor_spec.rb → monitors/monitor_spec.rb} +0 -0
- data/spec/spec_helper.rb +16 -1
- data/spec/support/integration_helper.rb +9 -0
- data/spec/test.yml +5 -0
- metadata +25 -8
- data/lib/rubix/model.rb +0 -56
- data/spec/rubix/models/host_group_spec.rb +0 -56
@@ -0,0 +1,126 @@
|
|
1
|
+
module Rubix
|
2
|
+
|
3
|
+
# It might be worth using ActiveModel -- but maybe not. The goal is
|
4
|
+
# to keep dependencies low while still retaining expressiveness.
|
5
|
+
class Model
|
6
|
+
|
7
|
+
attr_accessor :properties, :id
|
8
|
+
|
9
|
+
extend Logs
|
10
|
+
include Logs
|
11
|
+
|
12
|
+
def self.model_name
|
13
|
+
self.to_s.split('::').last
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.log_name
|
17
|
+
model_name
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize properties={}
|
21
|
+
@properties = properties
|
22
|
+
@id = properties[:id]
|
23
|
+
@log_name = self.class.model_name
|
24
|
+
end
|
25
|
+
|
26
|
+
def new_record?
|
27
|
+
@id.nil?
|
28
|
+
end
|
29
|
+
|
30
|
+
def request method, params
|
31
|
+
self.class.request(method, params)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.request method, params
|
35
|
+
Rubix.connection && Rubix.connection.request(method, params)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.find options={}
|
39
|
+
response = find_request(options)
|
40
|
+
case
|
41
|
+
when response.has_data?
|
42
|
+
build(response.result.first)
|
43
|
+
when response.success?
|
44
|
+
# a successful but empty response means it wasn't found
|
45
|
+
else
|
46
|
+
error("Could not find #{options.inspect}: #{response.error_message}")
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.find_or_create options={}
|
52
|
+
response = find_request(options)
|
53
|
+
case
|
54
|
+
when response.has_data?
|
55
|
+
build(response.result.first)
|
56
|
+
when response.success?
|
57
|
+
# doesn't exist
|
58
|
+
obj = new(options)
|
59
|
+
if obj.save
|
60
|
+
obj
|
61
|
+
else
|
62
|
+
false
|
63
|
+
end
|
64
|
+
else
|
65
|
+
error("Could not create #{options.inspect}: #{response.error_message}")
|
66
|
+
false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def validate
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
def create
|
75
|
+
return false unless validate
|
76
|
+
response = create_request
|
77
|
+
if response.has_data?
|
78
|
+
@id = response.result[self.class.id_field + 's'].first.to_i
|
79
|
+
info("Created")
|
80
|
+
true
|
81
|
+
else
|
82
|
+
error("Could not create: #{response.error_message}")
|
83
|
+
false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def update
|
88
|
+
return false unless validate
|
89
|
+
return create if new_record?
|
90
|
+
response = update_request
|
91
|
+
if response.has_data?
|
92
|
+
info("Updated")
|
93
|
+
after_update
|
94
|
+
else
|
95
|
+
error("Could not update: #{response.error_message}")
|
96
|
+
false
|
97
|
+
end
|
98
|
+
after_update
|
99
|
+
end
|
100
|
+
|
101
|
+
def after_update
|
102
|
+
true
|
103
|
+
end
|
104
|
+
|
105
|
+
def save
|
106
|
+
new_record? ? create : update
|
107
|
+
end
|
108
|
+
|
109
|
+
def destroy
|
110
|
+
return false if new_record?
|
111
|
+
response = destroy_request
|
112
|
+
case
|
113
|
+
when response.has_data? && response.result.values.first.first.to_i == id
|
114
|
+
info("Destroyed")
|
115
|
+
true
|
116
|
+
when response.zabbix_error? && response.error_message =~ /does not exist/i
|
117
|
+
# was never there
|
118
|
+
true
|
119
|
+
else
|
120
|
+
error("Could not destroy: #{response.error_message}")
|
121
|
+
false
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
@@ -2,79 +2,81 @@ module Rubix
|
|
2
2
|
|
3
3
|
class Template < Model
|
4
4
|
|
5
|
-
|
5
|
+
#
|
6
|
+
# == Properties & Finding ==
|
7
|
+
#
|
6
8
|
|
9
|
+
attr_accessor :name
|
10
|
+
|
7
11
|
def initialize properties={}
|
8
12
|
super(properties)
|
9
|
-
@name
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
"TEMPLATE #{name || id}"
|
14
|
-
end
|
13
|
+
@name = properties[:name]
|
14
|
+
|
15
|
+
self.host_ids = properties[:host_ids]
|
16
|
+
self.hosts = properties[:hosts]
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
+
self.host_group_ids = properties[:host_group_ids]
|
19
|
+
self.host_groups = properties[:host_groups]
|
18
20
|
end
|
19
21
|
|
20
|
-
def
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
def load
|
25
|
-
response = request('template.get', 'filter' => {'templateid' => id, 'name' => name}, 'select_hosts' => 'refer', 'output' => 'extend')
|
22
|
+
def self.find_request options={}
|
23
|
+
params = {'select_groups' => 'refer', 'select_hosts' => 'refer', 'output' => 'extend'}
|
26
24
|
case
|
27
|
-
when
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
@loaded = true
|
32
|
-
@exists = true
|
33
|
-
when response.success?
|
34
|
-
@exists = false
|
35
|
-
@loaded = true
|
36
|
-
else
|
37
|
-
error("Could not load: #{response.error_messaage}")
|
25
|
+
when options[:id]
|
26
|
+
params['templateids'] = [options[:id]]
|
27
|
+
when options[:name]
|
28
|
+
params['filter'] = { 'host' => options[:name] }
|
38
29
|
end
|
30
|
+
request('template.get', params)
|
39
31
|
end
|
40
32
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
33
|
+
def self.build template
|
34
|
+
new({
|
35
|
+
:id => (template['templateid'] || template['hostid']).to_i,
|
36
|
+
:name => template['host'],
|
37
|
+
:host_ids => template['hosts'].map { |host_info| host_info['hostid'].to_i },
|
38
|
+
:host_group_ids => template['groups'].map { |group| group['groupid'].to_i }
|
39
|
+
})
|
40
|
+
end
|
41
|
+
|
42
|
+
def log_name
|
43
|
+
"TEMPLATE #{name || id}"
|
50
44
|
end
|
51
45
|
|
52
|
-
def
|
53
|
-
|
54
|
-
info("Updated")
|
46
|
+
def self.id_field
|
47
|
+
'templateid'
|
55
48
|
end
|
56
49
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
else
|
65
|
-
error("Could not delete: #{response.error_message}")
|
66
|
-
end
|
50
|
+
#
|
51
|
+
# == Validation ==
|
52
|
+
#
|
53
|
+
|
54
|
+
def validate
|
55
|
+
raise ValidationError.new("A template must have at least one host group.") if host_group_ids.nil? || host_group_ids.empty?
|
56
|
+
true
|
67
57
|
end
|
58
|
+
|
59
|
+
#
|
60
|
+
# == Associations ==
|
61
|
+
#
|
68
62
|
|
69
|
-
|
70
|
-
|
71
|
-
|
63
|
+
include Associations::HasManyHosts
|
64
|
+
include Associations::HasManyHostGroups
|
65
|
+
|
66
|
+
#
|
67
|
+
# == CRUD ==
|
68
|
+
#
|
69
|
+
|
70
|
+
def create_request
|
71
|
+
request('template.create', {'host' => name, 'groups' => host_group_params})
|
72
|
+
end
|
73
|
+
|
74
|
+
def update_request
|
75
|
+
request('template.update', [{'host' => name, 'templateid' => id, 'groups' => host_group_params}])
|
72
76
|
end
|
73
77
|
|
74
|
-
def
|
75
|
-
|
76
|
-
group.create unless group.exists?
|
77
|
-
end
|
78
|
+
def destroy_request
|
79
|
+
request('template.delete', [{'templateid' => id}])
|
78
80
|
end
|
79
81
|
|
80
82
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Rubix
|
2
|
+
|
3
|
+
class UserMacro < Model
|
4
|
+
|
5
|
+
#
|
6
|
+
# == Properties & Finding ==
|
7
|
+
#
|
8
|
+
|
9
|
+
attr_accessor :name, :value
|
10
|
+
|
11
|
+
def initialize properties={}
|
12
|
+
super(properties)
|
13
|
+
@name = properties[:name] || self.class.unmacro_name(properties[:macro])
|
14
|
+
@value = properties[:value]
|
15
|
+
|
16
|
+
self.host = properties[:host]
|
17
|
+
self.host_id = properties[:host_id]
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.find_request options={}
|
21
|
+
request('usermacro.get', 'hostids' => [options[:host_id]], 'filter' => {'macro' => macro_name(options[:name])}, "output" => "extend")
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.build macro
|
25
|
+
new({
|
26
|
+
:id => macro['hostmacroid'].to_i,
|
27
|
+
:name => unmacro_name(macro['macro']),
|
28
|
+
:value => macro['value'],
|
29
|
+
:host_id => macro['hostid']
|
30
|
+
})
|
31
|
+
end
|
32
|
+
|
33
|
+
def log_name
|
34
|
+
"MACRO #{macro_name}@#{host.name}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.unmacro_name name
|
38
|
+
(name || '').gsub(/^\{\$/, '').gsub(/\}$/, '').upcase
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.macro_name name
|
42
|
+
"{$#{name.upcase}}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def macro_name
|
46
|
+
self.class.macro_name(name)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.id_field
|
50
|
+
'hostmacroid'
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# == Associations ==
|
55
|
+
#
|
56
|
+
|
57
|
+
include Associations::BelongsToHost
|
58
|
+
|
59
|
+
#
|
60
|
+
# == Validation ==
|
61
|
+
#
|
62
|
+
def validate
|
63
|
+
raise ValidationError.new("A user macro must have both a 'name' and a 'value'") if name.nil? || name.strip.empty? || value.nil? || value.strip.empty?
|
64
|
+
true
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# == CRUD ==
|
69
|
+
#
|
70
|
+
|
71
|
+
def create_request
|
72
|
+
request('usermacro.massAdd', 'macros' => [{'macro' => macro_name, 'value' => value}], 'hosts' => [{'hostid' => host_id}])
|
73
|
+
end
|
74
|
+
|
75
|
+
def update_request
|
76
|
+
request('usermacro.massUpdate', 'macros' => [{'macro' => macro_name, 'value' => value}], 'hosts' => [{'hostid' => host_id}])
|
77
|
+
end
|
78
|
+
|
79
|
+
def destroy_request
|
80
|
+
request('usermacro.massRemove', 'hostids' => [host_id], 'macros' => [macro_name])
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
File without changes
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "CRUD for hosts" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@hg = Rubix::HostGroup.new(:name => 'rubix_spec_host_group_1')
|
7
|
+
@hg.save
|
8
|
+
|
9
|
+
@h1 = Rubix::Host.new(:name => 'rubix_spec_host_1', :host_groups => [@hg])
|
10
|
+
@h1.save
|
11
|
+
|
12
|
+
@h2 = Rubix::Host.new(:name => 'rubix_spec_host_2', :host_groups => [@hg])
|
13
|
+
@h2.save
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
@h1.destroy
|
18
|
+
@h2.destroy
|
19
|
+
@hg.destroy
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be able to create, update, and destroy a host" do
|
23
|
+
integration_test
|
24
|
+
|
25
|
+
Rubix::Application.find(:name => 'rubix_spec_app_1', :host_id => @h1.id).should be_nil
|
26
|
+
|
27
|
+
app = Rubix::Application.new(:name => 'rubix_spec_app_1', :host_id => @h1.id)
|
28
|
+
app.save
|
29
|
+
new_a = Rubix::Application.find(:name => 'rubix_spec_app_1', :host_id => @h1.id)
|
30
|
+
new_a.should_not be_nil
|
31
|
+
new_a.id.should == app.id
|
32
|
+
new_a.host_id.should == @h1.id
|
33
|
+
id = app.id
|
34
|
+
id.should_not be_nil
|
35
|
+
|
36
|
+
app.name = 'rubix_spec_app_2'
|
37
|
+
app.update
|
38
|
+
new_a = Rubix::Application.find(:id => id, :name => 'rubix_spec_app_2', :host_id => @h1.id)
|
39
|
+
new_a.should_not be_nil
|
40
|
+
new_a.name.should == 'rubix_spec_app_2'
|
41
|
+
|
42
|
+
app.destroy
|
43
|
+
Rubix::Application.find(:id => id, :host_id => @h1.id).should be_nil
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "CRUD for host groups" do
|
4
|
+
|
5
|
+
it "should be able to create, update, and destroy a host group" do
|
6
|
+
integration_test
|
7
|
+
|
8
|
+
Rubix::HostGroup.find(:name => 'rubix_spec_host_group_1').should be_nil
|
9
|
+
|
10
|
+
hg = Rubix::HostGroup.new(:name => 'rubix_spec_host_group_1')
|
11
|
+
hg.save
|
12
|
+
Rubix::HostGroup.find(:name => 'rubix_spec_host_group_1').should_not be_nil
|
13
|
+
id = hg.id
|
14
|
+
id.should_not be_nil
|
15
|
+
|
16
|
+
hg.name = 'rubix_spec_host_group_2'
|
17
|
+
hg.update
|
18
|
+
Rubix::HostGroup.find(:id => id).name.should == 'rubix_spec_host_group_2'
|
19
|
+
|
20
|
+
hg.destroy
|
21
|
+
Rubix::HostGroup.find(:id => id).should be_nil
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "CRUD for hosts" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@hg1 = Rubix::HostGroup.new(:name => 'rubix_spec_host_group_1')
|
7
|
+
@hg1.save
|
8
|
+
|
9
|
+
@hg2 = Rubix::HostGroup.new(:name => 'rubix_spec_host_group_2')
|
10
|
+
@hg2.save
|
11
|
+
|
12
|
+
@t1 = Rubix::Template.new(:name => 'rubix_spec_template_1', :host_groups => [@hg1])
|
13
|
+
@t1.save
|
14
|
+
|
15
|
+
@t2 = Rubix::Template.new(:name => 'rubix_spec_template_2', :host_groups => [@hg2])
|
16
|
+
@t2.save
|
17
|
+
|
18
|
+
@um1 = Rubix::UserMacro.new(:name => 'rubix_spec_macro_1', :value => 'rubix_spec_value_1')
|
19
|
+
@um2 = Rubix::UserMacro.new(:name => 'rubix_spec_macro_2', :value => 'rubix_spec_value_2')
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
after do
|
24
|
+
@t1.destroy
|
25
|
+
@t2.destroy
|
26
|
+
@hg1.destroy
|
27
|
+
@hg2.destroy
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should be able to create, update, and destroy a host" do
|
31
|
+
integration_test
|
32
|
+
|
33
|
+
Rubix::Host.find(:name => 'rubix_spec_host_1').should be_nil
|
34
|
+
|
35
|
+
h = Rubix::Host.new(:name => 'rubix_spec_host_1', :host_groups => [@hg1], :templates => [@t1], :user_macros => [@um1])
|
36
|
+
h.save
|
37
|
+
begin
|
38
|
+
new_h = Rubix::Host.find(:name => 'rubix_spec_host_1')
|
39
|
+
new_h.should_not be_nil
|
40
|
+
new_h.template_ids.should include(@t1.id)
|
41
|
+
new_h.host_group_ids.should include(@hg1.id)
|
42
|
+
new_h.user_macros.size.should == 1
|
43
|
+
new_h.user_macros.first.name.should == 'RUBIX_SPEC_MACRO_1'
|
44
|
+
new_h.user_macros.first.value.should == 'rubix_spec_value_1'
|
45
|
+
|
46
|
+
id = h.id
|
47
|
+
id.should_not be_nil
|
48
|
+
|
49
|
+
h.name = 'rubix_spec_host_2'
|
50
|
+
h.host_groups = [@hg2]
|
51
|
+
h.templates = [@t2]
|
52
|
+
h.user_macros = [@um2]
|
53
|
+
h.update
|
54
|
+
|
55
|
+
new_h = Rubix::Host.find(:name => 'rubix_spec_host_2')
|
56
|
+
new_h.should_not be_nil
|
57
|
+
new_h.template_ids.should include(@t2.id)
|
58
|
+
new_h.host_group_ids.should include(@hg2.id)
|
59
|
+
new_h.user_macros.size.should == 1
|
60
|
+
new_h.user_macros.first.name.should == 'RUBIX_SPEC_MACRO_2'
|
61
|
+
new_h.user_macros.first.value.should == 'rubix_spec_value_2'
|
62
|
+
rescue => e
|
63
|
+
puts "#{e.class} -- #{e.message}"
|
64
|
+
puts e.backtrace
|
65
|
+
ensure
|
66
|
+
h.destroy
|
67
|
+
end
|
68
|
+
Rubix::Host.find(:id => id).should be_nil
|
69
|
+
end
|
70
|
+
end
|