From 7546904db7aea01a6d44033a21736af0366dd69a Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Fri, 7 Aug 2015 14:52:24 -0700 Subject: [PATCH] Additional utility and reporting scripts --- scripts/create_template_deltas.rb | 98 +++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100755 scripts/create_template_deltas.rb diff --git a/scripts/create_template_deltas.rb b/scripts/create_template_deltas.rb new file mode 100755 index 0000000..682b9e6 --- /dev/null +++ b/scripts/create_template_deltas.rb @@ -0,0 +1,98 @@ +#!/usr/bin/ruby + +require 'rubygems' +require 'rbvmomi' +require 'yaml' + +def load_configuration( file_array ) + file_array.each do |file| + file = File.expand_path( file ) + + if File.exists?( file ) + return YAML.load_file( file ) + end + end + + return false +end + +def create_template_deltas( folder ) + config = load_configuration( [ 'vmpooler.yaml', '~/.vmpooler' ] ) || nil + + abort 'No config file (./vmpooler.yaml or ~/.vmpooler) found!' unless config + + vim = RbVmomi::VIM.connect( + :host => config[ :vsphere ][ :server ], + :user => config[ :vsphere ][ :username ], + :password => config[ :vsphere ][ :password ], + :ssl => true, + :insecure => true, + ) or abort "Unable to connect to #{config[ :vsphere ][ :server ]}!" + + containerView = vim.serviceContent.viewManager.CreateContainerView( { + :container => vim.serviceContent.rootFolder, + :recursive => true, + :type => [ 'VirtualMachine' ] + } ) + + datacenter = vim.serviceInstance.find_datacenter + base = datacenter.vmFolder + + case base + when RbVmomi::VIM::Folder + base = base.childEntity.find { |f| f.name == folder } + else + abort "Unexpected object type encountered (#{base.class}) while finding folder!" + end + + unless base + abort "Folder #{ARGV[0]} not found!" + end + + base.childEntity.each do |vm| + print vm.name + + begin + disks = vm.config.hardware.device.grep( RbVmomi::VIM::VirtualDisk ) + rescue + puts ' !' + next + end + + begin + disks.select { |d| d.backing.parent == nil }.each do |disk| + linkSpec = { + :deviceChange => [ + { + :operation => :remove, + :device => disk + }, + { + :operation => :add, + :fileOperation => :create, + :device => disk.dup.tap { |x| + x.backing = x.backing.dup + x.backing.fileName = "[#{disk.backing.datastore.name}]" + x.backing.parent = disk.backing + } + } + ] + } + + vm.ReconfigVM_Task( :spec => linkSpec ).wait_for_completion + end + + puts " \u2713" + rescue + puts ' !' + end + end + + vim.close +end + +if ARGV[0] + create_template_deltas( ARGV[0] ) +else + puts "Usage: #{$0} " +end