fog-softlayer 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MWMzMWI0MTk1OTA5MTA1ZDc1MmFlMDVmYzA4MjM1MzNmODAyOGYxZQ==
5
+ data.tar.gz: !binary |-
6
+ MjQwYjI3YmEzNmNkMWNiMWU0NWY3ZDM4NDViOTI5MWZlZmEyZDVlNg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MWNlNTM4Mzk4N2ZkMjZmY2QxMzdlODdlYzdlMGZkOWYxMDU3NDEyMGU3MmVm
10
+ ZmI3OTVjZWQ4MzQ5ZGY1ZjZjMTNhYjQ0ZGM3YTM3MWQwZGExMjdhY2I5OWJj
11
+ OTU3YzFmNDZlOGIxZGJiYzdkOTMwNjY2MDdiY2IyY2QzYWFmZWQ=
12
+ data.tar.gz: !binary |-
13
+ NjIxNWNkZWM5ZTMzOWI3MjhkY2E2OGYzZTkwMWQzZTM2Yjk3ZjM0MjU1ZjBj
14
+ OTM0NDc3MTllZjliZjExODczM2EwM2FiZGJiN2JlNGM0MzEyNzI5NWU5ZWM5
15
+ MzQwYjQ5NzY2NGQwNzM2ZDZhOTk4OTJhODI0NmMxOGQzMmM4Mjg=
@@ -18,34 +18,42 @@ module Fog
18
18
 
19
19
  # Excon connection settings
20
20
  recognizes :softlayer_api_url
21
+ recognizes :softlayer_default_domain
21
22
 
22
- #model_path 'fog/softlayer/models/compute'
23
- #collection :servers
24
- #model :server
25
- #collection :bare_metal_servers
26
- #model :bare_metal_server
27
- #collection :global_ipv4s
28
- #model :global_ipv4
29
- #collection :images
30
- #model :image
31
- #
32
23
 
33
24
  service = File.basename(__FILE__, '.rb')
34
25
 
35
- path = "fog/softlayer/requests/#{service}"
36
- request_path path
26
+ model_path 'fog/softlayer/models/compute'
27
+ Fog::Softlayer.loader("models/#{service}") do |basename|
28
+ if basename =~ /s$/
29
+ collection basename
30
+ else
31
+ model basename
32
+ end
33
+
34
+ end
37
35
 
38
- Fog::Softlayer.load_requests(service) do |r|
39
- request r
36
+ request_path "fog/softlayer/requests/#{service}"
37
+ Fog::Softlayer.loader("requests/#{service}") do |basename|
38
+ request basename
40
39
  end
41
40
 
42
41
 
42
+
43
43
  # The Mock Service allows you to run a fake instance of the Service
44
44
  # which makes no real connections.
45
45
  #
46
46
  #
47
47
  class Mock
48
+ attr_accessor :default_domain
48
49
  include Fog::Softlayer::Compute::Shared
50
+ attr_accessor :virtual_guests, :bare_metal_servers
51
+
52
+ def initialize(args)
53
+ @virtual_guests = []
54
+ @bare_metal_servers = []
55
+ super(args)
56
+ end
49
57
 
50
58
  def request(method, path, expected_responses, parameters = {})
51
59
  _request
@@ -59,12 +67,17 @@ module Fog
59
67
  raise Fog::Errors::MockNotImplemented
60
68
  end
61
69
 
70
+ def list_servers
71
+ (self.get_vms.body << self.get_bare_metal_servers.body).flatten
72
+ end
73
+
62
74
  end
63
75
 
64
76
  ##
65
77
  # Makes real connections to Softlayer.
66
78
  #
67
79
  class Real
80
+ attr_accessor :default_domain
68
81
  include Fog::Softlayer::Compute::Shared
69
82
 
70
83
  # Sends the real request to the real SoftLayer service.
@@ -95,12 +108,15 @@ module Fog
95
108
  set_sl_service(service)
96
109
  # set the request path (known as the "method" in SL docs)
97
110
  set_sl_path(path)
