fog-softlayer 1.0.3 → 1.1.0

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: 4653fea3f18009d860e8472c3c0a30a94888b628
4
- data.tar.gz: 91e26288c27c6990a36b2a435def63e05c13a63a
3
+ metadata.gz: c8e974e2bd69d7a85f5f75c30c58aab63c5feb4a
4
+ data.tar.gz: 62a6c43e1da9592ba070e14269429a49e44c1afb
5
5
  SHA512:
6
- metadata.gz: 2c6e003eb7e9bd6452f02f8d7ceccdb5b81e6e6b30d2239b67a203b2f2105072d4c4ed25adc957e47362d6e324ad2e8b182e9571e04a4dd629f56ec5110f1480
7
- data.tar.gz: 06d9e733a5f5b60041b6c7ecb33abd1fb8441261151466ff26ab50e1c0444999fe3043d118f465968c4b9e4161df77b47590a6d25c9f9e82cb9c536a43a7c5ee
6
+ metadata.gz: 567acc968851f508de336f89b888cdee138d061a365bec496d8f3b452321c0d0eaa9c9dfdd9d32c359fff754981a034bc0020d3e1aa5a06c8fb21b6571329919
7
+ data.tar.gz: ef12acaa5e16d13049045aa31b59371542bdbfcabbd68694251b763fb0f46dbc17a59810f06d2c1add38db8b074d8d434c2b2a20b97323fd596be3fd8ff36a17
data/.editorconfig ADDED
@@ -0,0 +1,15 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+
9
+ [*.{rb,gemspec}]
10
+ indent_size = 2
11
+ indent_style = space
12
+
13
+ [Gemfile]
14
+ indent_size = 2
15
+ indent_style = space
data/.travis.yml CHANGED
@@ -24,4 +24,5 @@ notifications:
24
24
 
25
25
  before_install:
26
26
  - gem update --system # todo: workaround for https://github.com/rubygems/rubygems/pull/763
27
+ - gem update bundler
27
28
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # v1.1.0
2
+ __features__
3
+
4
+ * Add support for pre-configured bare metal with fast provisioning times.
5
+
1
6
  # v0.4.7
2
7
 
3
8
  __features__
