in managementnode/lib/VCL/Module/Provisioning/xCAT.pm [649:785]
sub does_image_exist {
my $self = shift;
unless (ref($self) && $self->isa('VCL::Module')) {
notify($ERRORS{'CRITICAL'}, 0, "subroutine can only be called as a VCL::Module module object method");
return;
}
# Get the image name, first try passed argument, then data
my $image_name = shift || $self->data->get_image_name();
if (!$image_name) {
notify($ERRORS{'WARNING'}, 0, "unable to determine image name");
return;
}
# Get the image install type
my $image_os_install_type = $self->data->get_image_os_install_type();
if (!$image_os_install_type) {
notify($ERRORS{'WARNING'}, 0, "image OS install type could not be determined");
return;
}
else {
notify($ERRORS{'DEBUG'}, 0, "image OS install type: $image_os_install_type");
}
# Get the image repository path
my $image_repository_path = $self->get_image_repository_directory_path($image_name);
if (!$image_repository_path) {
notify($ERRORS{'WARNING'}, 0, "image repository path could not be determined");
return;
}
else {
notify($ERRORS{'DEBUG'}, 0, "image repository path: $image_repository_path");
}
# Run du to get the size of the image files if the image exists
my $du_command;
if ($image_os_install_type eq 'kickstart') {
$du_command = "du -c $image_repository_path 2>&1 | grep total 2>&1"
}
else {
$du_command = "du -c $image_repository_path/*$image_name* 2>&1 | grep total 2>&1"
}
my ($du_exit_status, $du_output) = $self->mn_os->execute($du_command);
# If the partner doesn't have the image, a "no such file" error should be displayed
my $image_files_exist;
if (!defined($du_output)) {
notify($ERRORS{'WARNING'}, 0, "failed to execute command $du_command");
return;
}
elsif (grep(/no such file/i, @$du_output)) {
notify($ERRORS{'OK'}, 0, "$image_name does NOT exist");
$image_files_exist = 0;
}
elsif (!grep(/\d+\s+total/i, @$du_output)) {
notify($ERRORS{'WARNING'}, 0, "du output does not contain a total line:\n" . join("\n", @$du_output));
return;
}
# Return 1 if the image size > 0
my ($image_size) = (@$du_output[0] =~ /(\d+)\s+total/);
if ($image_size && $image_size > 0) {
my $image_size_mb = int($image_size / 1024);
notify($ERRORS{'DEBUG'}, 0, "$image_name exists in $image_repository_path, size: $image_size_mb MB");
$image_files_exist = 1;
}
else {
notify($ERRORS{'DEBUG'}, 0, "image does NOT exist: $image_name");
$image_files_exist = 0;
}
# Image files exist, make sure template (.tmpl) file exists
# Get the tmpl repository path
my $tmpl_repository_path = $self->_get_tmpl_directory_path($image_name);
if (!$tmpl_repository_path) {
notify($ERRORS{'WARNING'}, 0, "image template path could not be determined for $image_name");
return;
}
else {
notify($ERRORS{'DEBUG'}, 0, "template repository path for $image_name: $tmpl_repository_path");
}
# Check if template file exists for the image
# -s File has nonzero size
my $tmpl_file_exists;
if (-s "$tmpl_repository_path/$image_name.tmpl") {
$tmpl_file_exists = 1;
notify($ERRORS{'DEBUG'}, 0, "template file exists: $image_name.tmpl");
}
else {
$tmpl_file_exists = 0;
notify($ERRORS{'DEBUG'}, 0, "template file does not exist: $tmpl_repository_path/$image_name.tmpl");
}
# Check if either tmpl file or image files exist, but not both
# Attempt to correct the situation:
# tmpl file exists but not image files: delete tmpl file
# image files exist but not tmpl file: create tmpl file
if ($tmpl_file_exists && !$image_files_exist && $image_os_install_type ne 'kickstart') {
notify($ERRORS{'WARNING'}, 0, "template file exists but image files do not for $image_name");
# Attempt to delete the orphaned tmpl file for the image
if ($self->_delete_template($image_name)) {
notify($ERRORS{'OK'}, 0, "deleted orphaned template file for image $image_name");
$tmpl_file_exists = 0;
}
else {
notify($ERRORS{'WARNING'}, 0, "failed to delete orphaned template file for image $image_name, returning undefined");
return;
}
} ## end if ($tmpl_file_exists && !$image_files_exist)
elsif (!$tmpl_file_exists && $image_files_exist && $image_os_install_type ne 'kickstart') {
notify($ERRORS{'WARNING'}, 0, "image files exist but template file does not for $image_name");
# Attempt to create the missing tmpl file for the image
if ($self->_create_template($image_name)) {
notify($ERRORS{'OK'}, 0, "created missing template file for image $image_name");
$tmpl_file_exists = 1;
}
else {
notify($ERRORS{'WARNING'}, 0, "failed to create missing template file for image $image_name, returning undefined");
return;
}
} ## end elsif (!$tmpl_file_exists && $image_files_exist) [ if ($tmpl_file_exists && !$image_files_exist)
# Check if both image files and tmpl file were found and return
if ($tmpl_file_exists && $image_files_exist) {
notify($ERRORS{'DEBUG'}, 0, "image $image_name exists on this management node");
return 1;
}
else {
notify($ERRORS{'DEBUG'}, 0, "image $image_name does NOT exist on this management node");
return 0;
}
} ## end sub does_image_exist