jamesn-softlayer-ruby 0.5.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2009, James Nuckolls. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions are met:
5
+
6
+ * Redistributions of source code must retain the above copyright notice,
7
+ this list of conditions and the following disclaimer.
8
+ * Redistributions in binary form must reproduce the above copyright notice,
9
+ this list of conditions and the following disclaimer in the documentation
10
+ and/or other materials provided with the distribution.
11
+ * Neither "James Nuckolls" nor the names of any contributors may
12
+ be used to endorse or promote products derived from this software without
13
+ specific prior written permission.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
+ POSSIBILITY OF SUCH DAMAGE.
26
+
data/README ADDED
@@ -0,0 +1,61 @@
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
+
3
+ The factory creates classes as they are declared. As a group:
4
+
5
+ SLAPICLASSES = [ 'SoftLayer::Account' ]
6
+ SLAPISERVICES = [ 'SoftLayer_Billing_Item', 'SoftLayer_Network_Storage' ]
7
+ SoftLayer::declareClasses(:ruby => SLAPICLASSES, :soap => SLAPISERVICES)
8
+
9
+ Or one at a time:
10
+
11
+ SoftLayer::ClassFactory(:class => 'SoftLayer::Account')
12
+
13
+ Objects are then created and used like normal Ruby objects:
14
+
15
+ account = SoftLayer::Account.new(:user => AUTH_USER, :key => AUTH_KEY, :initParam => ACCT_ID)
16
+ puts account.getBalance
17
+
18
+ The object's associated Type is available like a hash:
19
+
20
+ puts account['email']
21
+
22
+ Object Masks:
23
+
24
+ account.objectMask = { 'allBillingItems' => nil }
25
+ pp account['allBillingItems]
26
+
27
+
28
+ API user and key is cached after first use (but can be overridden on a per object basis):
29
+
30
+ SLAPISERVICES = [ 'SoftLayer_Account', 'SoftLayer_Billing_Item', 'SoftLayer_Network_Storage' ]
31
+ SoftLayer::declareClasses(:soap => SLAPISERVICES)
32
+
33
+ account = SoftLayer::Account.new(:user => AUTH_USER, :key => AUTH_KEY, :initParam => ACCT_ID)
34
+ account.objectMask={ 'allBillingItems' => nil, 'nasNetworkStorage' => nil }
35
+ account['allBillingItems'].each do |bi|
36
+ billingItem = SoftLayer::Billing::Item.new(:initParam => bi['id'])
37
+ pp billingItem.getLocation['longName']
38
+ end
39
+
40
+ account['nasNetworkStorage'].each do |n|
41
+ nas = SoftLayer::Network::Storage(:user => OTHER_AUTH_USER, :key => OTHER_AUTH_KEY, :initParam => n['id'])
42
+ pp nas.capacityGb
43
+ end
44
+
45
+ ToDo:
46
+
47
+ Result Limits. Can be done now as a parameter to any method, but should be integrated such that this does the right thing:
48
+
49
+ account.getAllBillingItems(:limit => [X,Y]) do |o,bia|
50
+ ( blah )
51
+ end
52
+
53
+ Such that is +o+ is the offset and +bia+ is an array containing X or fewer elements (or a single element if :limit[0] == 1);
54
+ blah executes on each batch until it's done.
55
+
56
+ Without a block, should return the 5 elements offset from Y:
57
+
58
+ bia = account.getAllBillingItems(:limit => [5,Y])
59
+ bia.size <= 5
60
+
61
+
data/lib/softlayer.rb ADDED
@@ -0,0 +1,298 @@
1
+ #!/usr/bin/env ruby
2
+ # softlayer
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
+ #
32
+ #= ToDo
33
+ #
34
+
35
+ require 'rubygems' rescue LoadError
36
+ gem 'soap4r'
37
+ require 'soap/header/simplehandler'
38
+ require 'soap/wsdlDriver'
39
+
40
+
41
+ module SoftLayer
42
+
43
+ # Declare SLAPI clases. Args take class names in two forms:
44
+ # +soap+:: Service names in SOAP format (example: SoftLayer_Account)
45
+ # +ruby+:: Class names in Ruby format (example: SoftLayer::Account)
46
+ # Creates the class, and retrieves and caches the endpoint WSDL.
47
+ def SoftLayer::declareClasses(args)
48
+ classes = args[:ruby]
49
+ services = args[:soap]
50
+
51
+ unless (services.nil? || services.empty?)
52
+ services.each do |s|
53
+ c = s.gsub(/_/,'::')
54
+ classes.push(c)
55
+ end
56
+ end
57
+
58
+ classes.each do |cstr|
59
+ k = SoftLayer::ClassFactory(:class => cstr)
60
+ k.cacheWSDL
61
+ end
62
+ end
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
+ # Create a Ruby class to match an SLAPI WSDL endpoint.
75
+ # Args:
76
+ # +class+:: The name of the class to create in Ruby format.
77
+ # +parent+:: The parent namespace to add the class to (this should be somewere in SoftLayer; optional).
78
+ # This recursively walks up +class+ creating them as needed, so SoftLayer::Dns::Domain will create
79
+ # classes for Dns and Domain (even though the Dns class will never be used).
80
+ def SoftLayer::ClassFactory(args)
81
+ cname = args[:class]
82
+ parent = args[:parent] unless args[:parent].nil?
83
+
84
+ cary = cname.split('::')
85
+ parent = const_get(cary.shift) if parent.nil? # This should always be SoftLayer, but maybe not...
86
+ cur = cary.shift
87
+ newclass = nil
88
+ unless parent.const_defined?(cur)
89
+ newclass = SoftLayer::makeSLAPIKlass(:class => cur, :parent => parent)
90
+ else
91
+ newclass = parent.const_get(cur)
92
+ end
93
+ return newclass if cary.empty?
94
+
95
+ left = cary.join('::')
96
+ k = SoftLayer::ClassFactory(:class => left, :parent => newclass)
97
+ return k
98
+ end
99
+
100
+ # This really creates the class.
101
+ # +class+:: The name of the class to create in Ruby format.
102
+ # +parent+:: The parent namespace to add the class to (this should be somewhere in SoftLayer, not optional).
103
+ def SoftLayer::makeSLAPIKlass(args)
104
+ cname = args[:class]
105
+ parent = args[:parent]
106
+ realKlassName = "#{cname}"
107
+ klass = Class.new SoftLayer::BaseClass do
108
+
109
+ end
110
+ parent.const_set realKlassName, klass
111
+ return klass
112
+ end
113
+
114
+ # A class to old Paramaters.
115
+ class ParamHeader < SOAP::Header::SimpleHandler
116
+ def initialize(tag, out)
117
+ @out = out
118
+ super(XSD::QName.new(nil, tag))
119
+ end
120
+
121
+ def on_simple_outbound
122
+ @out
123
+ end
124
+
125
+ def [](k)
126
+ return @out[k]
127
+ end
128
+
129
+ def []=(k,v)
130
+ @out[k]=v
131
+ end
132
+ end
133
+
134
+ # A class to hold the object mask.
135
+ class ObjectMaskHeader < SOAP::Header::SimpleHandler
136
+ def initialize(tag, out)
137
+ @out = out
138
+ super(XSD::QName.new(nil, tag))
139
+ end
140
+
141
+ def on_simple_outbound
142
+ { 'mask' => @out }
143
+ end
144
+
145
+ def [](k)
146
+ @out[k]
147
+ end
148
+
149
+ def []=(k,v)
150
+ @out[k]=v
151
+ end
152
+
153
+ end
154
+
155
+ # The Base class for our generated class.
156
+ class BaseClass
157
+
158
+ WSDLBASE='http://api.service.softlayer.com/soap/v3'
159
+ WSDLPARAM='?wsdl'
160
+
161
+ @@wsdl = { }
162
+ @@apiUser = nil
163
+ @@apiKey = nil
164
+
165
+ # The initializer.
166
+ # Arguments:
167
+ # +user+:: The API User
168
+ # +key+:: The API Key
169
+ # +initParams+:: This object's initParam (just the key)
170
+ # +debug+:: Enable debug after driver creation. (IO handler)
171
+ #
172
+ # +user+ and +key+ are optional. The first time they're presented
173
+ # they're saved to class variables and reused later as necessary. Supplying
174
+ # +user+ and +key+ later does not overwrite the class variables. +initParams+ is
175
+ # required where the api requires it.
176
+ def initialize(args)
177
+ @apiUser = args[:user] unless args[:user].nil?
178
+ @apiKey = args[:key] unless args[:key].nil?
179
+ @initParam = args[:initParam]
180
+
181
+ @@apiUser = args[:user] unless (args[:user].nil? || !@@apiUser.nil?)
182
+ @@apiKey = args[:key] unless (args[:key].nil? || !@@apiKey.nil?)
183
+ @apiUser = @@apiUser unless (@@apiUser.nil? || !@apiUser.nil?)
184
+ @apiKey = @@apiKey unless (@@apiKey.nil? || !@apiKey.nil?)
185
+
186
+ self.class.cacheWSDL
187
+ @slapi = @@wsdl[self.soapClass].create_rpc_driver
188
+ self.debug=args[:debug] unless args[:debug].nil?
189
+ end
190
+
191
+ # Return this's object's matching SLAPI SOAP Class.
192
+ def soapClass
193
+ return self.class.to_s.gsub(/::/, '_')
194
+ end
195
+
196
+ # This returns key values from this Service's associated Type (retrieved using #getObject).
197
+ def [](key)
198
+ @slapiObject = self.getObject if @slapiobject.nil?
199
+ return @slapiObject[key.to_s]
200
+ end
201
+
202
+ def setObject(obj)
203
+ @slapiObject = obj
204
+ end
205
+
206
+ # Set the object mask which ia passed as a hash of optional hashes (otherwise the hash elements should have a nil value).
207
+ # Using the example from the wiki:
208
+ # <SoftLayer_AccountObjectMask xsi:type="v3:SoftLayer_AccountObjectMask">
209
+ # <mask xsi:type="slt:SoftLayer_Account" xmlns:slt="http://api.service.softlayer.com/soap/v3/SLTypes/">
210
+ # <domains>
211
+ # <resourceRecords />
212
+ # </domains>
213
+ # <openTickets>
214
+ # <assignedUser />
215
+ # <attachedHardware />
216
+ # <updates />
217
+ # </openTickets>
218
+ # <userCount />
219
+ # </mask>
220
+ # </SoftLayer_AccountObjectMask>
221
+ #
222
+ # { 'domains' => { 'resourceRecords' => nil }, 'openTicket' => { 'assignedUser' => nil, 'attachedHardware' => nil, 'updates' => nil },
223
+ # userCount => nil }
224
+ # Changing this resets the cached object used by #[]
225
+ def objectMask=(mask)
226
+ if mask.class == ObjectMaskHeader
227
+ @objectMask = mask
228
+ else
229
+ @objectMask = ObjectMaskHeader.new("#{self.soapClass}ObjectMask", mask)
230
+ end
231
+ @slapiObject = nil
232
+ end
233
+
234
+ def objectMask
235
+ return @objectMask
236
+ end
237
+
238
+
239
+ # Make a direct api call. Paramaters are a hash where the key is passed to ParamHeader as the tag, and the value
240
+ # is passed as the tag content, unless it's a magic paramater.
241
+ # Magic Paramaters:
242
+ # +initParam+:: Initialization paramater for this call (just the key). Otherwise @initParam is used.
243
+ #
244
+ # Aliased to #method_missing.
245
+ def slapiCall(method, args = { })
246
+ initParam = args[:initParam] unless args[:initParam].nil?
247
+ args.delete(:initParam) unless args[:initParam].nil?
248
+ initParam = @initParam if initParam.nil?
249
+
250
+ @slapi.headerhandler << ParamHeader.new('authenticate', {'username' => @apiUser, 'apiKey' => @apiKey})
251
+ unless args.nil?
252
+ args.each do |k,v|
253
+ @slapi.headerhandler << ParamHeader.new(k.to_s,v)
254
+ end
255
+ end
256
+ @slapi.headerhandler << ParamHeader.new("#{self.soapClass}InitParameters", { 'id' => initParam})
257
+ @slapi.headerhandler << @objectMask unless @objectMask.nil?
258
+ return @slapi.call(method.to_s)
259
+ end
260
+
261
+ # Alias the above call method to #method_missing.
262
+ alias_method :method_missing, :slapiCall
263
+
264
+ # Enable (or disable) debug. (paramater is the IO handler to write to)
265
+ def debug=(dev)
266
+ @slapi.wiredump_dev=(dev)
267
+ end
268
+
269
+ # Get the WSDL, parse it, and save it to a Class level hash.
270
+ # Returns false of we couldn't parse the WSDL.
271
+ def self.cacheWSDL
272
+ return unless @@wsdl[self.soapClass].nil?
273
+
274
+ begin
275
+ @@wsdl[self.soapClass] = SOAP::WSDLDriverFactory.new(self.wsdlUrl)
276
+ return true
277
+ rescue => e
278
+ return false
279
+ end
280
+ end
281
+
282
+ # Return this Class's WSDL.
283
+ def self.wsdl
284
+ return @@wsdl[self.soapClass]
285
+ end
286
+
287
+ # Return this Class's WSDL URL.
288
+ def self.wsdlUrl
289
+ return URI.parse("#{WSDLBASE}/#{self.soapClass}#{WSDLPARAM}")
290
+ end
291
+
292
+ # Returns this Class's SOAP Class.
293
+ def self.soapClass
294
+ self.name.to_s.gsub(/::/, '_')
295
+ end
296
+
297
+ end
298
+ end
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+ # billingreport
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
+ # Retrieves the current Account's BillingItems using an objectMask and outputs a report of the
32
+ # current (not-canceled) items.
33
+ #= ToDo
34
+ #
35
+
36
+ require 'rubygems' rescue LoadError
37
+ require 'pp'
38
+ require 'softlayer'
39
+
40
+ AUTH_USER = ARGV[0]
41
+ AUTH_KEY = ARGV[2]
42
+ ACCT_ID = ARGV[1]
43
+
44
+ SLAPICLASSES = [ 'SoftLayer::Account' ]
45
+ SoftLayer::declareClasses(:ruby => SLAPICLASSES)
46
+
47
+ account = SoftLayer::Account.new(:user => AUTH_USER, :key => AUTH_KEY, :initParam => ACCT_ID)
48
+ account.objectMask={ 'allBillingItems' => nil }
49
+
50
+ rtotal = rtax = 0
51
+ ottotal = ottax = 0
52
+ lftotal = lftax = 0
53
+ sftotal = sftax = 0
54
+ account['allBillingItems'].each do |b|
55
+ if b['cancellationDate'].nil?
56
+ rtotal = rtotal + rf = b['recurringFee'].to_f
57
+ ottotal = ottotal + ot = b['oneTimeFee'].to_f
58
+ lftotal = lftotal + lf = b['laborFee'].to_f
59
+ sftotal = sftotal + sf = b['setupFee'].to_f
60
+ rt = rf * rtr = b['recurringFeeTaxRate'].to_f
61
+ ott = ot * otr = b['oneTimeFeeTaxRate'].to_f
62
+ lft = lf * lfr = b['laborFeeTaxRate'].to_f
63
+ sft = sf * sfr = b['setupFeeTaxRate'].to_f
64
+ rtax = rtax + rt
65
+ ottax = ottax + ott
66
+ lftax = lftax + lft
67
+ sftax = sftax + sft
68
+
69
+ puts "Item Id #{b['id']}"
70
+ puts "Description #{b['description']}"
71
+ puts "Recurring Fee #{"$%.2f" % rf}"
72
+ puts "Recurring Tax #{"$%.2f" % rt} (#{rtr * 100}%)"
73
+ puts "One Time Fee #{"$%.2f" % ot}" unless ot == 0
74
+ puts "One Time Tax #{"$%.2f" % ott} (#{otr * 100}%)" unless ot == 0
75
+ puts "Labor Fee #{"$%.2f" % lf}" unless lf == 0
76
+ puts "Labor Fee Tax #{"$%.2f" % lft} (#{lfr * 100}%)" unless lf == 0
77
+ puts "Setup Fee #{"$%.2f" % sf}" unless sf == 0
78
+ puts "Setup Fee Tax #{"$%.2f" % sft} (#{sfr * 100}%)" unless sf == 0
79
+ puts "Recurring Months #{b['recurringMonths']}"
80
+ puts "Last Bill Date #{b['lastBillDate'].strftime("%b %d, %Y %X")}"
81
+ puts "Next Bill Date #{b['nextBillDate'].strftime("%b %d, %Y %X")}"
82
+ puts "Modify Date #{b['modifyDate'].strftime("%b %d, %Y %X")}"
83
+ puts "Create Date #{b['createDate'].strftime("%b %d, %Y %X")}"
84
+ puts "Associated Billing Item Id #{b['associatedBillingItemId']}" unless b['associatedBillingItemId'].nil?
85
+ puts "=================================="
86
+ # pp b
87
+ end
88
+ end
89
+ puts ""
90
+ puts "Totals:"
91
+ puts "\tRecurring: #{"$%.2f" % rtotal} Tax: #{"$%.2f" % rtax} == #{"$%.2f" % (rtotal + rtax)}"
92
+ puts "\tOne Time : #{"$%.2f" % ottotal} Tax: #{"$%.2f" % ottax} == #{"$%.2f" % (ottotal + ottax)}" unless ottotal == 0
93
+ puts "\tLabor : #{"$%.2f" % lftotal} Tax: #{"$%.2f" % lftax} == #{"$%.2f" % (lftotal + lftax)}" unless lftotal == 0
94
+ puts "\tSetup : #{"$%.2f" % sftotal} Tax: #{"$%.2f" % sftax} == #{"$%.2f" % (sftotal + sftax)}" unless sftotal == 0
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env ruby
2
+ # nascapacity
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
+ # Prints a list of all StorageLater objects and their capacity.
32
+ #= ToDo
33
+ #
34
+
35
+ require 'rubygems' rescue LoadError
36
+ require 'pp'
37
+ require 'softlayer'
38
+
39
+ require 'soap/header/simplehandler'
40
+ require 'soap/wsdlDriver'
41
+
42
+ AUTH_USER = ARGV[0]
43
+ AUTH_KEY = ARGV[2]
44
+ ACCT_ID = ARGV[1]
45
+
46
+ SLAPICLASSES = [ 'SoftLayer::Account', 'SoftLayer::Network::Storage' ]
47
+ SoftLayer::declareClasses(:ruby => SLAPICLASSES)
48
+
49
+ account = SoftLayer::Account.new(:user => AUTH_USER, :key => AUTH_KEY, :initParam => ACCT_ID)
50
+ account.objectMask={ 'networkStorage' => { 'serviceResource' => nil } }
51
+
52
+ nas = account['networkStorage'].each do |nas|
53
+ # pp nas
54
+ type = nas['nasType']
55
+ puts "//#{nas['serviceResource']['backendIpAddress']}/#{nas['username']} -- #{nas['capacityGb']}G" if (type == 'NAS' || type == 'LOCKBOX')
56
+ puts "#{nas['username']}@#{nas['serviceResource']['backendIpAddress']} -- #{nas['capacityGb']}G" if (type == 'EVAULT' || type == 'ISCSI')
57
+ puts "CloudLayer: #{nas['username']} -- #{nas['capacityGb']}G" if (type == 'HUB')
58
+ end
59
+
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env ruby
2
+ # objectmask
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 Object Masks.
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
+ puts "Before: "
47
+ account = SoftLayer::Account.new(:user => AUTH_USER, :key => AUTH_KEY, :initParam => ACCT_ID)
48
+ account.objectMask={ 'allRecurringTopLevelBillingItems' => nil }
49
+ pp account['allRecurringTopLevelBillingItems']
50
+ puts "=================================="
51
+
52
+ puts ""
53
+ puts "After: "
54
+ account.objectMask['allRecurringTopLevelBillingItems'] = { 'associatedChildren' => nil }
55
+ # account.debug=STDOUT
56
+ pp account['allRecurringTopLevelBillingItems']
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jamesn-softlayer-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0.0
5
+ platform: ruby
6
+ authors:
7
+ - James Nuckolls
8
+ autorequire: softlayer
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-11 22:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: soap4r
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.5.0
24
+ version:
25
+ description:
26
+ email: jamesn@what.net
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README
33
+ - LICENSE
34
+ files:
35
+ - lib/softlayer.rb
36
+ - sample/nascapacity.rb
37
+ - sample/billingreport.rb
38
+ - sample/objectmask.rb
39
+ - README
40
+ - LICENSE
41
+ has_rdoc: true
42
+ homepage: http://github.com/jamesn/softlayer-ruby
43
+ post_install_message:
44
+ rdoc_options: []
45
+
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ requirements: []
61
+
62
+ rubyforge_project:
63
+ rubygems_version: 1.2.0
64
+ signing_key:
65
+ specification_version: 2
66
+ summary: A module and class factory for SoftLayer's customer portal API
67
+ test_files: []
68
+