softlayer_api 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,263 @@
1
+ #
2
+ # Copyright (c) 2014 SoftLayer Technologies, Inc. All rights reserved.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+
23
+ module SoftLayer
24
+ #
25
+ # VirtualServerOrder orders virtual servers using SoftLayer_Virtual_Guest::createObject.
26
+ #
27
+ # http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest/createObject
28
+ #
29
+ # +createObject+ allows you to order a virtual server by providing
30
+ # a simple set of attributes and allows you to avoid much of the
31
+ # complexity of the SoftLayer ordering system (see ProductPackage)
32
+ #
33
+ class VirtualServerOrder
34
+ #--
35
+ # Required Attributes
36
+ # -------------------
37
+ # The following attributes are required in order to successfully order
38
+ # a virtual server
39
+ #++
40
+
41
+ # String, short name of the data center that will house the new virtual server (e.g. "dal05" or "sea01")
42
+ # Corresponds to +datacenter.name+ in the documentation for createObject. If not provided, the server will
43
+ # be provisioned in the first available data center.
44
+ attr_accessor :datacenter
45
+
46
+ # String, The hostname to assign to the new server
47
+ attr_accessor :hostname
48
+
49
+ # String, The domain (i.e. softlayer.com) for the new server
50
+ attr_accessor :domain
51
+
52
+ # Integer, The number of virtual CPU cores to include in the instance
53
+ # Corresponds to +startCpus+ in the documentation for +createObject+
54
+ attr_accessor :cores
55
+
56
+ # Integer, The amount of RAM for the new server (specified in Gigabytes so a value of 4 is 4GB)
57
+ # Corresponds to +maxMemory+ in the documentation for +createObject+
58
+ attr_accessor :memory
59
+
60
+ #--
61
+ # These two options are mutually exclusive, but one or the other must be provided.
62
+ # If you provide both, the image_global_id will be added to the order and the os_reference_code will be ignored
63
+ #++
64
+
65
+ # String, An OS reference code for the operating system to install on the virtual server
66
+ # Corresponds to +operatingSystemReferenceCode+ in the +createObject+ documentation
67
+ attr_accessor :os_reference_code
68
+
69
+ # String, The globalIdentifier of a disk image to put on the newly created server
70
+ # Corresponds to +blockDeviceTemplateGroup.globalIdentifier+ in the +createObject+ documentation
71
+ attr_accessor :image_global_id
72
+
73
+ #--
74
+ # Optional attributes
75
+ #++
76
+
77
+ # Boolean, If true, the virtual server will reside only on hosts with instances from this same account
78
+ # Corresponds to +dedicatedAccountHostOnlyFlag+ in the +createObject+ documentation
79
+ attr_accessor :dedicated_host_only
80
+
81
+ # Array of Integer, Sizes (in gigabytes... so use 25 to get a 25GB disk) of disks to attach to this server
82
+ # This roughly Corresponds to +blockDevices+ field in the +createObject+ documentation.
83
+ # This attribute only allows you to configure the size of disks while +blockDevices+ allows
84
+ # more configuration options
85
+ attr_accessor :disks
86
+
87
+ # Boolean, If true, an hourly server will be ordered, otherwise a monthly server will be ordered
88
+ # Corresponds to +hourlyBillingFlag+ in the +createObject+ documentation
89
+ attr_accessor :hourly
90
+
91
+ # Integer, The maximum network interface card speed (in Mbps) for the new instance
92
+ # Corresponds to +networkComponents.maxSpeed+ in the +createObject+ documentation
93
+ attr_accessor :max_port_speed
94
+
95
+ # Boolean, If true then the virtual server will only have a private network interface (and no public network interface)
96
+ # Corresponds to +userData.value+ in the +createObject+ documentation
97
+ attr_accessor :private_network_only
98
+
99
+ # Integer, The id of the private VLAN this server should join
100
+ # Corresponds to +primaryBackendNetworkComponent.networkVlan.id+ in the +createObject+ documentation
101
+ attr_accessor :private_vlan_id
102
+
103
+ # String, The URI of a post provisioning script to run on this server once it is created
104
+ attr_accessor :provision_script_URI
105
+
106
+ # Integer, The id of the public VLAN this server should join
107
+ # Corresponds to +primaryNetworkComponent.networkVlan.id+ in the +createObject+ documentation
108
+ attr_accessor :public_vlan_id
109
+
110
+ # Array of Strings, SSH keys to add to the root user's account.
111
+ # Corresponds to +sshKeys+ in the +createObject+ documentation
112
+ attr_accessor :ssh_key_ids
113
+
114
+ # Boolean, If true the server will use a virtual hard drive, if false, data will be stored on a SAN disk
115
+ # Corresponds to +localDiskFlag+ in the +createObject+ documentation
116
+ attr_accessor :use_local_disk
117
+
118
+ # String, User metadata associated with the instance
119
+ # Corresponds to +primaryBackendNetworkComponent.networkVlan.id+ in the +createObject+ documentation
120
+ attr_accessor :user_metadata
121
+
122
+ # Create a new order that works thorugh the given client connection
123
+ def initialize (client = nil)
124
+ @softlayer_client = client || Client.default_client
125
+ raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !@softlayer_client
126
+ end
127
+
128
+ # Calls the SoftLayer API to verify that the template provided by this order is valid
129
+ # This routine will return the order template generated by the API or will throw an exception
130
+ #
131
+ # This routine will not actually create a Virtual Server and will not affect billing.
132
+ #
133
+ # If you provide a block, it will receive the order template as a parameter and it
134
+ # should return the order template you wish to forward to the server.
135
+ def verify()
136
+ order_template = virtual_guest_template
137
+ order_template = yield order_template if block_given?
138
+
139
+ @softlayer_client["Virtual_Guest"].generateOrderTemplate(order_template)
140
+ end
141
+
142
+ # Calls the SoftLayer API to place an order for a new virtual server based on the template in this
143
+ # order. If this succeeds then you will be billed for the new Virtual Server.
144
+ #
145
+ # If you provide a block, it will receive the order template as a parameter and
146
+ # should return an order template, **carefully** modified, that will be
147
+ # sent to create the server
148
+ def place_order!()
149
+ order_template = virtual_guest_template
150
+ order_template = yield order_template if block_given?
151
+
152
+ virtual_server_hash = @softlayer_client["Virtual_Guest"].createObject(order_template)
153
+ SoftLayer::VirtualServer.server_with_id(virtual_server_hash["id"], :client => @softlayer_client) if virtual_server_hash
154
+ end
155
+
156
+ protected
157
+
158
+ # Returns a hash of the creation options formatted to be sent to
159
+ # the SoftLayer API for either verification or completion
160
+ def virtual_guest_template
161
+ template = {
162
+ "startCpus" => @cores.to_i,
163
+ "maxMemory" => @memory.to_i * 1024, # we let the user specify memory in GB, but the API expects maxMemory in MB.
164
+ "hostname" => @hostname,
165
+ "domain" => @domain,
166
+
167
+ # Note : for the values below, we want to use the constants "true" and "false" not nil
168
+ # the nil value (while false to Ruby) will not translate to XML properly
169
+ "localDiskFlag" => !!@use_local_disk,
170
+ "hourlyBillingFlag" => !!@hourly
171
+ }
172
+
173
+ template["dedicatedAccountHostOnlyFlag"] = true if @dedicated_host_only
174
+ template["privateNetworkOnlyFlag"] = true if @private_network_only
175
+
176
+ template["datacenter"] = {"name" => @datacenter} if @datacenter
177
+ template['userData'] = [{'value' => @user_metadata}] if @user_metadata
178
+ template['networkComponents'] = [{'maxSpeed'=> @max_port_speed}] if @max_port_speed
179
+ template['postInstallScriptUri'] = @provision_script_URI.to_s if @provision_script_URI
180
+ template['sshKeys'] = @ssh_key_ids.collect { |ssh_key_id| {'id'=> ssh_key_id.to_i } } if @ssh_key_ids
181
+ template['primaryNetworkComponent'] = { "networkVlan" => { "id" => @public_vlan_id.to_i } } if @public_vlan_id
182
+ template["primaryBackendNetworkComponent"] = { "networkVlan" => {"id" => @private_vlan_id.to_i } } if @private_vlan_id
183
+
184
+ if @image_global_id
185
+ template["blockDeviceTemplateGroup"] = {"globalIdentifier" => @image_global_id}
186
+ elsif @os_reference_code
187
+ template["operatingSystemReferenceCode"] = @os_reference_code
188
+ end
189
+
190
+ if @disks && !@disks.empty?
191
+ template['blockDevices'] = []
192
+
193
+ # According to the documentation for +createObject+,
194
+ # device number 1 is reserved for the SWAP disk of the computing instance.
195
+ # So we assign device 0 and then assign the rest starting at index 2.
196
+ @disks.each_with_index do |disk, index|
197
+ device_id = (index >= 1) ? index + 1 : index
198
+ template['blockDevices'].push({"device" => "#{device_id}", "diskImage" => {"capacity" => disk}})
199
+ end
200
+ end
201
+
202
+ template
203
+ end
204
+
205
+ ##
206
+ # The first time this is called it requests SoftLayer_Virtual_Guest::getCreateObjectOptions:
207
+ # from the API and remembers the result. On subsequent calls it returns the remembered result.
208
+ #
209
+ # http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest/getCreateObjectOptions
210
+ #
211
+ def self.create_object_options(client = nil)
212
+ softlayer_client = client || Client.default_client
213
+ raise "#{__method__} requires a client but none was given and Client::default_client is not set" if !softlayer_client
214
+
215
+ @@create_object_options ||= nil
216
+ @@create_object_options = softlayer_client["Virtual_Guest"].getCreateObjectOptions() if !@@create_object_options
217
+ @@create_object_options
218
+ end
219
+
220
+ #--
221
+ # The following routines offer a way to query the SoftLayer API for values that are
222
+ # valid in some of the fields of a Virtual Server order. While the individual values
223
+ # returned are all valid, it is still possible to create combinations of values which
224
+ # the ordering system cannot accept.
225
+ #++
226
+
227
+ ##
228
+ # Return a list of values that are valid for the :datacenter attribute
229
+ def self.datacenter_options(client = nil)
230
+ create_object_options(client)["datacenters"].collect { |datacenter_spec| datacenter_spec['template']['datacenter']["name"] }.uniq.sort!
231
+ end
232
+
233
+ ##
234
+ # Return a list of values that are valid for the :cores attribute
235
+ def self.core_options(client = nil)
236
+ create_object_options(client)["processors"].collect { |processor_spec| processor_spec['template']['startCpus'] }.uniq.sort!
237
+ end
238
+
239
+ ##
240
+ # Return a list of values that are valid for the :memory attribute
241
+ def self.memory_options(client = nil)
242
+ create_object_options(client)["memory"].collect { |memory_spec| memory_spec['template']['maxMemory'].to_i / 1024}.uniq.sort!
243
+ end
244
+
245
+ ##
246
+ # Return a list of values that are valid the array given to the :disks
247
+ def self.disk_options(client = nil)
248
+ create_object_options(client)["blockDevices"].collect { |block_device_spec| block_device_spec['template']['blockDevices'][0]['diskImage']['capacity']}.uniq.sort!
249
+ end
250
+
251
+ ##
252
+ # Returns a list of the valid :os_refrence_codes
253
+ def self.os_reference_code_options(client = nil)
254
+ create_object_options(client)["operatingSystems"].collect { |os_spec| os_spec['template']['operatingSystemReferenceCode'] }.uniq.sort!
255
+ end
256
+
257
+ ##
258
+ # Returns a list of the :max_port_speeds
259
+ def self.max_port_speed_options(client = nil)
260
+ create_object_options(client)["networkComponents"].collect { |component_spec| component_spec['template']['networkComponents'][0]['maxSpeed'] }
261
+ end
262
+ end # class VirtualServerOrder
263
+ end # module SoftLayer
@@ -22,16 +22,16 @@
22
22
 
