@@ -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