Class: Fog::Compute::OpenStack::Server

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attributes = {}) ⇒ Server

Returns a new instance of Server.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/fog/openstack/models/compute/server.rb', line 59

def initialize(attributes={})
  # Old 'connection' is renamed as service and should be used instead
  prepare_service_value(attributes)

  self.security_groups = attributes.delete(:security_groups)
  self.min_count = attributes.delete(:min_count)
  self.max_count = attributes.delete(:max_count)
  self.nics = attributes.delete(:nics)
  self.os_scheduler_hints = attributes.delete(:os_scheduler_hints)
  self.block_device_mapping = attributes.delete(:block_device_mapping)
  self.block_device_mapping_v2 = attributes.delete(:block_device_mapping_v2)

  super
end

Instance Attribute Details

#block_device_mappingObject

Returns the value of attribute block_device_mapping.



53
54
55
# File 'lib/fog/openstack/models/compute/server.rb', line 53

def block_device_mapping
  @block_device_mapping
end

#block_device_mapping_v2Object

Returns the value of attribute block_device_mapping_v2.



53
54
55
# File 'lib/fog/openstack/models/compute/server.rb', line 53

def block_device_mapping_v2
  @block_device_mapping_v2
end

#flavor_refObject



176
177
178
# File 'lib/fog/openstack/models/compute/server.rb', line 176

def flavor_ref
  @flavor_ref
end

#image_refObject



168
169
170
# File 'lib/fog/openstack/models/compute/server.rb', line 168

def image_ref
  @image_ref
end

#nics=(value) ⇒ Object (writeonly)

Sets the attribute nics

Parameters:

  • value

    the value to set the attribute nics to.



52
53
54
# File 'lib/fog/openstack/models/compute/server.rb', line 52

def nics=(value)
  @nics = value
end

#os_scheduler_hints=(value) ⇒ Object (writeonly)

Sets the attribute os_scheduler_hints

Parameters:

  • value

    the value to set the attribute os_scheduler_hints to.



52
53
54
# File 'lib/fog/openstack/models/compute/server.rb', line 52

def os_scheduler_hints=(value)
  @os_scheduler_hints = value
end

#passwordObject (readonly)

Returns the value of attribute password.



51
52
53
# File 'lib/fog/openstack/models/compute/server.rb', line 51

def password
  @password
end

#personalityHash

Note:

This attribute is only used for server creation. This field will be nil on subsequent retrievals.

Returns Hash containing data to inject into the file system of the cloud server instance during server creation.

Examples:

To inject fog.txt into file system

:personality => [{ :path => '/root/fog.txt',
                   :contents => Base64.encode64('Fog was here!')
                }]

Returns:

  • (Hash)

    Hash containing data to inject into the file system of the cloud server instance during server creation.

See Also:



28
# File 'lib/fog/openstack/models/compute/server.rb', line 28

attribute :personality

#projectObject

In some cases it’s handy to be able to store the project for the record, e.g. swift doesn’t contain project info in the result, so we can track it in this attribute based on what project was used in the request



57
58
59
# File 'lib/fog/openstack/models/compute/server.rb', line 57

def project
  @project
end

Instance Method Details

#all_addressesObject



105
106
107
108
109
110
# File 'lib/fog/openstack/models/compute/server.rb', line 105

def all_addresses
  # currently openstack API does not tell us what is a floating ip vs a fixed ip for the vm listing,
  # we fall back to get all addresses and filter sadly.
  # Only includes manually-assigned addresses, not auto-assigned
  @all_addresses ||= service.list_all_addresses.body["floating_ips"].select{|data| data['instance_id'] == id}
end

#associate_address(floating_ip) ⇒ Object



310
311
312
313
# File 'lib/fog/openstack/models/compute/server.rb', line 310

def associate_address(floating_ip)
  requires :id
  service.associate_address id, floating_ip
end

#attach_volume(volume_id, device_name) ⇒ Object



349
350
351
352
353
# File 'lib/fog/openstack/models/compute/server.rb', line 349

