Class: EY::API

Inherits:
Object show all
Defined in:
lib/engineyard/api.rb

Direct Known Subclasses

CLI::API

Defined Under Namespace

Classes: InvalidCredentials, RequestFailed

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(token = nil) ⇒ API

Returns a new instance of API.

Raises:

  • (ArgumentError)


5
6
7
8
9
# File 'lib/engineyard/api.rb', line 5

def initialize(token = nil)
  @token ||= token
  @token ||= self.class.read_token
  raise ArgumentError, "EY Cloud API token required" unless @token
end

Instance Attribute Details

#tokenObject (readonly)

Returns the value of attribute token.



3
4
5
# File 'lib/engineyard/api.rb', line 3

def token
  @token
end

Class Method Details

.fetch_token(email, password) ⇒ Object



69
70
71
72
73
74
# File 'lib/engineyard/api.rb', line 69

def self.fetch_token(email, password)
  api_token = request("/authenticate", :method => "post",
    :params => { :email => email, :password => password })["api_token"]
  save_token(api_token)
  api_token
end

.read_token(file = nil) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/engineyard/api.rb', line 76

def self.read_token(file = nil)
  file ||= ENV['EYRC'] || File.expand_path("~/.eyrc")
  return false unless File.exists?(file)

  require 'yaml'

  data = YAML.load_file(file)
  if EY.config.default_endpoint?
    data["api_token"]
  else
    (data[EY.config.endpoint.to_s] || {})["api_token"]
  end
end

.request(path, opts = {}) ⇒ Object

Raises:



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/engineyard/api.rb', line 26

def self.request(path, opts={})
  require 'rest_client'
  require 'json'

  url = EY.config.endpoint + "api/v2#{path}"
  method = ((meth = opts.delete(:method)) && meth.to_s || "get").downcase.to_sym
  params = opts.delete(:params) || {}
  headers = opts.delete(:headers) || {}
  headers["Accept"] ||= "application/json"

  begin
    EY.ui.debug("Request", "#{method.to_s.upcase} #{url}")
    case method
    when :get, :delete, :head
      url.query = RestClient::Payload::UrlEncoded.new(params).to_s
      resp = RestClient.send(method, url.to_s, headers)
    else
      resp = RestClient.send(method, url.to_s, params, headers)
    end
  rescue RestClient::Unauthorized
    raise InvalidCredentials
  rescue Errno::ECONNREFUSED
    raise RequestFailed, "Could not reach the cloud API"
  rescue RestClient::ResourceNotFound
    raise RequestFailed, "The requested resource could not be found"
  rescue RestClient::RequestFailed => e
    raise RequestFailed, "#{e.message}"
  rescue OpenSSL::SSL::SSLError
    raise RequestFailed, "SSL is misconfigured on your cloud"
  end
  raise RequestFailed, "Response body was empty" if resp.body.empty?

  begin
    data = JSON.parse(resp.body)
    EY.ui.debug("Response", data)
  rescue JSON::ParserError
    EY.ui.debug("Raw response", resp.body)
    raise RequestFailed, "Response was not valid JSON."
  end

  data
end

.save_token(token, file = nil) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/engineyard/api.rb', line 90

def self.save_token(token, file = nil)
  file ||= ENV['EYRC'] || File.expand_path("~/.eyrc")
  require 'yaml'

  data = File.exists?(file) ? YAML.load_file(file) : {}
  if EY.config.default_endpoint?
    data.merge!("api_token" => token)
  else
    data.merge!(EY.config.endpoint.to_s => {"api_token" => token})
  end

  File.open(file, "w"){|f| YAML.dump(data, f) }
  true
end

Instance Method Details

#==(other) ⇒ Object

Raises:

  • (ArgumentError)


11
12
13
14
# File 'lib/engineyard/api.rb', line 11

def ==(other)
  raise ArgumentError unless other.is_a?(self.class)
  self.token == other.token
end

#request(url, opts = {}) ⇒ Object



16
17
18
19
20
21
# File 'lib/engineyard/api.rb', line 16

def request(url, opts={})
  opts[:headers] ||= {}
  opts[:headers]["X-EY-Cloud-Token"] = token
  EY.ui.debug("Token", token)
  self.class.request(url, opts)
end