Class: CopyAmi::AmiSnapshotCreatedState

Inherits:
CopyAmiState show all
Defined in:
lib/scripts/ec2/copy_ami.rb

Overview

Snapshot is created from the AMI. Create a volume from the snapshot, attach and mount the volume as second device.

Instance Attribute Summary

Attributes inherited from ScriptExecutionState

#context, #logger

Instance Method Summary collapse

Methods inherited from CopyAmiState

load_state, #local_region, #remote_region

Methods inherited from ScriptExecutionState

#done?, #end_state, #failed?, #get_superclass_name, #initialize, #register_state_change_listener, #start_state_machine, #to_s

Methods included from StateTransitionHelper

#attach_volume, #connect, #copy_distribution, #create_fs, #create_image_from_instance, #create_labeled_fs, #create_security_group_with_rules, #create_snapshot, #create_volume, #create_volume_from_snapshot, #delete_security_group, #delete_snapshot, #delete_volume, #describe_instance, #detach_volume, #determine_file, #disable_ssh_tty, #disconnect, #ec2_handler, #ec2_handler=, #enable_ssh_tty, #get_aws_kernel_image_aki, #get_aws_region_from_endpoint, #get_partition_count, #get_partition_fs_type, #get_partition_fs_type_and_label, #get_partition_label, #get_partition_table, #get_root_device_name, #get_root_partition_fs_type, #get_root_partition_fs_type_and_label, #get_root_partition_label, #get_root_volume_id, #launch_instance, #local_decompress_and_dump_file_to_device, #local_dump_and_compress_device_to_file, #local_dump_device_to_file, #local_dump_file_to_device, #mount_fs, #mount_fs_old, #register_snapshot, #remote_copy, #remote_copy_old, #remote_handler, #remote_handler=, #retrieve_instances, #retrieve_security_groups, #set_partition_table, #shut_down_instance, #snapshot_accessible, #start_instance, #stop_instance, #unmount_fs, #upload_file, #zip_volume

Methods included from VCloudTransitionHelper

#retrieve_ip_services

Constructor Details

This class inherits a constructor from ScriptExecutionState

Instance Method Details

#enterObject



194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
# File 'lib/scripts/ec2/copy_ami.rb', line 194

def enter()
  @context[:source_volume_id] = create_volume_from_snapshot(@context[:snapshot_id],
    @context[:source_availability_zone])
  device = @context[:temp_device_name]
  mount_point = "/mnt/tmp_#{@context[:source_volume_id]}"
  #XXX: attach volume after root partition detection
  #attach_volume(@context[:source_volume_id], @context[:source_instance_id], device)
  connect(@context[:source_dns_name], @context[:source_ssh_username], nil, @context[:source_ssh_keydata]) 
  # detect if there is a shift for device mapping (between AWS and the operating system of the system)
  root_device_name = get_root_device_name()
  # detect letters
  aws_root_device = @context[:root_device_name]
  aws_letter = aws_root_device.split('/')[2].gsub('sd', '').gsub('xvd', '').gsub(/[0-9]/, '')
  os_letter = root_device_name.split('/')[2].gsub('sd', '').gsub('xvd', '').gsub(/[0-9]/, '')
  aws_device_letter = device.split('/')[2].gsub('sd', '').gsub('xvd', '').gsub(/[0-9]/, '')
  if !aws_letter.eql?(os_letter)
    post_message("Detected specific kernel with shift between AWS and Kernel OS for device naming: '#{aws_root_device}' vs '#{root_device_name}'")
  end
  while !aws_letter.eql?(os_letter)
    aws_letter.succ!
    aws_device_letter.succ!
  end

  # attach volume
  attach_volume(@context[:source_volume_id], @context[:source_instance_id], device, Ec2Script::CS_AWS_TIMEOUT)

  device = "/dev/sd#{aws_device_letter}"
  # detect root partition vs root volume: simply check if we have several /dev/sdx* entries
  parts_count = get_partition_count(device)
  if parts_count >= 2
    # retrieve partition table, in order to restore it in the target region
    post_message("Detected specific volume with a valid partition table on device '#{device}'...")
    partition_table = get_partition_table(device)
    @context[:partition_table] = partition_table
    #XXX: HANDLE at a LOWER LEVEL
    # update partition table with device
    # s/device/@context[:temp_device_name]/ on partition table 
    #@context[:partition_table] = partition_table.gsub("#{device}", "#{@context[:temp_device_name]}")
    # retrieve the root partition number
    os_nb = root_device_name.split('/')[2].gsub('sd', '').gsub('xvd', '').gsub(/[a-z]/, '')
    device = device + os_nb
    @context[:root_partition_nb] = os_nb
    post_message("Using root partition: '#{device}'...")
  end
  post_message("Using AWS name '#{@context[:temp_device_name]}' and OS name '#{device}'")
  mount_fs(mount_point, device)
  # get root partition label and filesystem type
  #@context[:label] = get_root_partition_label()
  #@context[:fs_type] = get_root_partition_fs_type()
  @context[:fs_type], @context[:label] = get_root_partition_fs_type_and_label()
  disconnect()

  SourceVolumeReadyState.new(@context)
end