sub _initialize : Init()

in managementnode/lib/VCL/DataStructure.pm [644:770]


sub _initialize : Init {
	my ($self, $args) = @_;
	
	# Get the management node info and add it to %ENV
	my $management_node_info = get_management_node_info();
	if (!$management_node_info) {
		notify($ERRORS{'WARNING'}, 0, "unable to obtain management node info for this node");
		return;
	}
	
	# Replace the request data with a deep copy if itself
	# This creates entirely separate copies in case multiple DataStructure objects are used
	# If not deep copied, the separate objects will alter each other's data
	$self->refresh_request_data(dclone($self->request_data)) if $self->request_data;
	
	# Set the request and reservation IDs in the request data hash if they are undefined
	$self->request_data->{id} = ($self->request_id || 0) if (!defined($self->request_data->{id}));
	$self->request_data->{RESERVATIONID} = ($self->reservation_id || 0) if (!defined($self->request_data->{RESERVATIONID}));
	if ($self->request_data->{RESERVATIONID} == 0) {
		$self->request_data->{reservation}{0}{serverrequest}{id} = 0;
		$self->request_data->{forimaging} = 0;
		$self->request_data->{state}{name} = "available";
		
	}

	my $computer_identifier = $self->computer_identifier;
	my $vmhost_identifier = $self->vmhost_identifier;
	my $image_identifier = $self->image_identifier;
	my $imagerevision_identifier = $self->imagerevision_identifier;
	
	# Get the computer info if the computer_identifier argument was specified and add it to this object
	if ($computer_identifier) {
		notify($ERRORS{'DEBUG'}, 0, "computer identifier argument was specified, retrieving data for computer: $computer_identifier");
		my $computer_info = get_computer_info($computer_identifier, 1);
		if (!$computer_info) {
			notify($ERRORS{'WARNING'}, 0, "DataStructure object could not be initialized, failed to retrieve data for computer: $computer_identifier");
			
			# Throw an exception because simply returning undefined (return;) does not result in this DataStructure object being undefined
			Exception::Class::Base->throw(error => "DataStructure object could not be initialized, failed to retrieve data for computer: $computer_identifier");
			return;
		}
		
		$self->request_data->{reservation}{$self->reservation_id}{computer} = $computer_info;
	}
	
	# Get the VM host info if the $vmhost_identifier argument was specified and add it to this object
	if ($vmhost_identifier) {
		notify($ERRORS{'DEBUG'}, 0, "VM host identifier argument was specified, retrieving data for VM host: $vmhost_identifier");
		my $vmhost_info = get_vmhost_info($vmhost_identifier, 1);
		if (!$vmhost_info) {
			notify($ERRORS{'WARNING'}, 0, "DataStructure object could not be initialized, failed to retrieve data for VM host: $vmhost_identifier");
			
			# Throw an exception because simply returning undefined (return;) does not result in this DataStructure object being undefined
			Exception::Class::Base->throw(error => "DataStructure object could not be initialized, failed to retrieve data for VM host: $vmhost_identifier");
			return;
		}
		$self->request_data->{reservation}{$self->reservation_id}{computer}{vmhost} = $vmhost_info;
	}

	# If either the computer, image, or imagerevision identifier arguments are specified, retrieve appropriate image and imagerevision data
	if (defined($imagerevision_identifier) || defined($image_identifier) || defined($computer_identifier)) {
		my $imagerevision_info;
		
		if (defined($imagerevision_identifier)) {
			$imagerevision_identifier = 'noimage' if !$imagerevision_identifier;
			notify($ERRORS{'DEBUG'}, 0, "imagerevision identifier argument was specified: $imagerevision_identifier, DataStructure object will contain image information for this imagerevision: $imagerevision_identifier");
			$imagerevision_info = get_imagerevision_info($imagerevision_identifier);
		}
		elsif (defined($image_identifier)) {
			$image_identifier = 'noimage' if !$image_identifier;
			notify($ERRORS{'DEBUG'}, 0, "image identifier argument was specified: $image_identifier, DataStructure object will contain image information for the production imagerevision of this image");
			$imagerevision_info = get_production_imagerevision_info($image_identifier);
		}
		elsif (defined($computer_identifier)) {
			my $imagerevision_id = $self->get_computer_imagerevision_id();
			if (defined($imagerevision_id)) {
				notify($ERRORS{'DEBUG'}, 0, "computer identifier argument was specified ($computer_identifier) but image and imagerevision ID arguments were not, DataStructure object will contain image information for the computer's current imagerevision ID: $imagerevision_id");
				if (!$imagerevision_id) {
					notify($ERRORS{'DEBUG'}, 0, "computer identifier argument was specified ($computer_identifier) imagerevision_id is set to $imagerevision_id");
					my $image_id = $self->get_computer_currentimage_id();
					if (defined($image_id)) {
						$imagerevision_info = get_production_imagerevision_info($image_id);
					}
					else {
						Exception::Class::Base->throw(error => "DataStructure object could not be initialized, computer's current imagerevision ID could not be retrieved from the current DataStructure data:\n" . format_data($self->get_request_data));
						return;
					}
				}
				else {
					$imagerevision_info = get_imagerevision_info($imagerevision_id);
				}
			}
			else {
				Exception::Class::Base->throw(error => "DataStructure object could not be initialized, computer's current imagerevision ID could not be retrieved from the current DataStructure data:\n" . format_data($self->get_request_data));
				return;
			}
		}
		
		if ($imagerevision_info) {
			my $imagerevision_id = $imagerevision_info->{id};
			notify($ERRORS{'DEBUG'}, 0, "retrieved data for imagerevision ID: $imagerevision_id");
			$self->request_data->{reservation}{$self->reservation_id}{imagerevision} = $imagerevision_info;
		}
		else {
			Exception::Class::Base->throw(error => "DataStructure object could not be initialized, failed to retrieve imagerevision data");
			return;
		}
		
		my $image_id = $imagerevision_info->{imageid};
		if (!defined($image_id)) {
			Exception::Class::Base->throw(error => "DataStructure object could not be initialized, failed to retrieve image ID from the imagerevision data:\n" . format_data($imagerevision_info));
			return;
		}
		
		my $image_info = get_image_info($image_id);
		if ($image_info) {
			notify($ERRORS{'DEBUG'}, 0, "retrieved data for image ID: $image_id");
			$self->request_data->{reservation}{$self->reservation_id}{image} = $image_info;
		}
		else {
			Exception::Class::Base->throw(error => "DataStructure object could not be initialized, failed to retrieve data for image ID: " . $self->image_id);
			return;
		}
	}
	
	return 1;
}