Modified: vcl/trunk/managementnode/lib/VCL/utils.pm URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1490025&r1=1490024&r2=1490025&view=diff ============================================================================== --- vcl/trunk/managementnode/lib/VCL/utils.pm (original) +++ vcl/trunk/managementnode/lib/VCL/utils.pm Wed Jun 5 20:19:28 2013 @@ -117,7 +117,7 @@ our @EXPORT = qw( get_computer_grp_members get_computer_ids get_computer_info - get_computers_controlled_by_MN + get_computers_controlled_by_mn get_connect_method_info get_copy_speed_info_string get_current_file_name @@ -133,6 +133,8 @@ our @EXPORT = qw( get_current_image_contents_noDS get_local_user_info get_management_node_blockrequests + get_management_node_computer_ids + get_management_node_vmhost_info get_management_node_id get_management_node_info get_management_node_requests @@ -143,6 +145,7 @@ our @EXPORT = qw( get_production_imagerevision_info get_random_mac_address get_request_by_computerid + get_request_current_state_name get_request_end get_request_info get_reservation_accounts @@ -150,6 +153,7 @@ our @EXPORT = qw( get_managable_resource_groups get_user_affiliation get_user_info + get_vmhost_assigned_vm_info get_vmhost_info getimagesize getnewdbh @@ -162,7 +166,7 @@ our @EXPORT = qw( insert_reload_request insert_request insertloadlog - is_IP_assigned_query + is_ip_assigned_query is_management_node_process_running is_inblockrequest is_public_ip_address @@ -1528,16 +1532,15 @@ sub update_request_state { AND laststate.name = \'$laststate_name\' AND request.id = $request_id "; - - # If input state_name is not pending. - # All other state changes must have the current state pending - if($state_name ne "pending") { - $update_statement .= " - AND request.stateid = cstate.id - AND cstate.name = 'pending' - "; - } - + + # If input state_name is not pending. + # All other state changes must have the current state pending + if ($state_name ne "pending") { + $update_statement .= " + AND request.stateid = cstate.id + AND cstate.name = 'pending' + "; + } } ## end if (defined $laststate_name && $laststate_name... else { $update_statement = " @@ -1551,16 +1554,16 @@ sub update_request_state { state.name = \'$state_name\' AND request.id = $request_id "; - - # If input state_name is not pending. - # All other state changes must have the current state pending - if($state_name ne "pending") { - $update_statement .= " - AND request.stateid = cstate.id - AND cstate.name = 'pending' - "; - } - + + # If input state_name is not pending. + # All other state changes must have the current state pending + if ($state_name ne "pending") { + $update_statement .= " + AND request.stateid = cstate.id + AND cstate.name = 'pending' + "; + } + $laststate_name = 'unchanged'; } ## end else [ if (defined $laststate_name && $laststate_name... @@ -4605,13 +4608,14 @@ EOF } # Get the vmprofile image info and add it to the hash - my $vmprofile_image_id = $vmhost_info->{vmprofile}{imageid}; - my $vmprofile_image_info = get_image_info($vmprofile_image_id); + my $vmprofile_image_identifier = $vmhost_info->{vmprofile}{imageid}; + $vmprofile_image_identifier = 'noimage' if !$vmprofile_image_identifier; + my $vmprofile_image_info = get_image_info($vmprofile_image_identifier); if ($vmprofile_image_info) { $vmhost_info->{vmprofile}{image} = $vmprofile_image_info; } else { - notify($ERRORS{'WARNING'}, 0, "unable to retrieve vmprofile image info, image ID: $vmprofile_image_id"); + notify($ERRORS{'WARNING'}, 0, "unable to retrieve vmprofile image info, image identifier: $vmprofile_image_identifier"); } $vmhost_info->{vmprofile}{username} = '' if !$vmhost_info->{vmprofile}{username}; @@ -5895,6 +5899,63 @@ EOF #///////////////////////////////////////////////////////////////////////////// +=head2 get_request_current_state_name + + Parameters : $request_id + Returns : String containing state name for a request + Description : + +=cut + + +sub get_request_current_state_name { + my ($request_id) = @_; + + # Check the passed parameter + if (!(defined($request_id))) { + notify($ERRORS{'WARNING'}, 0, "request ID was not specified"); + return (); + } + + # Create the select statement + my $select_statement = <<EOF; +SELECT +state.name AS state_name, +laststate.name AS laststate_name +FROM +request, +state, +state laststate +WHERE +request.id = $request_id +AND request.stateid = state.id +AND request.laststateid = laststate.id +EOF + + # Call the database select subroutine + my @selected_rows = database_select($select_statement); + + # Check to make sure 1 row was returned + if (!@selected_rows) { + notify($ERRORS{'WARNING'}, 0, "zero rows were returned from database select"); + return; + } + + my $row = $selected_rows[0]; + my $state_name = $row->{state_name}; + my $laststate_name = $row->{laststate_name}; + notify($ERRORS{'DEBUG'}, 0, "retrieved current request state: $state_name/$laststate_name"); + + if (wantarray) { + return ($state_name, $laststate_name); + } + else { + return $state_name; + } +} + +#///////////////////////////////////////////////////////////////////////////// + =head2 get_computer_current_state_name Parameters : $computer_id @@ -6086,42 +6147,41 @@ sub update_log_ending { =head2 update_reservation_lastcheck - Parameters : Updates the finalend and ending fields in the log table for the specified log ID - Returns : date string if successful, 0 if failed + Parameters : $reservation_id or @reservation_ids + Returns : boolean Description : =cut sub update_reservation_lastcheck { - my ($reservation_id) = @_; - - my ($package, $filename, $line, $sub) = caller(0); - + my @reservation_ids = @_; + # Check the passed parameter - if (!(defined($reservation_id))) { + if (!@reservation_ids) { notify($ERRORS{'WARNING'}, 0, "reservation ID was not specified"); - return (); + return; } - my $datestring = makedatestring(); - + my $reservation_id_string = join(', ', @reservation_ids); + # Construct the update statement - my $update_statement = " - UPDATE - reservation - SET - lastcheck = \'$datestring\' - WHERE - id = $reservation_id - "; + my $update_statement = <<EOF; +UPDATE +reservation +SET +reservation.lastcheck = NOW() +WHERE +reservation.id IN ($reservation_id_string) +EOF # Call the database execute subroutine if (database_execute($update_statement)) { - return $datestring; + notify($ERRORS{'DEBUG'}, 0, "updated reservation.lastcheck to now for reservation IDs: $reservation_id_string"); + return 1; } else { - notify($ERRORS{'WARNING'}, 0, "unable to update database, reservation id $reservation_id"); - return 0; + notify($ERRORS{'WARNING'}, 0, "failed to update reservation.lastcheck to now for reservation IDs: $reservation_id_string"); + return; } } ## end sub update_reservation_lastcheck @@ -7078,7 +7138,7 @@ sub get_management_node_blockrequests { #///////////////////////////////////////////////////////////////////////////// -=head2 get_computers_controlled_by_MN +=head2 get_computers_controlled_by_mn Parameters : $managementnode_id Returns : hash containing computer info @@ -7086,7 +7146,7 @@ sub get_management_node_blockrequests { =cut -sub get_computers_controlled_by_MN { +sub get_computers_controlled_by_mn { my (%managementnode) = @_; my %info; @@ -9777,22 +9837,26 @@ sub setup_get_input_string { =cut sub setup_get_hash_choice { - my ($hash_ref, $display_key) = @_; + my ($hash_ref, $display_key1, $display_key2) = @_; my $choice_count = scalar(keys %$hash_ref); my %choices; for my $key (keys %$hash_ref) { my $display_name; - if ($display_key) { - $display_name = $hash_ref->{$key}{$display_key}; + if ($display_key1) { + $display_name = $hash_ref->{$key}{$display_key1}; } - else { + if ($display_key2) { + $display_name .= " (" . $hash_ref->{$key}{$display_key2} . ")"; + } + + if (!$display_name) { $display_name = $key; } if ($choices{$display_name}) { - notify($ERRORS{'WARNING'}, 0, "duplicate hash keys containing the value '$display_key' = '$display_name', hash argument:\n" . format_data($hash_ref)); + notify($ERRORS{'WARNING'}, 0, "duplicate hash keys containing the value '$display_name', hash argument:\n" . format_data($hash_ref)); } $choices{$display_name} = $key; @@ -10410,15 +10474,15 @@ sub get_current_image_contents_noDS { #///////////////////////////////////////////////////////////////////////////// -=head2 is_IP_assigned_query +=head2 is_ip_assigned_query Parameters : IP address - Returns : boolean 1=true, 0=false + Returns : boolean Description : checks if IP address exists in db =cut -sub is_IP_assigned_query { +sub is_ip_assigned_query { my ($IPaddress) = @_; @@ -10473,20 +10537,233 @@ EOF sub stopwatch { my ($title) = @_; + my ($seconds, $microseconds) = gettimeofday; + if (!$ENV{'start'}) { - $ENV{'start'} = [gettimeofday]; + $ENV{'start'} = [$seconds, $microseconds]; + } + + if (defined($ENV{'stopwatch_count'})) { + $ENV{'stopwatch_count'}++; + } + else { + $ENV{'stopwatch_count'} = 'a'; } $ENV{'previous'} = $ENV{'current'} || $ENV{'start'}; - $ENV{'current'} = [gettimeofday]; + $ENV{'current'} = [$seconds, $microseconds]; + + my $message = "stopwatch - $ENV{'stopwatch_count'}: "; + $message .= "$title " if defined($title); + $title = '<none>' if !defined($title); - my $message = "stopwatch: "; - $message .= " $title: " if $title; + my $previous_delta = tv_interval($ENV{'previous'}, $ENV{'current'}); + my $start_delta = tv_interval($ENV{'start'}, $ENV{'current'}); + + $start_delta = 0 if $start_delta =~ /e/; + $previous_delta = 0 if $previous_delta =~ /e/; + + $message .= "+$previous_delta ($start_delta)"; + + print "$message\n"; + + my $info = { + current => $ENV{'current'}, + previous => $ENV{'previous'}, + message => $message, + start_delta => $start_delta, + previous_delta => $previous_delta, + title => "$ENV{'stopwatch_count'}: $title", + }; - $message .= "+" . tv_interval($ENV{'previous'}, $ENV{'current'}) . " (" . tv_interval($ENV{'start'}, $ENV{'current'}) . ")"; + if (!$ENV{stopwatch}) { + $ENV{stopwatch} = []; + } + + push @{$ENV{stopwatch}}, $info; +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_management_node_computer_ids + + Parameters : $management_node_identifier + Returns : hash reference + Description : Retrieves a list of all computer IDs a particular management node + controls. + +=cut + +sub get_management_node_computer_ids { + my $management_node_identifier = shift; + if (!$management_node_identifier) { + notify($ERRORS{'WARNING'}, 0, "management node identifier argument was not supplied"); + return; + } + + my $select_statement = <<EOF; +SELECT DISTINCT +computer.id, +computer.hostname + +FROM +managementnode mn, +resource mn_resource, +resourcetype mn_resourcetype, +resourcegroup mn_resourcegroup, +resourcegroupmembers mn_resourcegroupmembers, +computer, +resource comp_resource, +resourcegroup comp_resourcegroup, +resourcegroupmembers comp_resourceourcegroupmembers, +resourcemap + +WHERE + +mn.id = mn_resource.subid AND +mn_resource.resourcetypeid = mn_resourcetype.id AND +mn_resourcetype.name = 'managementnode' AND + +mn_resource.id = mn_resourcegroupmembers.resourceid AND +mn_resourcegroupmembers.resourcegroupid = mn_resourcegroup.id AND + +computer.id = comp_resource.subid AND +comp_resource.id = comp_resourceourcegroupmembers.resourceid AND +comp_resourceourcegroupmembers.resourcegroupid = comp_resourcegroup.id AND + +resourcemap.resourcegroupid1 = mn_resourcegroup.id AND +resourcemap.resourcegroupid2 = comp_resourcegroup.id AND + +computer.deleted = 0 +EOF + + if ($management_node_identifier =~ /^\d+$/) { + $select_statement .= "AND mn.id = $management_node_identifier"; + } + else { + $select_statement .= "AND mn.hostname = '$management_node_identifier'"; + } + + my @selected_rows = database_select($select_statement); + + my %computers = map { $_->{id} => $_->{hostname} } @selected_rows; + my @computer_ids = keys %computers; + my $computer_count = scalar(@computer_ids); + #notify($ERRORS{'DEBUG'}, 0, "computers assigned to $management_node_identifier: $computer_count\n" . format_data(\%computers)); + notify($ERRORS{'DEBUG'}, 0, "computers assigned to $management_node_identifier: $computer_count\n" . join(', ', @computer_ids)); + return @computer_ids; +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_management_node_vmhost_ids + + Parameters : $management_node_identifier + Returns : array + Description : Returns a list of all VM host IDs controlled by a particular + management node. + +=cut + +sub get_management_node_vmhost_info { + my $management_node_identifier = shift; + if (!$management_node_identifier) { + notify($ERRORS{'WARNING'}, 0, "management node identifier argument was not supplied"); + return; + } + + my $select_statement = <<EOF; +SELECT DISTINCT +vmhost.id + +FROM +managementnode mn, +resource mn_resource, +resourcetype mn_resourcetype, +resourcegroup mn_resourcegroup, +resourcegroupmembers mn_resourcegroupmembers, +computer, +vmhost, +resource comp_resource, +resourcegroup comp_resourcegroup, +resourcegroupmembers comp_resourceourcegroupmembers, +resourcemap + +WHERE + +mn.id = mn_resource.subid AND +mn_resource.resourcetypeid = mn_resourcetype.id AND +mn_resourcetype.name = 'managementnode' AND + +mn_resource.id = mn_resourcegroupmembers.resourceid AND +mn_resourcegroupmembers.resourcegroupid = mn_resourcegroup.id AND + +computer.deleted = 0 AND +computer.type = 'virtualmachine' AND +computer.id = comp_resource.subid AND +comp_resource.id = comp_resourceourcegroupmembers.resourceid AND +comp_resourceourcegroupmembers.resourcegroupid = comp_resourcegroup.id AND + +computer.vmhostid = vmhost.id AND + +resourcemap.resourcegroupid1 = mn_resourcegroup.id AND +resourcemap.resourcegroupid2 = comp_resourcegroup.id +EOF + + if ($management_node_identifier =~ /^\d+$/) { + $select_statement .= "AND mn.id = $management_node_identifier"; + } + else { + $select_statement .= "AND mn.hostname = '$management_node_identifier'"; + } + + my @selected_rows = database_select($select_statement); + + my @vmhost_ids = map { $_->{id} } @selected_rows; + + notify($ERRORS{'DEBUG'}, 0, "vmhost IDs assigned to $management_node_identifier:\n" . join(', ', @vmhost_ids)); + return @vmhost_ids; +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_vmhost_assigned_vm_info + + Parameters : $vmhost_id + Returns : hash reference + Description : Returns a hash reference containing all of the computer IDs + assigned to a VM host. + +=cut + +sub get_vmhost_assigned_vm_info { + my $vmhost_id = shift; + if (!$vmhost_id) { + notify($ERRORS{'WARNING'}, 0, "VM host ID argument was not supplied"); + return; + } + + my $select_statement = <<EOF; +SELECT +computer.id +FROM +computer +WHERE +computer.vmhostid = $vmhost_id +EOF + + my @selected_rows = database_select($select_statement); + + my $assigned_computer_info = {}; + for my $row (@selected_rows) { + my $computer_id = $row->{id}; + my $computer_info = get_computer_info($computer_id); + $assigned_computer_info->{$computer_id} = $computer_info; + } - print "\n\n$message\n\n"; + notify($ERRORS{'DEBUG'}, 0, "retrieved computer info for VMs assigned to VM host $vmhost_id: " . join(', ', sort keys %$assigned_computer_info)); + return $assigned_computer_info; } #/////////////////////////////////////////////////////////////////////////////