23
23
  require 'rubygems'
24
24
 
25
- # This module is used to provide a namespace for SoftLayer code. It also declares a number of
25
+ # This module is used to provide a namespace for SoftLayer code. It also declares a number of
26
26
  # global variables:
27
- # - <tt>$SL_API_USERNAME</tt> - The default username passed by clients to the server for authentication.
27
+ # - +$SL_API_USERNAME+ - The default username passed by clients to the server for authentication.
28
28
  # Set this if you want to use the same username for all clients and don't want to have to specify it when the client is created
29
- # - <tt>$SL_API_KEY</tt> - The default API key passed by clients to the server for authentication.
29
+ # - +$SL_API_KEY+ - The default API key passed by clients to the server for authentication.
30
30
  # Set this if you want to use the same api for all clients and don't want to have to specify it when the client is created
31
- # - <tt>$SL_API_BASE_URL</tt>- The default URL used to access the SoftLayer API. This defaults to the value of <tt>SoftLayer::API_PUBLIC_ENDPOINT</tt>
31
+ # - +$SL_API_BASE_URL+- The default URL used to access the SoftLayer API. This defaults to the value of +SoftLayer::API_PUBLIC_ENDPOINT+
32
32
  #
33
33
  module SoftLayer
34
- VERSION = "2.0.1" # version history in the CHANGELOG.textile file at the root of the source
34
+ VERSION = "2.1.0" # version history in the CHANGELOG.textile file at the root of the source
35
35
 
