class ScalrApiV2::Request

connection and request methods for interacting with the Scalr API

Public Class Methods

new() click to toggle source
# File lib/scalr_api_v2/request.rb, line 12
def initialize
  @api_config = ScalrApiV2::Config.new.config
end

Public Instance Methods

create(url, data) click to toggle source

Create item in API

# File lib/scalr_api_v2/request.rb, line 101
def create(url, data)
  response = request('POST', url, data)
  response['data'] = response['Error'] unless response['Error'].nil?
  return response['data']
end
delete(url) click to toggle source

Delete item from API

# File lib/scalr_api_v2/request.rb, line 108
def delete(url)
  response = request('DELETE', url)
  response['data'] = response['Error'] unless response['Error'].nil?
  return response['data']
end
fetch(url) click to toggle source

Fetch a single item from API

# File lib/scalr_api_v2/request.rb, line 94
def fetch(url)
  response = request('GET', url)
  response['data'] = response['Error'] unless response['Error'].nil?
  return response['data']
end
list(url) click to toggle source

List items from API

# File lib/scalr_api_v2/request.rb, line 78
def list(url)
  data = []
  until url.nil?
    response = request('GET', url)
    if response['Error'].nil?
      data.concat response['data']
      url = response['pagination']['next']
    else
      data = response['Error']
      url = nil
    end
  end
  return data
end
patch(url, data) click to toggle source

Update items in API

# File lib/scalr_api_v2/request.rb, line 122
def patch(url, data)
  response = request('PATCH', url, data)
  response['data'] = response['Error'] unless response['Error'].nil?
  return response['data']
end
post(url, data) click to toggle source

Edit items in API

# File lib/scalr_api_v2/request.rb, line 115
def post(url, data)
  response = request('POST', url, data)
  response['data'] = response['Error'] unless response['Error'].nil?
  return response['data']
end
request(method, url, body = '') click to toggle source
# File lib/scalr_api_v2/request.rb, line 16
def request(method, url, body = '')
  # JSON encode body if set
  body = body.to_json if body != ''

  # Split URL into components
  parts = URI.parse(@api_config['url'] + url)

  path = parts.path
  # host = parts.host
  # port = parts.port

  query = ''
  unless parts.query.nil?
    # Convert querystring into an array
    q = parts.query.split('&')

    # Sort the querystring array
    q.sort!

    # Convert querystring array back to string
    query = q.join('&')
  end

  # Create ISO 8601 date/time string
  time = Time.now.utc.iso8601 + '+00:00'

  # Collection of request data for generating signature
  request = [
    method,
    time,
    path,
    query,
    body
  ]

  # Calculate signature based on request data
  signature = 'V1-HMAC-SHA256 ' + Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), @api_config['key_secret'], request.join("\n"))).strip

  # HTTP request headers
  headers = {
    'X-Scalr-Key-Id' => @api_config['key_id'],
    'X-Scalr-Signature' => signature,
    'X-Scalr-Date' => time,
    'X-Scalr-Debug' => '1'
  }

  headers['Content-Type'] = 'application/json' if body != ''
  begin
    response = RestClient::Request.execute(
      method: method,
      url: @api_config['url'] + url,
      headers: headers,
      payload: body
    )
  rescue => e
    raise "#{e} #{e.response}"
  end
  response = '{\n  \"Error\": \"A problem occured: Response was empty\"\n}}' if response == ''
  JSON.parse(response)
end