Class: Fog::Compute::Softlayer::Server

Inherits:
Fog::Compute::Server
  • Object
show all
Defined in:
lib/fog/softlayer/models/compute/server.rb

Instance Method Summary collapse

Constructor Details

#initialize(attributes = {}) ⇒ Server

Returns a new instance of Server.

Raises:

  • (Exception)


50
51
52
53
54
55
# File 'lib/fog/softlayer/models/compute/server.rb', line 50

def initialize(attributes = {})
  # Forces every request inject bare_metal parameter
  raise Exception if attributes[:collection].nil? and attributes['bare_metal'].nil?
  super(attributes)
  set_defaults
end

Instance Method Details

#add_tags(tags) ⇒ Object

Raises:

  • (ArgumentError)


57
58
59
60
61
62
63
64
65
# File 'lib/fog/softlayer/models/compute/server.rb', line 57

def add_tags(tags)
  requires :id
  raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
  tags.each do |tag|
    service.tags.new(:resource_id => self.id, :name => tag).save
  end
  self.reload
  true
end

#bare_metalObject



71
72
73
# File 'lib/fog/softlayer/models/compute/server.rb', line 71

def bare_metal
  @bare_metal
end

#bare_metal?Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/fog/softlayer/models/compute/server.rb', line 67

def bare_metal?
  bare_metal
end

#datacenterObject



80
81
82
# File 'lib/fog/softlayer/models/compute/server.rb', line 80

def datacenter
  attributes[:datacenter][:name] unless attributes[:datacenter].nil?
end

#datacenter=(name) ⇒ Object



75
76
77
78
# File 'lib/fog/softlayer/models/compute/server.rb', line 75

def datacenter=(name)
  name = name['name'] if name.is_a?(Hash)
  attributes[:datacenter] = { :name => name }
end

#delete_tags(tags) ⇒ Object

Raises:

  • (ArgumentError)


84
85
86
87
88
89
90
91
92
# File 'lib/fog/softlayer/models/compute/server.rb', line 84

def delete_tags(tags)
  requires :id
  raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
  tags.each do |tag|
    service.tags.new(:resource_id => self.id, :name => tag).destroy
  end
  self.reload
  true
end

#destroyObject



94
95
96
97
98
99
# File 'lib/fog/softlayer/models/compute/server.rb', line 94

def destroy
  requires :id
  request = bare_metal? ? :delete_bare_metal_server : :delete_vm
  response = service.send(request, self.id)
  response.body
end

#dns_nameObject



101
102
103
# File 'lib/fog/softlayer/models/compute/server.rb', line 101

def dns_name
  fqdn
end

#image_idObject



109
110
111
# File 'lib/fog/softlayer/models/compute/server.rb', line 109

def image_id
  attributes[:image_id][:globalIdentifier] unless attributes[:image_id].nil?
end

#image_id=(uuid) ⇒ Object



105
106
107
# File 'lib/fog/softlayer/models/compute/server.rb', line 105

def image_id=(uuid)
  attributes[:image_id] = {:globalIdentifier => uuid}
end

#key_pairsObject



180
181
182
# File 'lib/fog/softlayer/models/compute/server.rb', line 180

def key_pairs
  attributes[:key_pairs]
end

#key_pairs=(keys) ⇒ Object

Raises:

  • (ArgumentError)


184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/fog/softlayer/models/compute/server.rb', line 184

def key_pairs=(keys)
  raise ArgumentError, "Argument #{local_variables.first.to_s} for #{self.class.name}##{__method__} must be Array." unless keys.is_a?(Array)
  attributes[:key_pairs] = []
  keys.map do |key|
    key = self.symbolize_keys(key) if key.is_a?(Hash)
    unless key.is_a?(Fog::Compute::Softlayer::KeyPair) or (key.is_a?(Hash) and key[:id])
      raise ArgumentError, "Elements of keys array for #{self.class.name}##{__method__} must be a Hash with key 'id', or Fog::Compute::Softlayer::KeyPair"
    end
    key = service.key_pairs.get(key[:id]) unless key.is_a?(Fog::Compute::Softlayer::KeyPair)
    attributes[:key_pairs] << key
  end
end

#nameObject



117
118
119
# File 'lib/fog/softlayer/models/compute/server.rb', line 117

def name
  attributes[:hostname]
end

#name=(set) ⇒ Object



113
114
115
# File 'lib/fog/softlayer/models/compute/server.rb', line 113

def name=(set)
  attributes[:hostname] = set