def attach_volume(volume_id, device_name)
  requires :id
  service.attach_volume(volume_id, id, device_name)
  true
end

#change_password(admin_password) ⇒ Object



192
193
194
195
196
# File 'lib/fog/openstack/models/compute/server.rb', line 192

def change_password(admin_password)
  requires :id
  service.change_server_password(id, admin_password)
  true
end

#confirm_resizeObject



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

def confirm_resize
  requires :id
  service.confirm_resize_server(id)
  true
end

#console(log_length = nil) ⇒ Object



290
291
292
293
# File 'lib/fog/openstack/models/compute/server.rb', line 290

def console(log_length = nil)
  requires :id
  service.get_console_output(id, log_length)
end

#create_image(name, metadata = {}) ⇒ Object



285
286
287
288
# File 'lib/fog/openstack/models/compute/server.rb', line 285

def create_image(name, ={})
  requires :id
  service.create_image(id, name, )
end

#destroyObject



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

def destroy
  requires :id
  service.delete_server(id)
  true
end

#detach_volume(volume_id) ⇒ Object



355
356
357
358
359
# File 'lib/fog/openstack/models/compute/server.rb', line 355

def detach_volume(volume_id)
  requires :id
  service.detach_volume(id, volume_id)
  true
end

#disassociate_address(floating_ip) ⇒ Object



315
316
317
318
# File 'lib/fog/openstack/models/compute/server.rb', line 315

def disassociate_address(floating_ip)
  requires :id
  service.disassociate_address id, floating_ip
end

#evacuate(host, on_shared_storage, admin_password = nil) ⇒ Object



305
306
307
308
# File 'lib/fog/openstack/models/compute/server.rb', line 305

def evacuate(host, on_shared_storage, admin_password = nil)
  requires :id
  service.evacuate_server(id, host, on_shared_storage, admin_password)
end

#failed?Boolean

Returns:

  • (Boolean)


188
189
190
# File 'lib/fog/openstack/models/compute/server.rb', line 188

def failed?
  self.state == 'ERROR'
end

#floating_ip_addressObject



150
151
152
# File 'lib/fog/openstack/models/compute/server.rb', line 150

def floating_ip_address
  floating_ip_addresses.first
end

#floating_ip_addressesObject



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

def floating_ip_addresses
  all_floating=addresses.values.flatten.select{ |data| data["OS-EXT-IPS:type"]=="floating" }.map{|addr| addr["addr"] }

  # Return them all, leading with manually assigned addresses
  manual = all_addresses.map{|addr| addr["ip"]}

  all_floating.sort{ |a,b|
    a_manual = manual.include? a
    b_manual = manual.include? b

    if a_manual and !b_manual
      -1
    elsif !a_manual and b_manual
      1
    else 0 end
  }
  all_floating.empty? ? manual : all_floating
end

#imagesObject



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

def images
  requires :id
  service.images(:server => self)
end

#ip_addressesObject

returns all ip_addresses for a given instance this includes both the fixed ip(s) and the floating ip(s)



119
120
121
# File 'lib/fog/openstack/models/compute/server.rb', line 119

def ip_addresses
  addresses.values.flatten.map{|x| x['addr']}
end

#live_migrate(host, block_migration, disk_over_commit) ⇒ Object



300
301
302
303
# File 'lib/fog/openstack/models/compute/server.rb', line 300

def live_migrate(host, block_migration, disk_over_commit)
  requires :id
  service.live_migrate_server(id, host, block_migration, disk_over_commit)
end

#max_count=(new_max_count) ⇒ Object



329
330
331
# File 'lib/fog/openstack/models/compute/server.rb', line 329

def max_count=(new_max_count)
  @max_count = new_max_count
end

#metadataObject



74
75
76
77
78
79
80
81
# File 'lib/fog/openstack/models/compute/server.rb', line 74

def 
  @metadata ||= begin
    Fog::Compute::OpenStack::Metadata.new({
      :service => service,
      :parent => self
    })
  end
end

#metadata=(new_metadata = {}) ⇒ Object