111
+ # set the query params if any
112
+
98
113
 
99
114
  # build request params
100
115
  params = { :headers => user_agent_header }
101
116
  params[:headers]['Content-Type'] = 'application/json'
102
- params[:expects] = [200,201]
117
+ params[:expects] = options[:expected] || [200,201]
103
118
  params[:body] = Fog::JSON.encode({:parameters => [ options[:body] ]}) unless options[:body].nil?
119
+ params[:query] = options[:query] unless options[:query].nil?
104
120
 
105
121
  # initialize connection object
106
122
  @connection = Fog::Core::Connection.new(@request_url, false, params)
@@ -113,6 +129,10 @@ module Fog
113
129
  response
114
130
  end
115
131
 
132
+ def list_servers
133
+ (self.get_vms.body << self.get_bare_metal_servers.body).flatten
134
+ end
135
+
116
136
  private
117
137
 
118
138
  def credentialize_url(username, apikey)
@@ -27,6 +27,7 @@ module Fog
27
27
  def initialize(options)
28
28
  @api_url = options[:softlayer_api_url] || API_URL
29
29
  @credentials = { :username => options[:softlayer_username], :api_key => options[:softlayer_api_key] }
30
+ @default_domain = options[:softlayer_default_domain]
30
31
  end
31
32
 
32
33
  def self.valid_request?(required, passed)
@@ -10,8 +10,8 @@ module Fog
10
10
 
11
11
  service(:compute, 'Compute')
12
12
 
13
- def self.load_requests(service)
14
- path = "providers/softlayer/lib/fog/softlayer/requests/#{service}"
13
+ def self.loader(service)
14
+ path = "providers/softlayer/lib/fog/softlayer/#{service}"
15
15
  Dir.entries(path).reject{|e| e =~ /^\./}.each do |file|
16
16
  _request = File.basename(file, '.rb')
17
17
  yield _request.to_sym
