Class: StackMate::CloudStackClient

Inherits:
Object
  • Object
show all
Defined in:
lib/stackmate/client.rb

Constant Summary collapse

MALFORMED_RESPONSES =

The following is malformed response title in ACS, should be fixed

{
  /(create|list)counter/i => 'counterresponse',
  /createcondition/i => 'conditionresponse',
  /createautoscalepolicy/i => 'autoscalepolicyresponse',
  /createautoscalevmprofile/i => 'autoscalevmprofileresponse',
  /createautoscalevmgroup/i => 'autoscalevmgroupresponse',
  /enableautoscalevmgroup/i => 'enableautoscalevmGroupresponse',
  /disableautoscalevmgroup/i => 'disableautoscalevmGroupresponse',
  /assignvirtualmachine/i => 'moveuservmresponse',
  /resetsshkeyforvirtualmachine/i => 'resetSSHKeyforvirtualmachineresponse',
  /restorevirtualmachine/i => 'restorevmresponse',
  /activateproject/i => 'activaterojectresponse',
  /listnetworkdevice/i => 'listnetworkdevice',
  /listniciranvpdevicenetworks/i => 'listniciranvpdevicenetworks',
  /cancelstoragemaintenance/i => 'cancelprimarystoragemaintenanceresponse',
  /enablestoragemaintenance/i => 'prepareprimarystorageformaintenanceresponse',
  /copyiso/i => 'copytemplateresponse',
  /deleteiso/i => 'deleteisosresponse',
  /listisopermissions/i => 'listtemplatepermissionsresponse'
}

Instance Method Summary collapse

Constructor Details

#initialize(api_url, api_key, secret_key, use_ssl = nil) ⇒ CloudStackClient

Returns a new instance of CloudStackClient.



29
30
31
32
33
34
# File 'lib/stackmate/client.rb', line 29

def initialize(api_url, api_key, secret_key, use_ssl=nil)
  @api_url = api_url
  @api_key = api_key
  @secret_key = secret_key
  @use_ssl = use_ssl
end

Instance Method Details

#api_call(command, params) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/stackmate/client.rb', line 56

def api_call(command,params)
  #params = {'command' => command}
  #params.merge!(args) unless args.empty?
  params['command'] = command
  response = request(params)
  json = JSON.parse(response.body)
  resp_title = command.downcase + "response"
  MALFORMED_RESPONSES.each do |k, v|
    if k =~ command
      resp_title = v
    end
  end
  if !response.is_a?(Net::HTTPOK)
    if ((["431","530"].include?(response.code.to_s)) && (["9999","4350"].include?(json[resp_title]['cserrorcode'].to_s)))
      raise ArgumentError, json[resp_title]['errortext']
    end

    raise RuntimeError, json['errorresponse']['errortext'] if response.code == "432"
    raise RuntimeError, "Unable to make request from client due to :" + response.to_s
    #raise CloudstackRubyClient::RequestError.new(response, json)
  end
  json[resp_title]
end

#request(params) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/stackmate/client.rb', line 36

def request(params)
  params['response'] = 'json'
  params['apiKey'] = @api_key

  data = params.map{ |k,v| "#{k.to_s}=#{CGI.escape(v.to_s).gsub(/\+|\ /, "%20")}" }.sort.join('&')

  signature = OpenSSL::HMAC.digest 'sha1', @secret_key, data.downcase
  signature = Base64.encode64(signature).chomp
  signature = CGI.escape(signature)

  url = "#{@api_url}?#{data}&signature=#{signature}"
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  # http.use_ssl = @use_ssl
  # http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  request = Net::HTTP::Get.new(uri.request_uri)

  http.request(request)
end