Class: DynectRest

Inherits:
Object
  • Object
show all
Defined in:
lib/dynect_rest.rb,
lib/dynect_rest/resource.rb,
lib/dynect_rest/exceptions.rb

Overview

Author

Adam Jacob (<[email protected]>)

Copyright

Copyright © 2010 Opscode, Inc.

License

Apache License, Version 2.0

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Defined Under Namespace

Classes: Exceptions, Resource

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(customer_name, user_name, password, zone = nil, connect = true, verbose = false) ⇒ DynectRest

Creates a new base object for interacting with Dynect’s REST API

Parameters:

  • Your (String)

    dynect customer name

  • Your (String)

    dnyect user name

  • Your (String)

    dynect password

  • The (String)

    zone you are going to be editing

  • Whether (Boolean)

    to connect immediately or not - runs login for you

  • Verbosity (Boolean)


36
37
38
39
40
41
42
43
44
# File 'lib/dynect_rest.rb', line 36

def initialize(customer_name, user_name, password, zone=nil, connect=true, verbose=false)
  @customer_name = customer_name
  @user_name = user_name
  @password = password
  @rest = RestClient::Resource.new('https://api2.dynect.net/REST/', :headers => { :content_type => 'application/json' })
  @zone = zone 
  @verbose = verbose
   if connect
end

Instance Attribute Details

#customer_nameObject

Returns the value of attribute customer_name.



26
27
28
# File 'lib/dynect_rest.rb', line 26

def customer_name
  @customer_name
end

#passwordObject

Returns the value of attribute password.



26
27
28
# File 'lib/dynect_rest.rb', line 26

def password
  @password
end

#restObject

Returns the value of attribute rest.



26
27
28
# File 'lib/dynect_rest.rb', line 26

def rest
  @rest
end

#user_nameObject

Returns the value of attribute user_name.



26
27
28
# File 'lib/dynect_rest.rb', line 26

def user_name
  @user_name
end

#zoneObject

Returns the value of attribute zone.



26
27
28
# File 'lib/dynect_rest.rb', line 26

def zone
  @zone
end

Class Method Details

.underscore(string) ⇒ Object

Convert a CamelCasedString to an under_scored_string.



118
119
120
121
122
123
124
125
126
# File 'lib/dynect_rest.rb', line 118

def self.underscore(string)
  word = string.dup
  word.gsub!(/::/, '/')
  word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
  word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
  word.tr!("-", "_")
  word.downcase!
  word
end

Instance Method Details

#api_request(&block) ⇒ Object

Handles making Dynect API requests and formatting the responses properly.



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/dynect_rest.rb', line 184

def api_request(&block)
  response_body = begin
    response = block.call
    response.body
  rescue RestClient::Exception => e
    if @verbose
      puts "I have #{e.inspect} with #{e.http_code}"
    end
    if e.http_code == 307
      get(e.response)
    end
    e.response
  end
  parse_response(JSON.parse(response_body))
end

#delete(path_part, additional_headers = {}, &block) ⇒ Object

Raw DELETE request, formatted for Dyn. See list of endpoints at:

manage.dynect.net/help/docs/api2/rest/resources/

Parameters:

  • The (String)

    partial path to DELETE - for example, ‘User’ or ‘Zone’.

  • Additional (Hash)

    HTTP headers



153
154
155
# File 'lib/dynect_rest.rb', line 153

def delete(path_part, additional_headers = {}, &block)
  api_request { @rest[path_part].delete(additional_headers, &block) }
end

#freeze(zone = nil) ⇒ Hash

Parameters:

  • The (String)

    zone to freeze - if one is provided when instantiated, we use that.

Returns:

  • (Hash)

    The dynect API response



101
102
103
104
# File 'lib/dynect_rest.rb', line 101

def freeze(zone=nil)
  zone ||= @zone 
  put("Zone/#{zone}", { "freeze" => true })
end

#get(path_part, additional_headers = {}, &block) ⇒ Object

Raw GET request, formatted for Dyn. See list of endpoints at:

manage.dynect.net/help/docs/api2/rest/resources/

Parameters:

  • The (String)

    partial path to GET - for example, ‘User’ or ‘Zone’.

  • Additional (Hash)

    HTTP headers



143
144
145
# File 'lib/dynect_rest.rb', line 143

def get(path_part, additional_headers = {}, &block)
  api_request { @rest[path_part].get(additional_headers, &block) }
end

