softlayer_api 3.2.1 → 3.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 04b38f09f536b94748efab61b6883ff8154e6f37
4
- data.tar.gz: a85b688249dd6b238e31721a38d079f713ec305a
3
+ metadata.gz: 7f92616fa3f3d7892a380e75a600df3c4b0e6d1f
4
+ data.tar.gz: cf11685a6754bc2ac4b1386008ba3953b6bda16f
5
5
  SHA512:
6
- metadata.gz: 37c5e2e9943594b49abcbf5b83f44f0cd911d07fa25ce2d875743ac16be33f5ca505b59fd7b394cc9d7f1d6571c04c14d00469cab2f657aa118564dfb5e77973
7
- data.tar.gz: aa5cde5e62543b5be95987eaddec42ddd16da4f75ad1c3fa8c2cffe75ea1d87fee3e6f2cf99ebaed865a595119c06e833da7f75ad9c413e8c7c1b016166e9501
6
+ metadata.gz: 70eb92b41aef54b2aa555bff34e071945110d2cd2a0f703f2662fa0546b0ed22cd0e66ae74ece48950e5d843bf4971647d6fb8fc7803174e830ede67644077db
7
+ data.tar.gz: 5a336a63bdd8504e858e32cc8f6a2512abdc483b82a0c9f580f9820c0978b39f8c8fe73371075ff4ae534a60fc067d531dec6b21fefb5115382bf6edee2f67aa
@@ -1,5 +1,9 @@
1
+ *3.2.2*
2
+ * Fix NoMethodError when getting the datacenters out of an ImageTemplate and the value was nil.
3
+ * Fix NoMethodError when getting public and private images with a result limit of 1.
4
+
1
5
  *3.2.1*
2
- Fix a crashing issue where a Bare Metal server order tried to retrieve the hardware ordered before it has been provisioned.
6
+ * Fix a crashing issue where a Bare Metal server order tried to retrieve the hardware ordered before it has been provisioned.
3
7
 
4
8
  *3.2*
5
9
  * Add password-based authentication with `SoftLayer::Client.with_password(username: '...', password: '...', ...)`.
@@ -37,24 +37,26 @@ require 'pp'
37
37
  # a server.
38
38
  def tl_dr_version
39
39
  client = SoftLayer::Client.new(
40
- # :username => "joecustomer" # enter your username here
40
+ # :username => "joecustomer", # enter your username here
41
41
  # :api_key => "feeddeadbeefbadf00d..." # enter your api key here
42
42
  )
43
43
 
44
44
  # Select a package
45
- quad_intel_package = SoftLayer::ProductPackage.package_with_id(client, 32)
45
+ product_package = SoftLayer::ProductPackage.package_with_id(251, client)
46
46
 
47
47
  # Find required Categories and fill config_options with defaults
48
48
  config_options = {}
49
- required_categories = quad_intel_package.configuration.select { |category| category.required? }
49
+ required_categories = product_package.configuration.select { |category| category.required? }
50
50
  required_categories.each { |required_category| config_options[required_category.categoryCode] = required_category.default_option }
51
51
 
52
- # Provide a value for missing config categories
53
- config_options['server'] = 1417 # price id of Quad Processor Quad Core Intel 7420 - 2.13GHz (Dunnington) - 4 x 6MB / 8MB cache
52
+ # Provide a value for missing config categories as they don't have defaults
53
+ config_options['server'] = 50691 # Dual Intel Xeon E5-2620 v3 (12 Cores, 2.40 GHz)
54
+ config_options['ram'] = 49427 # 64 GB RAM
55
+ config_options['disk0'] = 49811 # 1.00 TB SATA
54
56
 
55
57
  # With all the config options in place we can now construct the product order.
