You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2015/10/22 22:50:16 UTC

svn commit: r1710101 - /vcl/trunk/managementnode/lib/VCL/utils.pm

Author: arkurth
Date: Thu Oct 22 20:50:16 2015
New Revision: 1710101

URL: http://svn.apache.org/viewvc?rev=1710101&view=rev
Log:
VCL-898
Added utils.pm::insert_reservation. It isn't currently called from anywhere. The existing insert_request subroutine needed to be reworked. The new subroutine is a more flexible and only inserts a log table entry for reservations tied to a user such as if the request state is 'new'.

Modified:
    vcl/trunk/managementnode/lib/VCL/utils.pm

Modified: vcl/trunk/managementnode/lib/VCL/utils.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1710101&r1=1710100&r2=1710101&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/utils.pm Thu Oct 22 20:50:16 2015
@@ -196,6 +196,7 @@ our @EXPORT = qw(
 	insert_nathost
 	insert_reload_request
 	insert_request
+	insert_reservation
 	insertloadlog
 	ip_address_to_hostname
 	ip_address_to_network_address
@@ -8082,6 +8083,207 @@ EOF
 	}
 }
 
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 insert_reservation
+
+ Parameters  : hash reference
+ Returns     : array or integer
+ Description : Inserts a reservation into the database. A hash reference
+               argument must be supplied with the following keys:
+                  state          : request state name
+                  user           : user identifier
+                  computer       : computer identifier
+                  imagerevision  : image revision identifier
+               
+               The following keys are optional:
+                  managementnode : management node identifier
+                                   (default: current management node)
+                  laststate      : request laststate name
+                                   (default: same as request.state)
+                  start_minutes  : minutes in future of request.start
+                                   (default: 0)
+                  end_minutes    : minutes in future of request.end
+                                   (default: 120)
+
+=cut
+
+sub insert_reservation {
+	my ($arguments) = @_;
+	if (!defined($arguments)) {
+		notify($ERRORS{'WARNING'}, 0, "argument hash reference was not supplied");
+		return;
+	}
+	elsif (!ref($arguments) || ref($arguments) ne 'HASH') {
+		notify($ERRORS{'WARNING'}, 0, "argument is not a hash reference:\n" . format_data($arguments));
+		return;
+	}
+	
+	my $managementnode_identifier 	= $arguments->{'managementnode'};
+	my $request_state_name 				= $arguments->{'state'};
+	my $request_laststate_name 		= $arguments->{'laststate'};
+	my $user_identifier 					= $arguments->{'user'};
+	my $computer_identifier 			= $arguments->{'computer'};
+	my $imagerevision_identifier 		= $arguments->{'imagerevision'};
+	my $future_start_minutes 			= $arguments->{'start_minutes'} || 0;
+	my $future_end_minutes 				= $arguments->{'end_minutes'} || 120;
+	
+	if (!defined($request_state_name)) {
+		notify($ERRORS{'WARNING'}, 0, "argument hash reference does not contain a required 'state' key");
+		return;
+	}
+	if (!defined($user_identifier)) {
+		notify($ERRORS{'WARNING'}, 0, "argument hash reference does not contain a required 'user' key");
+		return;
+	}
+	if (!defined($computer_identifier)) {
+		notify($ERRORS{'WARNING'}, 0, "argument hash reference does not contain a required 'computer' key");
+		return;
+	}
+	if (!defined($imagerevision_identifier)) {
+		notify($ERRORS{'WARNING'}, 0, "argument hash reference does not contain a required 'imagerevision' key");
+		return;
+	}
+	
+	$request_laststate_name = $request_state_name unless defined($request_laststate_name);
+	
+	# Retrieve current management node info if argument was not specified
+	my $management_node_info = get_management_node_info($managementnode_identifier);
+	if (!defined($management_node_info)) {
+		notify($ERRORS{'WARNING'}, 0, "failed to insert reservation, management node info could not be retrieved");
+		return;
+	}
+	my $management_node_id = $management_node_info->{id};
+	my $management_node_hostname = $management_node_info->{hostname};
+	
+	my $user_info = get_user_info($user_identifier);
+	if (!defined($user_info)) {
+		notify($ERRORS{'WARNING'}, 0, "failed to insert reservation, user info could not be retrieved");
+		return;
+	}
+	my $user_id = $user_info->{id};
+	my $user_unityid = $user_info->{unityid};
+	
+	my $computer_info = get_computer_info($computer_identifier);
+	if (!defined($computer_info)) {
+		notify($ERRORS{'WARNING'}, 0, "failed to insert reservation, computer info could not be retrieved");
+		return;
+	}
+	my $computer_id = $computer_info->{id};
+	my $computer_hostname = $computer_info->{hostname};
+	
+	my $imagerevision_info = get_imagerevision_info($imagerevision_identifier);
+	if (!defined($imagerevision_info)) {
+		notify($ERRORS{'WARNING'}, 0, "failed to insert reservation, image revision info could not be retrieved");
+		return;
+	}
+	my $imagerevision_id = $imagerevision_info->{id};
+	my $image_id = $imagerevision_info->{imageid};
+	my $image_name = $imagerevision_info->{imagename};
+	
+	notify($ERRORS{'DEBUG'}, 0, "attempting to insert reservation:\n" .
+		"request state: $request_state_name/$request_laststate_name\n" .
+		"management node: $management_node_hostname (ID: $management_node_id)\n" .
+		"user: $user_unityid (ID: $user_id)\n" .
+		"computer: $computer_hostname (ID: $computer_id)\n" .
+		"image: $image_name (ID: $image_id, imagerevision ID: $imagerevision_id)"
+	);
+	
+	# Only insert a log table entry if this reservation is tied to a user
+	# Don't insert for reload, tomaintenance, etc.
+	if ($request_state_name =~ /^(new|inuse|reserved|timeout)$/) {
+		my $insert_log_statement = <<EOF;
+INSERT INTO log
+(userid, start, initialend, finalend, computerid, imageid)
+VALUES (
+	$user_id,
+	TIMESTAMPADD(MINUTE, $future_start_minutes, NOW()),
+	NOW(),
+	TIMESTAMPADD(MINUTE, $future_end_minutes, NOW()),
+	$computer_id,
+	$image_id
+)
+EOF
+		my $log_id = database_execute($insert_log_statement);
+		if (!$log_id) {
+			notify($ERRORS{'WARNING'}, 0, "unable to insert reservation, failed to insert into log table");
+			return;
+		}
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "log table entry not inserted, request state: $request_state_name");
+	}
+
+	my $insert_sublog_statement = <<EOF;
+INSERT INTO sublog
+(logid, imageid, imagerevisionid, computerid, managementnodeid, predictivemoduleid)
+VALUES (
+	$log_id,
+	$image_id,
+	$imagerevision_id,
+	$computer_id,
+	$management_node_id,
+	(SELECT MIN(id) FROM module WHERE perlpackage = 'VCL::Module::Predictive::Level_0')
+)
+EOF
+	my $sublog_id = database_execute($insert_sublog_statement);
+	if (!$sublog_id) {
+		notify($ERRORS{'WARNING'}, 0, "unable to insert reservation, failed to insert into sublog table");
+		return;
+	}
+	
+	my $insert_request_statement = <<EOF;
+INSERT INTO request
+(userid, stateid, laststateid, logid, start, end)
+VALUES (
+	$user_id,
+	(SELECT id FROM state WHERE name = '$request_state_name'),
+	(SELECT id FROM state WHERE name = '$request_laststate_name'),
+	$log_id,
+	(SELECT start FROM log WHERE id = $log_id),
+	(SELECT initialend FROM log WHERE id = $log_id)
+)
+EOF
+	my $request_id = database_execute($insert_request_statement);
+	if (!$request_id) {
+		notify($ERRORS{'WARNING'}, 0, "unable to insert reservation, failed to insert into request table");
+		return;
+	}
+	
+	my $insert_reservation_statement = <<EOF;
+INSERT INTO reservation
+(requestid, computerid, imageid, imagerevisionid, managementnodeid)
+VALUES (
+	$request_id,
+	$computer_id,
+	$image_id,
+	$imagerevision_id,
+	$management_node_id
+)
+EOF
+	my $reservation_id = database_execute($insert_reservation_statement);
+	if (!$reservation_id) {
+		notify($ERRORS{'WARNING'}, 0, "unable to insert reservation, failed to insert into reservation table");
+		return;
+	}
+	
+	my $update_log_statement = "UPDATE log SET requestid = $request_id WHERE id = $log_id";
+	database_execute($update_log_statement);
+	
+	notify($ERRORS{'OK'}, 0, "inserted reservation:\n" .
+		"request ID: $request_id\n" .
+		"reservation ID: $reservation_id\n" .
+		"log ID: $log_id\n" .
+		"sublog ID: $sublog_id"
+	);
+	if (wantarray) {
+		return ($request_id, $reservation_id);
+	}
+	else {
+		return $reservation_id;
+	}
+}
+
 #/////////////////////////////////////////////////////////////////////////////
 
 =head2 insert_request