36
36
  # The base URL of the SoftLayer API's REST-like endpoints available to the public internet.
37
37
  API_PUBLIC_ENDPOINT = 'https://api.softlayer.com/xmlrpc/v3/'
@@ -43,12 +43,12 @@ module SoftLayer
43
43
  # These globals can be used to simplify client creation
44
44
  #
45
45
 
46
- # Set this if you want to provide a default username for each service as it is created.
47
- # usernames provided to the service initializer will override the global
46
+ # Set this if you want to provide a default username for each client as it is created.
47
+ # usernames provided to the client initializer will override the global
48
48
  $SL_API_USERNAME = nil
49
49
 
50
- # Set this if you want to provide a default api_key for each service as it is
51
- # created. API keys provided in the constructor when a service is created will
50
+ # Set this if you want to provide a default api_key for each client as it is
51
+ # created. API keys provided in the constructor when a client is created will
52
52
  # override the values in this global
53
53
  $SL_API_KEY = nil
54
54
 
@@ -20,12 +20,17 @@
20
20
  # THE SOFTWARE.
21
21
  #
22
22
 
23
- # Ruby Hash Class
23
+ ##
24
+ # This extension to the Hash class to allows object masks to be constructed
25
+ # from built-in Ruby types and converted to object masks strings for presentation
26
+ # to the SoftLayer API
24
27
  class Hash