end

#network_componentsObject



225
226
227
228
229
230
231
# File 'lib/fog/softlayer/models/compute/server.rb', line 225

def network_components
  if id
    (public_network_components << private_network_components).flatten
  else
    attributes[:network_components]
  end
end

#os_codeObject



153
154
155
# File 'lib/fog/softlayer/models/compute/server.rb', line 153

def os_code
  attributes['operatingSystem']['softwareLicense']['softwareDescription']['referenceCode'] if attributes['operatingSystem']
end

#pre_saveObject



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/fog/softlayer/models/compute/server.rb', line 121

def pre_save
  extract_flavor
  validate_attributes
  if self.vlan
    attributes[:vlan] = { :networkVlan => { :id => self.vlan.id } }
  end
  if self.private_vlan
    attributes[:private_vlan] = { :networkVlan => { :id => self.private_vlan.id } }
  end
  if self.key_pairs
    attributes[:key_pairs].map! { |key| { :id => key.id } }
  end
  if self.network_components
    self.network_components = self.network_components.map do |component|
      component[:maxSpeed] = component.delete(:speed) if component[:speed]
      component[:maxSpeed] = component.delete(:max_speed) if component[:max_speed]
      component
    end
  end

  remap_attributes(attributes, attributes_mapping)
  clean_attributes
end

#private_ipObject

maintain backward compatibility with <0.3.13



145
146
147
# File 'lib/fog/softlayer/models/compute/server.rb', line 145

def private_ip # maintain backward compatibility with <0.3.13
  private_ip_address
end

#private_network_componentsObject



241
242
243
244
245
246
247
# File 'lib/fog/softlayer/models/compute/server.rb', line 241

def private_network_components
  if attributes['backendNetworkComponents']
    attributes['backendNetworkComponents'].map { |n| Fog::Compute::Softlayer::NetworkComponent.new(n) }
  else
    []
  end
end

#private_vlanObject



157
158
159
# File 'lib/fog/softlayer/models/compute/server.rb', line 157

def private_vlan
  attributes[:private_vlan] ||= _get_private_vlan
end

#private_vlan=(value) ⇒ Object



161
162
163
164
165
166
167
# File 'lib/fog/softlayer/models/compute/server.rb', line 161

def private_vlan=(value)
  unless value.is_a?(Integer) or value.is_a?(Fog::Network::Softlayer::Network)
    raise ArgumentError, "vlan argument for #{self.class.name}##{__method__} must be Integer or Fog::Network::Softlayer::Network."
  end
  value = network_connection.networks.get(value) if value.is_a?(Integer)
  attributes[:private_vlan] = value
end

#public_ipObject

maintain backward compatibility with <0.3.13



149
150
151
# File 'lib/fog/softlayer/models/compute/server.rb', line 149

def public_ip # maintain backward compatibility with <0.3.13
  public_ip_address
end

#public_network_componentsObject



233
234
235
236
237
238
239
# File 'lib/fog/softlayer/models/compute/server.rb', line 233

def public_network_components
  if attributes['frontendNetworkComponents']
    attributes['frontendNetworkComponents'].map { |n| Fog::Compute::Softlayer::NetworkComponent.new(n) }
  else
    []
  end
end

#ram=(set) ⇒ Object



209
210
211
212
213
214
# File 'lib/fog/softlayer/models/compute/server.rb', line 209

def ram=(set)
  if set.is_a?(Array) and set.first['hardwareComponentModel']
    set = 1024 * set.first['hardwareComponentModel']['capacity'].to_i
  end
  attributes[:ram] = set
end

#ready?Boolean

Returns:

  • (Boolean)


249
250
251
252
253
254
255
256
257
258
259
# File 'lib/fog/softlayer/models/compute/server.rb', line 249

def ready?
  begin
    if bare_metal?
      state == "on"
    else
      state == "Running"
    end
  rescue Excon::Errors::InternalServerError => e
    false
  end
end

#reboot(use_hard_reboot = true) ⇒ Object



261
262
263
264
265
266
267
268
269
# File 'lib/fog/softlayer/models/compute/server.rb', line 261

def reboot(use_hard_reboot = true)
  requires :id
  if bare_metal?
    service.reboot_bare_metal_server(id, use_hard_reboot)
  else
    service.reboot_vm(id, use_hard_reboot)
  end
  true
end

#relaunch!Object

reload the OS on a server (method name reload was already taken)



