Author: arkurth Date: Thu Sep 1 19:37:28 2011 New Revision: 1164226 URL: http://svn.apache.org/viewvc?rev=1164226&view=rev Log: VCL-506 Added subroutines to utils.pm: update_computer_procnumber, update_computer_procspeed, and update_computer_ram. Added get_cpu_core_count, get_cpu_speed, and get_total_memory to Linux.pm, vSphere_SDK.pm, and VIM_SSH.pm. Added code to VMware.pm to call these and update the database periodically for VM hosts.
Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm?rev=1164226&r1=1164225&r2=1164226&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Thu Sep 1 19:37:28 2011 @@ -2976,7 +2976,7 @@ sub enable_dhcp { return; } - my $computer_node_name = $self->data->get_computer_node_name(); + my $computer_node_name = $self->data->get_computer_node_name(); my $interface_name_argument = shift; my @interface_names; @@ -3031,6 +3031,141 @@ EOF #///////////////////////////////////////////////////////////////////////////// +=head2 get_cpu_core_count + + Parameters : none + Returns : integer + Description : Retrieves the quantitiy of CPU cores the computer has. + +=cut + +sub get_cpu_core_count { + my $self = shift; + if (ref($self) !~ /VCL::Module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $computer_node_name = $self->data->get_computer_node_name(); + + my $command = "cat /proc/cpuinfo"; + my ($exit_status, $output) = $self->execute($command); + + if (!defined($output)) { + notify($ERRORS{'WARNING'}, 0, "failed to retrieve CPU info from $computer_node_name"); + return; + } + + # Get the number of 'processor :' lines and the 'cpu cores :' and 'siblings :' values from the cpuinfo output + my $processor_count = scalar(grep(/^processor\s*:/, @$output)); + if (!$processor_count) { + notify($ERRORS{'WARNING'}, 0, "unable to determine $computer_node_name CPU core count, output does not contain any 'processor :' lines:\n" . join("\n", @$output)); + return; + } + my ($cpu_cores) = map { $_ =~ /cpu cores\s*:\s*(\d+)/ } @$output; + $cpu_cores = 1 unless $cpu_cores; + + my ($siblings) = map { $_ =~ /siblings\s*:\s*(\d+)/ } @$output; + $siblings = 1 unless $siblings; + + # The actual CPU core count can be determined by the equation: + my $cpu_core_count = ($processor_count * $cpu_cores / $siblings); + + # If hyperthreading is enabled, siblings will be greater than CPU cores + # If hyperthreading is not enabled, they will be equal + my $hyperthreading_enabled = ($siblings > $cpu_cores) ? 'yes' : 'no'; + + notify($ERRORS{'DEBUG'}, 0, "retrieved $computer_node_name CPU core count: $cpu_core_count + cpuinfo 'processor' line count: $processor_count + cpuinfo 'cpu cores': $cpu_cores + cpuinfo 'siblings': $siblings + hyperthreading enabled: $hyperthreading_enabled"); + + return $cpu_core_count; +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_cpu_speed + + Parameters : none + Returns : integer + Description : Retrieves the speed of the computer's CPUs in MHz. + +=cut + +sub get_cpu_speed { + my $self = shift; + if (ref($self) !~ /VCL::Module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $computer_node_name = $self->data->get_computer_node_name(); + + my $command = "cat /proc/cpuinfo"; + my ($exit_status, $output) = $self->execute($command); + + if (!defined($output)) { + notify($ERRORS{'WARNING'}, 0, "failed to retrieve CPU info from $computer_node_name"); + return; + } + + my ($mhz) = map { $_ =~ /cpu MHz\s*:\s*(\d+)/ } @$output; + if ($mhz) { + $mhz = int($mhz); + notify($ERRORS{'DEBUG'}, 0, "retrieved $computer_node_name CPU speed: $mhz MHz"); + return $mhz; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to determine $computer_node_name CPU speed CPU speed, 'cpu MHz :' line does not exist in the cpuinfo output:\n" . join("\n", @$output)); + return; + } +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_total_memory + + Parameters : none + Returns : integer + Description : Retrieves the computer's total memory capacity in MB. + +=cut + +sub get_total_memory { + my $self = shift; + if (ref($self) !~ /VCL::Module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $computer_node_name = $self->data->get_computer_node_name(); + + my $command = "dmesg | grep Memory:"; + my ($exit_status, $output) = $self->execute($command); + + if (!defined($output)) { + notify($ERRORS{'WARNING'}, 0, "failed to retrieve memory info from $computer_node_name"); + return; + } + + # Output should look like this: + # Memory: 1024016k/1048576k available (2547k kernel code, 24044k reserved, 1289k data, 208k init) + my ($memory_kb) = map { $_ =~ /Memory:.*\/(\d+)k available/ } @$output; + if ($memory_kb) { + my $memory_mb = int($memory_kb / 1024); + notify($ERRORS{'DEBUG'}, 0, "retrieved $computer_node_name total memory capacity: $memory_mb MB"); + return $memory_mb; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to determine $computer_node_name total memory capacity from command: '$command', output:\n" . join("\n", @$output)); + return; + } +} + +##///////////////////////////////////////////////////////////////////////////// + 1; __END__ Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm?rev=1164226&r1=1164225&r2=1164226&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm Thu Sep 1 19:37:28 2011 @@ -1791,6 +1791,144 @@ sub snapshot_exists { #///////////////////////////////////////////////////////////////////////////// +=head2 get_cpu_core_count + + Parameters : none + Returns : integer + Description : Retrieves the quantitiy of CPU cores the VM host has. + +=cut + +sub get_cpu_core_count { + my $self = shift; + if (ref($self) !~ /VCL::Module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $vmhost_hostname = $self->data->get_vmhost_hostname(); + + my $vim_cmd_arguments = "hostsvc/hosthardware"; + my ($exit_status, $output) = $self->_run_vim_cmd($vim_cmd_arguments); + return if !$output; + + # The CPU info should be contained in the output: + # cpuInfo = (vim.host.CpuInfo) { + # dynamicType = <unset>, + # numCpuPackages = 2, + # numCpuCores = 8, + # numCpuThreads = 8, + # hz = 2000070804, + # }, + + my ($cpu_cores_line) = grep(/^\s*numCpuCores\s*=/i, @$output); + if (!$cpu_cores_line) { + notify($ERRORS{'WARNING'}, 0, "unable to determine VM host $vmhost_hostname CPU core count, output does not contain a 'numCpuCores =' line:\n" . join("\n", @$output)); + return; + } + elsif ($cpu_cores_line =~ /(\d+)/) { + my $cpu_core_count = $1; + notify($ERRORS{'DEBUG'}, 0, "retrieved VM host $vmhost_hostname CPU core count: $cpu_core_count"); + return $cpu_core_count; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to determine VM host $vmhost_hostname CPU core count from line: $cpu_cores_line"); + return; + } +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_cpu_speed + + Parameters : none + Returns : integer + Description : Retrieves the speed of the VM host's CPUs in MHz. + +=cut + +sub get_cpu_speed { + my $self = shift; + if (ref($self) !~ /VCL::Module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $vmhost_hostname = $self->data->get_vmhost_hostname(); + + my $vim_cmd_arguments = "hostsvc/hosthardware"; + my ($exit_status, $output) = $self->_run_vim_cmd($vim_cmd_arguments); + return if !$output; + + # The CPU info should be contained in the output: + # cpuInfo = (vim.host.CpuInfo) { + # dynamicType = <unset>, + # numCpuPackages = 2, + # numCpuCores = 8, + # numCpuThreads = 8, + # hz = 2000070804, + # }, + + my ($hz_line) = grep(/^\s*hz\s*=/i, @$output); + if (!$hz_line) { + notify($ERRORS{'WARNING'}, 0, "unable to determine VM host $vmhost_hostname CPU speed, output does not contain a 'hz =' line:\n" . join("\n", @$output)); + return; + } + elsif ($hz_line =~ /(\d+)/) { + my $mhz = int($1 / 1000000); + notify($ERRORS{'DEBUG'}, 0, "retrieved VM host $vmhost_hostname CPU speed: $mhz MHz"); + return $mhz; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to determine VM host $vmhost_hostname CPU speed from line: $hz_line"); + return; + } +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_total_memory + + Parameters : none + Returns : integer + Description : Retrieves the VM host's total memory capacity in MB. + +=cut + +sub get_total_memory { + my $self = shift; + if (ref($self) !~ /VCL::Module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $vmhost_hostname = $self->data->get_vmhost_hostname(); + + my $vim_cmd_arguments = "hostsvc/hosthardware"; + my ($exit_status, $output) = $self->_run_vim_cmd($vim_cmd_arguments); + return if !$output; + + # The following line should be contained in the output: + # memorySize = 17178869760, + + my ($memory_size_line) = grep(/^\s*memorySize\s*=/i, @$output); + if (!$memory_size_line) { + notify($ERRORS{'WARNING'}, 0, "unable to determine VM host $vmhost_hostname total memory capacity, output does not contain a 'memorySize =' line:\n" . join("\n", @$output)); + return; + } + elsif ($memory_size_line =~ /(\d+)/) { + my $memory_mb = int($1 / 1024 / 1024); + notify($ERRORS{'DEBUG'}, 0, "retrieved VM host $vmhost_hostname total memory capacity: $memory_mb MB"); + return $memory_mb; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to determine VM host $vmhost_hostname total memory capacity from line: $memory_size_line"); + return; + } +} + +#///////////////////////////////////////////////////////////////////////////// + =head2 DESTROY Parameters : none Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm?rev=1164226&r1=1164225&r2=1164226&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm Thu Sep 1 19:37:28 2011 @@ -171,6 +171,16 @@ our %VM_OS_CONFIGURATION = ( }, ); +=head2 $VM_MINIMUM_MEMORY_MB + + Data type : string + Description : Minimum amount of memory in megabytes to be allocated to any VM. + +=cut + +our $VM_MINIMUM_MEMORY_MB = 512; + + =head2 $VSPHERE_SDK_PACKAGE Data type : string @@ -243,12 +253,12 @@ sub initialize { } my $request_state_name = $self->data->get_request_state_name(); - my $vm_computer_name = $self->data->get_computer_node_name(); - my $vmhost_computer_name = $vmhost_data->get_computer_node_name(); my $vmhost_image_name = $vmhost_data->get_image_name(); my $vmhost_os_module_package = $vmhost_data->get_image_os_module_perl_package(); + my $vmhost_lastcheck_time = $vmhost_data->get_computer_lastcheck_time(0); + my $vmhost_computer_id = $self->data->get_vmhost_computer_id(); my $vmware_api; @@ -308,13 +318,6 @@ sub initialize { return; } - # Configure the SSH authorized_keys file to persist through reboots if the VM host is running VMware ESXi - # This shouldn't need to be done more than once, only call this if the state is 'new' to reduce the number of times it is called - notify($ERRORS{'DEBUG'}, 0, "product: $vmhost_product_name, OS object: " . ref($self->{vmhost_os})); - if ($request_state_name eq 'new' && ref($self->{vmhost_os}) =~ /Linux/i && $vmhost_product_name =~ /ESXi/) { - $self->configure_vmhost_dedicated_ssh_key(); - } - # Make sure the vmx and vmdk base directories can be accessed my $vmx_base_directory_path = $self->get_vmx_base_directory_path(); if (!$vmx_base_directory_path) { @@ -339,6 +342,80 @@ sub initialize { return; } + # Retrieve the VM host's hardware info if: + # -request state is 'timeout', don't slow down user reservations + # -VM host computer.lastcheck is NULL or more than 30 days old + if ($request_state_name eq 'timeout' && (!$vmhost_lastcheck_time || (time - convert_to_epoch_seconds($vmhost_lastcheck_time)) > (60 * 60 * 24 * 30))) { + # Configure the SSH authorized_keys file to persist through reboots if the VM host is running VMware ESXi + # This shouldn't need to be done more than once, only call this if the state is 'reclaim' + if (ref($self->{vmhost_os}) =~ /Linux/i && $vmhost_product_name =~ /ESXi/) { + $self->configure_vmhost_dedicated_ssh_key(); + } + + # Retrieve the CPU core count, update the database if necessary + my $cpu_core_count; + if ($self->api->can('get_cpu_core_count')) { + $cpu_core_count = $self->api->get_cpu_core_count(); + } + elsif (!$cpu_core_count && $self->vmhost_os->can('get_cpu_core_count')) { + $cpu_core_count = $self->vmhost_os->get_cpu_core_count(); + } + + if (!$cpu_core_count) { + notify($ERRORS{'OK'}, 0, "VM host computer.procnumber not updated, CPU core count could not be retrieved from the API or VM host OS object"); + } + elsif ($cpu_core_count eq $vmhost_data->get_computer_processor_count()) { + notify($ERRORS{'DEBUG'}, 0, "VM host computer.procnumber is already correct in the database"); + } + else { + update_computer_procnumber($vmhost_computer_id, $cpu_core_count); + } + + # Retrieve the CPU speed, update the database if necessary + my $cpu_speed; + if ($self->api->can('get_cpu_speed')) { + $cpu_speed = $self->api->get_cpu_speed(); + } + elsif (!$cpu_speed && $self->vmhost_os->can('get_cpu_speed')) { + $cpu_speed = $self->vmhost_os->get_cpu_speed(); + } + + if (!$cpu_speed) { + notify($ERRORS{'OK'}, 0, "VM host computer.procspeed not updated, CPU speed could not be retrieved from the API or VM host OS object"); + } + elsif ($cpu_speed eq $vmhost_data->get_computer_processor_speed()) { + notify($ERRORS{'DEBUG'}, 0, "VM host computer.procspeed is already correct in the database"); + } + else { + update_computer_procspeed($vmhost_computer_id, $cpu_speed); + } + + # Retrieve the RAM, update the database if necessary + my $ram_mb; + if ($self->api->can('get_total_memory')) { + $ram_mb = $self->api->get_total_memory(); + } + elsif (!$ram_mb && $self->vmhost_os->can('get_total_memory')) { + $ram_mb = $self->vmhost_os->get_total_memory(); + } + + if (!$ram_mb) { + notify($ERRORS{'OK'}, 0, "VM host computer.RAM not updated, total memory could not be retrieved from the API or VM host OS object"); + } + elsif ($ram_mb eq $vmhost_data->get_computer_ram()) { + notify($ERRORS{'DEBUG'}, 0, "VM host computer.RAM is already correct in the database"); + } + else { + update_computer_ram($vmhost_computer_id, $ram_mb); + } + + # Update the VM host computer lastcheck time to now + update_computer_lastcheck($vmhost_computer_id); + } + elsif ($request_state_name eq 'timeout') { + notify($ERRORS{'DEBUG'}, 0, "VM host hardware parameters not updated in the database, last check is less than 30 days ago: $vmhost_lastcheck_time"); + } + return 1; } @@ -4626,7 +4703,8 @@ sub get_vm_ethernet_adapter_type { If not, the value is rounded down. The RAM value is also checked to make sure it is not lower than - 512 MB. If so, 512 MB is returned. + the $VM_MINIMUM_MEMORY_MB value. If so, the $VM_MINIMUM_MEMORY_MB + is returned. =cut @@ -4655,7 +4733,7 @@ sub get_vm_ram { # Get the minimum memory size for the OS my $vm_os_configuration = $self->get_vm_os_configuration(); my $vm_guest_os = $vm_os_configuration->{guestOS} || 'unknown'; - my $vm_os_memsize = $vm_os_configuration->{memsize} || 512; + my $vm_os_memsize = $vm_os_configuration->{memsize} || $VM_MINIMUM_MEMORY_MB; if ($image_minram_mb < $vm_os_memsize) { notify($ERRORS{'DEBUG'}, 0, "image minimum RAM value ($image_minram_mb MB) is too low for the $vm_guest_os guest OS, adjusting to $vm_os_memsize MB"); return $vm_os_memsize; Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm?rev=1164226&r1=1164225&r2=1164226&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm Thu Sep 1 19:37:28 2011 @@ -1798,6 +1798,106 @@ sub get_available_space { return $available_bytes; } +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_cpu_core_count + + Parameters : none + Returns : integer + Description : Retrieves the quantitiy of CPU cores the VM host has. + +=cut + +sub get_cpu_core_count { + my $self = shift; + if (ref($self) !~ /module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $vmhost_hostname = $self->data->get_vmhost_hostname(); + + # Get the host view + my $host_view = $self->_get_host_view() || return; + + my $cpu_core_count = $host_view->hardware->cpuInfo->numCpuCores; + if ($cpu_core_count) { + notify($ERRORS{'DEBUG'}, 0, "retrieved VM host $vmhost_hostname CPU core count: $cpu_core_count"); + return $cpu_core_count; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to determine VM host $vmhost_hostname CPU core count"); + return; + } +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_cpu_speed + + Parameters : none + Returns : integer + Description : Retrieves the speed of the VM host's CPUs in MHz. + +=cut + +sub get_cpu_speed { + my $self = shift; + if (ref($self) !~ /module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $vmhost_hostname = $self->data->get_vmhost_hostname(); + + # Get the host view + my $host_view = $self->_get_host_view() || return; + + my $hz = $host_view->hardware->cpuInfo->hz; + if ($hz) { + my $mhz = int($hz / 1000000); + notify($ERRORS{'DEBUG'}, 0, "retrieved VM host $vmhost_hostname CPU speed: $mhz MHz"); + return $mhz; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to determine VM host $vmhost_hostname CPU speed"); + return; + } +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 get_total_memory + + Parameters : none + Returns : integer + Description : Retrieves the VM host's total memory capacity in MB. + +=cut + +sub get_total_memory { + my $self = shift; + if (ref($self) !~ /module/i) { + notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); + return; + } + + my $vmhost_hostname = $self->data->get_vmhost_hostname(); + + # Get the host view + my $host_view = $self->_get_host_view() || return; + + my $memory_bytes = $host_view->hardware->memorySize; + if (!$memory_bytes) { + notify($ERRORS{'WARNING'}, 0, "unable to determine VM host $vmhost_hostname total memory capacity"); + return; + } + + my $memory_mb = int($memory_bytes / 1024 / 1024); + notify($ERRORS{'DEBUG'}, 0, "retrieved VM host $vmhost_hostname total memory capacity: $memory_mb MB"); + return $memory_mb; +} + ############################################################################## =head1 PRIVATE OBJECT METHODS Modified: incubator/vcl/trunk/managementnode/lib/VCL/utils.pm URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1164226&r1=1164225&r2=1164226&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/utils.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Thu Sep 1 19:37:28 2011 @@ -210,6 +210,9 @@ our @EXPORT = qw( update_computer_address update_computer_state update_computer_lastcheck + update_computer_procnumber + update_computer_procspeed + update_computer_ram update_currentimage update_computer_imagename update_image_name @@ -2035,7 +2038,6 @@ sub update_computer_lastcheck { $log = 0 unless (defined $log); notify($ERRORS{'WARNING'}, $log, "computer id is not defined") unless (defined($computer_id)); - notify($ERRORS{'WARNING'}, $log, "$datestring is not defined") unless (defined($datestring)); return 0 unless (defined $computer_id); unless (defined($datestring) ) { @@ -2062,6 +2064,125 @@ sub update_computer_lastcheck { return 0; } } ## end + +#///////////////////////////////////////////////////////////////////////////// + +=head2 update_computer_procnumber + + Parameters : $computer_id, $cpu_count + Returns : boolean + Description : Updates the computer.procnumber value for the specified computer. + +=cut + +sub update_computer_procnumber { + my ($computer_id, $cpu_count) = @_; + + if (!$computer_id || !$cpu_count) { + notify($ERRORS{'WARNING'}, 0, "computer ID and CPU count arguments were not supplied correctly"); + return; + } + + my $update_statement = <<EOF; +UPDATE +computer +SET +computer.procnumber = '$cpu_count' +WHERE +computer.id = $computer_id +EOF + + # Call the database execute subroutine + if (database_execute($update_statement)) { + notify($ERRORS{'DEBUG'}, 0, "updated the procnumber value to $cpu_count for computer ID $computer_id"); + return 1; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to update the procnumber value to $cpu_count for computer ID $computer_id"); + return 0; + } +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 update_computer_procspeed + + Parameters : $computer_id, $cpu_speed + Returns : boolean + Description : Updates the computer.procspeed value for the specified computer. + The $cpu_speed argument should contain an integer value of the + CPU speed in MHz. + +=cut + +sub update_computer_procspeed { + my ($computer_id, $cpu_speed_mhz) = @_; + + if (!$computer_id || !$cpu_speed_mhz) { + notify($ERRORS{'WARNING'}, 0, "computer ID and CPU speed arguments were not supplied correctly"); + return; + } + + my $update_statement = <<EOF; +UPDATE +computer +SET +computer.procspeed = '$cpu_speed_mhz' +WHERE +computer.id = $computer_id +EOF + + # Call the database execute subroutine + if (database_execute($update_statement)) { + notify($ERRORS{'DEBUG'}, 0, "updated the procspeed value to $cpu_speed_mhz for computer ID $computer_id"); + return 1; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to update the procspeed value to $cpu_speed_mhz for computer ID $computer_id"); + return 0; + } +} + +#///////////////////////////////////////////////////////////////////////////// + +=head2 update_computer_ram + + Parameters : $computer_id, $ram_mb + Returns : boolean + Description : Updates the computer.ram value for the specified computer. + The $ram_mb argument should contain an integer value of the + RAM in MB. + +=cut + +sub update_computer_ram { + my ($computer_id, $ram_mb) = @_; + + if (!$computer_id || !$ram_mb) { + notify($ERRORS{'WARNING'}, 0, "computer ID and RAM arguments were not supplied correctly"); + return; + } + + my $update_statement = <<EOF; +UPDATE +computer +SET +computer.ram = '$ram_mb' +WHERE +computer.id = $computer_id +EOF + + # Call the database execute subroutine + if (database_execute($update_statement)) { + notify($ERRORS{'DEBUG'}, 0, "updated the RAM value to $ram_mb for computer ID $computer_id"); + return 1; + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to update the RAM value to $ram_mb for computer ID $computer_id"); + return 0; + } +} + #///////////////////////////////////////////////////////////////////////////// =head2 update_request_password