ultradns-sdk 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,23 @@
1
+
2
+ class Ultradns::Api::ClientAccessor
3
+
4
+ def initialize(client)
5
+ @client = client
6
+ if client.kind_of?(Ultradns::Api::ClientAccessor)
7
+ @client = client.client
8
+ end
9
+ end
10
+
11
+ protected
12
+ #########
13
+
14
+ def client
15
+ @client
16
+ end
17
+
18
+ def request_options(params = {})
19
+ @client.send :request_options, params
20
+ end
21
+
22
+
23
+ end
@@ -0,0 +1,112 @@
1
+ # Copyright 2000-2014 NeuStar, Inc. All rights reserved.
2
+ # NeuStar, the Neustar logo and related names and logos are registered
3
+ # trademarks, service marks or tradenames of NeuStar, Inc. All other
4
+ # product names, company names, marks, logos and symbols may be trademarks
5
+ # of their respective owners.
6
+
7
+ require_relative 'client_accessor'
8
+
9
+ class Ultradns::Api::Rrset < Ultradns::Api::ClientAccessor
10
+
11
+ attr_reader :rtype, :owner_name
12
+
13
+ def initialize(zone, rtype, owner_name)
14
+ super(zone)
15
+ @zone_name = zone.zone_name
16
+ @rtype = rtype
17
+ @owner_name = owner_name
18
+ end
19
+
20
+
21
+ # Creates a new RRSet in the specified zone.
22
+ #
23
+ # === Required Parameters
24
+ #
25
+ # * +zone_name+ - The zone that contains the RRSet.The trailing dot is optional.
26
+ # * +rtype+ - The type of the RRSet.This can be numeric (1) or
27
+ # if a well-known name is defined for the type (A), you can use it instead.
28
+ # * +owner_name+ - The owner name for the RRSet.
29
+ # If no trailing dot is supplied, the owner_name is assumed to be relative (foo).
30
+ # If a trailing dot is supplied, the owner name is assumed to be absolute (foo.zonename.com.)
31
+ # * +ttl+ - The updated TTL value for the RRSet.
32
+ # * +rdata+ - The updated BIND data for the RRSet as a string.
33
+ # If there is a single resource record in the RRSet, you can pass in the single string or an array with a single element.
34
+ # If there are multiple resource records in this RRSet, pass in a list of strings.
35
+ #
36
+ # === Examples
37
+ #
38
+ # c.zone('zone.invalid.').rrset('A', 'foo').create(300, '1.2.3.4')
39
+ def create(ttl, rdata)
40
+ rrset = {:ttl => ttl, :rdata => rdata}
41
+ rrset[:rdata] = [rdata] unless rdata.kind_of? Array
42
+ client.with_auth_retry {|c| c.post rrset_path, request_options({body: rrset.to_json}) }
43
+ end
44
+
45
+
46
+ # List all RRSets for this rtype and owner_name
47
+ def list
48
+ client.with_auth_retry {|c| c.get rrset_path, request_options }
49
+ end
50
+
51
+ # (Partially) Updates an existing RRSet for this rtype and owner_name in this zone
52
+ #
53
+ # === Required Parameters
54
+ #
55
+ # * +ttl+ - The updated TTL value for the RRSet.
56
+ # * +rdata+ - The updated BIND data for the RRSet as a string.
57
+ # If there is a single resource record in the RRSet, you can pass in the single string or an array with a single element.
58
+ # If there are multiple resource records in this RRSet, pass in a list of strings.
59
+ # #
60
+ # === Examples
61
+ #
62
+ # c.update('zone.invalid.', "A", "foo", 100, ["10.20.30.40"])
63
+ def update(ttl, rdata = nil)
64
+ rrset = {}
65
+ rrset[:ttl] = ttl if ttl != nil
66
+ rrset[:rdata] = (rdata.kind_of?(Array) ? rdata : [rdata]) if rdata != nil
67
+
68
+ client.with_auth_retry {|c| c.patch rrset_path, request_options({body: rrset.to_json}) }
69
+ end
70
+
71
+ # Updates (by replacing) an existing RRSet for this rtype and owner_name in this zone
72
+ def replace()
73
+ end
74
+
75
+
76
+ # Delete an rrset
77
+ #
78
+ # === Required Parameters
79
+ # * +zone_name+ - The zone containing the RRSet to be deleted. The trailing dot is optional.
80
+ # * +rtype+ - The type of the RRSet.This can be numeric (1) or if a well-known name
81
+ # is defined for the type (A), you can use it instead.
82
+ # * +owner_name+ - The owner name for the RRSet.
83
+ # If no trailing dot is supplied, the owner_name is assumed to be relative (foo).
84
+ # If a trailing dot is supplied, the owner name is assumed to be absolute (foo.zonename.com.)
85
+ #
86
+ # === Examples
87
+ #
88
+ # c.delete_rrset(first_zone_name, 'A', 'foo')
89
+ def delete
90
+ client.with_auth_retry {|c| c.delete rrset_path, request_options }
91
+ end
92
+
93
+ #
94
+ # def profiles
95
+ # list()
96
+ # end
97
+
98
+ # Set the profile for the matching rrsets
99
+ #
100
+ def profile(options)
101
+ client.with_auth_retry {|c| c.patch rrset_path, request_options({body: {profile: options}.to_json}) }
102
+ end
103
+
104
+
105
+ protected
106
+ #########
107
+
108
+ def rrset_path()
109
+ "/zones/#{@zone_name}/rrsets/#{@rtype}/#{@owner_name}"
110
+ end
111
+
112
+ end
@@ -0,0 +1,137 @@
1
+ # Copyright 2000-2014 NeuStar, Inc. All rights reserved.
2
+ # NeuStar, the Neustar logo and related names and logos are registered
3
+ # trademarks, service marks or tradenames of NeuStar, Inc. All other
4
+ # product names, company names, marks, logos and symbols may be trademarks
5
+ # of their respective owners.
6
+
7
+ require_relative 'client_accessor'
8
+
9
+ class Ultradns::Api::Zone < Ultradns::Api::ClientAccessor
10
+
11
+ attr_reader :zone_name
12
+
13
+ def initialize(client, zone_name)
14
+ super(client)
15
+ @zone_name = zone_name
16
+ end
17
+
18
+ # Get zone metadata
19
+ #
20
+ # === Examples
21
+ #
22
+ # c.zone('foo.invalid.').metadata
23
+ def metadata
24
+ client.with_auth_retry {|c| c.get "/zones/#{@zone_name}", request_options }
25
+ end
26
+
27
+ # Create a zone
28
+ #
29
+ # === Required Parameters
30
+ #
31
+ # * +account_name+ - The account that the zone will be created under. The user must have write access for zones in that account.
32
+ #
33
+ # === Optional Parameters
34
+ #
35
+ # * +type+ - The type of zone to be created, one of three possible values: PRIMARY, SECONDARY, or ALIAS.
36
+ #
37
+ # See documentation section: Primary Zone DTO or Secondary Zone DTO for further options.
38
+ # === Examples
39
+ #
40
+ # c.create('my_account')
41
+ def create(account_name, options = {})
42
+ zone_properties = {name: @zone_name, accountName: account_name, type: 'PRIMARY'}
43
+
44
+ primary_zone_info = {}
45
+ if options[:properties][:type] == 'PRIMARY' || options[:properties][:type] == nil
46
+ primary_zone_info = {forceImport: true, createType: 'NEW'}
47
+ end
48
+
49
+ zone_data = {properties: zone_properties,
50
+ primaryCreateInfo: primary_zone_info}.merge(options)
51
+
52
+ with_auth_retry {|c| c.post '/zones', request_options({body: zone_data.to_json}) }
53
+ end
54
+
55
+ # Delete a zone
56
+ #
57
+ # === Examples
58
+ #
59
+ # c.zone('foo.invalid.').delete
60
+ def delete
61
+ client.with_auth_retry {|c| c.delete "/zones/#{@zone_name}", request_options }
62
+ end
63
+
64
+
65
+
66
+ # Returns the list of RRSets in the specified zone of the (optional) specified type.
67
+ #
68
+ # === Optional Parameters
69
+ #
70
+ # * +rtype+ - The type of the RRSets. This can be numeric (1) or
71
+ # if a well-known name is defined for the type (A), you can use it instead.
72
+ #
73
+ # === Optional Parameters
74
+ #
75
+ # * +:q+ - The search parameters, in a hash. Valid keys are:
76
+ # ttl - must match the TTL for the rrset
77
+ # owner - substring match of the owner name
78
+ # value - substring match of the first BIND field value
79
+ # * +:sort+ - The sort column used to order the list. Valid values for the sort field are:
80
+ # OWNER
81
+ # TTL
82
+ # TYPE
83
+ # * +:reverse+ - Whether the list is ascending(false) or descending(true). Defaults to true
84
+ # * +:offset+ - The position in the list for the first returned element(0 based)
85
+ # * +:limit+ - The maximum number of zones to be returned.
86
+ #
87
+ # === Examples
88
+ #
89
+ # c.zone('foo.invalid.').rrsets() # all types returned
90
+ # c.zone('foo.invalid.').rrsets('A')
91
+ # c.zone('foo.invalid.').rrsets('TXT', q: {value: 'cheese', ttl:300}, offset:5, limit:10)
92
+ def rrsets(rtype = nil, options={})
93
+ rrsets_path = "/zones/#{@zone_name}/rrsets"
94
+ rrsets_path += "/#{rtype}" if rtype != nil
95
+
96
+ client.with_auth_retry {|c| c.get(rrsets_path, request_options(options)) }
97
+ end
98
+
99
+
100
+ # === Required Parameters
101
+ # * +rtype+ - The type of the RRSet.This can be numeric (1) or if a well-known name
102
+ # is defined for the type (A), you can use it instead.
103
+ # * +owner_name+ - The owner name for the RRSet.
104
+ # If no trailing dot is supplied, the owner_name is assumed to be relative (foo).
105
+ # If a trailing dot is supplied, the owner name is assumed to be absolute (foo.zonename.com.)
106
+ #
107
+ # === Examples
108
+ #
109
+ # c.rrset('A', 'foo')
110
+ def rrset(rtype, owner_name)
111
+ Ultradns::Api::Rrset.new(self, rtype, owner_name)
112
+ end
113
+
114
+ # Creates a new RRSet in the specified zone.
115
+ #
116
+ # === Required Parameters
117
+ #
118
+ # * +zone_name+ - The zone that contains the RRSet.The trailing dot is optional.
119
+ # * +rtype+ - The type of the RRSet.This can be numeric (1) or
120
+ # if a well-known name is defined for the type (A), you can use it instead.
121
+ # * +owner_name+ - The owner name for the RRSet.
122
+ # If no trailing dot is supplied, the owner_name is assumed to be relative (foo).
123
+ # If a trailing dot is supplied, the owner name is assumed to be absolute (foo.zonename.com.)
124
+ # * +ttl+ - The updated TTL value for the RRSet.
125
+ # * +rdata+ - The updated BIND data for the RRSet as a string.
126
+ # If there is a single resource record in the RRSet, you can pass in the single string or an array with a single element.
127
+ # If there are multiple resource records in this RRSet, pass in a list of strings.
128
+ #
129
+ # === Examples
130
+ #
131
+ # c.zone('zone.invalid.').create_rrset('A', 'foo', 300, '1.2.3.4')
132
+ def create_rrset(rtype, owner_name, ttl, rdata)
133
+ rrset(rtype, owner_name).create(ttl, rdata)
134
+ end
135
+
136
+
137
+ end
@@ -0,0 +1,185 @@
1
+ # Copyright 2000-2014 NeuStar, Inc. All rights reserved.
2
+ # NeuStar, the Neustar logo and related names and logos are registered
3
+ # trademarks, service marks or tradenames of NeuStar, Inc. All other
4
+ # product names, company names, marks, logos and symbols may be trademarks
5
+ # of their respective owners.
6
+
7
+ require 'httparty'
8
+ require 'logger'
9
+
10
+ require_relative 'api/authentication'
11
+ require_relative 'api/account'
12
+ require_relative 'api/client_accessor'
13
+ require_relative 'api/rrset'
14
+ require_relative 'api/zone'
15
+
16
+ class Ultradns::Client
17
+ include HTTParty
18
+ include Ultradns::Api::Authentication
19
+
20
+ disable_rails_query_string_format
21
+ default_timeout 30
22
+ open_timeout 10
23
+ read_timeout 10
24
+ headers({'Accept' => 'application/json', 'Content-Type' => 'application/json'})
25
+ format :json # force the format to json
26
+
27
+ # base uri for the service
28
+ base_uri 'https://restapi.ultradns.com/v1'
29
+
30
+ debug_output $stdout if ENV['DEBUG']
31
+
32
+
33
+ # Initialize an Ultra REST API client
34
+ #
35
+ # === Required Parameters
36
+ #
37
+ # * +username+ - The user name
38
+ # * +password+ - The user's password
39
+ #
40
+ # === Optional Parameters
41
+ #
42
+ # * +:use_http+ - Use http instead of https. Defaults to false, set to true only in test environments. Will not work in production.
43
+ # * +:host+ - host and port of the remote server. Defaults to restapi.ultradns.com.
44
+ #
45
+ # === Examples
46
+ #
47
+ # c = RestClient.new("myUname", "myPwd")
48
+ # c = RestClient.new("myUname", "myPwd", host: 'restapi-useast1b01-01.ct.ultradns.net:8080')
49
+ def initialize(username, password, options = {})
50
+ @logger ||= ::Logger.new($stdout)
51
+
52
+ auth(username, password)
53
+
54
+ @options = {}
55
+ # override or ignored if nil
56
+ @options[:base_uri] = HTTParty.normalize_base_uri(options[:host]) if options[:host]
57
+
58
+ logger.debug "Initializing UltraDNS Client using #{@options.inspect}"
59
+ end
60
+
61
+
62
+
63
+ # Get version of REST API server
64
+ #
65
+ # === Examples
66
+ #
67
+ # c.version
68
+ def version
69
+ with_auth_retry {|c| c.get '/version', request_options }
70
+ end
71
+
72
+
73
+ # Get status of REST API server
74
+ #
75
+ # === Examples
76
+ #
77
+ # c.status
78
+ def status
79
+ with_auth_retry {|c| c.get '/status', request_options }
80
+ end
81
+
82
+
83
+ # Access Account Level Resources for the given account_name
84
+ #
85
+ # === Required Parameters
86
+ #
87
+ # * +account_name+ - One of the user's accounts. The user must have read access for zones in that account.
88
+ #
89
+ def account(account_name)
90
+ Ultradns::Api::Account.new(self, account_name)
91
+ end
92
+
93
+ # Get account details for user
94
+ #
95
+ # === Examples
96
+ #
97
+ # c.accounts
98
+ def accounts
99
+ with_auth_retry {|c| c.get '/accounts', request_options }
100
+ end
101
+
102
+
103
+ # === Required Parameters
104
+ #
105
+ # * +zone_name+ - The name of the zone.
106
+ #
107
+ def zone(zone_name)
108
+ Ultradns::Api::Zone.new(self, zone_name)
109
+ end
110
+
111
+
112
+ # Create a primary zone
113
+ #
114
+ # === Required Parameters
115
+ #
116
+ # * +account_name+ - The account that the zone will be created under. The user must have write access for zones in that account.
117
+ # * +zone_name+ - The name of the zone. The trailing . is optional. The zone name must not be in use by anyone.
118
+ #
119
+ # === Examples
120
+ #
121
+ # c.create_primary_zone('my_account', 'zone.invalid.')
122
+ def create_primary_zone(account_name, zone_name)
123
+ zone_properties = {:name => zone_name, :accountName => account_name, :type => 'PRIMARY'}
124
+ primary_zone_info = {:forceImport => true, :createType => 'NEW'}
125
+
126
+ zone_data = {:properties => zone_properties, :primaryCreateInfo => primary_zone_info}
127
+
128
+ with_auth_retry {|c| c.post '/zones', request_options({:body => zone_data.to_json}) }
129
+ end
130
+
131
+ # List the background tasks (jobs) running. Some APIs will return a Task Id
132
+ # which can used to determine the state of those jobs.
133
+ #
134
+ # === Optional Parameters
135
+ #
136
+ # * +:q+ - The search parameters, in a hash. The query used to construct the list.
137
+ # Valid keys are:
138
+ # code - valid values for 'code' are PENDING, IN_PROCESS, COMPLETE, and ERROR.
139
+ # hasData - valid values for 'hasData' are true and false.
140
+ #
141
+ # * +offset+ - The position in the list for the first returned element (0 based). The
142
+ # default value is 0.
143
+ #
144
+ # * +limit+ - The maximum number of rows requested. The default value is 100.
145
+ #
146
+ # * +sort+ - The sort column used to order the list. Valid sort fields are CODE, CONTENT_TYPE, EXTENSIONS,
147
+ # HAS_DATA, and DATE. The default value is CODE.
148
+ #
149
+ # * +reverse+ - Whether the list is ascending (false) or descending (true). The default
150
+ # value is false.
151
+ #
152
+ def tasks(options = {})
153
+ with_auth_retry {|c| c.get("/tasks", request_options(options)) }
154
+ end
155
+
156
+
157
+
158
+ protected
159
+ #########
160
+ def request_options(params = {})
161
+ add_auth_header!(params)
162
+ @options.merge(build_params(params))
163
+ end
164
+
165
+
166
+ def logger
167
+ @logger
168
+ end
169
+
170
+ def build_params(args)
171
+ params = {}
172
+ if args[:q]
173
+ q = args[:q]
174
+ q_str = ''
175
+ q.each { |k, v| q_str += "#{k}:#{v} " }
176
+ if q_str.length > 0
177
+ params[:q] = q_str
178
+ end
179
+ args.delete :q
180
+ end
181
+ params.update(args)
182
+ params
183
+ end
184
+
185
+ end