83
84
85
86
87
88
# File 'lib/fog/openstack/models/compute/server.rb', line 83

def metadata=(={})
  return unless 
  metas = []
  .each_pair {|k,v| metas << {"key" => k, "value" => v} }
  @metadata = .load(metas)
end

#migrateObject



295
296
297
298
# File 'lib/fog/openstack/models/compute/server.rb', line 295

def migrate
  requires :id
  service.migrate_server(id)
end

#min_count=(new_min_count) ⇒ Object



325
326
327
# File 'lib/fog/openstack/models/compute/server.rb', line 325

def min_count=(new_min_count)
  @min_count = new_min_count
end

#networksObject



333
334
335
# File 'lib/fog/openstack/models/compute/server.rb', line 333

def networks
  service.networks(:server => self)
end

#pauseObject



247
248
249
250
# File 'lib/fog/openstack/models/compute/server.rb', line 247

def pause
  requires :id
  service.pause_server(id)
end

#private_ip_addressObject



164
165
166
# File 'lib/fog/openstack/models/compute/server.rb', line 164

def private_ip_address
  private_ip_addresses.first
end

#private_ip_addressesObject



158
159
160
161
162
# File 'lib/fog/openstack/models/compute/server.rb', line 158

def private_ip_addresses
  rfc1918_regexp = /(^10\.|^172\.1[6-9]\.|^172\.2[0-9]\.|^172.3[0-1]\.|^192\.168\.)/
  almost_private = ip_addresses - public_ip_addresses - floating_ip_addresses
  almost_private.find_all{ |ip| rfc1918_regexp.match ip }
end

#public_ip_addressObject



154
155
156
# File 'lib/fog/openstack/models/compute/server.rb', line 154

def public_ip_address
  public_ip_addresses.first
end

#public_ip_addressesObject



142
143
144
145
146
147
148
# File 'lib/fog/openstack/models/compute/server.rb', line 142

def public_ip_addresses
  if floating_ip_addresses.empty?
    addresses.find_all{|s| s[0] =~ /public/i}.map{|a| a[1][0]['addr']}
  else
    floating_ip_addresses
  end
end

#ready?Boolean

Returns:

  • (Boolean)


184
185
186
# File 'lib/fog/openstack/models/compute/server.rb', line 184

def ready?
  self.state == 'ACTIVE'
end

#reboot(type = 'SOFT') ⇒ Object



236
237
238
239
240
# File 'lib/fog/openstack/models/compute/server.rb', line 236

def reboot(type = 'SOFT')
  requires :id
  service.reboot_server(id, type)
  true
end

#rebuild(image_ref, name, admin_pass = nil, metadata = nil, personality = nil) ⇒ Object



198
199
200
201
202
# File 'lib/fog/openstack/models/compute/server.rb', line 198

def rebuild(image_ref, name, admin_pass=nil, =nil, personality=nil)
  requires :id
  service.rebuild_server(id, image_ref, name, admin_pass, , personality)
  true
end

#reloadObject



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

def reload
  @all_addresses = nil
  super
end

#reset_vm_state(vm_state) ⇒ Object



320
321
322
323
# File 'lib/fog/openstack/models/compute/server.rb', line 320

def reset_vm_state(vm_state)
  requires :id
  service.reset_server_state id, vm_state
end

#resize(flavor_ref) ⇒ Object



204
205
206
207
208
# File 'lib/fog/openstack/models/compute/server.rb', line 204

def resize(flavor_ref)
  requires :id
  service.resize_server(id, flavor_ref)
  true
end

#revert_resizeObject



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

def revert_resize
  requires :id
  service.revert_resize_server(id)
  true
end

#saveObject

Raises:

  • (Fog::Errors::Error)


361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
# File 'lib/fog/openstack/models/compute/server.rb', line 361

