softlayer_api 3.0.b1 → 3.0.b2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.textile +7 -2
- data/examples/order_bare_metal_package.rb +2 -2
- data/examples/order_server_firewall.rb +63 -0
- data/lib/softlayer/APIParameterFilter.rb +8 -1
- data/lib/softlayer/Account.rb +20 -2
- data/lib/softlayer/BareMetalServer.rb +39 -8
- data/lib/softlayer/BareMetalServerOrder.rb +12 -12
- data/lib/softlayer/BareMetalServerOrder_Package.rb +5 -5
- data/lib/softlayer/Client.rb +4 -2
- data/lib/softlayer/Config.rb +3 -3
- data/lib/softlayer/ImageTemplate.rb +11 -11
- data/lib/softlayer/ModelBase.rb +1 -1
- data/lib/softlayer/NetworkComponent.rb +14 -0
- data/lib/softlayer/ProductItemCategory.rb +17 -13
- data/lib/softlayer/ProductPackage.rb +60 -10
- data/lib/softlayer/Server.rb +30 -9
- data/lib/softlayer/ServerFirewall.rb +263 -0
- data/lib/softlayer/ServerFirewallOrder.rb +84 -0
- data/lib/softlayer/Service.rb +17 -13
- data/lib/softlayer/Ticket.rb +8 -8
- data/lib/softlayer/VLANFirewall.rb +280 -0
- data/lib/softlayer/VLANFirewallOrder.rb +93 -0
- data/lib/softlayer/VirtualServer.rb +8 -5
- data/lib/softlayer/VirtualServerOrder.rb +16 -16
- data/lib/softlayer/VirtualServerUpgradeOrder.rb +21 -21
- data/lib/softlayer/base.rb +1 -1
- data/lib/softlayer_api.rb +5 -0
- metadata +8 -2
@@ -0,0 +1,93 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2014 SoftLayer Technologies, Inc. All rights reserved.
|
3
|
+
#
|
4
|
+
# For licensing information see the LICENSE.md file in the project root.
|
5
|
+
#++
|
6
|
+
|
7
|
+
module SoftLayer
|
8
|
+
#
|
9
|
+
# This class allows you to order a Firewall for a VLAN
|
10
|
+
#
|
11
|
+
class VLANFirewallOrder
|
12
|
+
##
|
13
|
+
# The VLAN that you are ordering the firewall for.
|
14
|
+
attr_reader :vlan_id
|
15
|
+
|
16
|
+
##
|
17
|
+
# Set high_availabilty to true if you want redundant
|
18
|
+
# firewall devices (defaults to false, no high_availability)
|
19
|
+
attr_accessor :high_availability
|
20
|
+
|
21
|
+
##
|
22
|
+
# Create a new order for the given VLAN
|
23
|
+
# Note that the vlan_id is NOT the same as the vlan number.
|
24
|
+
def initialize (vlan_id, client = nil)
|
25
|
+
@softlayer_client = client || Client.default_client
|
26
|
+
raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !@softlayer_client
|
27
|
+
|
28
|
+
@vlan_id = vlan_id
|
29
|
+
@high_availability = false
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# Calls the SoftLayer API to verify that the template provided by this order is valid
|
34
|
+
# This routine will return the order template generated by the API or will throw an exception
|
35
|
+
#
|
36
|
+
# This routine will not actually create a Bare Metal Instance and will not affect billing.
|
37
|
+
#
|
38
|
+
# If you provide a block, it will receive the order template as a parameter and
|
39
|
+
# the block may make changes to the template before it is submitted.
|
40
|
+
def verify()
|
41
|
+
order_template = firewall_order_template
|
42
|
+
order_template = yield order_template if block_given?
|
43
|
+
|
44
|
+
@softlayer_client[:Product_Order].verifyOrder(order_template)
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Calls the SoftLayer API to place an order for a new server based on the template in this
|
49
|
+
# order. If this succeeds then you will be billed for the new server.
|
50
|
+
#
|
51
|
+
# If you provide a block, it will receive the order template as a parameter and
|
52
|
+
# the block may make changes to the template before it is submitted.
|
53
|
+
def place_order!()
|
54
|
+
order_template = firewall_order_template
|
55
|
+
order_template = yield order_template if block_given?
|
56
|
+
|
57
|
+
@softlayer_client[:Product_Order].placeOrder(order_template)
|
58
|
+
end
|
59
|
+
|
60
|
+
protected
|
61
|
+
|
62
|
+
##
|
63
|
+
# Returns a hash of the creation options formatted to be sent to
|
64
|
+
# the SoftLayer API for either verification or completion
|
65
|
+
def firewall_order_template
|
66
|
+
client = @softlayer_client
|
67
|
+
additional_products_package = SoftLayer::ProductPackage.additional_products_package(client)
|
68
|
+
|
69
|
+
template = {
|
70
|
+
'complexType' => 'SoftLayer_Container_Product_Order_Network_Protection_Firewall_Dedicated',
|
71
|
+
'quantity' => 1,
|
72
|
+
'packageId' => additional_products_package.id,
|
73
|
+
'vlanId' => @vlan_id
|
74
|
+
}
|
75
|
+
|
76
|
+
if @high_availability
|
77
|
+
expected_description = "Hardware Firewall (High Availability)"
|
78
|
+
else
|
79
|
+
expected_description = "Hardware Firewall (Dedicated)"
|
80
|
+
end
|
81
|
+
|
82
|
+
firewall_items = additional_products_package.items_with_description(expected_description)
|
83
|
+
|
84
|
+
raise "Could not find a price item matching the description '#{expected_description}'" if firewall_items.empty?
|
85
|
+
|
86
|
+
firewall_item = firewall_items[0]
|
87
|
+
|
88
|
+
template['prices'] = [{ 'id' => firewall_item.price_id }] if firewall_item.respond_to?(:price_id)
|
89
|
+
|
90
|
+
template
|
91
|
+
end
|
92
|
+
end # class VLANFirewallOrder
|
93
|
+
end # module SoftLayer
|
@@ -87,13 +87,16 @@ module SoftLayer
|
|
87
87
|
# You may use the wait_until_ready routine of SoftLayer::ImageTemplate to
|
88
88
|
# wait on it.
|
89
89
|
#
|
90
|
-
def capture_image(image_name, include_attached_storage = false, image_notes =
|
90
|
+
def capture_image(image_name, include_attached_storage = false, image_notes = '')
|
91
|
+
image_notes = '' if !image_notes
|
92
|
+
image_name = 'Captured Image' if !image_name
|
93
|
+
|
91
94
|
disk_filter = lambda { |disk| disk['device'] == '0' }
|
92
95
|
disk_filter = lambda { |disk| disk['device'] != '1' } if include_attached_storage
|
93
96
|
|
94
97
|
disks = self.blockDevices.select(&disk_filter)
|
95
98
|
|
96
|
-
self.service.createArchiveTransaction(image_name, disks,
|
99
|
+
self.service.createArchiveTransaction(image_name, disks, image_notes) if disks && !disks.empty?
|
97
100
|
|
98
101
|
image_templates = SoftLayer::ImageTemplate.find_private_templates(:name => image_name)
|
99
102
|
image_templates[0] if !image_templates.empty?
|
@@ -161,7 +164,7 @@ module SoftLayer
|
|
161
164
|
softlayer_client = options[:client] || Client.default_client
|
162
165
|
raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !softlayer_client
|
163
166
|
|
164
|
-
vg_service = softlayer_client[
|
167
|
+
vg_service = softlayer_client[:Virtual_Guest]
|
165
168
|
vg_service = vg_service.object_mask(default_object_mask.to_sl_object_mask)
|
166
169
|
|
167
170
|
if options.has_key?(:object_mask)
|
@@ -248,7 +251,7 @@ module SoftLayer
|
|
248
251
|
|
249
252
|
required_properties_mask = 'mask.id'
|
250
253
|
|
251
|
-
account_service = softlayer_client[
|
254
|
+
account_service = softlayer_client[:Account]
|
252
255
|
account_service = account_service.object_filter(object_filter) unless object_filter.empty?
|
253
256
|
account_service = account_service.object_mask(default_object_mask.to_sl_object_mask)
|
254
257
|
|
@@ -307,7 +310,7 @@ module SoftLayer
|
|
307
310
|
# For VirtualServers the service is +SoftLayer_Virtual_Guest+ and
|
308
311
|
# addressing this object is done by id.
|
309
312
|
def service
|
310
|
-
return softlayer_client[
|
313
|
+
return softlayer_client[:Virtual_Guest].object_with_id(self.id)
|
311
314
|
end
|
312
315
|
end #class VirtualServer
|
313
316
|
end
|
@@ -119,7 +119,7 @@ module SoftLayer
|
|
119
119
|
order_template = virtual_guest_template
|
120
120
|
order_template = yield order_template if block_given?
|
121
121
|
|
122
|
-
@softlayer_client[
|
122
|
+
@softlayer_client[:Virtual_Guest].generateOrderTemplate(order_template)
|
123
123
|
end
|
124
124
|
|
125
125
|
# Calls the SoftLayer API to place an order for a new virtual server based on the template in this
|
@@ -132,8 +132,8 @@ module SoftLayer
|
|
132
132
|
order_template = virtual_guest_template
|
133
133
|
order_template = yield order_template if block_given?
|
134
134
|
|
135
|
-
virtual_server_hash = @softlayer_client[
|
136
|
-
SoftLayer::VirtualServer.server_with_id(virtual_server_hash[
|
135
|
+
virtual_server_hash = @softlayer_client[:Virtual_Guest].createObject(order_template)
|
136
|
+
SoftLayer::VirtualServer.server_with_id(virtual_server_hash['id'], :client => @softlayer_client) if virtual_server_hash
|
137
137
|
end
|
138
138
|
|
139
139
|
protected
|
@@ -153,21 +153,21 @@ module SoftLayer
|
|
153
153
|
"hourlyBillingFlag" => !!@hourly
|
154
154
|
}
|
155
155
|
|
156
|
-
template[
|
157
|
-
template[
|
156
|
+
template['dedicatedAccountHostOnlyFlag'] = true if @dedicated_host_only
|
157
|
+
template['privateNetworkOnlyFlag'] = true if @private_network_only
|
158
158
|
|
159
|
-
template[
|
159
|
+
template['datacenter'] = {"name" => @datacenter.name} if @datacenter
|
160
160
|
template['userData'] = [{'value' => @user_metadata}] if @user_metadata
|
161
161
|
template['networkComponents'] = [{'maxSpeed'=> @max_port_speed}] if @max_port_speed
|
162
162
|
template['postInstallScriptUri'] = @provision_script_URI.to_s if @provision_script_URI
|
163
163
|
template['sshKeys'] = @ssh_key_ids.collect { |ssh_key_id| {'id'=> ssh_key_id.to_i } } if @ssh_key_ids
|
164
164
|
template['primaryNetworkComponent'] = { "networkVlan" => { "id" => @public_vlan_id.to_i } } if @public_vlan_id
|
165
|
-
template[
|
165
|
+
template['primaryBackendNetworkComponent'] = { "networkVlan" => {"id" => @private_vlan_id.to_i } } if @private_vlan_id
|
166
166
|
|
167
167
|
if @image_template
|
168
|
-
template[
|
168
|
+
template['blockDeviceTemplateGroup'] = {"globalIdentifier" => @image_template.global_id}
|
169
169
|
elsif @os_reference_code
|
170
|
-
template[
|
170
|
+
template['operatingSystemReferenceCode'] = @os_reference_code
|
171
171
|
end
|
172
172
|
|
173
173
|
if @disks && !@disks.empty?
|
@@ -196,7 +196,7 @@ module SoftLayer
|
|
196
196
|
raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !softlayer_client
|
197
197
|
|
198
198
|
@@create_object_options ||= nil
|
199
|
-
@@create_object_options = softlayer_client[
|
199
|
+
@@create_object_options = softlayer_client[:Virtual_Guest].getCreateObjectOptions() if !@@create_object_options
|
200
200
|
@@create_object_options
|
201
201
|
end
|
202
202
|
|
@@ -210,37 +210,37 @@ module SoftLayer
|
|
210
210
|
##
|
211
211
|
# Return a list of values that are valid for the :datacenter attribute
|
212
212
|
def self.datacenter_options(client = nil)
|
213
|
-
create_object_options(client)[
|
213
|
+
create_object_options(client)['datacenters'].collect { |datacenter_spec| Datacenter.datacenter_named(datacenter_spec['template']['datacenter']['name'], client) }.uniq
|
214
214
|
end
|
215
215
|
|
216
216
|
##
|
217
217
|
# Return a list of values that are valid for the :cores attribute
|
218
218
|
def self.core_options(client = nil)
|
219
|
-
create_object_options(client)[
|
219
|
+
create_object_options(client)['processors'].collect { |processor_spec| processor_spec['template']['startCpus'] }.uniq.sort!
|
220
220
|
end
|
221
221
|
|
222
222
|
##
|
223
223
|
# Return a list of values that are valid for the :memory attribute
|
224
224
|
def self.memory_options(client = nil)
|
225
|
-
create_object_options(client)[
|
225
|
+
create_object_options(client)['memory'].collect { |memory_spec| memory_spec['template']['maxMemory'].to_i / 1024}.uniq.sort!
|
226
226
|
end
|
227
227
|
|
228
228
|
##
|
229
229
|
# Return a list of values that are valid the array given to the :disks
|
230
230
|
def self.disk_options(client = nil)
|
231
|
-
create_object_options(client)[
|
231
|
+
create_object_options(client)['blockDevices'].collect { |block_device_spec| block_device_spec['template']['blockDevices'][0]['diskImage']['capacity']}.uniq.sort!
|
232
232
|
end
|
233
233
|
|
234
234
|
##
|
235
235
|
# Returns a list of the valid :os_refrence_codes
|
236
236
|
def self.os_reference_code_options(client = nil)
|
237
|
-
create_object_options(client)[
|
237
|
+
create_object_options(client)['operatingSystems'].collect { |os_spec| os_spec['template']['operatingSystemReferenceCode'] }.uniq.sort!
|
238
238
|
end
|
239
239
|
|
240
240
|
##
|
241
241
|
# Returns a list of the :max_port_speeds
|
242
242
|
def self.max_port_speed_options(client = nil)
|
243
|
-
create_object_options(client)[
|
243
|
+
create_object_options(client)['networkComponents'].collect { |component_spec| component_spec['template']['networkComponents'][0]['maxSpeed'] }
|
244
244
|
end
|
245
245
|
end # class VirtualServerOrder
|
246
246
|
end # module SoftLayer
|
@@ -15,25 +15,25 @@ module SoftLayer
|
|
15
15
|
class VirtualServerUpgradeOrder
|
16
16
|
# The virtual server that this order is designed to upgrade.
|
17
17
|
attr_reader :virtual_server
|
18
|
-
|
18
|
+
|
19
19
|
# The number of cores the server should have after the upgrade.
|
20
20
|
# If this is nil, the the number of cores will not change
|
21
21
|
attr_accessor :cores
|
22
|
-
|
22
|
+
|
23
23
|
# The amount of RAM (in GB) that the server should have after the upgrade
|
24
24
|
# If this is nil, the ram will not change
|
25
25
|
attr_accessor :ram
|
26
|
-
|
26
|
+
|
27
27
|
# The port speed (in Mega bits per second) that the server should have
|
28
28
|
# after the upgrade. This is typically a value like 100, or 1000
|
29
29
|
# If this is nil, the port speeds will not change
|
30
30
|
attr_accessor :max_port_speed
|
31
|
-
|
31
|
+
|
32
32
|
# The date and time when you would like the upgrade to be processed.
|
33
33
|
# This should simply be a Time object. If nil then the upgrade
|
34
34
|
# will be performed immediately
|
35
35
|
attr_accessor :upgrade_at
|
36
|
-
|
36
|
+
|
37
37
|
##
|
38
38
|
# Create an upgrade order for the virtual server provided.
|
39
39
|
#
|
@@ -54,12 +54,12 @@ module SoftLayer
|
|
54
54
|
order_object = self.order_object
|
55
55
|
order_object = yield order_object if block_given?
|
56
56
|
|
57
|
-
@virtual_server.softlayer_client[
|
57
|
+
@virtual_server.softlayer_client[:Product_Order].verifyOrder(order_object)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
61
|
##
|
62
|
-
# Places the order represented by this object. This is likely to
|
62
|
+
# Places the order represented by this object. This is likely to
|
63
63
|
# involve a change to the charges on an account.
|
64
64
|
#
|
65
65
|
# If a block is passed to this routine, the code will send the order template
|
@@ -70,26 +70,26 @@ module SoftLayer
|
|
70
70
|
order_object = self.order_object
|
71
71
|
order_object = yield order_object if block_given?
|
72
72
|
|
73
|
-
@virtual_server.softlayer_client[
|
73
|
+
@virtual_server.softlayer_client[:Product_Order].placeOrder(order_object)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
77
|
##
|
78
78
|
# Return a list of values that are valid for the :cores attribute
|
79
79
|
def core_options()
|
80
|
-
self._item_prices_in_category("guest_core").map { |item_price| item_price[
|
80
|
+
self._item_prices_in_category("guest_core").map { |item_price| item_price['item']['capacity'].to_i}.sort.uniq
|
81
81
|
end
|
82
82
|
|
83
83
|
##
|
84
84
|
# Return a list of values that are valid for the :memory attribute
|
85
85
|
def memory_options()
|
86
|
-
self._item_prices_in_category("ram").map { |item_price| item_price[
|
86
|
+
self._item_prices_in_category("ram").map { |item_price| item_price['item']['capacity'].to_i}.sort.uniq
|
87
87
|
end
|
88
88
|
|
89
89
|
##
|
90
90
|
# Returns a list of valid values for max_port_speed
|
91
91
|
def max_port_speed_options(client = nil)
|
92
|
-
self._item_prices_in_category("port_speed").map { |item_price| item_price[
|
92
|
+
self._item_prices_in_category("port_speed").map { |item_price| item_price['item']['capacity'].to_i}.sort.uniq
|
93
93
|
end
|
94
94
|
|
95
95
|
private
|
@@ -105,30 +105,30 @@ module SoftLayer
|
|
105
105
|
# Returns a list of the update item prices, in the given category, for the server
|
106
106
|
#
|
107
107
|
def _item_prices_in_category(which_category)
|
108
|
-
@virtual_server.upgrade_options.select { |item_price| item_price[
|
108
|
+
@virtual_server.upgrade_options.select { |item_price| item_price['categories'].find { |category| category['categoryCode'] == which_category } }
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
##
|
112
112
|
# Searches through the upgrade items pricess known to this server for the one that is in a particular category
|
113
113
|
# and whose capacity matches the value given. Returns the item_price or nil
|
114
114
|
#
|
115
115
|
def _item_price_with_capacity(which_category, capacity)
|
116
|
-
self._item_prices_in_category(which_category).find { |item_price| item_price[
|
116
|
+
self._item_prices_in_category(which_category).find { |item_price| item_price['item']['capacity'].to_i == capacity}
|
117
117
|
end
|
118
|
-
|
119
|
-
##
|
118
|
+
|
119
|
+
##
|
120
120
|
# construct an order object
|
121
121
|
#
|
122
122
|
def order_object
|
123
123
|
prices = []
|
124
|
-
|
124
|
+
|
125
125
|
cores_price_item = @cores ? _item_price_with_capacity("guest_core", @cores) : nil
|
126
126
|
ram_price_item = @ram ? _item_price_with_capacity("ram", @ram) : nil
|
127
127
|
max_port_speed_price_item = @max_port_speed ? _item_price_with_capacity("port_speed", @max_port_speed) : nil
|
128
|
-
|
129
|
-
prices << { "id" => cores_price_item[
|
130
|
-
prices << { "id" => ram_price_item[
|
131
|
-
prices << { "id" => max_port_speed_price_item[
|
128
|
+
|
129
|
+
prices << { "id" => cores_price_item['id'] } if cores_price_item
|
130
|
+
prices << { "id" => ram_price_item['id'] } if ram_price_item
|
131
|
+
prices << { "id" => max_port_speed_price_item['id'] } if max_port_speed_price_item
|
132
132
|
|
133
133
|
# put together an order
|
134
134
|
upgrade_order = {
|
data/lib/softlayer/base.rb
CHANGED
@@ -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.0.
|
15
|
+
VERSION = "3.0.b2" # 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/'
|
data/lib/softlayer_api.rb
CHANGED
@@ -27,9 +27,14 @@ require 'softlayer/BareMetalServer'
|
|
27
27
|
require 'softlayer/BareMetalServerOrder'
|
28
28
|
require 'softlayer/BareMetalServerOrder_Package'
|
29
29
|
require 'softlayer/ImageTemplate'
|
30
|
+
require 'softlayer/NetworkComponent'
|
30
31
|
require 'softlayer/ProductPackage'
|
31
32
|
require 'softlayer/ProductItemCategory'
|
33
|
+
require 'softlayer/ServerFirewall'
|
34
|
+
require 'softlayer/ServerFirewallOrder'
|
32
35
|
require 'softlayer/Ticket'
|
33
36
|
require 'softlayer/VirtualServer'
|
34
37
|
require 'softlayer/VirtualServerOrder'
|
35
38
|
require 'softlayer/VirtualServerUpgradeOrder'
|
39
|
+
require 'softlayer/VLANFirewall'
|
40
|
+
require 'softlayer/VLANFirewallOrder'
|
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.0.
|
4
|
+
version: 3.0.b2
|
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: 2014-09-
|
11
|
+
date: 2014-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: configparser
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- examples/create_ticket.rb
|
114
114
|
- examples/open_tickets.rb
|
115
115
|
- examples/order_bare_metal_package.rb
|
116
|
+
- examples/order_server_firewall.rb
|
116
117
|
- examples/order_virtual_server.rb
|
117
118
|
- examples/ticket_info.rb
|
118
119
|
- lib/softlayer/APIParameterFilter.rb
|
@@ -126,6 +127,7 @@ files:
|
|
126
127
|
- lib/softlayer/DynamicAttribute.rb
|
127
128
|
- lib/softlayer/ImageTemplate.rb
|
128
129
|
- lib/softlayer/ModelBase.rb
|
130
|
+
- lib/softlayer/NetworkComponent.rb
|
129
131
|
- lib/softlayer/ObjectFilter.rb
|
130
132
|
- lib/softlayer/ObjectMaskParser.rb
|
131
133
|
- lib/softlayer/ObjectMaskProperty.rb
|
@@ -134,8 +136,12 @@ files:
|
|
134
136
|
- lib/softlayer/ProductItemCategory.rb
|
135
137
|
- lib/softlayer/ProductPackage.rb
|
136
138
|
- lib/softlayer/Server.rb
|
139
|
+
- lib/softlayer/ServerFirewall.rb
|
140
|
+
- lib/softlayer/ServerFirewallOrder.rb
|
137
141
|
- lib/softlayer/Service.rb
|
138
142
|
- lib/softlayer/Ticket.rb
|
143
|
+
- lib/softlayer/VLANFirewall.rb
|
144
|
+
- lib/softlayer/VLANFirewallOrder.rb
|
139
145
|
- lib/softlayer/VirtualServer.rb
|
140
146
|
- lib/softlayer/VirtualServerOrder.rb
|
141
147
|
- lib/softlayer/VirtualServerUpgradeOrder.rb
|