Skip to content

Commit 4a634b3

Browse files
committed
Add add/remove network monitors and query/response accessors to NetworkMonitor
1 parent 5b2f011 commit 4a634b3

1 file changed

Lines changed: 101 additions & 1 deletion

File tree

lib/softlayer/NetworkMonitor.rb

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ module SoftLayer
1515
class NetworkMonitor < ModelBase
1616
include ::SoftLayer::DynamicAttribute
1717

18-
@@query_result_descriptions = {
18+
@@available_query_types = nil
19+
@@available_response_actions = nil
20+
@@query_result_descriptions = {
1921
0 => "Down/Critical: Server is down and/or has passed the critical response threshold (extremely long ping response, abnormal behavior, etc.).",
2022
1 => "Warning - Server may be recovering from a previous down state, or may have taken too long to respond.",
2123
2 => "Up",
@@ -85,6 +87,104 @@ class NetworkMonitor < ModelBase
8587
end
8688
end
8789

90+
##
91+
# Add a network monitor for a host ping or port check to a server.
92+
#
93+
def self.add_network_monitor(server, ip_address, query_type, response_action, wait_cycles = 0, argument_value = nil, options = {})
94+
softlayer_client = options[:client] || Client.default_client
95+
raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !softlayer_client
96+
raise "#{__method__} requires a server to monitor but none was given" if !server || !server.kind_of?(Server)
97+
raise "#{__method__} requires an IP address to monitor but none was given" if !ip_address || ip_address.empty?
98+
raise "#{__method__} requires a query type for the monitor but none was given" if !query_type || (query_type.kind_of?(Hash) && !query_type.include?('id'))
99+
raise "#{__method__} requires a response action for the monitor but none was given" if !response_action || (response_action.kind_of?(Hash) && !response_action.include?('id'))
100+
101+
query_type_id = query_type.kind_of?(Hash) ? query_type['id'] : query_type
102+
response_action_id = response_action.kind_of?(Hash) ? response_action['id'] : response_action
103+
104+
if available_query_types(:client => softlayer_client, :query_level => server.network_monitor_levels['monitorLevel']).select{ |query_type| query_type['id'] == query_type_id }.empty?
105+
raise "#{__method__} requested monitor query level is not supported for this server"
106+
end
107+
108+
if available_response_actions(:client => softlayer_client, :response_level => server.network_monitor_levels['responseLevel']).select{ |response| response['id'] == response_action_id }.empty?
109+
raise "#{__method__} requested monitor response level is not supported for this server"
110+
end
111+
112+
network_monitor_object_filter = ObjectFilter.new()
113+
server_id_label = server.kind_of?(VirtualServer) ? 'guestId' : 'hardwareId'
114+
115+
network_monitor_object_filter.modify { |filter| filter.accept('networkMonitors.arg1Value').when_it is(argument_value.to_s) }
116+
network_monitor_object_filter.modify { |filter| filter.accept('networkMonitors.' + server_id_label).when_it is(server.id) }
117+
network_monitor_object_filter.modify { |filter| filter.accept('networkMonitors.ipAddress').when_it is(ip_address.to_s) }
118+
network_monitor_object_filter.modify { |filter| filter.accept('networkMonitors.queryTypeId').when_it is(query_type_id) }
119+
network_monitor_object_filter.modify { |filter| filter.accept('networkMonitors.responseActionId').when_it is(response_action_id) }
120+
network_monitor_object_filter.modify { |filter| filter.accept('networkMonitors.waitCycles').when_it is(wait_cycles) }
121+
122+
if server.service.object_filter(network_monitor_object_filter).getNetworkMonitors.empty?
123+
network_monitor = softlayer_client[:Network_Monitor_Version1_Query_Host].createObject({
124+
'arg1Value' => argument_value.to_s,
125+
server_id_label => server.id,
126+
'ipAddress' => ip_address.to_s,
127+
'queryTypeId' => query_type_id,
128+
'responseActionId' => response_action_id,
129+
'waitCycles' => wait_cycles
130+
})
131+
132+
NetworkMonitor.new(softlayer_client, network_monitor)
133+
end
134+
end
135+
136+
##
137+
# Return the list of available query types (optionally limited to a max query level)
138+
#
139+
def self.available_query_types(options = {})
140+
softlayer_client = options[:client] || Client.default_client
141+
raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !softlayer_client
142+
143+
unless @@available_query_types
144+
@@available_query_types = softlayer_client[:Network_Monitor_Version1_Query_Host_Stratum].getAllQueryTypes
145+
end
146+
147+
if options[:query_level]
148+
@@available_query_types.select { |query_type| query_type['monitorLevel'].to_i <= options[:query_level].to_i }
149+
else
150+
@@available_query_types
151+
end
152+
end
153+
154+
##
155+
# Return the list of available response actions (optionally limited to a max response level)
156+
#
157+
def self.available_response_actions(options = {})
158+
softlayer_client = options[:client] || Client.default_client
159+
raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !softlayer_client
160+
161+
unless @@available_response_actions
162+
@@available_response_actions = softlayer_client[:Network_Monitor_Version1_Query_Host_Stratum].getAllResponseTypes
163+
end
164+
165+
if options[:response_level]
166+
@@available_response_actions.select { |response_action| response_action['level'].to_i <= options[:response_level].to_i }
167+
else
168+
@@available_response_actions
169+
end
170+
end
171+
172+
##
173+
# Removes the list of network monitors from their associated servers
174+
#
175+
def self.remove_network_monitors(network_monitors, options = {})
176+
softlayer_client = options[:client] || Client.default_client
177+
raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !softlayer_client
178+
179+
network_monitors_data = network_monitors.map do |network_monitor|
180+
raise "#{__method__} requires a network monitor instance or id but non provided" if !network_monitor || !(network_monitor.kind_of?(Hash) && network_monitor['id'])
181+
182+
network_monitor.kind_of?(Hash) ? { 'id' => network_monitor['id'] } : { 'id' => network_monitor }
183+
end
184+
185+
softlayer_client[:Network_Monitor_Version1_Query_Host].deleteObjects(network_monitors_data)
186+
end
187+
88188
##
89189
# Return the list of descriptions by result id for last query responses.
90190
#

0 commit comments

Comments
 (0)