@@ -0,0 +1,26 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ require 'fog/core/model'
8
+
9
+ module Fog
10
+ module Compute
11
+ class Softlayer
12
+
13
+ class Flavor < Fog::Model
14
+
15
+ identity :id
16
+
17
+ attribute :cpu
18
+ attribute :disk
19
+ attribute :name
20
+ attribute :ram
21
+
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,100 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ require 'fog/core/collection'
8
+ require 'fog/softlayer/models/compute/flavor'
9
+
10
+ module Fog
11
+ module Compute
12
+ class Softlayer
13
+
14
+ ## SoftLayer doesn't actually have "flavors", these are just for portability/convenience,
15
+ # they map directly to OpenStack defaults.
16
+
17
+
18
+ # :cores => number of virtual CPUs presented
19
+ # :disk => size in GB of the virtual root disk
20
+ # :ram => virtual machine memory in MB
21
+ FLAVORS = [
22
+ {
23
+ :id => 'm1.tiny',
24
+ :name => 'Tiny Instance',
25
+ :cpu => 2,
26
+ :disk => [{'device' => 0, 'diskImage' => {'capacity' => 25 } }],
27
+ :ram => 1024
28
+ },
29
+ {
30
+ :id => 'm1.small',
31
+ :name => 'Small Instance',
32
+ :cpu => 2,
33
+ :disk => [{'device' => 0, 'diskImage' => {'capacity' => 100 } }],
34
+ :ram => 2048
35
+ },
36
+ {
37
+ :id => 'm1.medium',
38
+ :name => 'Medium Instance',
39
+ :cpu => 4,
40
+ :disk => [{'device' => 0, 'diskImage' => {'capacity' => 500 } }],
41
+ :ram => 4096
42
+ },
43
+ {
44
+ :id => 'm1.large',
45
+ :name => 'Large Instance',
46
+ :cpu => 8,
47
+ :disk => [{'device' => 0, 'diskImage' => {'capacity' => 750 } }],
48
+ :ram => 8192
49
+ },
50
+ {
51
+ :id => 'm1.xlarge',
52
+ :name => 'Extra Large Instance',
53
+ :cpu => 16,
54
+ :disk => [{'device' => 0, 'diskImage' => {'capacity' => 1000 } }],
55
+ :ram => 16384
56
+ }
57
+ ]
58
+
59
+ class Flavors < Fog::Collection
60
+
61
+ model Fog::Compute::Softlayer::Flavor
62
+
63
+ # Returns an array of all flavors that have been created
64
+ #
65
+ # Fog::Softlayer.flavors.all
66
+ def all
67
+ load(Fog::Compute::Softlayer::FLAVORS)
68
+ self
69
+ end
70
+
71
+ # Used to retrieve a flavor
72
+ # flavor_id is required to get the associated flavor information.
73
+ # flavors available currently:
74
+ #
75
+ # m1.tiny
76
+ #
77
+ # You can run the following command to get the details:
78
+ # Softlayer.flavors.get("m1.tiny")
79
+ #
80
+ # ==== Returns
81
+ #
82
+ #>> Softlayer.flavors.get("m1.tiny")
83
+ # <Fog::Softlayer::Compute::Flavor
84
+ # id="m1.tiny",
85
+ # cores=1,
86
+ # disk=160,
87
+ # name="Tiny Instance",
88
+ # ram=1024
89
+ # >
90
+ #
91
+
92
+ def get(flavor_id)
93
+ self.class.new(:service => service).all.detect {|flavor| flavor.id == flavor_id}
94
+ end
95
+
96
+ end
97
+
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,29 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ require 'fog/core/model'
8
+
9
+ module Fog
10
+ module Compute
11
+ class Softlayer
12
+
13
+ class Image < Fog::Model
14
+
15
+ identity :id, :aliases => 'globalIdentifier'
16
+ attribute :name
17
+ attribute :note
18
+ attribute :parent_id, :aliases => 'parentId'
19
+ attribute :pulic_flag, :aliases => 'publicFlag'
20
+ attribute :status_id, :aliases => 'statusId'
21
+ attribute :summary
22
+ attribute :transaction_id, :aliases => 'transactionId'
23
+ attribute :user_record_id, :aliases => 'userRecordId'
24
+
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ require 'fog/core/collection'
8
+ require 'fog/softlayer/models/compute/image'
9
+
10
+ module Fog
11
+ module Compute
12
+ class Softlayer
13
+
14
+ class Images < Fog::Collection
15
+
16
+ model Fog::Compute::Softlayer::Image
17
+
18
+ # Returns an array of all public images.
19
+ #
20
+ # Fog::Softlayer.images.all
21
+ def all
22
+ load(service.request(:virtual_guest_block_device_template_group, :get_public_images).body)
23
+ self
24
+ end
25
+
26
+ # Used to retrieve an image
27
+ def get(uuid)
28
+ self.class.new(:service => service).all.detect {|image| image.id == uuid}
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,252 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ require 'fog/compute/models/server'
8
+
9
+ module Fog
10
+ module Compute
11
+ class Softlayer
12
+
13
+ class Server < Fog::Compute::Server
14
+
15
+ identity :id
16
+ attribute :name, :aliases => 'hostname'
17
+ attribute :domain
18
+ attribute :fqdn, :aliases => 'fullyQualifiedDomainName'
19
+ attribute :cpu, :aliases => ['startCpus', 'processorCoreAmount']
20
+ attribute :ram, :aliases => ['maxMemory', 'memory']
21
+ attribute :disk, :aliases => ['blockDevices','hardDrives'], :type => :squash
22
+ attribute :private_ip, :aliases => 'primaryBackendIpAddress'
23
+ attribute :public_ip, :aliases => 'primaryIpAddress'
24
+ attribute :flavor_id
25
+ attribute :bare_metal, :aliases => 'bareMetalInstanceFlag'
26
+ attribute :os_code, :aliases => 'operatingSystemReferenceCode'
27
+ attribute :image_id, :type => :squash
28
+ attribute :ephemeral_storage, :aliases => 'localDiskFlag'
29
+
30
+ # Times
31
+ attribute :created_at, :aliases => ['createDate', 'provisionDate'], :type => :time
32
+ attribute :last_verified_date, :aliases => 'lastVerifiedDate', :type => :time
33
+ attribute :metric_poll_date, :aliases => 'metricPollDate', :type => :time
34
+ attribute :modify_date, :aliases => 'modifyDate', :type => :time
35
+
36
+ # Metadata
37
+ attribute :account_id, :aliases => 'accountId', :type => :integer
38
+ attribute :datacenter
39
+ attribute :single_tenant, :aliases => 'dedicatedAccountHostOnlyFlag'
40
+ attribute :global_identifier, :aliases => 'globalIdentifier'
41
+ attribute :hourly_billing_flag, :aliases => 'hourlyBillingFlag'
42
+
43
+
44
+ def initialize(attributes = {})
45
+ super(attributes)
46
+ set_defaults
47
+ end
48
+
49
+ def bare_metal?
50
+ bare_metal
51
+ end
52
+
53
+ def bare_metal=(set)
54
+ attributes[:bare_metal] = case set
55
+ when true, 'true', 1
56
+ 1
57
+ when false, 'false', 0, nil
58
+ 0
59
+ else
60
+ raise ArgumentError, ":bare_metal cannot be #{set.class}"
61
+ end
62
+ end
63
+
64
+ def bare_metal
65
+ attributes[:bare_metal] === 1 ? true : false
66
+ end
67
+
68
+ def image_id=(uuid)
69
+ attributes[:image_id] = {:globalIdentifier => uuid}
70
+ end
71
+
72
+ def image_id
73
+ attributes[:image_id][:globalIdentifier] unless attributes[:image_id].nil?
74
+ end
75
+
76
+ def ram=(set)
77
+ if set.is_a?(Array) and set.first['hardwareComponentModel']
78
+ set = 1024 * set.first['hardwareComponentModel']['capacity'].to_i
79
+ end
80
+ attributes[:ram] = set
81
+ end
82
+
83
+ def name=(set)
84
+ attributes[:hostname] = set
85
+ end
86
+
87
+ def name
88
+ attributes[:hostname]
89
+ end
90
+
91
+ #def ram
92
+ #
93
+ #end
94
+
95
+ def snapshot
96
+ # TODO: implement
97
+ end
98
+
99
+ def reboot(use_hard_reboot = true)
100
+ # TODO: implement
101
+ end
102
+
103
+ def start
104
+ # TODO: implement
105
+
106
+ #requires :identity
107
+ #service.start_server(identity)
108
+ true
109
+ end
110
+
111
+ def stop
112
+ # TODO: implement
113
+ end
114
+
115
+ def shutdown
116
+ # TODO: implement
117
+ end
118
+
119
+ def destroy
120
+ requires :id
121
+ request = bare_metal? ? :delete_bare_metal_server : :delete_vm
122
+ response = service.send(request, self.id)
123
+ response.body
124
+ end
125
+
126
+ # Returns the public DNS name of the server
127
+ #
128
+ # @return [String]
129
+ #
130
+ def dns_name
131
+ fqdn
132
+ end
133
+
134
+ def state
135
+ if bare_metal?
136
+ service.request(:hardware_server, "#{id}/getServerPowerState").body
137
+ else
138
+ service.request(:virtual_guest, "#{id}/getPowerState").body['name']
139
+ end
140
+
141
+ end
142
+
143
+ def ready?
144
+ if bare_metal?
145
+ state == "on"
146
+ else
147
+ state == "Running"
148
+ end
149
+ end
150
+
151
+ # Creates server
152
+ # * requires attributes: :name, :domain, and :flavor_id OR (:cpu_count && :ram && :disks)
153
+ #
154
+ # @note You should use servers.create to create servers instead calling this method directly
155
+ #
156
+ # * State Transitions
157
+ # * BUILD -> ACTIVE
158
+ # * BUILD -> ERROR (on error)
159
+ def save
160
+ raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
161
+
162
+ data = if bare_metal?
163
+ pre_save
164
+ service.create_bare_metal_server(attributes).body
165
+ else
166
+ pre_save
167
+ service.create_vm(attributes).body
168
+ end
169
+ merge_attributes(data.first)
170
+ true
171
+ end
172
+
173
+ def pre_save
174
+ extract_flavor
175
+ validate_attributes
176
+ remap_attributes(attributes, attributes_mapping)
177
+ clean_attributes
178
+ end
179
+
180
+ private
181
+
182
+ ##
183
+ # Generate mapping for use with remap_attributes
184
+ def attributes_mapping
185
+ common = {
186
+ :hourly_billing_flag => :hourlyBillingFlag,
187
+ :os_code => :operatingSystemReferenceCode,
188
+
189
+ }
190
+
191
+ conditional = if bare_metal?
192
+ {
193
+ :cpu => :processorCoreAmount,
194
+ :ram => :memoryCapacity,
195
+ :disk => :hardDrives,
196
+ :bare_metal => :bareMetalInstanceFlag
197
+ }
198
+ else
199
+ {
200
+ :cpu => :startCpus,
201
+ :ram => :maxMemory,
202
+ :disk => :blockDevices,
203
+ :image_id => :blockDeviceTemplateGroup,
204
+ :ephemeral_storage => :localDiskFlag,
205
+ }
206
+ end
207
+ common.merge(conditional)
208
+ end
209
+
210
+ ##
211
+ # Remove model attributes that aren't expected by the SoftLayer API
212
+ def clean_attributes
213
+ @bare_metal = attributes.delete(:bare_metal)
214
+ attributes.delete(:flavor_id)
215
+ attributes.delete(:ephemeral_storage)
216
+ end
217
+
218
+
219
+ ##
220
+ # Expand a "flavor" into cpu, ram, and disk attributes
221
+ def extract_flavor
222
+ if attributes[:flavor_id]
223
+ flavor = @service.flavors.get(attributes[:flavor_id])
224
+ flavor.nil? and Fog::Errors::Error.new("Unrecognized flavor in #{self.class}##{__method__}")
225
+ attributes[:cpu] = flavor.cpu
226
+ attributes[:ram] = flavor.ram
227
+ attributes[:disk] = flavor.disk unless attributes[:image_id]
228
+ if bare_metal?
229
+ value = flavor.disk.first['diskImage']['capacity'] < 500 ? 250 : 500
230
+ attributes[:disk] = [{'capacity'=>value}]
231
+ attributes[:ram] = attributes[:ram] / 1024 if attributes[:ram] > 64
232
+ end
233
+ end
234
+ end
235
+
236
+ def validate_attributes
237
+ requires :name, :domain, :cpu, :ram
238
+ requires_one :os_code, :image_id
239
+ requires_one :image_id, :disk
240
+ bare_metal? and image_id and raise ArgumentError, "Bare Metal Cloud does not support booting from Image"
241
+ end
242
+
243
+ def set_defaults
244
+ attributes[:hourly_billing_flag] = true if attributes[:hourly_billing_flag].nil?
245
+ attributes[:ephemeral_storage] = false if attributes[:ephemeral_storage].nil?
246
+ attributes[:domain] = service.default_domain if attributes[:domain].nil?
247
+ end
248
+
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ require 'fog/core/collection'
8
+ require 'fog/softlayer/models/compute/server'
9
+
10
+ module Fog
11
+ module Compute
12
+ class Softlayer
13
+
14
+ class Servers < Fog::Collection
15
+
16
+ model Fog::Compute::Softlayer::Server
17
+
18
+ def all
19
+ data = service.list_servers
20
+ load(data)
21
+ end
22
+
23
+ ## Get a SoftLayer server.
24
+ #
25
+ def get(identifier)
26
+ return nil if identifier.nil? || identifier == ""
27
+ response = service.get_vm(identifier)
28
+ if response.status == 404 # we didn't find it as a VM, look for a BMC server
29
+ response = service.get_bare_metal_server(identifier)
30
+ end
31
+ data = response.body
32
+ new.merge_attributes(data)
33
+ rescue Excon::Errors::NotFound
34
+ nil
35
+ end
36
+
37
+ def bootstrap(options={})
38
+ server = service.create(options)
39
+ server.wait_for { ready? }
40
+ server
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -1,3 +1,9 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
1
7
  module Fog
