Author: fapeeler
Date: Tue Apr 22 16:15:55 2014
New Revision: 1589196

URL: http://svn.apache.org/r1589196
Log:
VCL-758

Improved functionality for timing variables. Begining steps to allow VCL admins 
to set different timing values for selected events related to reservations.

- Moved the following from DataStructure to utils to allow for calls from 
non-objects

get_variable, set_variable, is_variable_set, yaml_deserialize, yaml_serialize

Modified:
    vcl/trunk/managementnode/lib/VCL/DataStructure.pm
    vcl/trunk/managementnode/lib/VCL/Module/OS.pm
    vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
    vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm
    vcl/trunk/managementnode/lib/VCL/Module/Provisioning/Lab.pm
    vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm
    vcl/trunk/managementnode/lib/VCL/inuse.pm
    vcl/trunk/managementnode/lib/VCL/reclaim.pm
    vcl/trunk/managementnode/lib/VCL/reserved.pm
    vcl/trunk/managementnode/lib/VCL/utils.pm

Modified: vcl/trunk/managementnode/lib/VCL/DataStructure.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/DataStructure.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/DataStructure.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/DataStructure.pm Tue Apr 22 16:15:55 2014
@@ -485,6 +485,9 @@ $SUBROUTINE_MAPPINGS{management_node_pre
 $SUBROUTINE_MAPPINGS{management_node_predictive_module_description} = 
'$ENV{management_node_info}{predictive_description}';
 $SUBROUTINE_MAPPINGS{management_node_predictive_module_perl_package} = 
'$ENV{management_node_info}{predictive_perlpackage}';
 
+$SUBROUTINE_MAPPINGS{general_inuse_check} = 
'$ENV{management_node_info}{GENERAL_INUSE_CHECK}';
+$SUBROUTINE_MAPPINGS{server_inuse_check} = 
'$ENV{management_node_info}{SERVER_INUSE_CHECK}';
+
 $SUBROUTINE_MAPPINGS{subroutine_mappings} = '\%SUBROUTINE_MAPPINGS';
 
 ##############################################################################
@@ -1786,372 +1789,13 @@ sub set_computer_private_ip_address {
        return 1;
 }
 
-#/////////////////////////////////////////////////////////////////////////////
-
-=head2 is_variable_set
-
- Parameters  : variable name
- Returns     : If variable is set: 1
-               If variable is not set: 0
-               If an error occurred: undefined
- Description : Queries the variable table for the variable with the name
-               specified by the argument. Returns true if the variable is set,
-               false otherwise.
-
-=cut
-
-sub is_variable_set {
-       my $variable_name = shift;
-       
-       # Check if 1st argument is a reference meaning this was called as an 
object method
-       # If so, ignore 1st reference argument and call shift again
-       if (ref($variable_name)) {
-               $variable_name = shift;
-       }
-       
-       # Check the argument
-       if (!defined($variable_name)) {
-               notify($ERRORS{'WARNING'}, 0, "variable name argument was not 
supplied");
-               return;
-       }
-       
-       # Construct the select statement
-my $select_statement .= <<"EOF";
-SELECT
-variable.value
-FROM
-variable
-WHERE
-variable.name = '$variable_name'
-EOF
-       
-       # Call the database select subroutine
-       my @selected_rows = database_select($select_statement);
-
-       # Check to make 1 sure row was returned
-       if (!@selected_rows){
-               notify($ERRORS{'DEBUG'}, 0, "variable is NOT set: 
$variable_name");
-               return 0;
-       }
-       elsif (@selected_rows > 1){
-               notify($ERRORS{'WARNING'}, 0, "unable to get value of variable 
'$variable_name', multiple rows exist in the database for variable:\n" . 
format_data(\@selected_rows));
-               return;
-       }
-       
-       # Get the serialized value from the variable row
-       my $database_value = $selected_rows[0]{value};
-       
-       if (defined($database_value)) {
-               notify($ERRORS{'DEBUG'}, 0, "variable is set: $variable_name");
-               return 1;
-       }
-       else {
-               notify($ERRORS{'WARNING'}, 0, "unable to get value of variable 
'$variable_name', row returned:\n" . format_data(\@selected_rows));
-               return;
-       }
-}
-
-#/////////////////////////////////////////////////////////////////////////////
-
-=head2 get_variable
-
- Parameters  : $variable_name, $show_warnings (optional)
- Returns     : If successful: data stored in the variable table for the 
variable name specified
-               If failed: false
- Description : Queries the variable table for the variable with the name
-               specified by the argument. Returns the data stored for the
-               variable. Values are deserialized before being returned if the
-               value stored was a reference.
-               
-               Undefined is returned if the variable name does not exist in the
-               variable table. A log message is displayed by default. To
-               suppress the log message, supply the $show_warnings argument 
with
-               a value of 0.
-
-=cut
-
-sub get_variable {
-       # Check if 1st argument is a reference meaning this was called as an 
object method
-       # If so, ignore 1st reference argument
-       shift @_ if ($_[0] && ref($_[0]) && ref($_[0]) =~ /VCL/);
-       
-       # Check the argument
-       my $variable_name = shift;
-       if (!defined($variable_name)) {
-               notify($ERRORS{'WARNING'}, 0, "variable name argument was not 
supplied");
-               return;
-       }
-       
-       my $show_warnings = shift;
-       $show_warnings = 1 unless defined $show_warnings;
-       
-       # Construct the select statement
-my $select_statement .= <<"EOF";
-SELECT
-variable.value,
-variable.serialization
-FROM
-variable
-WHERE
-variable.name = '$variable_name'
-EOF
-       
-       # Call the database select subroutine
-       my @selected_rows = database_select($select_statement);
-
-       # Check to make 1 sure row was returned
-       if (!@selected_rows){
-               notify($ERRORS{'OK'}, 0, "variable '$variable_name' is not set 
in the database") if $show_warnings;
-               return 0;
-       }
-       elsif (@selected_rows > 1){
-               notify($ERRORS{'WARNING'}, 0, "unable to get value of variable 
'$variable_name', multiple rows exist in the database for variable:\n" . 
format_data(\@selected_rows));
-               return;
-       }
-       
-       # Get the serialized value from the variable row
-       my $serialization_type = $selected_rows[0]{serialization};
-       my $database_value = $selected_rows[0]{value};
-       my $deserialized_value;
-       
-       # Deserialize the variable value if necessary
-       if ($serialization_type eq 'none') {
-               $deserialized_value = $database_value;
-       }
-       elsif ($serialization_type eq 'yaml') {
-               # Attempt to deserialize the value
-               $deserialized_value = yaml_deserialize($database_value);
-               if (!defined($deserialized_value)) {
-                       notify($ERRORS{'WARNING'}, 0, "unable to deserialize 
variable '$variable_name' using YAML");
-                       return;
-               }
-               
-               # Display the data type of the value retrieved from the 
variable table
-               if (my $deserialized_data_type = ref($deserialized_value)) {
-                       notify($ERRORS{'DEBUG'}, 0, "data type of variable 
'$variable_name': $deserialized_data_type reference");
-               }
-               else {
-                       notify($ERRORS{'DEBUG'}, 0, "data type of variable 
'$variable_name': scalar");
-               }
-       }
-       elsif ($serialization_type eq 'phpserialize') {
-               # TODO: find Perl module to handle PHP serialized data
-               # Add module to list of dependencies
-               # Add code here to call PHP deserialize function
-               notify($ERRORS{'CRITICAL'}, 0, "unable to get value of variable 
'$variable_name', PHP serialized data is NOT supported yet by the VCL backend, 
returning null");
-               return;
-       }
-       else {
-               notify($ERRORS{'CRITICAL'}, 0, "unable to get value of variable 
'$variable_name', serialization type '$serialization_type' is NOT supported by 
the VCL backend, returning null");
-               return;
-       }
-       
-       notify($ERRORS{'DEBUG'}, 0, "retrieved variable '$variable_name', 
serialization: $serialization_type");
-       return $deserialized_value;
-}
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 set_variable
-
- Parameters  : variable name, variable value
- Returns     : If successful: true
-               If failed: false
- Description : Inserts or updates a row in the variable table. The variable 
name
-               and value arguments must be specified.
-               
-               The value can be a simple scalar such as a string or a reference
-               to a complex data structure such as an array of hashes.
-               
-               Simple scalar values are stored in the variable.value column
-               as-is and the variable.serialization column will be set to
-               'none'.
-               
-               References are serialized using YAML before being stored. The
-               variable.value column will contain the YAML representation of 
the
-               data and the variable.serialization column will be set to 
'yaml'.
-               
-               This subroutine will also update the variable.timestamp column.
-               The variable.setby column is automatically set to the filename
-               and line number which called this subroutine.
-
-=cut
-
-sub set_variable {
-       # Check if 1st argument is a reference meaning this was called as an 
object method
-       # If so, ignore 1st reference argument
-       shift @_ if ($_[0] && ref($_[0]) && ref($_[0]) =~ /VCL/);
-       
-       my $variable_name = shift;
-       
-       # Get the 2nd argument containing the variable value
-       my $variable_value = shift;
-       
-       # Check the arguments
-       if (!defined($variable_name)) {
-               notify($ERRORS{'WARNING'}, 0, "variable name argument was not 
supplied");
-               return;
-       }
-       elsif (!defined($variable_value)) {
-               notify($ERRORS{'WARNING'}, 0, "variable value argument was not 
supplied");
-               return;
-       }
-       
-       notify($ERRORS{'DEBUG'}, 0, "attempting to set variable: 
$variable_name");
-       
-       # Set serialization type to yaml if the value being stored is a 
reference
-       # Otherwise, a simple scalar is being stored and serialization is not 
necessary
-       my $serialization_type;
-       if (ref($variable_value)) {
-               $serialization_type = 'yaml';
-       }
-       else {
-               $serialization_type = 'none';
-       }
-       
-       # Construct a string indicating where the variable was set from
-       my @caller = caller(0);
-       (my $calling_file) = $caller[1] =~ /([^\/]*)$/;
-       my $calling_line = $caller[2];
-       my $caller_string = "$calling_file:$calling_line";
-       
-       # Attempt to serialize the value if necessary
-       my $database_value;
-       if ($serialization_type eq 'none') {
-               $database_value = $variable_value;
-       }
-       else {
-               # Attempt to serialize the value using YAML
-               $database_value = yaml_serialize($variable_value);
-               if (!defined($database_value)) {
-                       notify($ERRORS{'WARNING'}, 0, "unable to serialize 
variable '$variable_name' using YAML, value:\n" . format_data($variable_value));
-                       return;
-               }
-       }
-       
-       # Escape all backslashes
-       $database_value =~ s/\\/\\\\/g;
-       
-       # Escape all single quote characters with a backslash
-       #   or else the SQL statement will fail becuase it is wrapped in single 
quotes
-       $database_value =~ s/'/\\'/g;
-       
-       # Assemble an insert statement, if the variable already exists, update 
the existing row
-       my $insert_statement .= <<"EOF";
-INSERT INTO variable
-(
-name,
-serialization,
-value,
-setby,
-timestamp
-)
-VALUES
-(
-'$variable_name',
-'$serialization_type',
-'$database_value',
-'$caller_string',
-NOW()
-)
-ON DUPLICATE KEY UPDATE
-name=VALUES(name),
-serialization=VALUES(serialization),
-value=VALUES(value),
-setby=VALUES(setby),
-timestamp=VALUES(timestamp)
-EOF
-       
-       # Execute the insert statement, the return value should be the id of 
the row
-       my $inserted_id = database_execute($insert_statement);
-       if ($inserted_id) {
-               notify($ERRORS{'OK'}, 0, "set variable '$variable_name', 
variable id: $inserted_id, serialization: $serialization_type");
-       }
-       else {
-               notify($ERRORS{'WARNING'}, 0, "failed to set variable 
'$variable_name', serialization: $serialization_type");
-               return;
-       }
-       
-       return 1;
-}
-
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 yaml_serialize
-
- Parameters  : Data
- Returns     : If successful: string containing serialized representation of 
data
-               If failed: false
- Description : 
-
-=cut
-
-sub yaml_serialize {
-       # Check if 1st argument is a reference meaning this was called as an 
object method
-       # If so, ignore 1st reference argument
-       shift @_ if ($_[0] && ref($_[0]) && ref($_[0]) =~ /VCL/);
-       
-       # Check to make sure argument was passed
-       my $data_argument = shift;
-       if (!defined($data_argument)) {
-               notify($ERRORS{'WARNING'}, 0, "data argument was not passed");
-               return;
-       }
-       
-       # Attempt to serialize the value using YAML::Dump()
-       # Use eval because Dump() will call die() if it encounters an error
-       my $serialized_data;
-       eval '$serialized_data = YAML::Dump($data_argument)';
-       if ($EVAL_ERROR) {
-               notify($ERRORS{'WARNING'}, 0, "unable to serialize data using 
YAML::Dump(), data value: $data_argument");
-               return;
-       }
-       
-       # Escape all backslashes
-       $serialized_data =~ s/\\/\\\\/g;
-       
-       # Escape all single quote characters with a backslash
-       #   or else the SQL statement will fail becuase it is wrapped in single 
quotes
-       $serialized_data =~ s/'/\\'/g;
-       
-       return $serialized_data;
-}
-
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 yaml_deserialize
-
- Parameters  : Data
- Returns     : If successful: data structure
-               If failed: false
- Description : 
-
-=cut
-
-sub yaml_deserialize {
-       # Check if 1st argument is a reference meaning this was called as an 
object method
-       # If so, ignore 1st reference argument and call shift again
-       my $yaml_data_argument = shift;
-       if (ref($yaml_data_argument)) {
-               $yaml_data_argument = shift;
-       }
-       
-       # Check to make sure argument was passed
-       if (!defined($yaml_data_argument)) {
-               notify($ERRORS{'WARNING'}, 0, "data argument was not passed");
-               return;
-       }
-       
-       my $deserialized_value;
-       eval '$deserialized_value = YAML::Load($yaml_data_argument)';
-       if ($EVAL_ERROR) {
-               notify($ERRORS{'WARNING'}, 0, "unable to deserialize data using 
YAML::Load(), data value: $yaml_data_argument");
-               return;
-       }
-       
-       return $deserialized_value;
-}
-
 #/////////////////////////////////////////////////////////////////////////////
 
 =head2 get_image_affiliation_name

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS.pm Tue Apr 22 16:15:55 2014
@@ -3286,9 +3286,9 @@ sub update_fixedIP_info {
        my $variable_name = "fixedIPsr" . $server_request_id;   
    my $server_variable_data;
 
-       if($self->data->is_variable_set($variable_name)){
+       if(is_variable_set($variable_name)){
                  #fetch variable
-                 $server_variable_data  = 
$self->data->get_variable($variable_name);
+                 $server_variable_data  = get_variable($variable_name);
 
                  notify($ERRORS{'DEBUG'}, 0, "data is set for $variable_name" 
. format_data($server_variable_data));
                        
@@ -3309,6 +3309,54 @@ sub update_fixedIP_info {
 
 }
 
+#/////////////////////////////////////////////////////////////////////////////
+=head2 get_timings
+
+   Parameters  : $self
+   Returns     : hash of timings
+   Description : Check for cached information or pulls from variable table
+   Acceptable variables are:
+      acknowledgetimeout
+      wait_for_connect
+      wait_for_reconnect
+      general_inuse_check
+      server_inuse_check
+      general_end_notice_first
+      general_end_notice_second
+      ignore_connections_gte
+
+=cut
+
+#/////////////////////////////////////////////////////////////////////////////
+
+sub get_timings {
+       my $self = shift;
+       my $variable = shift;
+       my $affiliation_name = $self->data->get_user_affiliation_name(0);
+
+   my %timing_defaults = (
+      acknowledgetimeout => '900',
+      connecttimeout => '900',
+      wait_for_connect => '900',
+      wait_for_reconnect => '900',
+      general_inuse_check => '300',
+      server_inuse_check => '900',
+      general_end_notice_first => '600',
+      general_end_notice_second => '300',
+      ignore_connections_gte => '1440'
+   );
+
+       #Check for affiliation, if nothing return default timings
+   if (!defined($variable) || !(exists($timing_defaults{$variable}))) {
+               notify($ERRORS{'WARNING'}, 0, " input variable is not 
acceptable, returning 900 as value"); 
+      return '900';
+   }
+
+       my $db_timing_variable_value = 
get_variable("$variable|$affiliation_name", 0) || get_variable("$variable", 0) 
|| $timing_defaults{$variable} ;
+       return $db_timing_variable_value;
+
+}
+
 #///////////////////////////////////////////////////////////////////////////
 
 1;

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Tue Apr 22 16:15:55 2014
@@ -1023,12 +1023,12 @@ sub synchronize_time {
        my $variable_name_global = "timesource|global";
        
        my $time_source_variable;
-       if ($self->data->is_variable_set($variable_name)) {
-               $time_source_variable = 
$self->data->get_variable($variable_name);
+       if (is_variable_set($variable_name)) {
+               $time_source_variable = get_variable($variable_name);
                notify($ERRORS{'DEBUG'}, 0, "retrieved time source variable 
'$variable_name': $time_source_variable");
        }
-       elsif ($self->data->is_variable_set($variable_name_global)) {
-               $time_source_variable = 
$self->data->get_variable($variable_name_global);
+       elsif (is_variable_set($variable_name_global)) {
+               $time_source_variable = get_variable($variable_name_global);
                notify($ERRORS{'DEBUG'}, 0, "retrieved global time source 
variable '$variable_name_global': $time_source_variable");
        }
        else {
@@ -3029,7 +3029,7 @@ sub check_connection_on_port {
        
        my $ret_val = "no";
        my $command = "netstat -an";
-       my ($status, $output) = $self->execute($command, '', '', 0);
+       my ($status, $output) = $self->execute($command, 0);
        notify($ERRORS{'DEBUG'}, 0, "checking connections on node 
$computer_node_name on port $port");
        foreach my $line (@{$output}) {
                if ($line =~ /Connection refused|Permission denied/) {

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm Tue Apr 22 16:15:55 
2014
@@ -8587,14 +8587,14 @@ sub configure_time_synchronization {
        my $time_source;
    my $variable_name = "timesource|" . 
$self->data->get_management_node_hostname();
    my $variable_name_global = "timesource|global";
-   if($self->data->is_variable_set($variable_name)){
+   if(is_variable_set($variable_name)){
        #fetch variable
-       $time_source = $self->data->get_variable($variable_name);
+       $time_source = get_variable($variable_name);
        notify($ERRORS{'DEBUG'}, 0, "time_source is $time_source  set for 
$variable_name");
     }
-    elsif($self->data->is_variable_set($variable_name_global) ) {
+    elsif(is_variable_set($variable_name_global) ) {
        #fetch variable
-       $time_source = $self->data->get_variable($variable_name_global);
+       $time_source = get_variable($variable_name_global);
        notify($ERRORS{'DEBUG'}, 0, "time_source is $time_source  set for 
$variable_name");
     }
         else {
@@ -11720,8 +11720,8 @@ sub check_image {
                return;
        }
        
-       #$self->data->set_variable('ignore_users', 
'Administrator,cyg_server,Guest,root,sshd,HelpAssistant,SUPPORT_388945a0,ASPNET');
-       #$self->data->set_variable('disable_users', 'test');
+       #set_variable('ignore_users', 
'Administrator,cyg_server,Guest,root,sshd,HelpAssistant,SUPPORT_388945a0,ASPNET');
+       #set_variable('disable_users', 'test');
        
        my $imagerevision_id = $self->data->get_imagerevision_id();
        my $image_name = $self->data->get_image_name();
@@ -11740,12 +11740,12 @@ sub check_image {
        my $reservation_user_names_regex = join("|", @reservation_user_names);
 
        # Get list of user names which should be ignored in images (safe, 
normal users: Administrator, guest...)
-       my $ignore_user_names_variable = 
$self->data->get_variable('ignore_users') || '';
+       my $ignore_user_names_variable = get_variable('ignore_users') || '';
        my @ignore_user_names = sort {lc($a) cmp lc($b)} (split(/[,;]+/, 
$ignore_user_names_variable));
        my $ignore_user_names_regex = join("|", @ignore_user_names);
        
        # Get list of user names which should be disabled in images - known 
bad, unsafe
-       my $disable_user_names_variable = 
$self->data->get_variable('disable_users') || '';
+       my $disable_user_names_variable = get_variable('disable_users') || '';
        my @disable_user_names = sort {lc($a) cmp lc($b)} (split(/[,;]+/, 
$disable_user_names_variable));
        my $disable_user_names_regex = join("|", @disable_user_names);
        

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/Lab.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/Lab.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/Lab.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/Lab.pm Tue Apr 22 
16:15:55 2014
@@ -296,6 +296,12 @@ sub node_status {
        return \%status;
 } ## end sub node_status
 
+
+sub power_reset {
+
+       return 1;
+
+}
 #/////////////////////////////////////////////////////////////////////////////
 
 1;

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm Tue Apr 22 
16:15:55 2014
@@ -179,7 +179,7 @@ sub load {
        $self->_edit_nodelist($computer_node_name, $image_name) || return;
        
        # Check to see if management node throttle is configured
-       my $throttle_limit = 
$self->data->get_variable("xcat|throttle|$management_node_hostname", 0) || 
$self->data->get_variable("$management_node_hostname|xcat|throttle", 0) || 
$self->data->get_variable("xcat|throttle", 0);
+       my $throttle_limit = 
get_variable("xcat|throttle|$management_node_hostname", 0) || 
get_variable("$management_node_hostname|xcat|throttle", 0) || 
get_variable("xcat|throttle", 0);
        if (!$throttle_limit || $throttle_limit !~ /^\d+$/) {
                $throttle_limit = 10;
                notify($ERRORS{'DEBUG'}, 0, "xCAT load throttle limit variable 
is NOT set in database: 'xcat|throttle', using default value: $throttle_limit");
@@ -1860,13 +1860,13 @@ sub _rpower {
        my $command = "$XCAT_ROOT/bin/rpower $computer_node_name 
$rpower_option";
        
        my $rpower_attempt = 0;
-       my $rpower_error_limit = 
$self->data->get_variable("xcat|rpower_error_limit|$management_node_hostname", 
0) || $self->data->get_variable("xcat|rpower_error_limit", 0);
+       my $rpower_error_limit = 
get_variable("xcat|rpower_error_limit|$management_node_hostname", 0) || 
get_variable("xcat|rpower_error_limit", 0);
        if (!$rpower_error_limit || $rpower_error_limit !~ /^\d+$/) {
                $rpower_error_limit = 3;
        }
        
        my $timeout_error_count = 0;
-       my $timeout_error_limit = 
$self->data->get_variable("xcat|timeout_error_limit|$management_node_hostname", 
0) || $self->data->get_variable("xcat|timeout_error_limit", 0);
+       my $timeout_error_limit = 
get_variable("xcat|timeout_error_limit|$management_node_hostname", 0) || 
get_variable("xcat|timeout_error_limit", 0);
        if (!$timeout_error_limit || $timeout_error_limit !~ /^\d+$/) {
                $timeout_error_limit = 5;
        }

Modified: vcl/trunk/managementnode/lib/VCL/inuse.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/inuse.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/inuse.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/inuse.pm Tue Apr 22 16:15:55 2014
@@ -116,7 +116,7 @@ sub process {
        my $is_parent_reservation   = $self->data->is_parent_reservation();
        my $computer_id             = $self->data->get_computer_id();
        my $computer_short_name     = $self->data->get_computer_short_name();
-       my $connect_timeout_seconds = 
$self->data->get_variable('connecttimeout') || (15 * 60);
+       my $connect_timeout_seconds = $self->os->get_timings('connecttimeout');
 
        # Make sure connect timeout is long enough
        # It has to be a bit longer than the ~5 minute period between inuse 
checks due to cluster reservations
@@ -378,6 +378,8 @@ sub user_connected {
        my $server_request_id                   = 
$self->data->get_server_request_id();
        my $request_duration_epoch_secs = 
$self->data->get_request_duration_epoch();
        my $request_duration_hrs                        = 
floor($request_duration_epoch_secs / 60 / 60);
+       my $ignore_connections_gte_min  = 
$self->os->get_timings('ignore_connections_gte');
+       my $ignore_connections_gte                      = 
floor($ignore_connections_gte_min / 60);
        
        # Check if user deleted the request
        $self->state_exit() if is_request_deleted($request_id);
@@ -393,8 +395,8 @@ sub user_connected {
        }
        
        # If duration is >= 24 hrs set as connected and return
-       if($request_duration_hrs >= 24 ) {
-               notify($ERRORS{'OK'}, 0, "duration is $request_duration_hrs hrs 
. Is >= to 24 hrs, skipping inuse checks");
+       if($request_duration_hrs >= $ignore_connections_gte ) {
+               notify($ERRORS{'OK'}, 0, "reservation duration is 
$request_duration_hrs hrs is >= to ignore_connections setting 
$ignore_connections_gte hrs, skipping inuse checks");
                insertloadlog($reservation_id, $computer_id, "connected", "user 
connected to $computer_short_name");
                return 1;
        }       

Modified: vcl/trunk/managementnode/lib/VCL/reclaim.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/reclaim.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/reclaim.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/reclaim.pm Tue Apr 22 16:15:55 2014
@@ -102,7 +102,7 @@ sub process {
        # Remove related fixedIPsr variable, if it exists
        if ($server_request_id) {
                my $variable_name = "fixedIPsr" . $server_request_id;
-               if($self->data->is_variable_set($variable_name)){
+               if(is_variable_set($variable_name)){
                #Delete from variable table.
                my $delete_sql_statement = "DELETE variable FROM variable WHERE 
name = '$variable_name' ";
                if (database_execute($delete_sql_statement)) {

Modified: vcl/trunk/managementnode/lib/VCL/reserved.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/reserved.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/reserved.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/reserved.pm Tue Apr 22 16:15:55 2014
@@ -101,7 +101,7 @@ sub process {
        my $computer_short_name         = 
$self->data->get_computer_short_name();
        my $is_parent_reservation       = $self->data->is_parent_reservation();
        my $server_request_id           = $self->data->get_server_request_id();
-       my $acknowledge_timeout_seconds = 
$self->data->get_variable('acknowledgetimeout') || 900;
+       my $acknowledge_timeout_seconds = 
$self->os->get_timings('acknowledgetimeout');
        
        # Update the log loaded time to now for this request
        update_log_loaded_time($request_logid);

Modified: vcl/trunk/managementnode/lib/VCL/utils.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1589196&r1=1589195&r2=1589196&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/utils.pm Tue Apr 22 16:15:55 2014
@@ -153,6 +153,7 @@ our @EXPORT = qw(
   get_resource_groups
   get_managable_resource_groups
   get_user_info
+  get_variable
   get_vmhost_assigned_vm_info
   get_vmhost_info
   getnewdbh
@@ -172,6 +173,7 @@ our @EXPORT = qw(
   is_request_imaging
   is_valid_dns_host_name
   is_valid_ip_address
+  is_variable_set
   kill_child_processes
   kill_reservation_process
   known_hosts
@@ -196,6 +198,7 @@ our @EXPORT = qw(
   set_hash_process_id
   set_logfile_path
   set_managementnode_state
+  set_variable
   setnextimage
   setup_confirm
   setup_get_array_choice
@@ -234,6 +237,8 @@ our @EXPORT = qw(
   write_currentimage_txt
   xmlrpc_call
   xml_string_to_hash
+  yaml_deserialize
+  yaml_serialize
   add_imageid_to_newimages
 
   $CONF_FILE_PATH
@@ -1082,8 +1087,9 @@ sub check_time {
                else {
                        # End time is more than 10 minutes in the future
                        #notify($ERRORS{'DEBUG'}, 0, "reservation will end in 
more than 10 minutes ($end_diff_minutes)");
+                       my $general_inuse_check_time = 
($ENV{management_node_info}->{GENERAL_INUSE_CHECK} * -1);
 
-                       if ($lastcheck_diff_minutes <= -5) {
+                       if ($lastcheck_diff_minutes <= 
$general_inuse_check_time) {
                                #notify($ERRORS{'DEBUG'}, 0, "reservation was 
last checked more than 5 minutes ago ($lastcheck_diff_minutes)");
                                return "poll";
                        }
@@ -3155,7 +3161,7 @@ EOF
                my $user_id = $request_info->{userid};
                my $user_info = get_user_info($user_id, 0, 1);
                $request_info->{user} = $user_info;
-               
+
                my $imagemeta_root_access = 
$request_info->{reservation}{$reservation_id}{image}{imagemeta}{rootaccess};
                
                # Add the request user to the hash, set ROOTACCESS to the value 
configured in imagemeta
@@ -3182,7 +3188,7 @@ EOF
                
                # If server request or duration is greater >= 24 hrs disable 
user checks
                if 
($request_info->{reservation}{$reservation_id}{serverrequest}{id}) {
-                       notify($ERRORS{'DEBUG'}, 0, "server sequest - disabling 
user checks");
+                       notify($ERRORS{'DEBUG'}, 0, "server request - disabling 
user checks");
                        $request_info->{checkuser} = 0;
                        
$request_info->{reservation}{$reservation_id}{serverrequest}{ALLOW_USERS} = 
$request_info->{user}{unityid};
                }
@@ -4711,6 +4717,15 @@ AND managementnode.id != $management_nod
                #notify($ERRORS{'DEBUG'}, 0, "image library sharing functions 
are disabled");
        }
 
+       # Get the inuse timing checks for general and server based reservations
+       my $general_inuse_check = get_variable('general_inuse_check') || 300;
+       $management_node_info->{GENERAL_INUSE_CHECK} = 
round($general_inuse_check / 60);
+       $ENV{management_node_info}{GENERAL_INUSE_CHECK} = 
$management_node_info->{GENERAL_INUSE_CHECK};
+
+       my $server_inuse_check = get_variable('server_inuse_check') || 300;
+       $management_node_info->{SERVER_INUSE_CHECK} = round($server_inuse_check 
/ 60);
+       $ENV{management_node_info}{SERVER_INUSE_CHECK} = 
$management_node_info->{SERVER_INUSE_CHECK};
+
        # Get the OS name
        my $os_name = lc($^O);
        $management_node_info->{OSNAME} = $os_name;
@@ -6550,6 +6565,7 @@ sub get_user_info {
 SELECT DISTINCT
 user.*,
 adminlevel.name AS adminlevel_name,
+affiliation.id AS affiliation_id,
 affiliation.name AS affiliation_name,
 affiliation.shibname AS affiliation_shibname,
 affiliation.dataUpdateText AS affiliation_dataUpdateText,
@@ -6688,7 +6704,7 @@ EOF
        if ($user_login_id =~ /vcladmin/) {
                $user_info->{STANDALONE} = 1;
        }
-       
+
        # Set the user's affiliation sitewwwaddress and help address if not 
defined or blank
        if (!$user_info->{affiliation}{sitewwwaddress}) {
                $user_info->{affiliation}{sitewwwaddress} = 
'http://cwiki.apache.org/VCL';
@@ -10456,6 +10472,373 @@ sub get_code_ref_subroutine_name {
        return $gv->NAME;
 }
 
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 is_variable_set
+
+ Parameters  : variable name
+ Returns     : If variable is set: 1
+               If variable is not set: 0
+               If an error occurred: undefined
+ Description : Queries the variable table for the variable with the name
+               specified by the argument. Returns true if the variable is set,
+               false otherwise.
+
+=cut
+
+sub is_variable_set {
+       my $variable_name = shift;
+       
+       # Check if 1st argument is a reference meaning this was called as an 
object method
+       # If so, ignore 1st reference argument and call shift again
+       if (ref($variable_name)) {
+               $variable_name = shift;
+       }
+       
+       # Check the argument
+       if (!defined($variable_name)) {
+               notify($ERRORS{'WARNING'}, 0, "variable name argument was not 
supplied");
+               return;
+       }
+       
+       # Construct the select statement
+my $select_statement .= <<"EOF";
+SELECT
+variable.value
+FROM
+variable
+WHERE
+variable.name = '$variable_name'
+EOF
+       
+       # Call the database select subroutine
+       my @selected_rows = database_select($select_statement);
+
+       # Check to make 1 sure row was returned
+       if (!@selected_rows){
+               notify($ERRORS{'DEBUG'}, 0, "variable is NOT set: 
$variable_name");
+               return 0;
+       }
+       elsif (@selected_rows > 1){
+               notify($ERRORS{'WARNING'}, 0, "unable to get value of variable 
'$variable_name', multiple rows exist in the database for variable:\n" . 
format_data(\@selected_rows));
+               return;
+       }
+       
+       # Get the serialized value from the variable row
+       my $database_value = $selected_rows[0]{value};
+       
+       if (defined($database_value)) {
+               notify($ERRORS{'DEBUG'}, 0, "variable is set: $variable_name");
+               return 1;
+       }
+       else {
+               notify($ERRORS{'WARNING'}, 0, "unable to get value of variable 
'$variable_name', row returned:\n" . format_data(\@selected_rows));
+               return;
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 get_variable
+
+ Parameters  : $variable_name, $show_warnings (optional)
+ Returns     : If successful: data stored in the variable table for the 
variable name specified
+               If failed: false
+ Description : Queries the variable table for the variable with the name
+               specified by the argument. Returns the data stored for the
+               variable. Values are deserialized before being returned if the
+               value stored was a reference.
+               
+               Undefined is returned if the variable name does not exist in the
+               variable table. A log message is displayed by default. To
+               suppress the log message, supply the $show_warnings argument 
with
+               a value of 0.
+
+=cut
+
+sub get_variable {
+       # Check if 1st argument is a reference meaning this was called as an 
object method
+       # If so, ignore 1st reference argument
+       shift @_ if ($_[0] && ref($_[0]) && ref($_[0]) =~ /VCL/);
+       
+       # Check the argument
+       my $variable_name = shift;
+       if (!defined($variable_name)) {
+               notify($ERRORS{'WARNING'}, 0, "variable name argument was not 
supplied");
+               return;
+       }
+       
+       my $show_warnings = shift;
+       $show_warnings = 1 unless defined $show_warnings;
+       
+       # Construct the select statement
+my $select_statement .= <<"EOF";
+SELECT
+variable.value,
+variable.serialization
+FROM
+variable
+WHERE
+variable.name = '$variable_name'
+EOF
+       
+       # Call the database select subroutine
+       my @selected_rows = database_select($select_statement);
+
+       # Check to make 1 sure row was returned
+       if (!@selected_rows){
+               notify($ERRORS{'OK'}, 0, "variable '$variable_name' is not set 
in the database") if $show_warnings;
+               return 0;
+       }
+       elsif (@selected_rows > 1){
+               notify($ERRORS{'WARNING'}, 0, "unable to get value of variable 
'$variable_name', multiple rows exist in the database for variable:\n" . 
format_data(\@selected_rows));
+               return;
+       }
+       
+       # Get the serialized value from the variable row
+       my $serialization_type = $selected_rows[0]{serialization};
+       my $database_value = $selected_rows[0]{value};
+       my $deserialized_value;
+       
+       # Deserialize the variable value if necessary
+       if ($serialization_type eq 'none') {
+               $deserialized_value = $database_value;
+       }
+       elsif ($serialization_type eq 'yaml') {
+               # Attempt to deserialize the value
+               $deserialized_value = yaml_deserialize($database_value);
+               if (!defined($deserialized_value)) {
+                       notify($ERRORS{'WARNING'}, 0, "unable to deserialize 
variable '$variable_name' using YAML");
+                       return;
+               }
+               
+               # Display the data type of the value retrieved from the 
variable table
+               if (my $deserialized_data_type = ref($deserialized_value)) {
+                       notify($ERRORS{'DEBUG'}, 0, "data type of variable 
'$variable_name': $deserialized_data_type reference");
+               }
+               else {
+                       notify($ERRORS{'DEBUG'}, 0, "data type of variable 
'$variable_name': scalar");
+               }
+       }
+       elsif ($serialization_type eq 'phpserialize') {
+               # TODO: find Perl module to handle PHP serialized data
+               # Add module to list of dependencies
+               # Add code here to call PHP deserialize function
+               notify($ERRORS{'CRITICAL'}, 0, "unable to get value of variable 
'$variable_name', PHP serialized data is NOT supported yet by the VCL backend, 
returning null");
+               return;
+       }
+       else {
+               notify($ERRORS{'CRITICAL'}, 0, "unable to get value of variable 
'$variable_name', serialization type '$serialization_type' is NOT supported by 
the VCL backend, returning null");
+               return;
+       }
+       
+       notify($ERRORS{'DEBUG'}, 0, "retrieved variable '$variable_name', 
serialization: $serialization_type");
+       return $deserialized_value;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 yaml_deserialize
+
+ Parameters  : Data
+ Returns     : If successful: data structure
+               If failed: false
+ Description : 
+
+=cut
+
+sub yaml_deserialize {
+       # Check if 1st argument is a reference meaning this was called as an 
object method
+       # If so, ignore 1st reference argument and call shift again
+       my $yaml_data_argument = shift;
+       if (ref($yaml_data_argument)) {
+               $yaml_data_argument = shift;
+       }
+       
+       # Check to make sure argument was passed
+       if (!defined($yaml_data_argument)) {
+               notify($ERRORS{'WARNING'}, 0, "data argument was not passed");
+               return;
+       }
+       
+       my $deserialized_value;
+       eval '$deserialized_value = YAML::Load($yaml_data_argument)';
+       if ($EVAL_ERROR) {
+               notify($ERRORS{'WARNING'}, 0, "unable to deserialize data using 
YAML::Load(), data value: $yaml_data_argument");
+               return;
+       }
+       
+       return $deserialized_value;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 set_variable
+
+ Parameters  : variable name, variable value
+ Returns     : If successful: true
+               If failed: false
+ Description : Inserts or updates a row in the variable table. The variable 
name
+               and value arguments must be specified.
+               
+               The value can be a simple scalar such as a string or a reference
+               to a complex data structure such as an array of hashes.
+               
+               Simple scalar values are stored in the variable.value column
+               as-is and the variable.serialization column will be set to
+               'none'.
+               
+               References are serialized using YAML before being stored. The
+               variable.value column will contain the YAML representation of 
the
+               data and the variable.serialization column will be set to 
'yaml'.
+               
+               This subroutine will also update the variable.timestamp column.
+               The variable.setby column is automatically set to the filename
+               and line number which called this subroutine.
+
+=cut
+
+sub set_variable {
+       # Check if 1st argument is a reference meaning this was called as an 
object method
+       # If so, ignore 1st reference argument
+       shift @_ if ($_[0] && ref($_[0]) && ref($_[0]) =~ /VCL/);
+       
+       my $variable_name = shift;
+       
+       # Get the 2nd argument containing the variable value
+       my $variable_value = shift;
+       
+       # Check the arguments
+       if (!defined($variable_name)) {
+               notify($ERRORS{'WARNING'}, 0, "variable name argument was not 
supplied");
+               return;
+       }
+       elsif (!defined($variable_value)) {
+               notify($ERRORS{'WARNING'}, 0, "variable value argument was not 
supplied");
+               return;
+       }
+       
+       notify($ERRORS{'DEBUG'}, 0, "attempting to set variable: 
$variable_name");
+       
+       # Set serialization type to yaml if the value being stored is a 
reference
+       # Otherwise, a simple scalar is being stored and serialization is not 
necessary
+       my $serialization_type;
+       if (ref($variable_value)) {
+               $serialization_type = 'yaml';
+       }
+       else {
+               $serialization_type = 'none';
+       }
+       
+       # Construct a string indicating where the variable was set from
+       my @caller = caller(0);
+       (my $calling_file) = $caller[1] =~ /([^\/]*)$/;
+       my $calling_line = $caller[2];
+       my $caller_string = "$calling_file:$calling_line";
+       
+       # Attempt to serialize the value if necessary
+       my $database_value;
+       if ($serialization_type eq 'none') {
+               $database_value = $variable_value;
+       }
+       else {
+               # Attempt to serialize the value using YAML
+               $database_value = yaml_serialize($variable_value);
+               if (!defined($database_value)) {
+                       notify($ERRORS{'WARNING'}, 0, "unable to serialize 
variable '$variable_name' using YAML, value:\n" . format_data($variable_value));
+                       return;
+               }
+       }
+       
+       # Escape all backslashes
+       $database_value =~ s/\\/\\\\/g;
+       
+       # Escape all single quote characters with a backslash
+       #   or else the SQL statement will fail becuase it is wrapped in single 
quotes
+       $database_value =~ s/'/\\'/g;
+       
+       # Assemble an insert statement, if the variable already exists, update 
the existing row
+       my $insert_statement .= <<"EOF";
+INSERT INTO variable
+(
+name,
+serialization,
+value,
+setby,
+timestamp
+)
+VALUES
+(
+'$variable_name',
+'$serialization_type',
+'$database_value',
+'$caller_string',
+NOW()
+)
+ON DUPLICATE KEY UPDATE
+name=VALUES(name),
+serialization=VALUES(serialization),
+value=VALUES(value),
+setby=VALUES(setby),
+timestamp=VALUES(timestamp)
+EOF
+       
+       # Execute the insert statement, the return value should be the id of 
the row
+       my $inserted_id = database_execute($insert_statement);
+       if ($inserted_id) {
+               notify($ERRORS{'OK'}, 0, "set variable '$variable_name', 
variable id: $inserted_id, serialization: $serialization_type");
+       }
+       else {
+               notify($ERRORS{'WARNING'}, 0, "failed to set variable 
'$variable_name', serialization: $serialization_type");
+               return;
+       }
+       
+       return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 yaml_serialize
+
+ Parameters  : Data
+ Returns     : If successful: string containing serialized representation of 
data
+               If failed: false
+ Description : 
+
+=cut
+
+sub yaml_serialize {
+       # Check if 1st argument is a reference meaning this was called as an 
object method
+       # If so, ignore 1st reference argument
+       shift @_ if ($_[0] && ref($_[0]) && ref($_[0]) =~ /VCL/);
+       
+       # Check to make sure argument was passed
+       my $data_argument = shift;
+       if (!defined($data_argument)) {
+               notify($ERRORS{'WARNING'}, 0, "data argument was not passed");
+               return;
+       }
+       
+       # Attempt to serialize the value using YAML::Dump()
+       # Use eval because Dump() will call die() if it encounters an error
+       my $serialized_data;
+       eval '$serialized_data = YAML::Dump($data_argument)';
+       if ($EVAL_ERROR) {
+               notify($ERRORS{'WARNING'}, 0, "unable to serialize data using 
YAML::Dump(), data value: $data_argument");
+               return;
+       }
+       
+       # Escape all backslashes
+       $serialized_data =~ s/\\/\\\\/g;
+       
+       # Escape all single quote characters with a backslash
+       #   or else the SQL statement will fail becuase it is wrapped in single 
quotes
+       $serialized_data =~ s/'/\\'/g;
+       
+       return $serialized_data;
+}
+
 #/////////////////////////////////////////////////////////////////////////////
 
 1;


Reply via email to