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.



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

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.



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

def block_device_mapping
  @block_device_mapping
end

#block_device_mapping_v2Object

Returns the value of attribute block_device_mapping_v2.



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

def block_device_mapping_v2
  @block_device_mapping_v2
end

#flavor_refObject

Returns the value of attribute flavor_ref.



178
179
180
# File 'lib/fog/openstack/models/compute/server.rb', line 178

def flavor_ref
  @flavor_ref
end

#image_refObject

Returns the value of attribute image_ref.



174
175
176
# File 'lib/fog/openstack/models/compute/server.rb', line 174

def image_ref
  @image_ref
end

#max_count=(value) ⇒ Object (writeonly)

Sets the attribute max_count

Parameters:

  • value

    the value to set the attribute max_count to.



323
324
325
# File 'lib/fog/openstack/models/compute/server.rb', line 323

def max_count=(value)
  @max_count = value
end

#min_count=(value) ⇒ Object (writeonly)

Sets the attribute min_count

Parameters:

  • value

    the value to set the attribute min_count to.



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

def min_count=(value)
  @min_count = value
end

#nics=(value) ⇒ Object (writeonly)

Sets the attribute nics

Parameters:

  • value

    the value to set the attribute nics to.



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

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.



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

def os_scheduler_hints=(value)
  @os_scheduler_hints = value
end

#passwordObject (readonly)

Returns the value of attribute password.



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

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:



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

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



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

def project
  @project
end

#security_groupsObject



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

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

Instance Method Details

#all_addressesObject



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

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



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

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

#attach_volume(volume_id, device_name) ⇒ Object



341
342
343
344
345
# File 'lib/fog/openstack/models/compute/server.rb', line 341

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

#change_password(admin_password) ⇒ Object



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

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

#confirm_resizeObject



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

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

#console(log_length = nil) ⇒ Object



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

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

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



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

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

#destroyObject



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

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

#detach_volume(volume_id) ⇒ Object



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

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

#disassociate_address(floating_ip) ⇒ Object



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

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

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



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

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

#failed?Boolean

Returns:

  • (Boolean)


186
187
188
# File 'lib/fog/openstack/models/compute/server.rb', line 186

def failed?
  state == 'ERROR'
end

#floating_ip_addressObject



156
157
158
# File 'lib/fog/openstack/models/compute/server.rb', line 156

def floating_ip_address
  floating_ip_addresses.first
end

#floating_ip_addressesObject



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

def floating_ip_addresses
  all_floating = if addresses
                   flattened_values = addresses.values.flatten
                   flattened_values.select { |d| d["OS-EXT-IPS:type"] == "floating" }.collect { |a| a["addr"] }
                 else
                   []
                 end

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

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

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

#imagesObject



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

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)



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

def ip_addresses
  addresses ? addresses.values.flatten.collect { |x| x['addr'] } : []
end

#live_migrate(host, block_migration, disk_over_commit) ⇒ Object



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

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

#metadataObject



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

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

#metadata=(new_metadata = {}) ⇒ Object



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

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

#migrateObject



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

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

#networksObject



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

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

#pauseObject



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

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

#private_ip_addressObject



170
171
172
# File 'lib/fog/openstack/models/compute/server.rb', line 170

def private_ip_address
  private_ip_addresses.first
end

#private_ip_addressesObject



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

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.select { |ip| rfc1918_regexp.match ip }
end

#public_ip_addressObject



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

def public_ip_address
  public_ip_addresses.first
end

#public_ip_addressesObject



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

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

#ready?Boolean

Returns:

  • (Boolean)


182
183
184
# File 'lib/fog/openstack/models/compute/server.rb', line 182

def ready?
  state == 'ACTIVE'
end

#reboot(type = 'SOFT') ⇒ Object



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

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



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

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



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

def reload
  @all_addresses = nil
  super
end

#reset_vm_state(vm_state) ⇒ Object



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

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

#resize(flavor_ref) ⇒ Object



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

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

#revert_resizeObject



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

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

#saveObject

Raises:

  • (Fog::Errors::Error)


353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
# File 'lib/fog/openstack/models/compute/server.rb', line 353

def save
  raise Fog::Errors::Error, '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

#setup(credentials = {}) ⇒ Object



380
381
382
383
384
385
386
387
388
389
390
391
392
393
# File 'lib/fog/openstack/models/compute/server.rb', line 380

def setup(credentials = {})
  requires :ssh_ip_address, :identity, :public_key, :username
  ssh = Fog::SSH.new(ssh_ip_address, username, credentials)
  ssh.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



266
267
268
269
# File 'lib/fog/openstack/models/compute/server.rb', line 266

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

#shelve_offloadObject



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

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

#startObject



253
254
255
256
257
258
259
260
261
262
263
264
# File 'lib/fog/openstack/models/compute/server.rb', line 253

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



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

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

#suspendObject



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

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

#unshelveObject



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

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

#user_data=(ascii_userdata) ⇒ Object



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

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

#volume_attachmentsObject



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

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

#volumesObject



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

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