2
8
  module Compute
3
9
  class Softlayer
@@ -61,6 +67,7 @@ module Fog
61
67
  "error" => "Properties #{required.join(', ')} ALL must be set to create an instance of 'SoftLayer_Hardware'."
62
68
  }
63
69
  end
70
+ @bare_metal_servers.push(response.body).flatten!
64
71
  response
65
72
  end
66
73
  end
@@ -1,3 +1,9 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
1
7
  module Fog
2
8
  module Compute
3
9
  class Softlayer
@@ -1,3 +1,9 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
1
7
  module Fog
2
8
  module Compute
3
9
  class Softlayer
@@ -71,6 +77,7 @@ module Fog
71
77
  "error" => "Properties #{required.join(', ')} ALL must be set to create an instance of 'SoftLayer_Hardware'."
72
78
  }
73
79
  end
80
+ @virtual_guests.push(response.body).flatten!
74
81
  response
75
82
  end
76
83
 
@@ -0,0 +1,42 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ module Fog
8
+ module Compute
9
+ class Softlayer
10
+
11
+ class Mock
12
+
13
+ # Delete a BMC server
14
+ # @param [Integer] id
15
+ # @return [Excon::Response]
16
+ def delete_bare_metal_server(id)
17
+ response = Excon::Response.new
18
+
19
+ # Found it and deleted it.
20
+ response.status = 200
21
+ response.body = self.get_bare_metal_servers.body.map{|server| server['id']}.include?(id)
22
+
23
+ # Didn't find it, give the error that the API would give.
24
+ unless response.body
25
+ response.body = Fog::JSON.encode({:error => "A billing item is required to process a cancellation.", :code => "SoftLayer_Exception_NotFound"})
26
+ response.status = 500
27
+ end
28
+
29
+ response
30
+ end
31
+ end
32
+
33
+ class Real
34
+
35
+ def delete_bare_metal_server(id)
36
+ request(:hardware_server, id.to_s, :http_method => :DELETE)
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ module Fog
8
+ module Compute
9
+ class Softlayer
10
+
11
+ class Mock
12
+
13
+ # Delete a VM
14
+ # @param [Integer] id
15
+ # @return [Excon::Response]
16
+ def delete_vm(id)
17
+ response = Excon::Response.new
18
+
19
+ # Found it and deleted it.
20
+ response.status = 200
21
+ response.body = self.get_vms.body.map{|server| server['id']}.include?(id)
22
+
23
+ # Didn't find it, give the error that the API would give.
24
+ unless response.body
25
+ response.body = Fog::JSON.encode({:error => "A billing item is required to process a cancellation.", :code => "SoftLayer_Exception_NotFound"})
26
+ response.status = 500
27
+ end
28
+
29
+ response
30
+ end
31
+ end
32
+
33
+ class Real
34
+
35
+ def delete_vm(id)
36
+ request(:virtual_guest, id.to_s, :http_method => :DELETE)
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ module Fog
8
+ module Compute
9
+ class Softlayer
10
+
11
+ class Mock
12
+ def get_bare_metal_server(identifier)
13
+ response = Excon::Response.new
14
+ response.body = @bare_metal_servers.map {|vm| vm if vm['id'] == identifier}.compact.reduce
15
+ response.status = 200
16
+ response
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def get_bare_metal_server(identifier)
23
+ request(:hardware_server, identifier, :expected => [200, 404], :query => 'objectMask=mask[memory,provisionDate,processorCoreAmount,hardDrives,datacenter,hourlyBillingFlag]')
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ module Fog
8
+ module Compute
9
+ class Softlayer
10
+
11
+ class Mock
12
+ def get_bare_metal_servers
13
+ response = Excon::Response.new
14
+ response.body = @bare_metal_servers
15
+ response.status = 200
16
+ response
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def get_bare_metal_servers
23
+ request(:account, :get_hardware)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ module Fog
8
+ module Compute
9
+ class Softlayer
10
+
11
+ class Mock
12
+ def get_vm(identifier)
13
+ response = Excon::Response.new
14
+ response.body = @virtual_guests.map {|vm| vm if vm['id'] == identifier}.compact.reduce
15
+ response.status = 200
16
+ response
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def get_vm(identifier)
23
+ request(:virtual_guest, identifier, :expected => [200, 404], :query => 'objectMask=mask[blockDevices,blockDeviceTemplateGroup.globalIdentifier]')
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ module Fog
8
+ module Compute
9
+ class Softlayer
10
+
11
+ class Mock
12
+ def get_vms
13
+ response = Excon::Response.new
14
+ response.body = @virtual_guests
15
+ response.status = 200
16
+ response
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def get_vms
23
+ request(:account, :get_virtual_guests)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Softlayer
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-softlayer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Matt Eldridge
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-04-18 00:00:00.000000000 Z
11
+ date: 2014-04-25 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: fog-core
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: fog-json
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: pry-debugger
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: bundler
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: minitest
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ! '>='
108
95
  - !ruby/object:Gem::Version