25
- def __valid_root_property_key?(key_string)
26
- return key_string == "mask" || (0 == (key_string =~ /\Amask\([a-z][a-z0-9_]*\)\z/i))
27
- end
28
-
28
+ # Given a hash, generate an Object Mask string from the structure
29
+ # found within the hash. This allows object masks to be constructed
30
+ # as hashes, then converted to strings when they must be passed
31
+ # to the API. The routine does some very rudimentary validation to
32
+ # ensure that the hash represents a valid object mask, but care must
33
+ # still be taken when constructing the hash.
29
34
  def to_sl_object_mask()
30
35
  raise RuntimeError, "An object mask must contain properties" if empty?
31
36
  raise RuntimeError, "An object mask must start with root properties" if keys().find { |key| !__valid_root_property_key?(key) }
@@ -34,25 +39,34 @@ class Hash
34
39
  key_strings.count > 1 ? "[#{key_strings.join(',')}]" : "#{key_strings[0]}"
35
40
  end
36
41
 
37
- def to_sl_object_mask_property()
42
+ # Returns a string representing the hash as a property within a larger
43
+ # object mask. This routine is an implementation detail used in the conversion
44
+ # of hashes to object mask strings. You should not have to call this method directly.
45
+ def _to_sl_object_mask_property()
38
46
  key_strings = __sl_object_mask_properties_for_keys();