data/examples/compute.md CHANGED
@@ -150,6 +150,24 @@ If you are unfamiliar with fog, we recommend reading our [getting started](getti
150
150
  @sl.servers.create(opts)
151
151
  new_server.id # => 1338
152
152
  ```
153
+
154
+ 1. Provision a *preset* Bare Metal instance (instant provisioning).
155
+ 1. First get a list of available preset configuration keys:
156
+
157
+ ```ruby
158
+
159
+ ```
160
+
161
+ ```ruby
162
+ opts = {
163
+ :domain => 'example.com',
164
+ :name => 'my-test',
165
+ :flavor_id => 'm1.small',
166
+ :fixed_configuration_preset => '50_128GB_4X800GBSSD_RAID10',
167
+ :os_code => 'UBUNTU_LATEST',
168
+ :datacenter => 'wdc01'
169
+ }
170
+ ```
153
171
 
154
172
  1. Provision a new VM without flavor.
155
173
 
data/examples/storage.md CHANGED
@@ -10,6 +10,23 @@ If you are unfamiliar with fog, we recommend reading our [getting started](getti
10
10
  @sl = Fog::Storage[:softlayer]
11
11
  ```
12
12
 
13
+ #### Create a connection within a Bluemix Application to Bluemix v1 Object Storage
14
+
15
+ ```ruby
16
+ require 'fog/softlayer'
17
+ objstor_service = JSON.parse(ENV['VCAP_SERVICES'])["objectstorage"].first["credentials"]
18
+ bluemix_app_name = JSON.parse(ENV["VCAP_APPLICATION"])["name"]
19
+
20
+ @sl = Fog::Storage.new({
21
+ :provider => 'softlayer',
22
+ :softlayer_username => objstor_service['username'].to_s,
23
+ :softlayer_api_key => objstor_service['password'].to_s,
24
+ :softlayer_storage_account => bluemix_app_name,
25
+ :softlayer_bluemix_objstor_auth_url => objstor_service['auth_uri'].to_s,
26
+ :softlayer_cluster => 'dal05'
27
+ })
28
+ ```
29
+
13
30
  #### Use the Models
14
31
  1. List directories/containers.
15
32
 
@@ -48,6 +48,7 @@ module Fog
48
48
  request :describe_tags
49
49
  request :generate_bare_metal_order_template
50
50
  request :generate_virtual_guest_order_template
51
+ request :get_available_preset_codes
51
52
  request :get_bare_metal_active_tickets
52
53
  request :get_bare_metal_create_options
53
54
  request :get_bare_metal_server
@@ -29,6 +29,7 @@ module Fog
29
29
  attribute :ephemeral_storage, :aliases => 'localDiskFlag'
30
30
  attribute :key_pairs, :aliases => 'sshKeys'
31
31
  attribute :network_components
32
+ attribute :fixed_configuration_preset, :aliases => 'fixedConfigurationPreset'
32
33
 
33
34
  # Times
34
35
  attribute :created_at, :aliases => ['createDate', 'provisionDate'], :type => :time
@@ -121,6 +122,7 @@ module Fog
121
122
 
122
123
  def pre_save
123
124
  extract_flavor
125
+ self.bare_metal = true if attributes[:fixed_configuration_preset] and not bare_metal?
124
126
  validate_attributes
125
127
  if self.vlan
126
128
  attributes[:vlan] = { :networkVlan => { :id => self.vlan.id } }
@@ -139,6 +141,10 @@ module Fog
139
141
  end
140
142
  end
141
143
 
144
+ if attributes[:fixed_configuration_preset].is_a? String
145
+ attributes[:fixedConfigurationPreset] = {:keyName => attributes.delete(:fixed_configuration_preset)}
146
+ end
147
+
142
148
  remap_attributes(attributes, attributes_mapping)
143
149
  clean_attributes
144
150
  end
@@ -343,7 +349,7 @@ module Fog
343
349
  copy = self.dup
344
350
  copy.pre_save
345
351
 
346
- data = if bare_metal?
352
+ data = if copy.bare_metal?
347
353
  service.create_bare_metal_server(copy.attributes).body
348
354
  else
349
355
  service.create_vm(copy.attributes).body.first
@@ -384,10 +390,49 @@ module Fog
384
390
  def generate_order_template
385
391
  copy = self.dup
386
392
  copy.pre_save
387
- return service.generate_bare_metal_order_template(copy.attributes).body if bare_metal?
393
+ return service.generate_bare_metal_order_template(copy.attributes).body if copy.bare_metal?
388
394
  service.generate_virtual_guest_order_template(copy.attributes).body
389
395
  end
390
396
 
397
+ def wait_for_id(timeout=14400, delay=30)
398
+ # Cannot use self.wait_for because it calls reload which requires
399
+ # self.id which is not initially available for bare metal.
400
+ filterStr = Fog::JSON.encode({
401
+ "hardware" => {
402
+ "hostname" => {
403
+ "operation" => self.name,
404
+ },
405
+ "domain" => {
406
+ "operation" => self.domain,
407
+ },
408
+ "globalIdentifier" => {
409
+ "operation" => self.uid,
410
+ },
411
+ }
412
+ })
413
+
414
+ Fog.wait_for(timeout, delay) do
415
+ res = service.request(:account, 'getHardware', :query => {
416
+ :objectMask => 'mask[id,fullyQualifiedDomainName,provisionDate,hardwareStatus,lastTransaction[elapsedSeconds,transactionStatus[friendlyName]],operatingSystem[id,passwords[password,username]]]',
417
+ :objectFilter => filterStr,
418
+ })
419
+
420
+ server = res.body.first
421
+
422
+ yield server if block_given?
423
+
424
+ if server and server["provisionDate"]
425
+ attributes[:id] = server['id']
426
+ true
427
+ else
428
+ false
429
+ end
430
+ end
431
+
432
+ self.reload
433
+ true
434
+ end
435
+
391
436
  private
392
437
 
393
438
  def network_connection
@@ -455,7 +500,8 @@ module Fog
455
500
  :cpu => :processorCoreAmount,
456
501
  :ram => :memoryCapacity,
457
502
  :disk => :hardDrives,
458
- :bare_metal => :bareMetalInstanceFlag
503
+ :bare_metal => :bareMetalInstanceFlag,
504
+ :fixed_configuration_preset => :fixedConfigurationPreset,
459
505
  }
460
506
  else