#get_zone(zone = nil) ⇒ Hash

Parameters:

  • The (String)

    zone to fetch - if one is provided when instantiated, we use that.

Returns:

  • (Hash)

    The dynect API response



79
80
81
82
# File 'lib/dynect_rest.rb', line 79

def get_zone(zone=nil)  
  zone ||= @zone
  get("Zone/#{zone}")
end

#loginHash

Login to Dynect - must be done before any other methods called.

See: manage.dynect.net/help/docs/api2/rest/resources/Session.html

Returns:

  • (Hash)

    The dynect API response



55
56
57
58
59
# File 'lib/dynect_rest.rb', line 55

def 
  response = post('Session', { 'customer_name' => @customer_name, 'user_name' => @user_name, 'password' => @password })
  @rest.headers[:auth_token] = response["token"]
  response
end

#logoutHash

Logout of Dynect - must be done before any other methods called.

See: manage.dynect.net/help/docs/api2/rest/resources/Session.html

Returns:

  • (Hash)

    The dynect API response



66
67
68
# File 'lib/dynect_rest.rb', line 66

def logout
  delete('Session')
end

#parse_response(response) ⇒ Object



200
201
202
203
204
205
206
207
208
209
210
211
# File 'lib/dynect_rest.rb', line 200

def parse_response(response)
  case response["status"]
  when "success"
    response["data"]
  when "failure", "incomplete"
    error_messages = []
    response["msgs"].each do |error_message|
      error_messages << "#{error_message["LVL"]} #{error_message["ERR_CD"]} #{error_message["SOURCE"]} - #{error_message["INFO"]}"
    end
    raise DynectRest::Exceptions::RequestFailed, "Request failed: #{error_messages.join("\n")}" 
  end
end

#post(path_part, payload, additional_headers = {}, &block) ⇒ Object

Raw POST request, formatted for Dyn. See list of endpoints at:

manage.dynect.net/help/docs/api2/rest/resources/

Read the API documentation, and submit the proper data structure from here.

Parameters:

  • The (String)

    partial path to POST - for example, ‘User’ or ‘Zone’.

  • The (Hash)

    data structure to submit as the body, is automatically turned to JSON.

  • Additional (Hash)

    HTTP headers



166
167
168
# File 'lib/dynect_rest.rb', line 166

def post(path_part, payload, additional_headers = {}, &block)
  api_request { @rest[path_part].post(payload.to_json, additional_headers, &block) }
end

#publish(zone = nil) ⇒ Hash

Publish any pending changes to the zone - required to make any alterations permanent.

See: manage.dynect.net/help/docs/api2/rest/resources/Zone.html

Parameters:

  • The (String)

    zone to publish - if one is provided when instantiated, we use that.

Returns:

  • (Hash)

    The dynect API response



90
91
92
93
# File 'lib/dynect_rest.rb', line 90

def publish(zone=nil)
  zone ||= @zone 
  put("Zone/#{zone}", { "publish" => true })
end

#put(path_part, payload, additional_headers = {}, &block) ⇒ Object

Raw PUT request, formatted for Dyn. See list of endpoints at:

manage.dynect.net/help/docs/api2/rest/resources/

Read the API documentation, and submit the proper data structure from here.

Parameters:

  • The (String)

    partial path to PUT - for example, ‘User’ or ‘Zone’.

  • The (Hash)

    data structure to submit as the body, is automatically turned to JSON.

  • Additional (Hash)

    HTTP headers



179
180
181
# File 'lib/dynect_rest.rb', line 179

def put(path_part, payload, additional_headers = {}, &block)
  api_request { @rest[path_part].put(payload.to_json, additional_headers, &block) }
end

#record_typeObject

Resource Records



131
132
133
134
135
# File 'lib/dynect_rest.rb', line 131

%w{AAAA A CNAME DNSKEY DS KEY LOC MX NS PTR RP SOA SRV TXT}.each do |record_type|
  define_method underscore(record_type) do
    DynectRest::Resource.new(self,"#{record_type}" , @zone)
  end
end

#thaw(zone = nil) ⇒ Hash

Parameters:

  • The (String)

    zone to thaw - if one is provided when instantiated, we use that.

Returns:

  • (Hash)

    The dynect API response



112
113
114
115
# File 'lib/dynect_rest.rb', line 112

def thaw(zone=nil)
  zone ||= @zone 
  put("Zone/#{zone}", { "thaw" => true })
end