fog-softlayer 0.4.5 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/examples/compute.md +87 -4
- data/lib/fog/softlayer/compute.rb +6 -0
- data/lib/fog/softlayer/models/compute/server.rb +53 -3
- data/lib/fog/softlayer/product.rb +1 -0
- data/lib/fog/softlayer/requests/compute/generate_bare_metal_order_template.rb +162 -0
- data/lib/fog/softlayer/requests/compute/generate_virtual_guest_order_template.rb +173 -0
- data/lib/fog/softlayer/requests/compute/get_bare_metal_upgrade_item_prices.rb +629 -0
- data/lib/fog/softlayer/requests/compute/get_virtual_guest_upgrade_item_prices.rb +6056 -0
- data/lib/fog/softlayer/requests/product/place_order.rb +258 -0
- data/lib/fog/softlayer/version.rb +1 -1
- data/tests/softlayer/models/compute/server_tests.rb +14 -3
- data/tests/softlayer/requests/compute/bmc_tests.rb +31 -2
- data/tests/softlayer/requests/compute/vm_tests.rb +32 -0
- data/tests/softlayer/requests/product/place_order.rb +19 -0
- metadata +35 -30
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZTI0NzU5MzQ3OWNjYTliZmRlYzFiZjU5ZDc5NjEwYzBmNTFmYjVjNg==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e7d1c6f03ac2e0040db85db4721b27d0d4cd64cb
|
4
|
+
data.tar.gz: bdc6756610695169ad345a08c366322bebb1bf4f
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MTcyZmYxYWE4YzZmNTQ3MGZmMjg1ZDU1ZGEwNzhhYzUxNWIzZTViNTY5MjI1
|
11
|
-
MDhmMjEzMmE1Y2Y4NmNiZTM5MjlkMWFhMzI5YWZiMGRjYzY1ODY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
N2YxYmE2OWQ4Yzg2NDY4MGFmYTM0NmQwYjc4ZGQ2ODk5N2RkMGFlZDNjOTRl
|
14
|
-
YjJkNDQxMmE3ZTNhMWRlNmVlOWUzOGU4MWQ0NGQxYjhmNjBlYWMwMThhYzRi
|
15
|
-
NjIzNTM3Y2M5MmUxOTdkZDQ5MTYxNDE0ODBmOWM3ODQyOTZkYTU=
|
6
|
+
metadata.gz: 78c526fb8b3708aad63c410bbd34d6ead32c8f7ecaa43bae0d3706667ea08909fde2b4e1c6231b37863a11d37e47cf61843667ad2d131411925f8eec93914427
|
7
|
+
data.tar.gz: 549aa937fb695071e6e85f3c7860899958781ca58d0e3d8a69f36c21a0ff3cc684c10f0a0a50df0a74257ef0b27bc254c4feead972cce9c7b1ec83361bc2b258
|
data/examples/compute.md
CHANGED
@@ -141,7 +141,7 @@ If you are unfamiliar with fog, we recommend reading our [getting started](getti
|
|
141
141
|
|
142
142
|
```ruby
|
143
143
|
opts = {
|
144
|
-
:flavor_id => "m1.
|
144
|
+
:flavor_id => "m1.medium",
|
145
145
|
:os_code => "UBUNTU_LATEST",
|
146
146
|
:name => "test1",
|
147
147
|
:datacenter => "ams01",
|
@@ -173,7 +173,7 @@ If you are unfamiliar with fog, we recommend reading our [getting started](getti
|
|
173
173
|
opts = {
|
174
174
|
:cpu => 8,
|
175
175
|
:ram => 16348,
|
176
|
-
:disk => {'capacity' =>
|
176
|
+
:disk => {'capacity' => 500 },
|
177
177
|
:ephemeral_storage => true,
|
178
178
|
:domain => "not-my-default.com",
|
179
179
|
:name => "hostname",
|
@@ -299,7 +299,6 @@ If you are unfamiliar with fog, we recommend reading our [getting started](getti
|
|
299
299
|
|
300
300
|
```
|
301
301
|
|
302
|
-
|
303
302
|
1. Get all options to create a bare metal.
|
304
303
|
|
305
304
|
```ruby
|
@@ -324,4 +323,88 @@ If you are unfamiliar with fog, we recommend reading our [getting started](getti
|
|
324
323
|
```ruby
|
325
324
|
server = @sl.servers.get(123456)
|
326
325
|
server.get_users
|
327
|
-
```
|
326
|
+
```
|
327
|
+
|
328
|
+
1. Get all upgrade options of a server.
|
329
|
+
|
330
|
+
```ruby
|
331
|
+
server = @sl.servers.get(123456)
|
332
|
+
server.get_upgrade_options
|
333
|
+
```
|
334
|
+
|
335
|
+
1. Update a server.
|
336
|
+
|
337
|
+
```ruby
|
338
|
+
new_attributes = {
|
339
|
+
:cpu => 2,
|
340
|
+
:memory => 1, # this value is in GBs
|
341
|
+
:max_port_speed => 100, # this value is in MPBSs
|
342
|
+
:time => Time.now + 5.minutes # if you don't specify, time will be equal to now
|
343
|
+
}
|
344
|
+
server = @sl.servers.get(123456)
|
345
|
+
server.update(new_attributes)
|
346
|
+
```
|
347
|
+
|
348
|
+
1. Generate an order template for VM with flavor (simple).
|
349
|
+
|
350
|
+
```ruby
|
351
|
+
opts = {
|
352
|
+
:flavor_id => "m1.small",
|
353
|
+
:image_id => "23f7f05f-3657-4330-8772-329ed2e816bc",
|
354
|
+
:name => "test",
|
355
|
+
:datacenter => "ams01"
|
356
|
+
}
|
357
|
+
new_server = @sl.servers.new(opts)
|
358
|
+
new_server.generate_order_template
|
359
|
+
```
|
360
|
+
|
361
|
+
1. Generate an order template for Bare Metal instance with flavor (simple).
|
362
|
+
|
363
|
+
```ruby
|
364
|
+
opts = {
|
365
|
+
:flavor_id => "m1.medium",
|
366
|
+
:os_code => "UBUNTU_LATEST",
|
367
|
+
:name => "test1",
|
368
|
+
:datacenter => "ams01",
|
369
|
+
:bare_metal => true
|
370
|
+
}
|
371
|
+
new_server = @sl.servers.new(opts)
|
372
|
+
new_server.generate_order_template
|
373
|
+
```
|
374
|
+
|
375
|
+
1. Generate an order template for VM without flavor.
|
376
|
+
|
377
|
+
```ruby
|
378
|
+
opts = {
|
379
|
+
:cpu => 2,
|
380
|
+
:ram => 2048,
|
381
|
+
:disk => [{'device' => 0, 'diskImage' => {'capacity' => 100 } }],
|
382
|
+
:ephemeral_storage => true,
|
383
|
+
:domain => "not-my-default.com",
|
384
|
+
:name => "hostname",
|
385
|
+
:os_code => "UBUNTU_LATEST",
|
386
|
+
:name => "test2",
|
387
|
+
:datacenter => "ams01"
|
388
|
+
}
|
389
|
+
new_server = @sl.servers.new(opts)
|
390
|
+
new_server.generate_order_template
|
391
|
+
```
|
392
|
+
|
393
|
+
1. Generate an order template for Bare Metal Instance without a flavor
|
394
|
+
|
395
|
+
```ruby
|
396
|
+
opts = {
|
397
|
+
:cpu => 8,
|
398
|
+
:ram => 16348,
|
399
|
+
:disk => {'capacity' => 500 },
|
400
|
+
:ephemeral_storage => true,
|
401
|
+
:domain => "not-my-default.com",
|
402
|
+
:name => "hostname",
|
403
|
+
:os_code => "UBUNTU_LATEST",
|
404
|
+
:name => "test2",
|
405
|
+
:datacenter => "ams01",
|
406
|
+
:bare_metal => true
|
407
|
+
}
|
408
|
+
new_server = @sl.servers.new(opts)
|
409
|
+
new_server.generate_order_template
|
410
|
+
```
|
@@ -46,12 +46,15 @@ module Fog
|
|
46
46
|
request :delete_vm
|
47
47
|
request :delete_vm_tags
|
48
48
|
request :describe_tags
|
49
|
+
request :generate_bare_metal_order_template
|
50
|
+
request :generate_virtual_guest_order_template
|
49
51
|
request :get_bare_metal_active_tickets
|
50
52
|
request :get_bare_metal_create_options
|
51
53
|
request :get_bare_metal_server
|
52
54
|
request :get_bare_metal_server_by_ip
|
53
55
|
request :get_bare_metal_servers
|
54
56
|
request :get_bare_metal_tags
|
57
|
+
request :get_bare_metal_upgrade_item_prices
|
55
58
|
request :get_bare_metal_users
|
56
59
|
request :get_key_pair
|
57
60
|
request :get_key_pairs
|
@@ -60,6 +63,7 @@ module Fog
|
|
60
63
|
request :get_virtual_guest_active_tickets
|
61
64
|
request :get_virtual_guest_by_ip
|
62
65
|
request :get_virtual_guest_create_options
|
66
|
+
request :get_virtual_guest_upgrade_item_prices
|
63
67
|
request :get_virtual_guest_users
|
64
68
|
request :get_vm_tags
|
65
69
|
request :get_vm
|
@@ -72,6 +76,8 @@ module Fog
|
|
72
76
|
request :reboot_vm
|
73
77
|
request :update_key_pair
|
74
78
|
|
79
|
+
request :place_order, 'fog/softlayer/requests/product'
|
80
|
+
|
75
81
|
# The Mock Service allows you to run a fake instance of the Service
|
76
82
|
# which makes no real connections.
|
77
83
|
#
|
@@ -357,6 +357,25 @@ module Fog
|
|
357
357
|
service.get_virtual_guest_users(id).body
|
358
358
|
end
|
359
359
|
|
360
|
+
def get_upgrade_options
|
361
|
+
return service.get_bare_metal_upgrade_item_prices(id).body if bare_metal?
|
362
|
+
service.get_virtual_guest_upgrade_item_prices(id).body
|
363
|
+
end
|
364
|
+
|
365
|
+
def update(update_attributes = {})
|
366
|
+
raise Exception("Need implementation for BM") if bare_metal?
|
367
|
+
prices = get_item_prices_id(update_attributes)
|
368
|
+
order = generate_upgrade_order(prices, update_attributes[:time])
|
369
|
+
service.place_order(order).body
|
370
|
+
end
|
371
|
+
|
372
|
+
def generate_order_template
|
373
|
+
copy = self.dup
|
374
|
+
copy.pre_save
|
375
|
+
return service.generate_bare_metal_order_template(copy.attributes).body if bare_metal?
|
376
|
+
service.generate_virtual_guest_order_template(copy.attributes).body
|
377
|
+
end
|
378
|
+
|
360
379
|
private
|
361
380
|
|
362
381
|
def network_connection
|
@@ -440,7 +459,6 @@ module Fog
|
|
440
459
|
attributes.delete(:ephemeral_storage)
|
441
460
|
end
|
442
461
|
|
443
|
-
|
444
462
|
##
|
445
463
|
# Expand a "flavor" into cpu, ram, and disk attributes
|
446
464
|
def extract_flavor
|
@@ -460,8 +478,8 @@ module Fog
|
|
460
478
|
|
461
479
|
def validate_attributes
|
462
480
|
requires :name, :domain, :cpu, :ram, :datacenter
|
463
|
-
requires_one :os_code
|
464
|
-
requires_one :
|
481
|
+
requires_one :os_code if self.attributes[:os_code].nil? # need this while os_code bug isn't fixed
|
482
|
+
requires_one :disk, :image_id
|
465
483
|
bare_metal? and image_id and raise ArgumentError, "Bare Metal Cloud does not support booting from Image"
|
466
484
|
end
|
467
485
|
|
@@ -472,6 +490,38 @@ module Fog
|
|
472
490
|
self.datacenter = service.softlayer_default_datacenter if service.softlayer_default_datacenter and attributes[:datacenter].nil?
|
473
491
|
end
|
474
492
|
|
493
|
+
def get_item_prices_id_by_value(item_price_array, category, value)
|
494
|
+
item_price_array = item_price_array.select { |item_price| item_price["categories"].find { |category_hash| category_hash["categoryCode"] == category } }
|
495
|
+
item_price = item_price_array.find { |item_price| item_price['item']['capacity'].to_i == value }
|
496
|
+
item_price["id"]
|
497
|
+
end
|
498
|
+
|
499
|
+
def get_item_prices_id(update_attributes)
|
500
|
+
item_price_array = get_upgrade_options
|
501
|
+
categories = {:cpu => "guest_core", :memory => "ram", :max_port_speed => "port_speed"}
|
502
|
+
prices = []
|
503
|
+
update_attributes.delete(:time)
|
504
|
+
update_attributes.each_pair { |key, value| prices << { :id => get_item_prices_id_by_value(item_price_array, categories[key], update_attributes[key]) } }
|
505
|
+
prices
|
506
|
+
end
|
507
|
+
|
508
|
+
def generate_upgrade_order(prices, time)
|
509
|
+
{
|
510
|
+
:complexType => 'SoftLayer_Container_Product_Order_Virtual_Guest_Upgrade',
|
511
|
+
:prices => prices,
|
512
|
+
:properties => [
|
513
|
+
{
|
514
|
+
:name => 'MAINTENANCE_WINDOW',
|
515
|
+
:value => time.present? ? time.iso8601 : Time.now.iso8601
|
516
|
+
}
|
517
|
+
],
|
518
|
+
:virtualGuests => [
|
519
|
+
{
|
520
|
+
:id => id
|
521
|
+
}
|
522
|
+
]
|
523
|
+
}
|
524
|
+
end
|
475
525
|
end
|
476
526
|
end
|
477
527
|
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Matheus Francisco Barra Mina (<mfbmina@gmail.com>)
|
3
|
+
# © Copyright IBM Corporation 2015.
|
4
|
+
#
|
5
|
+
# LICENSE: MIT (http://opensource.org/licenses/MIT)
|
6
|
+
#
|
7
|
+
module Fog
|
8
|
+
module Compute
|
9
|
+
class Softlayer
|
10
|
+
class Mock
|
11
|
+
# Generate an order template for a Bare Metal
|
12
|
+
# @param [Integer] order_template
|
13
|
+
# @return [Excon::Response]
|
14
|
+
def generate_bare_metal_order_template(order_template)
|
15
|
+
raise ArgumentError, "Fog::Compute::Softlayer#create_vms expects argument of type Hash" unless order_template.kind_of?(Hash)
|
16
|
+
response = Excon::Response.new
|
17
|
+
required = %w{hostname domain processorCoreAmount memoryCapacity hourlyBillingFlag operatingSystemReferenceCode}
|
18
|
+
begin
|
19
|
+
raise MissingRequiredParameter unless Fog::Softlayer.valid_request?(required, order_template)
|
20
|
+
response.status = 200
|
21
|
+
response.body = order_template_mock
|
22
|
+
rescue MissingRequiredParameter
|
23
|
+
response.status = 500
|
24
|
+
response.body = {
|
25
|
+
"code" => "SoftLayer_Exception_MissingCreationProperty",
|
26
|
+
"error" => "Properties #{required.join(', ')} ALL must be set to create an instance of 'SoftLayer_Virtual_Guest'."
|
27
|
+
}
|
28
|
+
end
|
29
|
+
@virtual_guests.push(response.body).flatten!
|
30
|
+
response
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Real
|
35
|
+
def generate_bare_metal_order_template(order_template)
|
36
|
+
request(:hardware_server, :generate_order_template, body: order_template, :http_method => :POST)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module Fog
|
44
|
+
module Compute
|
45
|
+
class Softlayer
|
46
|
+
class Mock
|
47
|
+
def order_template_mock
|
48
|
+
{
|
49
|
+
"hardware"=>[
|
50
|
+
{
|
51
|
+
"domain"=>"example.com",
|
52
|
+
"hostname"=>"host1"
|
53
|
+
}
|
54
|
+
],
|
55
|
+
"location"=>"265592",
|
56
|
+
"packageId"=>50,
|
57
|
+
"prices"=>[
|
58
|
+
{
|
59
|
+
"hourlyRecurringFee"=>".24",
|
60
|
+
"id"=>1921,
|
61
|
+
"recurringFee"=>"159",
|
62
|
+
"item"=>{
|
63
|
+
"description"=>"2 x 2.0 GHz Core Bare Metal Instance - 2 GB Ram"
|
64
|
+
}
|
65
|
+
},
|
66
|
+
{
|
67
|
+
"hourlyRecurringFee"=>"0",
|
68
|
+
"id"=>37620,
|
69
|
+
"recurringFee"=>"0",
|
70
|
+
"item"=>{
|
71
|
+
"description"=>"Ubuntu Linux 14.04 LTS Trusty Tahr - Minimal Install (64 bit)"
|
72
|
+
}
|
73
|
+
},
|
74
|
+
{
|
75
|
+
"hourlyRecurringFee"=>"0",
|
76
|
+
"id"=>1267,
|
77
|
+
"recurringFee"=>"0",
|
78
|
+
"item"=>{
|
79
|
+
"description"=>"500 GB SATA II"
|
80
|
+
}
|
81
|
+
},
|
82
|
+
{
|
83
|
+
"hourlyRecurringFee"=>"0",
|
84
|
+
"id"=>55,
|
85
|
+
"recurringFee"=>"0",
|
86
|
+
"item"=>{
|
87
|
+
"description"=>"Host Ping"
|
88
|
+
}
|
89
|
+
},
|
90
|
+
{
|
91
|
+
"hourlyRecurringFee"=>"0",
|
92
|
+
"id"=>57,
|
93
|
+
"recurringFee"=>"0",
|
94
|
+
"item"=>{
|
95
|
+
"description"=>"Email and Ticket"
|
96
|
+
}
|
97
|
+
},
|
98
|
+
{
|
99
|
+
"hourlyRecurringFee"=>"0",
|
100
|
+
"id"=>58,
|
101
|
+
"recurringFee"=>"0",
|
102
|
+
"item"=>{
|
103
|
+
"description"=>"Automated Notification"
|
104
|
+
}
|
105
|
+
},
|
106
|
+
{
|
107
|
+
"hourlyRecurringFee"=>"0",
|
108
|
+
"id"=>40640,
|
109
|
+
"recurringFee"=>"0",
|
110
|
+
"item"=>{
|
111
|
+
"description"=>"100 Mbps Dual Public & Private Network Uplinks (Unbonded)"
|
112
|
+
}
|
113
|
+
},
|
114
|
+
{
|
115
|
+
"hourlyRecurringFee"=>"0",
|
116
|
+
"id"=>1800,
|
117
|
+
"item"=>{
|
118
|
+
"description"=>"0 GB Bandwidth"
|
119
|
+
}
|
120
|
+
},
|
121
|
+
{
|
122
|
+
"hourlyRecurringFee"=>"0",
|
123
|
+
"id"=>420,
|
124
|
+
"recurringFee"=>"0",
|
125
|
+
"item"=>{
|
126
|
+
"description"=>"Unlimited SSL VPN Users & 1 PPTP VPN User per account"
|
127
|
+
}
|
128
|
+
},
|
129
|
+
{
|
130
|
+
"hourlyRecurringFee"=>"0",
|
131
|
+
"id"=>418,
|
132
|
+
"recurringFee"=>"0",
|
133
|
+
"item"=>{
|
134
|
+
"description"=>"Nessus Vulnerability Assessment & Reporting"
|
135
|
+
}
|
136
|
+
},
|
137
|
+
{
|
138
|
+
"hourlyRecurringFee"=>"0",
|
139
|
+
"id"=>905,
|
140
|
+
"recurringFee"=>"0",
|
141
|
+
"item"=>{
|
142
|
+
"description"=>"Reboot / Remote Console"
|
143
|
+
}
|
144
|
+
},
|
145
|
+
{
|
146
|
+
"hourlyRecurringFee"=>"0",
|
147
|
+
"id"=>21,
|
148
|
+
"recurringFee"=>"0",
|
149
|
+
"item"=>{
|
150
|
+
"description"=>"1 IP Address"
|
151
|
+
}
|
152
|
+
}
|
153
|
+
],
|
154
|
+
"quantity"=>1,
|
155
|
+
"sshKeys"=>[],
|
156
|
+
"useHourlyPricing"=>true
|
157
|
+
}
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Matheus Francisco Barra Mina (<mfbmina@gmail.com>)
|
3
|
+
# © Copyright IBM Corporation 2015.
|
4
|
+
#
|
5
|
+
# LICENSE: MIT (http://opensource.org/licenses/MIT)
|
6
|
+
#
|
7
|
+
module Fog
|
8
|
+
module Compute
|
9
|
+
class Softlayer
|
10
|
+
class Mock
|
11
|
+
# Generate an order template for a Virtual Guest
|
12
|
+
# @param [Integer] order_template
|
13
|
+
# @return [Excon::Response]
|
14
|
+
def generate_virtual_guest_order_template(order_template)
|
15
|
+
raise ArgumentError, "Fog::Compute::Softlayer#create_vms expects argument of type Hash" unless order_template.kind_of?(Hash)
|
16
|
+
response = Excon::Response.new
|
17
|
+
required = %w{hostname domain startCpus maxMemory hourlyBillingFlag localDiskFlag}
|
18
|
+
begin
|
19
|
+
raise MissingRequiredParameter unless Fog::Softlayer.valid_request?(required, order_template)
|
20
|
+
response.status = 200
|
21
|
+
response.body = order_template_mock
|
22
|
+
rescue MissingRequiredParameter
|
23
|
+
response.status = 500
|
24
|
+
response.body = {
|
25
|
+
"code" => "SoftLayer_Exception_MissingCreationProperty",
|
26
|
+
"error" => "Properties #{required.join(', ')} ALL must be set to create an instance of 'SoftLayer_Virtual_Guest'."
|
27
|
+
}
|
28
|
+
end
|
29
|
+
@virtual_guests.push(response.body).flatten!
|
30
|
+
response
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Real
|
35
|
+
def generate_virtual_guest_order_template(order_template)
|
36
|
+
request(:virtual_guest, :generate_order_template, body: order_template, :http_method => :POST)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module Fog
|
44
|
+
module Compute
|
45
|
+
class Softlayer
|
46
|
+
class Mock
|
47
|
+
def order_template_mock
|
48
|
+
{
|
49
|
+
"imageTemplateId"=>nil,
|
50
|
+
"location"=>"265592",
|
51
|
+
"packageId"=>46,
|
52
|
+
"prices"=>[
|
53
|
+
{
|
54
|
+
"hourlyRecurringFee"=>".021",
|
55
|
+
"id"=>1640,
|
56
|
+
"recurringFee"=>"15",
|
57
|
+
"item"=>{
|
58
|
+
"description"=>"1 x 2.0 GHz Core"
|
59
|
+
}
|
60
|
+
},
|
61
|
+
{
|
62
|
+
"hourlyRecurringFee"=>".019",
|
63
|
+
"id"=>1644,
|
64
|
+
"recurringFee"=>"12.6",
|
65
|
+
"item"=>{
|
66
|
+
"description"=>"1 GB"
|
67
|
+
}
|
68
|
+
},
|
69
|
+
{
|
70
|
+
"hourlyRecurringFee"=>"0",
|
71
|
+
"id"=>37202,
|
72
|
+
"recurringFee"=>"0",
|
73
|
+
"item"=>{
|
74
|
+
"description"=>"Ubuntu Linux 14.04 LTS Trusty Tahr - Minimal Install (64 bit)"
|
75
|
+
}
|
76
|
+
},
|
77
|
+
{
|
78
|
+
"hourlyRecurringFee"=>"0",
|
79
|
+
"id"=>13899,
|
80
|
+
"recurringFee"=>"0",
|
81
|
+
"item"=>{
|
82
|
+
"description"=>"25 GB (LOCAL)"
|
83
|
+
}
|
84
|
+
},
|
85
|
+
{
|
86
|
+
"hourlyRecurringFee"=>"0",
|
87
|
+
"id"=>55,
|
88
|
+
"recurringFee"=>"0",
|
89
|
+
"item"=>{
|
90
|
+
"description"=>"Host Ping"
|
91
|
+
}
|
92
|
+
},
|
93
|
+
{
|
94
|
+
"hourlyRecurringFee"=>"0",
|
95
|
+
"id"=>57,
|
96
|
+
"recurringFee"=>"0",
|
97
|
+
"item"=>{
|
98
|
+
"description"=>"Email and Ticket"
|
99
|
+
}
|
100
|
+
},
|
101
|
+
{
|
102
|
+
"hourlyRecurringFee"=>"0",
|
103
|
+
"id"=>58,
|
104
|
+
"recurringFee"=>"0",
|
105
|
+
"item"=>{
|
106
|
+
"description"=>"Automated Notification"
|
107
|
+
}
|
108
|
+
},
|
109
|
+
{
|
110
|
+
"hourlyRecurringFee"=>"0",
|
111
|
+
"id"=>272,
|
112
|
+
"recurringFee"=>"0",
|
113
|
+
"item"=>{
|
114
|
+
"description"=>"10 Mbps Public & Private Network Uplinks"
|
115
|
+
}
|
116
|
+
},
|
117
|
+
{
|
118
|
+
"hourlyRecurringFee"=>"0",
|
119
|
+
"id"=>1800,
|
120
|
+
"item"=>{
|
121
|
+
"description"=>"0 GB Bandwidth"
|
122
|
+
}
|
123
|
+
},
|
124
|
+
{
|
125
|
+
"hourlyRecurringFee"=>"0",
|
126
|
+
"id"=>420,
|
127
|
+
"recurringFee"=>"0",
|
128
|
+
"item"=>{
|
129
|
+
"description"=>"Unlimited SSL VPN Users & 1 PPTP VPN User per account"
|
130
|
+
}
|
131
|
+
},
|
132
|
+
{
|
133
|
+
"hourlyRecurringFee"=>"0",
|
134
|
+
"id"=>418,
|
135
|
+
"recurringFee"=>"0",
|
136
|
+
"item"=>{
|
137
|
+
"description"=>"Nessus Vulnerability Assessment & Reporting"
|
138
|
+
}
|
139
|
+
},
|
140
|
+
{
|
141
|
+
"hourlyRecurringFee"=>"0",
|
142
|
+
"id"=>905,
|
143
|
+
"recurringFee"=>"0",
|
144
|
+
"item"=>{
|
145
|
+
"description"=>"Reboot / Remote Console"
|
146
|
+
}
|
147
|
+
},
|
148
|
+
{
|
149
|
+
"hourlyRecurringFee"=>"0",
|
150
|
+
"id"=>21,
|
151
|
+
"recurringFee"=>"0",
|
152
|
+
"item"=>{
|
153
|
+
"description"=>"1 IP Address"
|
154
|
+
}
|
155
|
+
}
|
156
|
+
],
|
157
|
+
"quantity"=>1,
|
158
|
+
"sourceVirtualGuestId"=>nil,
|
159
|
+
"sshKeys"=>[],
|
160
|
+
"useHourlyPricing"=>true,
|
161
|
+
"virtualGuests"=>[
|
162
|
+
{
|
163
|
+
"domain"=>"example.com",
|
164
|
+
"hostname"=>"host1"
|
165
|
+
}
|
166
|
+
],
|
167
|
+
"complexType"=>"SoftLayer_Container_Product_Order_Virtual_Guest"
|
168
|
+
}
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|