Adding the chvm method for esx. Not quite finished, but shouldn't break anything else

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6372 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
cjhardee 2010-06-07 19:44:48 +00:00
parent 76a472c98b
commit ddd0b2e197

@ -416,83 +416,235 @@ sub do_cmd {
generic_vm_operation(['config.name','runtime.powerState','runtime.host'],\&rmvm,@exargs);
} elsif ($command eq 'rsetboot') {
generic_vm_operation(['config.name','runtime.host'],\&setboot,@exargs);
} elsif ($command eq 'chvm') {
chvm(@exargs);
} elsif ($command eq 'rinv') {
generic_vm_operation(['config.name','config','runtime.host'],\&inv,@exargs);
} elsif ($command eq 'rmhypervisor') {
generic_hyp_operation(\&rmhypervisor,@exargs);
} elsif ($command eq 'mkvm') {
generic_hyp_operation(\&mkvms,@exargs);
} elsif ($command eq 'chvm') {
generic_vm_operation(['config.name','config','runtime.host'],\&chvm,@exargs);
#generic_hyp_operation(\&chvm,@exargs);
} elsif ($command eq 'rmigrate') { #Technically, on a host view, but vcenter path is 'weirder'
generic_hyp_operation(\&migrate,@exargs);
}
wait_for_tasks();
}
#inventory request for esx
sub inv {
my %args = @_;
my $node = $args{node};
my $hyp = $args{hyp};
if (not defined $args{vmview}) { #attempt one refresh
$args{vmview} = $hyphash{$hyp}->{conn}->find_entity_view(view_type => 'VirtualMachine',properties=>['config.name','runtime.powerState'],filter=>{name=>$node});
}
if (not defined $args{vmview}) {
sendmsg([1,"VM does not appear to exist"],$node);
return;
}
my $vmview = $args{vmview};
my $uuid = $vmview->config->uuid;
sendmsg("$node: UUID/GUI: $uuid");
my $cpuCount = $vmview->config->hardware->numCPU;
sendmsg("$node: CPUs: $cpuCount");
my $memory = $vmview->config->hardware->memoryMB;
sendmsg("$node: Memory: $memory MB");
my $devices = $vmview->config->hardware->device;
my $label;
my $size;
my $fileName;
my $device;
foreach $device (@$devices) {
$label = $device->deviceInfo->label;
my %args = @_;
my $node = $args{node};
my $hyp = $args{hyp};
if (not defined $args{vmview}) { #attempt one refresh
$args{vmview} = $hyphash{$hyp}->{conn}->find_entity_view(view_type => 'VirtualMachine',properties=>['config.name','runtime.powerState'],filter=>{name=>$node});
}
if (not defined $args{vmview}) {
sendmsg([1,"VM does not appear to exist"],$node);
return;
}
my $vmview = $args{vmview};
my $uuid = $vmview->config->uuid;
sendmsg("$node: UUID/GUI: $uuid");
my $cpuCount = $vmview->config->hardware->numCPU;
sendmsg("$node: CPUs: $cpuCount");
my $memory = $vmview->config->hardware->memoryMB;
sendmsg("$node: Memory: $memory MB");
my $devices = $vmview->config->hardware->device;
my $label;
my $size;
my $fileName;
my $device;
foreach $device (@$devices) {
$label = $device->deviceInfo->label;
if($label =~ /^Hard disk/) {
$size = $device->capacityInKB / 1024;
$fileName = $device->backing->fileName;
if($label =~ /^Hard disk/) {
$size = $device->capacityInKB / 1024;
$fileName = $device->backing->fileName;
sendmsg("$node: $label: $size MB @ $fileName");
}
sendmsg("$node: $label: $size MB @ $fileName");
}
}
}
sub chvm {
# my @exargs = @_;
#
# my $reconfigspec;
# if ($reconfigspec = getreconfigspec(node=>$node,view=>$args{vmview})) {
# if ($currstat eq 'poweredOff') {
# #sendmsg("Correcting guestId because $currid and $rightid are not the same...");#DEBUG
# my $task = $args{vmview}->ReconfigVM_Task(spec=>$reconfigspec);
# $running_tasks{$task}->{task} = $task;
# $running_tasks{$task}->{callback} = \&reconfig_callback;
# $running_tasks{$task}->{hyp} = $args{hyp};
# $running_tasks{$task}->{data} = { node => $node, reconfig_fun=>\&power, reconfig_args=>\%args };
# return;
# } elsif (grep /$subcmd/,qw/reset boot/) { #going to have to do a 'cycle' and present it up normally..
# #sendmsg("DEBUG: forcing a cycle");
# $task = $args{vmview}->PowerOffVM_Task();
# $running_tasks{$task}->{task} = $task;
# $running_tasks{$task}->{callback} = \&repower;
# $running_tasks{$task}->{hyp} = $args{hyp};
# $running_tasks{$task}->{data} = { node => $node, power_args=>\%args};
# return; #we have to wait
# }
#TODO: fixit
#sendmsg("I see vm has $currid and I want it to be $rightid");
# }
#changes the memory, number of cpus and device size
#can also add and remove disks
sub chvm {
my %args = @_;
my $node = $args{node};
my $hyp = $args{hyp};
if (not defined $args{vmview}) { #attempt one refresh
$args{vmview} = $hyphash{$hyp}->{conn}->find_entity_view(view_type => 'VirtualMachine',
properties=>['config.name','runtime.powerState'],
filter=>{name=>$node});
}
if (not defined $args{vmview}) {
sendmsg([1,"VM does not appear to exist"],$node);
return;
}
@ARGV= @{$args{exargs}};
my @deregister;
my @purge;
my @add;
my %resize;
my $cpuCount;
my $memory;
my $vmview = $args{vmview};
require Getopt::Long;
$SIG{__WARN__} = sub {
sendmsg([1,"Could not parse options, ".shift()]);
};
my $rc = GetOptions(
"d=s" => \@deregister,
"p=s" => \@purge,
"a=s" => \@add,
"resize=s%" => \%resize,
"cpus=i" => \$cpuCount,
"mem=s" => \$memory
);
$SIG{__WARN__} = 'DEFAULT';
if(@ARGV) {
sendmsg("Invalid arguments: @ARGV");
return;
}
if(!$rc) {
return;
}
#use Data::Dumper;
#sendmsg("dereg = ".Dumper(\@deregister));
#sendmsg("purge = ".Dumper(\@purge));
#sendmsg("add = ".Dumper(\@add));
#sendmsg("resize = ".Dumper(\%resize));
#sendmsg("cpus = $cpuCount");
#sendmsg("mem = ".getUnits($memory,"K",1024));
my %conargs;
if($cpuCount) {
$conargs{numCPUs} = $cpuCount;
}
if($memory) {
$conargs{memoryMB} = getUnits($memory, "M", 1048576);
}
my $disk;
my $devices = $vmview->config->hardware->device;
my $label;
my $device;
my $cmdLabel;
my $newSize;
my @devChanges;
if(@deregister) {
for $disk (@deregister) {
$device = getDiskByLabel($disk, $devices);
unless($device) {
sendmsg("$node: Disk: $disk does not exist");
return;
}
#sendmsg(Dumper($device));
push @devChanges, VirtualDeviceConfigSpec->new(
device => $device,
operation => VirtualDeviceConfigSpecOperation->new('remove'));
}
}
if(@purge) {
for $disk (@purge) {
$device = getDiskByLabel($disk, $devices);
unless($device) {
sendmsg("$node: Disk: $disk does not exist");
return;
}
#sendmsg(Dumper($device));
push @devChanges, VirtualDeviceConfigSpec->new(
device => $device,
operation => VirtualDeviceConfigSpecOperation->new('remove'),
fileOperation => VirtualDeviceConfigSpecFileOperation->new('destroy'));
}
}
if(@add) {
my $addSizes = join(',',@add);
push @devChanges, create_storage_devs($node,$hyphash{$hyp}->{datastoremap},$addSizes);
}
if(%resize) {
while( my ($key, $value) = each(%resize) ) {
my @drives = split(/,/, $key);
for my $device ( @drives ) {
my $disk = $device;
$device = getDiskByLabel($disk, $devices);
unless($device) {
sendmsg("$node: Disk: $disk does not exist");
return;
}
$value = getUnits($value, "G", 1024);
my $newDevice = VirtualDisk->new(deviceInfo => $device->deviceInfo,
key => $device->key,
controllerKey => $device->controllerKey,
unitNumber => $device->unitNumber,
deviceInfo => $device->deviceInfo,
backing => $device->backing,
capacityInKB => $value);
push @devChanges, VirtualDeviceConfigSpec->new(
device => $newDevice,
operation => VirtualDeviceConfigSpecOperation->new('edit'));
}
}
}
if(@devChanges) {
$conargs{deviceChange} = \@devChanges;
}
use Data::Dumper;
sendmsg(Dumper(\%conargs));
my $reconfigspec = VirtualMachineConfigSpec->new(%conargs);
#sendmsg("reconfigspec = ".Dumper($reconfigspec));
my $task = $vmview->ReconfigVM_Task(spec=>$reconfigspec);
$running_tasks{$task}->{task} = $task;
$running_tasks{$task}->{callback} = \&generic_task_callback;
$running_tasks{$task}->{hyp} = $hyp;
$running_tasks{$task}->{data} = { node => $node, successtext => "node successfully changed" };
}
#given a device list from a vm and a label for a hard disk, returns the device object
sub getDiskByLabel {
my $cmdLabel = shift;
my $devices = shift;
my $device;
my $label;
$cmdLabel = commandLabel($cmdLabel);
foreach $device (@$devices) {
$label = $device->deviceInfo->label;
if($cmdLabel eq $label) {
return $device;
}
}
return undef;
}
#takes a label for a hard disk and prepends "Hard disk " if it's not there already
sub commandLabel {
my $label = shift;
if($label =~ /^Hard disk/) {
return $label;
}
return "Hard disk ".$label;
}
#this function will check pending task status
@ -1544,7 +1696,7 @@ sub create_storage_devs {
my @devs;
my $havescsidevs =0;
my $disktype = 'ide';
my $unitnum=0; #Going to make IDE controllers for now, aiming for
my $unitnum=1; #Going to make IDE controllers for now, aiming for
#lowest common denominator guest driver for
#changing hypervisor technology
my %disktocont;
@ -1603,17 +1755,17 @@ sub create_storage_devs {
}
#It *seems* that IDE controllers are not subject to require creation, so we skip it
if ($havescsidevs) { #need controllers to attach the disks to
foreach(0..$scsicontrollerkey) {
$dev=VirtualLsiLogicController->new(key => $_,
device => \@{$disktocont{$_}},
sharedBus => VirtualSCSISharing->new('noSharing'),
busNumber => $_);
push @devs,VirtualDeviceConfigSpec->new(device => $dev,
operation => VirtualDeviceConfigSpecOperation->new('add'));
}
}
# if ($havescsidevs) { #need controllers to attach the disks to
# foreach(0..$scsicontrollerkey) {
# $dev=VirtualLsiLogicController->new(key => $_,
# device => \@{$disktocont{$_}},
# sharedBus => VirtualSCSISharing->new('noSharing'),
# busNumber => $_);
# push @devs,VirtualDeviceConfigSpec->new(device => $dev,
# operation => VirtualDeviceConfigSpecOperation->new('add'));
#
# }
# }
return @devs;
# my $ctlr = VirtualIDEController->new(
}