461
507
  {
@@ -470,12 +516,13 @@ module Fog
470
516
  end
471
517
 
472
518
  def bare_metal=(set)
519
+ return @bare_metal if set == @bare_metal
473
520
  raise Exception, "Bare metal flag has already been set" unless @bare_metal.nil?
474
521
  @bare_metal = case set
475
522
  when false, 'false', 0, nil, ''
476
- false
523
+ attributes[:bare_metal] = false
477
524
  else
478
- true
525
+ attributes[:bare_metal] = true
479
526
  end
480
527
  end
481
528
 
@@ -485,6 +532,7 @@ module Fog
485
532
  attributes.delete(:bare_metal)
486
533
  attributes.delete(:flavor_id)
487
534
  attributes.delete(:ephemeral_storage)
535
+ attributes.delete(:tags) if bare_metal?
488
536
  end
489
537
 
490
538
  ##
@@ -505,9 +553,14 @@ module Fog
505
553
  end
506
554
 
507
555
  def validate_attributes
508
- requires :name, :domain, :cpu, :ram, :datacenter
509
- requires_one :os_code, :image_id
510
- requires_one :disk, :image_id
556
+ requires :name, :domain, :datacenter
557
+ if attributes[:fixed_configuration_preset]
558
+ requires :os_code
559
+ else
560
+ requires :cpu, :ram
561
+ requires_one :os_code, :image_id
562
+ requires_one :disk, :image_id
563
+ end
511
564
  bare_metal? and image_id and raise ArgumentError, "Bare Metal Cloud does not support booting from Image"
512
565
  end
513
566
 
@@ -78,6 +78,10 @@ module Fog
78
78
  def get_vm_create_options
79
79
  service.get_virtual_guest_create_options.body
80
80
  end
81
+
82
+ def get_available_preset_codes
83
+ service.get_available_preset_codes.body['fixedConfigurationPresets'].map { |item| { :desc => item['preset']['description'], :key => item['preset']['keyName'] } }
84
+ end
81
85
  end
82
86
  end
83
87
  end
@@ -46,7 +46,10 @@ module Fog
46
46
  alias_method :public?, :public
47
47
 
48
48
  def public_url
49
- raise NotImplementedError
49
+ requires :key
50
+ cluster = service.cluster.downcase
51
+ key = Fog::Softlayer.escape(self.key)
52
+ "http://17532.http.#{cluster}.cdn.softlayer.net/#{key}"
50
53
  end
51
54
 
52
55
  def save
@@ -170,7 +170,7 @@ module Fog
170
170
  # @return [Integer]
171
171
  def global_ipv4_price_code
172
172
  request(:product_package, '0/get_item_prices', :query => 'objectMask=mask[id,item.description,categories.id]').body.map do |item|
173
- item['id'] if item['categories'][0]['id'] == global_ipv4_cat_code
173
+ item['id'] if item.has_key?('categories') && !item['categories'][0].nil? && item['categories'][0]['id'] == global_ipv4_cat_code
174
174
  end.compact.first
175
175
  end
176
176
 
@@ -0,0 +1,40 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2015.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+
8
+ module Fog
9
+ module Compute
10
+ class Softlayer
11
+ class Mock
12
+ def get_available_preset_codes
13
+ {
14
+ "fixedConfigurationPresets" =>
15
+ [{"preset"=>{"description"=>"Single Xeon 1270, 8GB Ram, 2x1TB SATA disks, Non-RAID", "keyName"=>"S1270_8GB_2X1TBSATA_NORAID", "totalMinimumHourlyFee"=>".368", "totalMinimumRecurringFee"=>"244"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"S1270_8GB_2X1TBSATA_NORAID"}}},
16
+ {"preset"=>{"description"=>"Single Xeon 1270, 32GB Ram, 1x1TB SATA disks, Non-RAID", "keyName"=>"S1270_32GB_1X1TBSATA_NORAID", "totalMinimumHourlyFee"=>".595", "totalMinimumRecurringFee"=>"395"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"S1270_32GB_1X1TBSATA_NORAID"}}},
17
+ {"preset"=>{"description"=>"Dual Xeon 2620, 32GB Ram, 4x1TB SATA disks, Non-RAID", "keyName"=>"D2620_32GB_4X1TBSATA_NORAID", "totalMinimumHourlyFee"=>".786", "totalMinimumRecurringFee"=>"522"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2620_32GB_4X1TBSATA_NORAID"}}},
18
+ {"preset"=>{"description"=>"Dual Xeon 2620, 64GB Ram, 2x1TB SATA disks, Non-RAID", "keyName"=>"D2620_64GB_2X1TBSATA_NORAID", "totalMinimumHourlyFee"=>".978", "totalMinimumRecurringFee"=>"649"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2620_64GB_2X1TBSATA_NORAID"}}},
19
+ {"preset"=>{"description"=>"Single Xeon 1270, 32GB Ram, 2x960GB SSD disks, Non-RAID", "keyName"=>"S1270_32GB_2X400GBSSD_NORAID", "totalMinimumHourlyFee"=>"1.057", "totalMinimumRecurringFee"=>"701"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"S1270_32GB_2X400GBSSD_NORAID"}}},
20
+ {"preset"=>{"description"=>"Single Xeon 1270, 32GB Ram, 2x960GB SSD disks, Non-RAID", "keyName"=>"S1270_32GB_2X960GBSSD_NORAID", "totalMinimumHourlyFee"=>"1.057", "totalMinimumRecurringFee"=>"701"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"S1270_32GB_2X960GBSSD_NORAID"}}},
21
+ {"preset"=>{"description"=>"Dual Xeon 2650, 64GB Ram, 4x1TB SATA disks, Non-RAID", "keyName"=>"D2650_64GB_4X1TBSATA_NORAID", "totalMinimumHourlyFee"=>"1.148", "totalMinimumRecurringFee"=>"762"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2650_64GB_4X1TBSATA_NORAID"}}},
22
+ {"preset"=>{"description"=>"Dual Xeon 2650, 128GB Ram, 1x1TB SATA disks, Non-RAID", "keyName"=>"D2650_128GB_1X1TBSATA_NORAID", "totalMinimumHourlyFee"=>"1.399", "totalMinimumRecurringFee"=>"929"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2650_128GB_1X1TBSATA_NORAID"}}},
23
+ {"preset"=>{"description"=>"Dual Xeon 2620, 64GB Ram, 4x600GB SAS disks, RAID10", "keyName"=>"D2620_64GB_4X300GBSAS_RAID10", "totalMinimumHourlyFee"=>"1.603", "totalMinimumRecurringFee"=>"1068"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2620_64GB_4X300GBSAS_RAID10"}}},
24
+ {"preset"=>{"description"=>"Dual Xeon 2690, 128GB Ram, 2x600GB SAS disks, RAID1", "keyName"=>"D2690_128GB_2X600GBSAS_RAID1", "totalMinimumHourlyFee"=>"1.87", "totalMinimumRecurringFee"=>"1246"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2690_128GB_2X600GBSAS_RAID1"}}},
25
+ {"preset"=>{"description"=>"Dual Xeon 2690, 128GB Ram, 2x600GB SAS disks, RAID1", "keyName"=>"D2690_128GB_2X600GBSAS_RAID1_2", "totalMinimumHourlyFee"=>"1.893", "totalMinimumRecurringFee"=>"1261"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2690_128GB_2X600GBSAS_RAID1_2"}}},
26
+ {"preset"=>{"description"=>"Dual Xeon 2690, 64GB Ram, 4x960GB SSD disks, RAID10", "keyName"=>"D2690_64GB_4X960GBSSD_RAID10", "totalMinimumHourlyFee"=>"2.226", "totalMinimumRecurringFee"=>"1481"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2690_64GB_4X960GBSSD_RAID10"}}},
27
+ {"preset"=>{"description"=>"Dual Xeon 2690, 256GB Ram, 4x600GB SAS disks, RAID10", "keyName"=>"D2690_256GB_4X600GBSAS_RAID10_RAID_10", "totalMinimumHourlyFee"=>"2.605", "totalMinimumRecurringFee"=>"1733"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2690_256GB_4X600GBSAS_RAID10_RAID_10"}}},
28
+ {"preset"=>{"description"=>"Dual Xeon 2650, 128GB Ram, 4x800GB SSD disks, RAID10", "keyName"=>"D2650_128GB_4X800GBSSD_RAID10", "totalMinimumHourlyFee"=>"2.749", "totalMinimumRecurringFee"=>"1828"}, "template"=>{"fixedConfigurationPreset"=>{"keyName"=>"D2650_128GB_4X800GBSSD_RAID10"}}}]
29
+ }
30
+ end
31
+ end
32
+
33
+ class Real
34
+ def get_available_preset_codes
35
+ self.request(:hardware_server, :get_create_object_options, :http_method => :GET)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -5,11 +5,13 @@
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
7
 
8
+ require 'base64'
9
+
8
10
  module Fog
9
11
  module Storage
10
12
  class Softlayer < Fog::Service
11
13
  requires :softlayer_username, :softlayer_api_key, :softlayer_cluster
12
- recognizes :persistent, :softlayer_storage_account, :softlayer_temp_url_key
14
+ recognizes :persistent, :softlayer_storage_account, :softlayer_temp_url_key, :softlayer_bluemix_objstor_auth_url
13
15
 
14
16
  model_path 'fog/softlayer/models/storage'
15
17
  model :directory
@@ -87,7 +89,7 @@ module Fog
87
89
  class Real
88
90
  include Integrity
89
91
 
90
- attr_reader :auth_url
92
+ attr_reader :auth_url, :cluster
91
93
  attr_accessor :auth_token, :auth_expires
92
94
 
93
95
  def initialize(options={})
@@ -97,6 +99,7 @@ module Fog
97
99
  @cluster = options[:softlayer_cluster]
98
100
  @storage_account = options[:softlayer_storage_account] || default_storage_account(options[:softlayer_username], options[:softlayer_api_key])
99
101
  @connection_options = options[:connection_options] || {}
102
+ @bluemix_objstor_auth_url = options[:softlayer_bluemix_objstor_auth_url] || nil
100
103
  authenticate
101
104
  @persistent = options[:persistent] || false
102
105
  @connection = Fog::Core::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent, @connection_options)
@@ -104,7 +107,7 @@ module Fog
104
107
  end
105
108
 
106
109
  def auth_url
107
- "https://#{@cluster}.#{Fog::Softlayer::SL_STORAGE_AUTH_URL}"
110
+ @bluemix_objstor_auth_url.nil? ? "https://#{@cluster}.#{Fog::Softlayer::SL_STORAGE_AUTH_URL}" : "#{@bluemix_objstor_auth_url}/#{@storage_account}"
108
111
  end
109
112
 
110
113
  def reload
@@ -141,13 +144,23 @@ module Fog
141
144
  private
142
145
 
143
146
  def _auth_headers
144
- {
145
- :headers => {
146
- 'User-Agent' => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}",
147
- 'X-Auth-User' => "#{@storage_account}:#{@username}",
148
- 'X-Auth-Key' => @api_key
149
- }
150
- }
147
+ unless @bluemix_objstor_auth_url.nil?
148
+ puts "Bluemix Object Store v1 Authentication Header Required ..."
149
+ {
150
+ :headers => {
151
+ 'User-Agent' => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}",
152
+ 'Authorization' => "Basic " + Base64.strict_encode64("#{@username}" + ':' + "#{@api_key}")
153
+ }
154
+ }
155
+ else
156
+ {
157
+ :headers => {
158
+ 'User-Agent' => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}",
159
+ 'X-Auth-User' => "#{@storage_account}:#{@username}",
160
+ 'X-Auth-Key' => @api_key
161
+ }
162
+ }
163
+ end
151
164
  end
152
165
 
153
166
  def _build_params(params)
@@ -296,4 +309,3 @@ module Fog
296
309
  end
297
310
  end
298
311
  end
299
-
@@ -7,6 +7,6 @@
7
7
 
8
8
  module Fog
9
9
  module Softlayer
10
- VERSION = "1.0.3"
10
+ VERSION = "1.1.0"
11
11
  end
12
12
  end
@@ -36,6 +36,21 @@ Shindo.tests("Fog::Storage[:softlayer] | Directory model", ["softlayer"]) do
36
36
  data_matches_schema([Fog::Storage::Softlayer::Directory]) { @storage.directories.all }
37
37
  end
38
38
 
39
+ tests("#public_url") do
40
+ data_matches_schema(String) do
41
+ directory = @storage.directories.create(:key => @test_dir1)
42
+ service = directory.service
43
+ def service.cluster
44
+ @cluster ||= %w[
45
+ AMS01 CHE01 DAL05 FRA02
46
+ HKG02 LON02 MEL01 MEX01
47
+ MON01 PAR01 SAO01 SJC01
48
+ SNG01 SYD01 TOK02 TOR01
49
+ ].sample
50
+ end
51
+ directory.public_url
52
+ end
53
+ end
39
54
  end
40
55
 
41
56
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-softlayer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Eldridge
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-07 00:00:00.000000000 Z
11
+ date: 2016-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-core
@@ -185,6 +185,7 @@ executables: []
185
185
  extensions: []
186
186
  extra_rdoc_files: []
187
187
  files:
188
+ - ".editorconfig"
188
189
  - ".gitignore"
189
190
  - ".travis.yml"
190
191
  - CHANGELOG.md
@@ -275,6 +276,7 @@ files:
275
276
  - lib/fog/softlayer/requests/compute/describe_tags.rb
276
277
  - lib/fog/softlayer/requests/compute/generate_bare_metal_order_template.rb
277
278
  - lib/fog/softlayer/requests/compute/generate_virtual_guest_order_template.rb
279
+ - lib/fog/softlayer/requests/compute/get_available_preset_codes.rb
278
280
  - lib/fog/softlayer/requests/compute/get_bare_metal_active_tickets.rb
279
281
  - lib/fog/softlayer/requests/compute/get_bare_metal_create_options.rb
280
282
  - lib/fog/softlayer/requests/compute/get_bare_metal_server.rb