From 4325ee63e9bc25899b8b733178273fffc4ea14e3 Mon Sep 17 00:00:00 2001 From: jbjohnso Date: Wed, 21 Oct 2009 16:39:17 +0000 Subject: [PATCH] -Fix problem where vcenter migrations outside of xcat control would invalidate vm.host git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4433 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/esx.pm | 54 +++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/esx.pm b/xCAT-server/lib/xcat/plugins/esx.pm index 946ca371f..4a501e9ca 100644 --- a/xCAT-server/lib/xcat/plugins/esx.pm +++ b/xCAT-server/lib/xcat/plugins/esx.pm @@ -7,6 +7,7 @@ use xCAT::Utils; use Time::HiRes qw (sleep); use xCAT::MsgUtils; use xCAT::SvrUtils; +use xCAT::NodeRange; use xCAT::Common; use xCAT::VMCommon; use POSIX "WNOHANG"; @@ -36,6 +37,7 @@ my $output_handler; #Pointer to the function to drive results to client my $executerequest; my %tablecfg; #to hold the tables my $currkey; +my $viavcenter; my %guestidmap = ( @@ -272,7 +274,7 @@ sub process_request { #my $children = 0; #my $vmmaxp = 84; #$SIG{CHLD} = sub { my $cpid; while ($cpid = waitpid(-1, WNOHANG) > 0) { delete $esx_comm_pids{$cpid}; $children--; } }; - my $viavcenter = 0; + $viavcenter = 0; if ($command eq 'rmigrate') { #Only use vcenter when required, fewer prereqs $viavcenter = 1; } @@ -284,6 +286,7 @@ sub process_request { foreach my $hyp (sort(keys %hyphash)){ #if($pid == 0){ if ($viavcenter or (defined $tablecfg{hypervisor}->{$hyp}->[0]->{mgr} and not $tablecfg{hypervisor}->{$hyp}->[0]->{preferdirect})) { + $viavcenter=1; $hypready{$hyp} = 0; #This hypervisor requires a flag be set to signify vCenter sanenes before proceeding $hyphash{$hyp}->{conn} = Vim->new(service_url=>"https://$hyp/sdk"); #Direct connect to install/check licenses $hyphash{$hyp}->{conn}->login(user_name=>$hyphash{$hyp}->{username},password=>$hyphash{$hyp}->{password}); @@ -359,11 +362,11 @@ sub do_cmd { my $command = shift; my @exargs = @_; if ($command eq 'rpower') { - generic_vm_operation(['config.name','config','runtime.powerState'],\&power,@exargs); + generic_vm_operation(['config.name','config','runtime.powerState','runtime.host'],\&power,@exargs); } elsif ($command eq 'rmvm') { - generic_vm_operation(['config.name','runtime.powerState'],\&rmvm,@exargs); + generic_vm_operation(['config.name','runtime.powerState','runtime.host'],\&rmvm,@exargs); } elsif ($command eq 'rsetboot') { - generic_vm_operation(['config.name'],\&setboot,@exargs); + generic_vm_operation(['config.name','runtime.host'],\&setboot,@exargs); } elsif ($command eq 'mkvm') { generic_hyp_operation(\&mkvms,@exargs); } elsif ($command eq 'rmigrate') { #Technically, on a host view, but vcenter path is 'weirder' @@ -890,9 +893,48 @@ sub generic_vm_operation { #The general form of firing per-vm requests to ESX hy my $properties = shift; #The relevant properties to the general task, MUST INCLUDE config.name my $function = shift; #The function to actually run against the right VM view my @exargs = @_; #Store the rest to pass on - my $hyp; + my $hyp; + my $vmviews; + my %vcviews; #views populated once per vcenter server for improved performance + if ($viavcenter) { + foreach $hyp (keys %hyphash) { + if ($vcviews{$hyphash{$hyp}->{vcenter}->{name}}) { next; } + $vcviews{$hyphash{$hyp}->{vcenter}->{name}} = $hyphash{$hyp}->{conn}->find_entity_views(view_type => 'VirtualMachine',properties=>$properties); + foreach (@{$vcviews{$hyphash{$hyp}->{vcenter}->{name}}}) { + my $node = $_->{'config.name'}; + unless (defined $tablecfg{vm}->{$node}) { + $node =~ s/\..*//; #try the short name; + } + if (defined $tablecfg{vm}->{$node}) { #see if the host pointer requires a refresh + my $host = $hyphash{$hyp}->{conn}->get_view(mo_ref=>$_->{'runtime.host'}); + $host = $host->summary->config->name; + if ( $tablecfg{vm}->{$node}->[0]->{host} eq "$host" ) { next; } + my $shost = $host; + $shost =~ s/\..*//; + if ( $tablecfg{vm}->{$node}->[0]->{host} eq "$shost" ) { next; } + #time to figure out which of these is a node + my @nodes = noderange("$host,$shost"); + my $vmtab = xCAT::Table->new("vm",-create=>1); + unless($vmtab){ + die "Error opening vm table"; + } + if ($nodes[0]) { + print $node. " and ".$nodes[0]; + $vmtab->setNodeAttribs($node,{host=>$nodes[0]}); + } else { + $vmtab->setNodeAttribs($node,{host=>$host}); + } + + } + } + } + } foreach $hyp (keys %hyphash) { - my $vmviews = $hyphash{$hyp}->{conn}->find_entity_views(view_type => 'VirtualMachine',properties=>$properties); + if ($viavcenter) { + $vmviews= $vcviews{$hyphash{$hyp}->{vcenter}->{name}} + } else { + $vmviews = $hyphash{$hyp}->{conn}->find_entity_views(view_type => 'VirtualMachine',properties=>$properties); + } my %mgdvms; #sort into a hash for convenience foreach (@$vmviews) { $mgdvms{$_->{'config.name'}} = $_;