@@ -125,35 +112,46 @@ files:
125
112
  - lib/fog/softlayer/compute.rb
126
113
  - lib/fog/softlayer/compute/shared.rb
127
114
  - lib/fog/softlayer/core.rb
115
+ - lib/fog/softlayer/models/compute/flavor.rb
116
+ - lib/fog/softlayer/models/compute/flavors.rb
117
+ - lib/fog/softlayer/models/compute/image.rb
118
+ - lib/fog/softlayer/models/compute/images.rb
119
+ - lib/fog/softlayer/models/compute/server.rb
120
+ - lib/fog/softlayer/models/compute/servers.rb
128
121
  - lib/fog/softlayer/requests/compute/create_bare_metal_server.rb
129
122
  - lib/fog/softlayer/requests/compute/create_vm.rb
130
123
  - lib/fog/softlayer/requests/compute/create_vms.rb
124
+ - lib/fog/softlayer/requests/compute/delete_bare_metal_server.rb
125
+ - lib/fog/softlayer/requests/compute/delete_vm.rb
126
+ - lib/fog/softlayer/requests/compute/get_bare_metal_server.rb
127
+ - lib/fog/softlayer/requests/compute/get_bare_metal_servers.rb
128
+ - lib/fog/softlayer/requests/compute/get_vm.rb
129
+ - lib/fog/softlayer/requests/compute/get_vms.rb
131
130
  - lib/fog/softlayer/version.rb
132
131
  - spec/fog/compute/softlayer_spec.rb
133
132
  homepage: ''
134
133
  licenses:
135
134
  - MIT
135
+ metadata: {}
136
136
  post_install_message:
137
137
  rdoc_options: []
138
138
  require_paths:
139
139
  - lib
140
140
  required_ruby_version: !ruby/object:Gem::Requirement
141
- none: false
142
141
  requirements:
143
142
  - - ! '>='
144
143
  - !ruby/object:Gem::Version
145
144
  version: '0'
146
145
  required_rubygems_version: !ruby/object:Gem::Requirement
147
- none: false
148
146
  requirements:
149
147
  - - ! '>='
150
148
  - !ruby/object:Gem::Version
151
149
  version: '0'
152
150
  requirements: []
153
151
  rubyforge_project:
154
- rubygems_version: 1.8.23
152
+ rubygems_version: 2.2.2
155
153
  signing_key:
156
- specification_version: 3
154
+ specification_version: 4
157
155
  summary: This library can be used as a module for `fog` or as standalone provider
158
156
  to use the SoftLayer Cloud in applications
159
157
  test_files: