jamesn-softlayer-ruby 0.5.0.0 → 0.6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Changes +7 -0
- data/README +5 -8
- data/lib/softlayer.rb +89 -24
- data/sample/resultlimit.rb +71 -0
- metadata +6 -3
data/Changes
ADDED
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
This is a module and class factory for SoftLayer's customer portal API (http://sldn.softlayer.com
|
1
|
+
This is a module and class factory for SoftLayer's customer portal API (http://sldn.softlayer.com ). See the rdoc documentation and the sample directory for usage details.
|
2
2
|
|
3
3
|
The factory creates classes as they are declared. As a group:
|
4
4
|
|
@@ -22,7 +22,7 @@ puts account['email']
|
|
22
22
|
Object Masks:
|
23
23
|
|
24
24
|
account.objectMask = { 'allBillingItems' => nil }
|
25
|
-
pp account['allBillingItems]
|
25
|
+
pp account['allBillingItems']
|
26
26
|
|
27
27
|
|
28
28
|
API user and key is cached after first use (but can be overridden on a per object basis):
|
@@ -42,16 +42,13 @@ account['nasNetworkStorage'].each do |n|
|
|
42
42
|
pp nas.capacityGb
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
Result Limits:
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
account.getAllBillingItems(:limit => [X,Y]) do |o,bia|
|
47
|
+
account.getAllBillingItems(:limit => [X,Y]) do |bia|
|
50
48
|
( blah )
|
51
49
|
end
|
52
50
|
|
53
|
-
Such that
|
54
|
-
blah executes on each batch until it's done.
|
51
|
+
Such that +bia+ is an array containing X or fewer elements; blah executes on each batch until there's no more.
|
55
52
|
|
56
53
|
Without a block, should return the 5 elements offset from Y:
|
57
54
|
|
data/lib/softlayer.rb
CHANGED
@@ -61,16 +61,6 @@ module SoftLayer
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
-
# Derive a Class from a SOAP::Mapping::Object
|
65
|
-
# +obj+:: The object to derive a class from.
|
66
|
-
# Returns a new object with +obj+ as the cached object. (obj['id'] == :initParam)
|
67
|
-
#
|
68
|
-
# XXX: We should use the SOAP mapping registry to avoid doing this, but what the hell.
|
69
|
-
# Also, there's no guartinee there's a class here to be created, so the assumption is
|
70
|
-
# that you know what you're doing when you use this (much like everything else).
|
71
|
-
def SoftLayer::deriveClass(args)
|
72
|
-
end
|
73
|
-
|
74
64
|
# Create a Ruby class to match an SLAPI WSDL endpoint.
|
75
65
|
# Args:
|
76
66
|
# +class+:: The name of the class to create in Ruby format.
|
@@ -111,8 +101,8 @@ module SoftLayer
|
|
111
101
|
return klass
|
112
102
|
end
|
113
103
|
|
114
|
-
# A class to old Paramaters.
|
115
|
-
class
|
104
|
+
# A class to old Paramaters.
|
105
|
+
class Param < SOAP::Header::SimpleHandler
|
116
106
|
def initialize(tag, out)
|
117
107
|
@out = out
|
118
108
|
super(XSD::QName.new(nil, tag))
|
@@ -132,7 +122,8 @@ module SoftLayer
|
|
132
122
|
end
|
133
123
|
|
134
124
|
# A class to hold the object mask.
|
135
|
-
class
|
125
|
+
class ObjectMask < SOAP::Header::SimpleHandler
|
126
|
+
|
136
127
|
def initialize(tag, out)
|
137
128
|
@out = out
|
138
129
|
super(XSD::QName.new(nil, tag))
|
@@ -149,7 +140,21 @@ module SoftLayer
|
|
149
140
|
def []=(k,v)
|
150
141
|
@out[k]=v
|
151
142
|
end
|
143
|
+
end
|
144
|
+
|
145
|
+
class ResultLimit < SOAP::Header::SimpleHandler
|
146
|
+
attr_accessor :limit, :offset
|
152
147
|
|
148
|
+
# limit should be an array of two elements; limit and offset.
|
149
|
+
def initialize(tag, limit)
|
150
|
+
@limit = limit[0]
|
151
|
+
@offset = limit[1]
|
152
|
+
super(XSD::QName.new(nil, tag))
|
153
|
+
end
|
154
|
+
|
155
|
+
def on_simple_outbound
|
156
|
+
{ 'limit' => @limit, 'offset' => @offset }
|
157
|
+
end
|
153
158
|
end
|
154
159
|
|
155
160
|
# The Base class for our generated class.
|
@@ -182,13 +187,14 @@ module SoftLayer
|
|
182
187
|
@@apiKey = args[:key] unless (args[:key].nil? || !@@apiKey.nil?)
|
183
188
|
@apiUser = @@apiUser unless (@@apiUser.nil? || !@apiUser.nil?)
|
184
189
|
@apiKey = @@apiKey unless (@@apiKey.nil? || !@apiKey.nil?)
|
190
|
+
@authHeader = Param.new('authenticate', {'username' => @apiUser, 'apiKey' => @apiKey})
|
185
191
|
|
186
192
|
self.class.cacheWSDL
|
187
193
|
@slapi = @@wsdl[self.soapClass].create_rpc_driver
|
188
194
|
self.debug=args[:debug] unless args[:debug].nil?
|
189
195
|
end
|
190
196
|
|
191
|
-
# Return this
|
197
|
+
# Return this object's matching SLAPI SOAP Class.
|
192
198
|
def soapClass
|
193
199
|
return self.class.to_s.gsub(/::/, '_')
|
194
200
|
end
|
@@ -223,10 +229,10 @@ module SoftLayer
|
|
223
229
|
# userCount => nil }
|
224
230
|
# Changing this resets the cached object used by #[]
|
225
231
|
def objectMask=(mask)
|
226
|
-
if mask.class ==
|
232
|
+
if mask.class == ObjectMask
|
227
233
|
@objectMask = mask
|
228
234
|
else
|
229
|
-
@objectMask =
|
235
|
+
@objectMask = ObjectMask.new("#{self.soapClass}ObjectMask", mask)
|
230
236
|
end
|
231
237
|
@slapiObject = nil
|
232
238
|
end
|
@@ -234,33 +240,83 @@ module SoftLayer
|
|
234
240
|
def objectMask
|
235
241
|
return @objectMask
|
236
242
|
end
|
243
|
+
|
244
|
+
# Set an object wide result set (or clear it)
|
245
|
+
# arg can be one of three things:
|
246
|
+
# * nil clears the resultLimit
|
247
|
+
# * A Result Limit array of two elements range and offset.
|
248
|
+
# * An existing ResultLimit object
|
249
|
+
def resultLimit=(arg)
|
250
|
+
case arg.class
|
251
|
+
when NilClass
|
252
|
+
@resultLimit = nil
|
253
|
+
when Array
|
254
|
+
@resultLimit = ResultLimit.new('resultLimit',arg)
|
255
|
+
when ResultLimit
|
256
|
+
@resultLimit = arg
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def resultLimit
|
261
|
+
return @resultLimit
|
262
|
+
end
|
237
263
|
|
238
264
|
|
239
265
|
# Make a direct api call. Paramaters are a hash where the key is passed to ParamHeader as the tag, and the value
|
240
266
|
# is passed as the tag content, unless it's a magic paramater.
|
241
267
|
# Magic Paramaters:
|
242
|
-
# +initParam+:: Initialization paramater for this call (just the key)
|
243
|
-
#
|
268
|
+
# +initParam+:: Initialization paramater for this call (just the key), therwise @initParam is used.
|
269
|
+
# +limit+:: A Result Limit array of two elements range and offset. If @resultLimit is set it's used
|
270
|
+
# if +limit+ is not and if neither is set, no limit is applied.
|
271
|
+
#
|
272
|
+
# If a block is provided, the limit's range (or fewer) elements will yield to the block until the dataset
|
273
|
+
# is exhausted. If no limit is provided with the block a limit of [1,0] is assumed initially.
|
244
274
|
# Aliased to #method_missing.
|
245
|
-
def slapiCall(method, args = { })
|
275
|
+
def slapiCall(method, args = { }, &block)
|
246
276
|
initParam = args[:initParam] unless args[:initParam].nil?
|
247
277
|
args.delete(:initParam) unless args[:initParam].nil?
|
278
|
+
initParam = Param.new("#{self.soapClass}InitParameters", { 'id' => initParam }) unless initParam.nil?
|
248
279
|
initParam = @initParam if initParam.nil?
|
280
|
+
resultLimit = ResultLimit.new('resultLimit', args[:limit]) unless args[:limit].nil?
|
281
|
+
args.delete(:limit) unless args[:limit].nil?
|
282
|
+
resultLimit = @resultLimit if resultLimit.nil?
|
249
283
|
|
250
|
-
@slapi.headerhandler <<
|
284
|
+
@slapi.headerhandler << @authHeader unless @slapi.headerhandler.include?(@authHeader)
|
285
|
+
paramHeaders = []
|
251
286
|
unless args.nil?
|
252
287
|
args.each do |k,v|
|
253
|
-
|
288
|
+
p = ParamHeader.new(k.to_s,v)
|
289
|
+
paramHeaders.push(p)
|
290
|
+
@slapi.headerhandler << p
|
254
291
|
end
|
255
292
|
end
|
256
|
-
@slapi.headerhandler <<
|
293
|
+
@slapi.headerhandler << initParam unless @slapi.headerhandler.include?(@authHeader)
|
257
294
|
@slapi.headerhandler << @objectMask unless @objectMask.nil?
|
258
|
-
|
295
|
+
@slapi.headerhandler << resultLimit unless resultLimit.nil?
|
296
|
+
|
297
|
+
if block_given?
|
298
|
+
go=true
|
299
|
+
resultLimit = ResultLimit.new('resultLimit', [1,0]) if resultLimit.nil? # this is broken.
|
300
|
+
@slapi.headerhandler << resultLimit unless @slapi.headerhandler.include?(resultLimit)
|
301
|
+
while(go) do
|
302
|
+
res = @slapi.call(method.to_s)
|
303
|
+
yield(res) unless (res.nil? || (res.respond_to?(:empty) && res.empty?))
|
304
|
+
go = false if res.nil?
|
305
|
+
go = false if (res.respond_to?(:size) && (res.size < resultLimit.limit))
|
306
|
+
resultLimit.offset=resultLimit.offset + resultLimit.limit
|
307
|
+
end
|
308
|
+
headerClean(resultLimit,paramHeaders)
|
309
|
+
return true
|
310
|
+
else
|
311
|
+
res = @slapi.call(method.to_s)
|
312
|
+
headerClean(resultLimit,paramHeaders)
|
313
|
+
return res
|
314
|
+
end
|
259
315
|
end
|
260
316
|
|
261
317
|
# Alias the above call method to #method_missing.
|
262
318
|
alias_method :method_missing, :slapiCall
|
263
|
-
|
319
|
+
|
264
320
|
# Enable (or disable) debug. (paramater is the IO handler to write to)
|
265
321
|
def debug=(dev)
|
266
322
|
@slapi.wiredump_dev=(dev)
|
@@ -293,6 +349,15 @@ module SoftLayer
|
|
293
349
|
def self.soapClass
|
294
350
|
self.name.to_s.gsub(/::/, '_')
|
295
351
|
end
|
352
|
+
|
353
|
+
private
|
354
|
+
|
355
|
+
# Clean the headers out of the driver.
|
356
|
+
def headerClean(rl,ha)
|
357
|
+
@slapi.headerhandler.delete(rl)
|
358
|
+
ha.each { |h| @slapi.headerhandler.delete(h) }
|
359
|
+
|
360
|
+
end
|
296
361
|
|
297
362
|
end
|
298
363
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# resultlimit
|
3
|
+
#
|
4
|
+
# Copyright (c) 2009, James Nuckolls. All rights reserved.
|
5
|
+
#
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
8
|
+
#
|
9
|
+
# * Redistributions of source code must retain the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer.
|
11
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
# * Neither "James Nuckolls" nor the names of any contributors may
|
15
|
+
# be used to endorse or promote products derived from this software without
|
16
|
+
# specific prior written permission.
|
17
|
+
#
|
18
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
21
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
22
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
23
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
24
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
25
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
26
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
27
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
28
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
#
|
30
|
+
#= Description
|
31
|
+
# Fun with Range Limits.
|
32
|
+
#= ToDo
|
33
|
+
#
|
34
|
+
|
35
|
+
require 'rubygems' rescue LoadError
|
36
|
+
require 'pp'
|
37
|
+
require 'softlayer'
|
38
|
+
|
39
|
+
AUTH_USER = ARGV[0]
|
40
|
+
AUTH_KEY = ARGV[2]
|
41
|
+
ACCT_ID = ARGV[1]
|
42
|
+
|
43
|
+
SLAPICLASSES = [ 'SoftLayer::Account' ]
|
44
|
+
SoftLayer::declareClasses(:ruby => SLAPICLASSES)
|
45
|
+
|
46
|
+
range = 5
|
47
|
+
offset = 0
|
48
|
+
account = SoftLayer::Account.new(:user => AUTH_USER, :key => AUTH_KEY, :initParam => ACCT_ID)
|
49
|
+
# account.debug=STDOUT
|
50
|
+
bia = account.getAllBillingItems(:limit => [range,offset])
|
51
|
+
pp bia
|
52
|
+
puts "=================================="
|
53
|
+
offset = range + offset
|
54
|
+
bia = account.getAllBillingItems(:limit => [range,offset])
|
55
|
+
pp bia
|
56
|
+
puts "=================================="
|
57
|
+
offset = range + offset
|
58
|
+
account.getAllBillingItems(:limit => [range,offset]) do |bi|
|
59
|
+
pp bi
|
60
|
+
puts "================== #{offset}"
|
61
|
+
offset = range + offset
|
62
|
+
end
|
63
|
+
|
64
|
+
range = 5
|
65
|
+
offset = 0
|
66
|
+
# account.debug=STDOUT
|
67
|
+
account.getInvoices(:limit => [range,offset]) do |bi|
|
68
|
+
pp bi
|
69
|
+
puts "================== #{offset}"
|
70
|
+
offset = offset + range
|
71
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jamesn-softlayer-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Nuckolls
|
@@ -9,7 +9,7 @@ autorequire: softlayer
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-13 22:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -23,7 +23,7 @@ dependencies:
|
|
23
23
|
version: 1.5.0
|
24
24
|
version:
|
25
25
|
description:
|
26
|
-
email:
|
26
|
+
email: afeIfz.drtgcE@what.net
|
27
27
|
executables: []
|
28
28
|
|
29
29
|
extensions: []
|
@@ -31,13 +31,16 @@ extensions: []
|
|
31
31
|
extra_rdoc_files:
|
32
32
|
- README
|
33
33
|
- LICENSE
|
34
|
+
- Changes
|
34
35
|
files:
|
35
36
|
- lib/softlayer.rb
|
36
37
|
- sample/nascapacity.rb
|
37
38
|
- sample/billingreport.rb
|
38
39
|
- sample/objectmask.rb
|
40
|
+
- sample/resultlimit.rb
|
39
41
|
- README
|
40
42
|
- LICENSE
|
43
|
+
- Changes
|
41
44
|
has_rdoc: true
|
42
45
|
homepage: http://github.com/jamesn/softlayer-ruby
|
43
46
|
post_install_message:
|