170
171
172
173
174
175
176
177
178
# File 'lib/fog/softlayer/models/compute/server.rb', line 170

def relaunch!
  requires :id
  body = [ "FORCE", {}]
  body[1][:sshKeyIds] = key_pairs.map {|kp| kp.id} unless key_pairs.empty?
  type = bare_metal? ? :hardware_server : :virtual_guest
  status = service.request(type, "#{id}/reloadOperatingSystem", :body => body, :http_method => :post).status
  wait_for { not ready? } # block until the relaunch has begun
  [200, 201].include?(status)
end

#saveObject

Note:

You should use servers.create to create servers instead calling this method directly

Creates server

  • requires attributes: :name, :domain, and :flavor_id OR (:cpu_count && :ram && :disks)

  • State Transitions

    • BUILD -> ACTIVE

    • BUILD -> ERROR (on error)

Raises:

  • (Fog::Errors::Error)


330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
# File 'lib/fog/softlayer/models/compute/server.rb', line 330

def save
  raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
  copy = self.dup
  copy.pre_save

  data = if bare_metal?
    service.create_bare_metal_server(copy.attributes).body
  else
    service.create_vm(copy.attributes).body.first
  end

  data.delete("bare_metal")
  merge_attributes(data)
  true
end

#shutdownObject

Soft power off



304
305
306
307
308
309
310
311
312
# File 'lib/fog/softlayer/models/compute/server.rb', line 304

def shutdown
  requires :id
  if bare_metal?
    raise Fog::Errors::Error.new('Shutdown not supported on baremetal servers. Use #stop.')
  else
    service.power_off_vm(id, false)
  end
  true
end

#snapshotObject



278
279
280
# File 'lib/fog/softlayer/models/compute/server.rb', line 278

def snapshot
  # TODO: implement
end

#ssh_passwordObject



271
272
273
274
275
276
# File 'lib/fog/softlayer/models/compute/server.rb', line 271

def ssh_password
  requires :id
  service_path = bare_metal? ? :hardware_server : :virtual_guest
  @sshpass ||= service.request(service_path, id, :query => 'objectMask=mask[id,operatingSystem.passwords[password]]').body
  @sshpass['operatingSystem']['passwords'][0]['password'] unless @sshpass['operatingSystem'].nil? or @sshpass['operatingSystem']['passwords'].empty?
end

#startObject



282
283
284
285
286
287
288
289
290
# File 'lib/fog/softlayer/models/compute/server.rb', line 282

def start
  requires :id
  if bare_metal?
    service.power_on_bare_metal_server(id)
  else
    service.power_on_vm(id)
  end
  true
end

#stateObject



314
315
316
317
318
319
320
# File 'lib/fog/softlayer/models/compute/server.rb', line 314

def state
  if bare_metal?
    service.request(:hardware_server, "#{id}/getServerPowerState").body
  else
    service.request(:virtual_guest, "#{id}/getPowerState").body['name']
  end
end

#stopObject

Hard power off



293
294
295
296
297
298
299
300
301
# File 'lib/fog/softlayer/models/compute/server.rb', line 293

def stop
  requires :id
  if bare_metal?
    service.power_off_bare_metal_server(id)
  else
    service.power_off_vm(id, true)
  end
  true
end

#tagsObject



346
347
348
# File 'lib/fog/softlayer/models/compute/server.rb', line 346

def tags
  attributes[:tags].map { |i| i['tag']['name'] } if attributes[:tags]
end

#user_dataObject



221
222
223
# File 'lib/fog/softlayer/models/compute/server.rb', line 221

def user_data
  attributes[:user_data]
end

#user_data=(value) ⇒ Object



217
218
219
# File 'lib/fog/softlayer/models/compute/server.rb', line 217

def user_data=(value)
  attributes[:user_data] = [{'value' => value}]
end

#vlanObject



197
198
199
# File 'lib/fog/softlayer/models/compute/server.rb', line 197

def vlan
  attributes[:vlan] ||= _get_vlan
end

#vlan=(value) ⇒ Object



201
202
203
204
205
206
207
# File 'lib/fog/softlayer/models/compute/server.rb', line 201

def vlan=(value)
  unless value.is_a?(Integer) or value.is_a?(Fog::Network::Softlayer::Network)
    raise ArgumentError, "vlan argument for #{self.class.name}##{__method__} must be Integer or Fog::Network::Softlayer::Network."
  end
  value = network_connection.networks.get(value) if value.is_a?(Integer)
  attributes[:vlan] = value
end