56
- server_order = SoftLayer::BareMetalServerOrder_Package.new(quad_intel_package, client)
57
- server_order.location = 'sng01'
58
+ server_order = SoftLayer::BareMetalServerOrder_Package.new(product_package, client)
59
+ server_order.datacenter = SoftLayer::Datacenter.datacenter_named 'sng01', client
58
60
  server_order.hostname = 'sample'
59
61
  server_order.domain = 'softlayerapi.org'
60
62
  server_order.configuration_options = config_options
@@ -69,7 +71,7 @@ end
69
71
 
70
72
  begin
71
73
  client = SoftLayer::Client.new(
72
- # :username => "joecustomer" # enter your username here
74
+ # :username => "joecustomer", # enter your username here
73
75
  # :api_key => "feeddeadbeefbadf00d..." # enter your api key here
74
76
  )
75
77
 
@@ -80,14 +82,14 @@ begin
80
82
  packages.each { |package| puts "#{package.id}\t#{package.name}"}
81
83
 
82
84
  # For this example, we'll assume that we've selected the a package
83
- # with an id of 32 representing a "Quad Processor, Quad Core Intel"
84
- quad_intel_package = SoftLayer::ProductPackage.package_with_id(32, client)
85
+ # with an id of 251 representing a "Dual E5-2600 v3 Series (12 Drives)"
86
+ product_package = SoftLayer::ProductPackage.package_with_id(251, client)
85
87
 
86
88
  # Now we need to now what ProductItemCategories are required to
87
89
  # configure a server in that package. This code prints out a table
88
90
  # of the required category codes with a description of each
89
- puts "\nRequired Categories for '#{quad_intel_package.name}':"
90
- required_categories = quad_intel_package.configuration.select { |category| category.required? }
91
+ puts "\nRequired Categories for '#{product_package.name}':"
92
+ required_categories = product_package.configuration.select { |category| category.required? }
91
93
  max_code_length = required_categories.inject(0) { |max_code_length, category| [category.categoryCode.length, max_code_length].max }
92
94
  printf "%#{max_code_length}s\tCategory Description\n", "Category Code"
93
95
  printf "%#{max_code_length}s\t--------------------\n", "-------------"
@@ -96,7 +98,7 @@ begin
96
98
  # We will need to provide values for each of the required category codes in our
97
99
  # configuration_options. Let's see what configuration options are available for
98
100
  # just one of the categories... Say 'os'
99
- os_category = quad_intel_package.category('os')
101
+ os_category = product_package.category('os')
100
102
  config_options = os_category.configuration_options
101
103
  puts "\nConfiguration options in the 'os' category:"
102
104
  config_options.each { |option| printf "%5s\t#{option.description}\n", option.price_id }
@@ -119,20 +121,25 @@ begin
119
121
  # Regardless of the default values... we know we want the os selection we discovered above:
120
122
  config_options['os'] = os_config_option
121
123
 
124
+ # Provide a value for missing config categories as they don't have defaults
125
+ config_options['server'] = 50691 # Dual Intel Xeon E5-2620 v3 (12 Cores, 2.40 GHz)
126
+ config_options['ram'] = 49427 # 64 GB RAM
127
+ config_options['disk0'] = 49811 # 1.00 TB SATA
128
+
122
129
  # And we can customize the default config by providing selections for any config categories
123
130
  # we are interested in
124
131
  config_options.merge! ({
125
- 'server' => 1417, # price id of Quad Processor Quad Core Intel 7420 - 2.13GHz (Dunnington) - 4 x 6MB / 8MB cache
126
- 'port_speed' => 274 # 1 Gbps Public & Private Network Uplinks
132
+ 'port_speed' => 37220, # 1 Gbps Public & Private Network Uplinks (Unbonded)
133
+ 'bandwidth' => 50233 # 1000 GB Bandwidth
127
134
  })
128
135
 
129
136
  # We have a configuration for the server, we also need a location for the new server.
130
137
  # The package can give us a list of locations. Let's print out that list
