Class: Rubix::Model

Inherits:
Object
  • Object
show all
Extended by:
Logs
Includes:
Logs
Defined in:
lib/rubix/models/model.rb

Overview

A base class for all Zabbix models to subclass.

It might be worth using ActiveModel – but maybe not. The goal is to keep dependencies low while still retaining expressiveness.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logs

debug, error, fatal, info, warn

Constructor Details

#initialize(properties = {}) ⇒ Model

Create a new model instance. This may represent a new or existing Zabbix resource.

Parameters:

  • properties (Hash) (defaults to: {})

Options Hash (properties):

  • id (Fixnum)

    the ID of the resource in Zabbix (typically blank for a new resource)



71
72
73
74
# File 'lib/rubix/models/model.rb', line 71

def initialize properties={}
  @properties = properties
  @id         = properties[:id]
end

Instance Attribute Details

#idFixnum?

Returns the ID of this model.

Returns:

  • (Fixnum, nil)

    the ID of this model



13
14
15
# File 'lib/rubix/models/model.rb', line 13

def id
  @id
end

#propertiesHash

Returns ] the properties this model was initialized with.

Returns:

  • (Hash)

    ] the properties this model was initialized with



10
11
12
# File 'lib/rubix/models/model.rb', line 10

def properties
  @properties
end

Class Method Details

.all(options = {}) ⇒ Array<Rubix::Model>

List all objects of this resource’s type.

Parameters:

  • options (Hash) (defaults to: {})

    options for filtering the list of all resources.

Returns:



284
285
286
287
288
289
290
291
292
# File 'lib/rubix/models/model.rb', line 284

def self.all options={} 
  response = all_request(options)
  if response.has_data?
    response.result.map { |obj_data| build(obj_data) }
  else
    error("Error listing all Zabbix #{resource_name}s: #{response.error_message}") unless response.success?
    []
  end
end

.all_params(options = {}) ⇒ Hash

Parameters to list all the objects of this resource’s type.

Parameters:

  • options (Hash) (defaults to: {})

    options for filtering the list of all resources.

Returns:

  • (Hash)


268
269
270
# File 'lib/rubix/models/model.rb', line 268

def self.all_params options={}
  get_params.merge(options)
end

.all_request(options = {}) ⇒ Rubix::Response

Send a request to list all objects of this resource’s type.

Parameters:

  • options (Hash) (defaults to: {})

    options for filtering the list of all resources.

Returns:



276
277
278
# File 'lib/rubix/models/model.rb', line 276

def self.all_request options={}
  request("#{zabbix_name}.get", all_params(options))
end

.each(options = {}, &block) ⇒ Array<Rubix::Model>

Execute block once for each element of the result set.

Parameters:

  • options (Hash) (defaults to: {})

    options for filtering the list of all resources.

Returns:



298
299
300
# File 'lib/rubix/models/model.rb', line 298

def self.each options={}, &block
  all(options).each(&block)
end

.find(options = {}) ⇒ Rubix::Model?

Find a resource using the given options or return nil if none is found.

Parameters:

  • options (Hash) (defaults to: {})

    specify properties about the object to find

Returns:



327
328
329
330
331
332
333
334
335
336
337
338
# File 'lib/rubix/models/model.rb', line 327

def self.find options={}
  response = find_request(options)
  case
  when response.has_data?
    build(response.result.first)
  when response.success?
    # a successful but empty response means it wasn't found
  else
    error("Error finding Zabbix #{resource_name} using #{options.inspect}: #{response.error_message}")
    nil
  end
end

.find_or_create(options = {}) ⇒ Rubix::Model, false

Find a resource using the given options or create one if none can be found. Will return false if the object cannot be found and cannot be created.

Parameters:

  • options (Hash) (defaults to: {})

    specify properties about the object to find

Returns:



346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
# File 'lib/rubix/models/model.rb', line 346

def self.find_or_create options={}
  response = find_request(options)
  case
  when response.has_data?
    build(response.result.first)
  when response.success?
    # doesn't exist
    obj = new(options)
    if obj.save
      obj
    else
      false
    end
  else
    error("Error creating Zabbix #{resource_name} using #{options.inspect}: #{response.error_message}")
    false
  end
end

.find_params(options = {}) ⇒ Hash

Parameters for finding a specific resource.

Parameters:

  • options (Hash) (defaults to: {})

    specify properties about the object to find

Returns:

  • (Hash)


310
311
312
# File 'lib/rubix/models/model.rb', line 310

def self.find_params options={}
  get_params.merge(options)
end

.find_request(options = {}) ⇒ Rubix::Response

Send a find request for a specific resource.

Parameters:

  • options (Hash) (defaults to: {})

    specify properties about the object to find

Returns:



318
319
320
# File 'lib/rubix/models/model.rb', line 318

def self.find_request options={}
  request("#{zabbix_name}.get", find_params(options))
end

.get_paramsHash

Parameters for ‘get’-type requests for this resource’s type.

Returns:

  • (Hash)


260
261
262
# File 'lib/rubix/models/model.rb', line 260

def self.get_params
  { :output => :extend }
end

.id_fieldString

This is the name of the id field returned in Zabbix responses – hostid, groupid, hostmacroid, &c.

Returns:

  • (String)


50
51
52
# File 'lib/rubix/models/model.rb', line 50

def self.id_field
  "#{zabbix_name}id"
end

.request(method, params) ⇒ Rubix::Response

Send a request to the Zabbix API. This is just a convenience method for Rubix::Connection#request.

Parameters:

  • method (String)
  • params (Hash, Array)

Returns:



92
93
94
# File 'lib/rubix/models/model.rb', line 92

def self.request method, params
  Rubix.connection && Rubix.connection.request(method, params)
end

.resource_nameString

This is the name of the resource as used inside Rubix – Host, HostGroup, UserMacro, &c.

Returns:

  • (String)


26
27
28
# File 'lib/rubix/models/model.rb', line 26

def self.resource_name
  self.to_s.split('::').last
end

.zabbix_nameString

This is the name of the resource as used by Zabbix – host, hostgroup, usermacro, &c.

Returns:

  • (String)


42
43
44
# File 'lib/rubix/models/model.rb', line 42

def self.zabbix_name
  resource_name.downcase
end

Instance Method Details

#before_destroytrue, false

A hook that will be run before this resource is destroyed.

Override this in a subclass to implement any desired before-destroy functionality. Must return true or false.

Returns:

  • (true, false)


249
250
251
# File 'lib/rubix/models/model.rb', line 249

def before_destroy
  true
end

#before_updatetrue, false

A hook that will be run before this resource is updated.

Override this in a subclass to implement any desired before-update functionality. Must return true or false.

Returns:

  • (true, false)


201
202
203
# File 'lib/rubix/models/model.rb', line 201

def before_update
  true
end

#createtrue, false

Create this resource.

Returns:

  • (true, false)


143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/rubix/models/model.rb', line 143

def create
  return false unless validate
  response = create_request
  if response.has_data?
    @id = response.result[id_field + 's'].first.to_i
    info("Created Zabbix #{resource_name}")
    true
  else
    error("Error creating Zabbix #{resource_name}: #{response.error_message}")
    return false
  end
end

#create_paramsHash

Parameters for creating a new resource of this type.

Returns:

  • (Hash)


129
130
131
# File 'lib/rubix/models/model.rb', line 129

def create_params
  {}
end

#create_requestRubix::Response

Send a request to create this resource.

Returns:



136
137
138
# File 'lib/rubix/models/model.rb', line 136

def create_request
  request("#{self.class.zabbix_name}.create", create_params)
end

#destroytrue, false

Destroy this resource.

Returns:

  • (true, false)


226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/rubix/models/model.rb', line 226

def destroy
  return true if new_record?
  return false unless before_destroy
  response = destroy_request
  case
  when response.has_data? && response.result.values.first.first.to_i == id
    info("Destroyed Zabbix #{resource_name}")
    true
  when response.zabbix_error? && response.error_message =~ /does not exist/i
    # was never there
    true
  else
    error("Could not destroy Zabbix #{resource_name}: #{response.error_message}")
    false
  end
end

#destroy_paramsArray<Fixnum>

Parameters for destroying this resource.

Returns:

  • (Array<Fixnum>)


212
213
214
# File 'lib/rubix/models/model.rb', line 212

def destroy_params
  [id]
end

#destroy_requestRubix::Response

Send a request to destroy this resource.

Returns:



219
220
221
# File 'lib/rubix/models/model.rb', line 219

def destroy_request
  request("#{self.class.zabbix_name}.delete", destroy_params)
end

#id_fieldString

This is the name of the id field returned in Zabbix responses – hostid, groupid, hostmacroid, &c.

Returns:

  • (String)


58
59
60
# File 'lib/rubix/models/model.rb', line 58

def id_field
  self.class.id_field
end

#new_record?true, false

Is this a new record? We can tell because the ID must be blank.

Returns:

  • (true, false)


99
100
101
# File 'lib/rubix/models/model.rb', line 99

def new_record?
  @id.nil?
end

#request(method, params) ⇒ Rubix::Response

Send a request to the Zabbix API. This is just a convenience method for Rubix::Connection#request.

Parameters:

  • method (String)
  • params (Hash, Array)

Returns:



82
83
84
# File 'lib/rubix/models/model.rb', line 82

def request method, params
  self.class.request(method, params)
end

#resource_nameString

This is the name of this resource instance, using this object’s ‘name’ property if possible.

Returns:

  • (String)


34
35
36
# File 'lib/rubix/models/model.rb', line 34

def resource_name
  "#{self.class.resource_name} #{respond_to?(:name) ? self.name : self.id}"
end

#savetrue, false

Save this record.

Will create new records and update old ones.

Returns:

  • (true, false)


108
109
110
# File 'lib/rubix/models/model.rb', line 108

def save
  new_record? ? create : update
end

#updatetrue, false

Update this resource.

Returns:

  • (true, false)


177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/rubix/models/model.rb', line 177

def update
  return false unless validate
  return create if new_record?
  return false unless before_update
  response = update_request
  case
  when response.has_data? && response.result.values.first.map(&:to_i).include?(id)
    info("Updated Zabbix #{resource_name}")
    true
  when response.has_data?
    error("No error, but failed to update Zabbix #{resource_name}")
    false
  else
    error("Error updating Zabbix #{resource_name}: #{response.error_message}")
    false
  end
end

#update_paramsHash

Parameters for updating a resource of this type.

Returns:

  • (Hash)


163
164
165
# File 'lib/rubix/models/model.rb', line 163

def update_params
  create_params.merge({id_field => id})
end

#update_requestRubix::Response

Send a request to update this resource.

Returns:



170
171
172
# File 'lib/rubix/models/model.rb', line 170

def update_request
  request("#{self.class.zabbix_name}.update", update_params)
end

#validatetrue, false

Validate this record.

Override this method in a subclass and have it raise a Rubix::ValidationError if validation fails.

Returns:

  • (true, false)


118
119
120
# File 'lib/rubix/models/model.rb', line 118

def validate
  true
end