39
47
  "#{key_strings.join(',')}"
40
48
  end
41
49
 
50
+ private
51
+
52
+ def __valid_root_property_key?(key_string)
53
+ return key_string == "mask" || (0 == (key_string =~ /\Amask\([a-z][a-z0-9_]*\)\z/i))
54
+ end
55
+
42
56
  def __sl_object_mask_properties_for_keys
43
57
  key_strings = [];
44
58
 
45
59
  each do |key, value|
46
60
  return "" if !value
47
61
 
48
- string_for_key = key.to_sl_object_mask_property
62
+ string_for_key = key._to_sl_object_mask_property
49
63
 
50
64
  if value.kind_of?(String) || value.kind_of?(Symbol) then
51
- string_for_key = "#{string_for_key}.#{value.to_sl_object_mask_property}"
65
+ string_for_key = "#{string_for_key}.#{value._to_sl_object_mask_property}"
52
66
  end
53
67
 
54
68
  if value.kind_of?(Array) || value.kind_of?(Hash) then
55
- value_string = value.to_sl_object_mask_property
69
+ value_string = value._to_sl_object_mask_property
56
70
  if value_string && !value_string.empty?
57
71
  string_for_key = "#{string_for_key}[#{value_string}]"
58
72
  end
@@ -65,30 +79,44 @@ class Hash
65
79
  end
66
80
  end
67
81
 
68
- # Ruby Array Class
82
+ ##
83
+ # SoftLayer Extensions to the Array class to support using arrays to create
84
+ # object masks
69
85
  class Array
70
86
  # Returns a string representing the object mask content represented by the
71
87
  # Array. Each value in the array is converted to its object mask eqivalent
72
- def to_sl_object_mask_property()
88
+ # This routine is an implementation detail used in the conversion of hashes
89
+ # to object mask strings. You should not have to call this method directly.
90
+ def _to_sl_object_mask_property()
73
91
  return "" if self.empty?
74
- property_content = map { |item| item.to_sl_object_mask_property() }.flatten.join(",")
92
+ property_content = map { |item| item ? item._to_sl_object_mask_property() : nil }.compact.flatten.join(",")
75
93
  "#{property_content}"
76
94
  end
77
95
  end
78
96
 
79
- # Ruby String Class
97
+ ##
98
+ # SoftLayer Extensions to the String class to support using strings to create
99
+ # object masks
80
100
  class String
81
101
  # Returns a string representing the object mask content represented by the
82
- # String. Strings are simply represented as copies of themselves. We make
102
+ # String. Strings are simply represented as copies of themselves. We make
83
103
  # a copy in case the original String is modified somewhere along the way
84
- def to_sl_object_mask_property()
104
+ # This routine is an implementation detail used in the conversion of hashes
105
+ # to object mask strings. You should not have to call this method directly.
106
+ def _to_sl_object_mask_property()
85
107
  return self.strip
86
108
  end
87
109
  end
88
110
 
89
- # Ruby Symbol Class
111
+ ##
112
+ # SoftLayer Extensions to the Symbol class to support using symbols to create
113
+ # object masks
90
114
  class Symbol
91
- def to_sl_object_mask()
92
- self.to_s.to_sl_object_mask()
115
+ # Converts the Symbol to a string, then converts the string to an
116
+ # object mask property. This routine is an implementation detail used in
117
+ # the conversion of hashes to object mask strings. You should not have to
118
+ # call this method directly.
119
+ def _to_sl_object_mask_property()
120
+ self.to_s._to_sl_object_mask_property()
93
121
  end
94
122
  end
@@ -24,7 +24,22 @@ require 'softlayer/base'
24
24
  require 'softlayer/object_mask_helpers'
25
25
  require 'softlayer/APIParameterFilter'
26
26
  require 'softlayer/ObjectFilter'
27
+ require 'softlayer/ObjectMaskParser'
27
28
  require 'softlayer/Config'
28
29
 
29
30
  require 'softlayer/Client'
30
31
  require 'softlayer/Service'