def save
  raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
  requires :flavor_ref, :name
  requires_one :image_ref, :block_device_mapping, :block_device_mapping_v2
  options = {
    'personality' => personality,
    'accessIPv4' => accessIPv4,
    'accessIPv6' => accessIPv6,
    'availability_zone' => availability_zone,
    'user_data' => user_data_encoded,
    'key_name'    => key_name,
    'config_drive' => config_drive,
    'security_groups' => @security_groups,
    'min_count'   => @min_count,
    'max_count'   => @max_count,
    'nics' => @nics,
    'os:scheduler_hints' => @os_scheduler_hints,
    'block_device_mapping' => @block_device_mapping,
    'block_device_mapping_v2' => @block_device_mapping_v2,
  }
  options['metadata'] = .to_hash unless @metadata.nil?
  options = options.reject {|key, value| value.nil?}
  data = service.create_server(name, image_ref, flavor_ref, options)
  merge_attributes(data.body['server'])
  true
end

#security_groupsObject



222
223
224
225
226
227
228
229
230
# File 'lib/fog/openstack/models/compute/server.rb', line 222

def security_groups
  requires :id

  groups = service.list_security_groups(:server_id => id).body['security_groups']

  groups.map do |group|
    Fog::Compute::OpenStack::SecurityGroup.new group.merge({:service => service})
  end
end

#security_groups=(new_security_groups) ⇒ Object



232
233
234
# File 'lib/fog/openstack/models/compute/server.rb', line 232

def security_groups=(new_security_groups)
  @security_groups = new_security_groups
end

#setup(credentials = {}) ⇒ Object



388
389
390
391
392
393
394
395
396
397
398
399
400
# File 'lib/fog/openstack/models/compute/server.rb', line 388

def setup(credentials = {})
  requires :ssh_ip_address, :identity, :public_key, :username
  Fog::SSH.new(ssh_ip_address, username, credentials).run([
    %{mkdir .ssh},
    %{echo "#{public_key}" >> ~/.ssh/authorized_keys},
    %{passwd -l #{username}},
    %{echo "#{Fog::JSON.encode(attributes)}" >> ~/attributes.json},
    %{echo "#{Fog::JSON.encode()}" >> ~/metadata.json}
  ])
rescue Errno::ECONNREFUSED
  sleep(1)
  retry
end

#shelveObject



270
271
272
273
# File 'lib/fog/openstack/models/compute/server.rb', line 270

def shelve
  requires :id
  service.shelve_server(id)
end

#shelve_offloadObject



280
281
282
283
# File 'lib/fog/openstack/models/compute/server.rb', line 280

def shelve_offload
  requires :id
  service.shelve_offload_server(id)
end

#startObject



257
258
259
260
261
262
263
264
265
266
267
268
# File 'lib/fog/openstack/models/compute/server.rb', line 257

def start
  requires :id

  case state.downcase
  when 'paused'
    service.unpause_server(id)
  when 'suspended'
    service.resume_server(id)
  else
    service.start_server(id)
  end
end

#stopObject



242
243
244
245
# File 'lib/fog/openstack/models/compute/server.rb', line 242

def stop
  requires :id
  service.stop_server(id)
end

#suspendObject



252
253
254
255
# File 'lib/fog/openstack/models/compute/server.rb', line 252

def suspend
  requires :id
  service.suspend_server(id)
end

#unshelveObject



275
276
277
278
# File 'lib/fog/openstack/models/compute/server.rb', line 275

def unshelve
  requires :id
  service.unshelve_server(id)
end

#user_data=(ascii_userdata) ⇒ Object



90
91
92
# File 'lib/fog/openstack/models/compute/server.rb', line 90

def user_data=(ascii_userdata)
  self.user_data_encoded = [ascii_userdata].pack('m') if ascii_userdata
end

#volume_attachmentsObject



344
345
346
347
# File 'lib/fog/openstack/models/compute/server.rb', line 344

def volume_attachments
  requires :id
  service.get_server_volumes(id).body['volumeAttachments']
end

#volumesObject



337
338
339
340
341
342
# File 'lib/fog/openstack/models/compute/server.rb', line 337

def volumes
  requires :id
  service.volumes.select do |vol|
    vol.attachments.find { |attachment| attachment["serverId"] == id }
  end
end