class Servicenow::Client

Client is the client to interact with the ServiceNow REST API

Attributes

snow_api_base_url[R]
snow_table_url[R]

Public Class Methods

new(params={}) click to toggle source

Initialization parameters for username, password and URL are normally set in the module configuration. They can also be passed here, or set in the environment. The precedence is ENV > params > module config

@param [Hash] params initialization parameters

@option params [String] :username ServiceNow API username @option params [String] :password ServiceNow API password @option params [String] :base_url ServiceNow API URL

@return [Servicenow::Client] new client

# File lib/servicenow/client.rb, line 23
def initialize(params={})
  @snow_api_username = ENV.fetch('SNOW_API_USERNAME', params.delete(:username))
  @snow_api_password = ENV.fetch('SNOW_API_PASSWORD', params.delete(:password))
  @snow_api_base_url = ENV.fetch('SNOW_API_BASE_URL', params.delete(:url))

  @snow_api_username ||= Servicenow.configuration.username
  @snow_api_password ||= Servicenow.configuration.password
  @snow_api_base_url ||= Servicenow.configuration.base_url

  raise MissingParameterError, 'ServiceNow API Username not set' if @snow_api_username.nil?
  raise MissingParameterError, 'ServiceNow API Password not set' if @snow_api_password.nil?
  raise MissingParameterError, 'ServiceNow API Base URL not set' if @snow_api_base_url.nil?

  @snow_table_url = format('%s/%s', @snow_api_base_url, 'table')
end

Public Instance Methods

create_change(data={}) click to toggle source

@param [Hash] data the data to use for Change creation

@return [Servicenow::Change]

# File lib/servicenow/client.rb, line 98
def create_change(data={})
  url = format('%s/change_request', @snow_table_url)
  query = {}
  query.merge(data)

  response = send_request(url, query, :post)
  new_change_url = response.headers['Location']

  obj = JSON.parse response.body
  change = Change.new(obj['result'].first)
  change.url ||= new_change_url
  change
end
get_change(number) click to toggle source

@param [String] number Change number

@return [Servicenow::Change]

# File lib/servicenow/client.rb, line 81
def get_change(number)
  url = format('%s/change_request', @snow_table_url)
  query = {
    sysparm_limit: 1,
    number: number
  } 

  response = send_request(url, query)

  obj = JSON.parse response.body
  Change.new(obj['result'].first)
end
get_changes_by_query(encodedquery, limit=10, page=1) click to toggle source

@param [String] encodedquery a ServiceNow encoded query @param [int] limit limit results, default 10 @param [int] page page of results, default 1

@return [Array<Servicenow::Change>]

# File lib/servicenow/client.rb, line 62
def get_changes_by_query(encodedquery, limit=10, page=1)
  url = format('%s/change_request', @snow_table_url)
  query = {
    sysparm_limit: limit,
    sysparm_page: page,
    sysparm_query: encodedquery
  }

  response = send_request(url, query)
  Servicenow.logger.debug response
  
  obj = JSON.parse response.body
  obj['result'].collect{ |c| Change.new(c) }
end
get_changes_by_user(user_id) click to toggle source

@param [String] user_id uses LIKE query to match for substring in u_cr_requester field

@return [Array<Servicenow::Change>]

# File lib/servicenow/client.rb, line 43
def get_changes_by_user(user_id)
  url = format('%s/change_request', @snow_table_url)
  query = {
    sysparm_limit: 10,
    sysparm_query: "active=true^GOTOu_cr_requester.u_name_idLIKE#{user_id}"
  }

  response = send_request(url, query)

  obj = JSON.parse response.body
  obj['result'].collect{ |c| Change.new(c) }
end
send_request(url, query, method=:get) click to toggle source

protected

# File lib/servicenow/client.rb, line 116
def send_request(url, query, method=:get)
  request = HTTPI::Request.new(url)
  if %i[ patch put ].include? method
    request.body = query.to_json
  else
    request.query = query
  end
  request.auth.basic(@snow_api_username, @snow_api_password)
  request.headers['Accept'] = 'application/json'
  request.headers['Content-Type'] = 'application/json'
  request.proxy = ENV['http_proxy'] unless ENV.fetch('http_proxy', nil).nil?
  HTTPI.request(method, request)
end