class Fission::Action::VM::Cloner
Public Class Methods
Internal: Creates a new VMCloner object. This accepts a source and target VM object.
source_vm - An instance of VM target_vm - An instance of VM
Examples:
Fission::Action::VMCloner.new @my_source_vm, @my_target_vm
Returns a new VMCloner object.
# File lib/fission/action/vm/cloner.rb, line 18 def initialize(source_vm, target_vm) @source_vm = source_vm @target_vm = target_vm end
Public Instance Methods
Public: Creates a new VM which is a clone of an existing VM. As Fusion doesn't provide a native cloning mechanism, this is a best effort. This essentially is a directory copy with updates to relevant files. It's recommended to clone VMs which are not running.
Examples
@cloner.clone
Returns a Response with the result. If successful, the Response's data attribute will be nil. If there is an error, an unsuccessful Response will be returned.
# File lib/fission/action/vm/cloner.rb, line 35 def clone unless @source_vm.exists? return Response.new :code => 1, :message => 'VM does not exist' end if @target_vm.exists? return Response.new :code => 1, :message => 'VM already exists' end FileUtils.cp_r @source_vm.path, @target_vm.path rename_vm_files @source_vm.name, @target_vm.name update_config @source_vm.name, @target_vm.name Response.new :code => 0 end
Private Instance Methods
Internal: Cleans up the conf file (*.vmx) for a newly cloned VM. This includes removing generated MAC addresses, setting up for a new UUID, and disable VMware tools warning.
conf_file_path - Aboslute path to the VM's conf file (.vmx).
Examples
@cloner.clean_up_conf_file '/vms/foo/foo.vmx'
Returns nothing.
# File lib/fission/action/vm/cloner.rb, line 156 def clean_up_conf_file(conf_file_path) conf_items_patterns = { /^tools\.remindInstall.*\n/ => "tools.remindInstall = \"FALSE\"", /^uuid\.action.*\n/ => "uuid.action = \"create\"", /^ethernet\.+generatedAddress.*\n/ => '' } content = File.read conf_file_path content << "\n" conf_items_patterns.each_pair do |pattern, new_item| unless content.include? new_item content.gsub(pattern, '').strip content << "#{new_item}\n" end end File.open(conf_file_path, 'w') { |f| f.print content } end
Internal: Provides the list of files which need to be renamed in a newly cloned VM directory.
from - The VM name that was used as the source of the clone. to - The name of the newly cloned VM.
Examples
@cloner.files_to_rename 'foo', 'bar' # => ['/vms/vm1/foo.vmdk', '/vms/vm1/foo.vmx', 'vms/vm1/blah.other']
Returns an Array containing the paths (String) to the files to rename. The paths which match the from name will preceed any other files found in the newly cloned VM directory.
# File lib/fission/action/vm/cloner.rb, line 94 def files_to_rename(from, to) files_which_match_source_vm = [] other_files = [] Dir.entries(@target_vm.path).each do |f| unless f == '.' || f == '..' f.include?(from) ? files_which_match_source_vm << f : other_files << f end end files_which_match_source_vm + other_files end
Internal: Renames the files of a newly cloned VM.
from - The VM name that was used as the source of the clone. to - The name of the newly cloned VM.
Examples
@cloner.rename_vm_files 'foo', 'bar'
Returns nothing.
# File lib/fission/action/vm/cloner.rb, line 63 def rename_vm_files(from, to) files_to_rename(from, to).each do |file| text_to_replace = File.basename(file, File.extname(file)) if File.extname(file) == '.vmdk' if file.match /\-s\d+\.vmdk/ text_to_replace = file.partition(/\-s\d+.vmdk/).first end end unless File.exists?(File.join(@target_vm.path, file.gsub(text_to_replace, to))) FileUtils.mv File.join(@target_vm.path, file), File.join(@target_vm.path, file.gsub(text_to_replace, to)) end end end
Internal: Updates config files for a newly cloned VM. This will update any files with the extension of '.vmx', '.vmxf', and '.vmdk'. Any binary '.vmdk' files will be skipped.
from - The VM name that was used as the source of the clone. to - The name of the newly cloned VM.
Examples
@cloner.update_config 'foo', 'bar'
Returns nothing.
# File lib/fission/action/vm/cloner.rb, line 132 def update_config(from, to) ['.vmx', '.vmxf', '.vmdk'].each do |ext| file = File.join @target_vm.path, "#{to}#{ext}" unless File.binary?(file) text = (File.read file).gsub from, to File.open(file, 'w'){ |f| f.print text } end clean_up_conf_file(file) if ext == '.vmx' end end
Internal: Provides the list of file extensions for VM related files.
Examples
@cloner.vm_file_extension # => ['.nvram', '.vmdk', '.vmem']
Returns an Array containing the file extensions of VM realted files. The file extensions returned are Strings and include a '.'.
# File lib/fission/action/vm/cloner.rb, line 116 def vm_file_extensions ['.nvram', '.vmdk', '.vmem', '.vmsd', '.vmss', '.vmx', '.vmxf'] end
Internal: Helper for getting the configured #vmrun_cmd value.
Examples
@cloner.vmrun_cmd # => "/foo/bar/vmrun -T fusion"
Returns a String for the configured value of Fission#config.
# File lib/fission/action/vm/cloner.rb, line 183 def vmrun_cmd Fission.config['vmrun_cmd'] end