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 +4 -4
- data/.editorconfig +15 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/examples/compute.md +18 -0
- data/examples/storage.md +17 -0
- data/lib/fog/softlayer/compute.rb +1 -0
- data/lib/fog/softlayer/models/compute/server.rb +61 -8
- data/lib/fog/softlayer/models/compute/servers.rb +4 -0
- data/lib/fog/softlayer/models/storage/directory.rb +4 -1
- data/lib/fog/softlayer/network.rb +1 -1
- data/lib/fog/softlayer/requests/compute/get_available_preset_codes.rb +40 -0
- data/lib/fog/softlayer/storage.rb +23 -11
- data/lib/fog/softlayer/version.rb +1 -1
- data/tests/softlayer/models/storage/directory_tests.rb +15 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8e974e2bd69d7a85f5f75c30c58aab63c5feb4a
|
4
|
+
data.tar.gz: 62a6c43e1da9592ba070e14269429a49e44c1afb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 567acc968851f508de336f89b888cdee138d061a365bec496d8f3b452321c0d0eaa9c9dfdd9d32c359fff754981a034bc0020d3e1aa5a06c8fb21b6571329919
|
7
|
+
data.tar.gz: ef12acaa5e16d13049045aa31b59371542bdbfcabbd68694251b763fb0f46dbc17a59810f06d2c1add38db8b074d8d434c2b2a20b97323fd596be3fd8ff36a17
|
data/.editorconfig
ADDED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
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, :
|
509
|
-
|
510
|
-
|
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
|
-
|
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
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
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
|
-
|
@@ -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
|
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-
|
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
|