131
- puts "\nData Centers for '#{quad_intel_package.name}':"
132
- quad_intel_package.datacenter_options.each { |datacenter| puts "\t#{datacenter.name}"}
138
+ puts "\nData Centers for '#{product_package.name}':"
139
+ product_package.datacenter_options.each { |datacenter| puts "\t#{datacenter.name}"}
133
140
 
134
141
  # With all the config options in place we can now construct the product order.
135
- server_order = SoftLayer::BareMetalServerOrder_Package.new(quad_intel_package, client)
142
+ server_order = SoftLayer::BareMetalServerOrder_Package.new(product_package, client)
136
143
  server_order.datacenter = SoftLayer::Datacenter.datacenter_named 'sng01', client
137
144
  server_order.hostname = 'sample'
138
145
  server_order.domain = 'softlayerapi.org'
@@ -151,4 +158,3 @@ begin
151
158
  rescue Exception => exception
152
159
  $stderr.puts "An exception occurred while trying to complete the SoftLayer API calls #{exception}"
153
160
  end
154
-
@@ -78,7 +78,9 @@ module SoftLayer
78
78
  ##
79
79
  # Returns the an array containing the datacenters where this image is available.
80
80
  def datacenters
81
- self['datacenters'].collect{ |datacenter_data| SoftLayer::Datacenter.datacenter_named(datacenter_data['name'])}
81
+ Array(self['datacenters']).collect do |datacenter_data|
82
+ SoftLayer::Datacenter.datacenter_named(datacenter_data['name'])
83
+ end
82
84
  end
83
85
 
84
86
  ##
@@ -253,7 +255,7 @@ module SoftLayer
253
255
  account_service = account_service.result_limit(options_hash[:result_limit][:offset], options_hash[:result_limit][:limit])
254
256
  end
255
257
 
256
- templates_data = account_service.getPrivateBlockDeviceTemplateGroups
258
+ templates_data = Array(account_service.getPrivateBlockDeviceTemplateGroups)
257
259
  templates_data.collect { |template_data| ImageTemplate.new(softlayer_client, template_data) }
258
260
  end
259
261
 
@@ -312,7 +314,9 @@ module SoftLayer
312
314
  template_service = template_service.result_limit(options_hash[:result_limit][:offset], options_hash[:result_limit][:limit])
313
315
  end
314
316
 
315
- templates_data = template_service.getPublicImages
317
+ # Ensure this is an array with Array(). SL won't return array if the result set is of just one
318
+ # (like when the user specifies a limit of 1)
319
+ templates_data = Array(template_service.getPublicImages)
316
320
  templates_data.collect { |template_data| ImageTemplate.new(softlayer_client, template_data) }
317
321
  end
318
322
 
@@ -45,7 +45,7 @@ module SoftLayer
45
45
  ##
46
46
  # :attr_reader: available_locations
47
47
  # The list of locations where this product package is available.
48
- sl_attr :available_locations, 'availableLocations'
48
+ sl_attr :available_locations, 'regions'
49
49
 
50
50
  ##
51
51
  # Retrieve the set of product categories needed to make an order for this product package.
@@ -230,7 +230,7 @@ module SoftLayer
230
230
  "groups.prices.requiredCoreCount" ].join(",") + "]"
231
231
 
232
232
  def self.default_object_mask(root)
233
- "#{root}[id,name,description,availableLocations.location]"
233
+ "#{root}[id,name,description,regions]"
234
234
  end
235
235
  end
236
236
  end # SoftLayer
@@ -14,9 +14,11 @@ ensure
14
14
  $VERBOSE = old_verbose
15
15
  end
16
16
 
17
- # enable parsing of "nil" values in structures returned from the API
18
17
  with_warnings(nil) {
18
+ # enable parsing of "nil" values in structures returned from the API
19
19
  XMLRPC::Config.const_set('ENABLE_NIL_PARSER', true)
20
+ # enable serialization of "nil" values in structures sent to the API
21
+ XMLRPC::Config.const_set('ENABLE_NIL_CREATE', true)
20
22
  }