32
+
33
+ # model classes
34
+ require 'softlayer/ModelBase'
35
+ require 'softlayer/DynamicAttribute'
36
+ require 'softlayer/Account'
37
+ require 'softlayer/Ticket'
38
+ require 'softlayer/Server'
39
+ require 'softlayer/BareMetalServer'
40
+ require 'softlayer/BareMetalServerOrder'
41
+ require 'softlayer/BareMetalServerOrder_Package'
42
+ require 'softlayer/ProductPackage'
43
+ require 'softlayer/ProductItemCategory'
44
+ require 'softlayer/VirtualServer'
45
+ require 'softlayer/VirtualServerOrder'
metadata CHANGED
@@ -1,75 +1,89 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: softlayer_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
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-05-27 00:00:00.000000000 Z
11
+ date: 2014-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: configparser
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.1.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.1.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rdoc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.4.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 2.4.2
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: json
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ~>
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
75
  version: '1.8'
62
- - - ! '>='
76
+ - - ">="
63
77
  - !ruby/object:Gem::Version
64
78
  version: 1.8.1
65
79
  type: :development
66
80
  prerelease: false
67
81
  version_requirements: !ruby/object:Gem::Requirement
68
82
  requirements:
69
- - - ~>
83
+ - - "~>"
70
84
  - !ruby/object:Gem::Version
71
85
  version: '1.8'
72
- - - ! '>='
86
+ - - ">="
73
87
  - !ruby/object:Gem::Version
74
88
  version: 1.8.1
75
89
  description: The softlayer_api gem offers a convenient mechanism for invoking the
@@ -79,17 +93,37 @@ executables: []
79
93
  extensions: []
80
94
  extra_rdoc_files: []
81
95
  files:
96
+ - CHANGELOG.textile
82
97
  - LICENSE.textile
83
98
  - README.textile
84
99
  - examples/account_info.rb
100
+ - examples/account_servers.rb
85
101
  - examples/create_ticket.rb
86
102
  - examples/open_tickets.rb
103
+ - examples/order_bare_metal_package.rb
104
+ - examples/order_virtual_server.rb
87
105
  - examples/ticket_info.rb
88
106
  - lib/softlayer/APIParameterFilter.rb
107
+ - lib/softlayer/Account.rb
108
+ - lib/softlayer/BareMetalServer.rb
109
+ - lib/softlayer/BareMetalServerOrder.rb
110
+ - lib/softlayer/BareMetalServerOrder_Package.rb
89
111
  - lib/softlayer/Client.rb
90
112
  - lib/softlayer/Config.rb
113
+ - lib/softlayer/DynamicAttribute.rb
114
+ - lib/softlayer/ModelBase.rb
91
115
  - lib/softlayer/ObjectFilter.rb
116
+ - lib/softlayer/ObjectMaskParser.rb
117
+ - lib/softlayer/ObjectMaskProperty.rb
118
+ - lib/softlayer/ObjectMaskToken.rb
119
+ - lib/softlayer/ObjectMaskTokenizer.rb
120
+ - lib/softlayer/ProductItemCategory.rb
121
+ - lib/softlayer/ProductPackage.rb
122
+ - lib/softlayer/Server.rb
92
123
  - lib/softlayer/Service.rb
124
+ - lib/softlayer/Ticket.rb
125
+ - lib/softlayer/VirtualServer.rb
126
+ - lib/softlayer/VirtualServerOrder.rb
93
127
  - lib/softlayer/base.rb
94
128
  - lib/softlayer/object_mask_helpers.rb
95
129
  - lib/softlayer_api.rb
@@ -103,12 +137,12 @@ require_paths:
103
137
  - lib
104
138
  required_ruby_version: !ruby/object:Gem::Requirement
105
139
  requirements:
106
- - - ! '>='
140
+ - - ">="
107
141
  - !ruby/object:Gem::Version
108
- version: '0'
142
+ version: 1.9.2
109
143
  required_rubygems_version: !ruby/object:Gem::Requirement
110
144
  requirements:
111
- - - ! '>='
145
+ - - ">="
112
146
  - !ruby/object:Gem::Version
113
147
  version: '0'
114
148
  requirements: []