21
23
 
22
24
  # The XML-RPC spec calls for the "faultCode" in faults to be an integer
@@ -188,6 +188,35 @@ module SoftLayer
188
188
  softlayer_client[:Virtual_Disk_Image].object_with_id(self.id)
189
189
  end
190
190
 
191
+ ##
192
+ # Retrieve the virtual disk image with the given image ID from the API
193
+ #
194
+ # The options parameter should contain:
195
+ #
196
+ # <b>+:client+</b> - The client used to connect to the API
197
+ #
198
+ # If no client is given, then the routine will try to use Client.default_client
199
+ # If no client can be found the routine will raise an error.
200
+ #
201
+ # The options may include the following keys
202
+ # * <b>+:object_mask+</b> (string) - A object mask of properties, in addition to the default properties, that you wish to retrieve for the image
203
+ #
204
+ def self.image_with_id(image_id, options = {})
205
+ softlayer_client = options[:client] || Client.default_client
206
+ raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !softlayer_client
207
+
208
+ vdi_service = softlayer_client[:Virtual_Disk_Image]
209
+ vdi_service = vdi_service.object_mask(default_object_mask.to_sl_object_mask)
210
+
211
+ if options.has_key?(:object_mask)
212
+ vdi_service = vdi_service.object_mask(options[:object_mask])
213
+ end
214
+
215
+ image_data = vdi_service.object_with_id(image_id).getObject()
216
+
217
+ return VirtualDiskImage.new(softlayer_client, image_data)
218
+ end
219
+
191
220
  protected
192
221
 
193
222
  def self.default_object_mask
@@ -12,7 +12,7 @@ require 'rubygems'
12
12
  module SoftLayer
13
13
  # The version number (including major, minor, and bugfix numbers)
14
14
  # This should change in accordance with the concept of Semantic Versioning
15
- VERSION = "3.2.1" # version history in the CHANGELOG.textile file at the root of the source
15
+ VERSION = "3.2.2" # version history in the CHANGELOG.textile file at the root of the source
16
16
 
17
17
  # The base URL of the SoftLayer API available to the public internet.
18
18
  API_PUBLIC_ENDPOINT = 'https://api.softlayer.com/xmlrpc/v3/'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: softlayer_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.1
4
+ version: 3.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - SoftLayer Development Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-19 00:00:00.000000000 Z
11
+ date: 2017-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: configparser
@@ -86,20 +86,34 @@ dependencies:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: 1.8.1
89
+ - !ruby/object:Gem::Dependency
90
+ name: mime-types
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '='
94
+ - !ruby/object:Gem::Version
95
+ version: 2.99.3
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '='
101
+ - !ruby/object:Gem::Version
102
+ version: 2.99.3
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: coveralls
91
105
  requirement: !ruby/object:Gem::Requirement
92
106
  requirements:
93
- - - ">="
107
+ - - '='
94
108
  - !ruby/object:Gem::Version
95
- version: '0'
109
+ version: 0.7.2
96
110
  type: :development
97
111
  prerelease: false
98
112
  version_requirements: !ruby/object:Gem::Requirement
99
113
  requirements:
100
- - - ">="
114
+ - - '='
101
115
  - !ruby/object:Gem::Version
102
- version: '0'
116
+ version: 0.7.2
103
117
  description: The softlayer_api gem offers a convenient mechanism for invoking the
104
118
  services of the SoftLayer API from Ruby.
105
119
  email: sldn@softlayer.com
@@ -183,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
197
  version: '0'
184
198
  requirements: []
185
199
  rubyforge_project:
186
- rubygems_version: 2.4.8
200
+ rubygems_version: 2.6.12
187
201
  signing_key:
188
202
  specification_version: 4
189
203
  summary: Library for accessing the SoftLayer API