Author: fapeeler
Date: Wed Apr 8 16:52:11 2009
New Revision: 763311
URL: http://svn.apache.org/viewvc?rev=763311&view=rev
Log:
VCL-6
preliminary steps for updating healthcheck.pl
extended get_management_node_info to collect resourceid
added routines:
get_computers_controlled_by_MN
get_resource_groups
get_managable_resource_groups
get_computer_grp_members
get_computer_info
Modified:
incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
Modified: incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
URL:
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=763311&r1=763310&r2=763311&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Wed Apr 8 16:52:11 2009
@@ -111,6 +111,9 @@
firewall_compare_update
format_data
get_computer_current_state_name
+ get_computer_grp_members
+ get_computer_info
+ get_computers_controlled_by_MN
get_highest_imagerevision_info
get_image_info
get_imagemeta_info
@@ -126,6 +129,8 @@
get_request_by_computerid
get_request_end
get_request_info
+ get_resource_groups
+ get_managable_resource_groups
get_vmhost_info
getanothermachine
getdynamicaddress
@@ -2756,7 +2761,7 @@
#else {
#}
}
- if ($s =~ /^(rh|win|fc|vmware)/) {
+ if ($s =~ /^(rh|win|fc|vmware|cent)/) {
chomp($s);
if ($s =~ s/\x0d//) {
notify($ERRORS{'OK'}, 0, "stripped dos newline
$s");
@@ -7179,6 +7184,7 @@
my $select_statement = "
SELECT
managementnode.*,
+ resource.id AS resource_id,
predictivemodule.name AS predictive_name,
predictivemodule.prettyname AS predictive_prettyname,
predictivemodule.description AS predictive_description,
@@ -7187,10 +7193,15 @@
FROM
managementnode,
module predictivemodule,
+ resource,
+ resourcetype,
state
WHERE
managementnode.predictivemoduleid = predictivemodule.id
AND managementnode.stateid = state.id
+ AND resource.resourcetypeid = resourcetype.id
+ AND resource.subid = managementnode.id
+ AND resourcetype.name = 'managementnode'
AND
";
@@ -8970,6 +8981,419 @@
#/////////////////////////////////////////////////////////////////////////////
+=head2 get_computers_controlled_by_MN
+
+ Parameters : $managementnode_id
+ Returns : hash containing computer info
+ Description :
+
+=cut
+
+sub get_computers_controlled_by_MN {
+ my (%managementnode) = @_;
+
+ my %info;
+
+ #set some local variables
+ my $management_node_resourceid = $managementnode{resource_id};
+ my $management_node_id = $managementnode{id};
+ my $management_node_hostname = $managementnode{hostname};
+
+ # Collect resource group this management node is a member of
+ if($info{managementnode}{resoucegroups} =
get_resource_groups($management_node_resourceid)){
+ notify($ERRORS{'OK'}, $LOGFILE, "retrieved management node
resource groups from database");
+ }
+ else {
+ notify($ERRORS{'CRITICAL'}, $LOGFILE, "unable to retrieve
management node resource groups from database");
+ return 0;
+ }
+
+ # Collect resource group management node grpcan control
+ foreach my $mresgrp_id (keys %{$info{managementnode}{resoucegroups}} )
{
+
+ my $grp_id =
$info{managementnode}{resoucegroups}{$mresgrp_id}{groupid};
+
+ notify($ERRORS{'OK'}, $LOGFILE, "grp_id = $grp_id ");
+
+ if($info{manageable_resoucegroups}{$mresgrp_id} =
get_managable_resource_groups($grp_id)){
+ notify($ERRORS{'OK'}, $LOGFILE, "retrieved manageable
resource groups from database for mresgrp_id= $grp_id groupname=
$info{managementnode}{resoucegroups}{$mresgrp_id}{groupname}");
+
+ foreach my $id (keys %{
$info{manageable_resoucegroups}{$grp_id} } ) {
+ my $computer_group_id =
$info{manageable_resoucegroups}{$grp_id}{$id}{groupid};
+
if($info{"manageable_computer_grps"}{$id}{"members"} =
get_computer_grp_members($computer_group_id) ){
+ notify($ERRORS{'OK'}, $LOGFILE,
"retrieved computers from computer groupname=
$info{manageable_resoucegroups}{$grp_id}{$id}{groupname}");
+ }
+ else{
+ notify($ERRORS{'OK'}, $LOGFILE, "no
computers in computer groupname=
$info{managementnode}{resoucegroups}{$grp_id}{$id}{groupname}");
+ delete
$info{manageable_resoucegroups}{$grp_id}{$id};
+ }
+ }
+ }
+ else {
+ notify($ERRORS{'OK'}, $LOGFILE, "no manageable resource
groups associated for resgrp_id= $mresgrp_id groupname=
$info{managementnode}{resoucegroups}{$mresgrp_id}{groupname}");
+ #delete
$info{managementnode}{resoucegroups}{$mresgrp_id};
+ }
+ }
+
+ #Build master list of computerids
+ my %computer_list;
+
+ foreach my $computergroup (keys %{ $info{manageable_computer_grps}}){
+ foreach my $computerid (keys %{
$info{manageable_computer_grps}{$computergroup}{members} }){
+ if ( !(exists $computer_list{$computerid}) ){
+ # add to return list
+
$computer_list{$computerid}{"computer_id"}=$computerid;
+ }
+ }
+ }
+
+ return \%computer_list;
+
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 get_resource_groups
+
+ Parameters : $management_node_resourceid
+ Returns : hash containing list of resource groups id is a part of
+ Description :
+
+=cut
+
+sub get_resource_groups {
+ my ($resource_id) = @_;
+
+ if(!defined($resource_id)){
+ notify($ERRORS{'WARNING'}, $LOGFILE, "resource_id was not
supplied");
+ return 0;
+ }
+
+ my $select_statement = "
+ SELECT DISTINCT
+ resourcegroupmembers.resourcegroupid AS resource_groupid,
+ resourcegroup.name AS resource_groupname
+ FROM
+ resourcegroupmembers,
+ resourcegroup
+ WHERE
+ resourcegroup.id = resourcegroupmembers.resourcegroupid
+ AND resourceid = $resource_id
+ ";
+
+ # Call the database select subroutine
+ # This will return an array of one or more rows based on the select
statement
+ my @selected_rows = database_select($select_statement);
+
+ # Check to make sure 1 row was returned
+ if (scalar @selected_rows == 0) {
+ notify($ERRORS{'WARNING'}, 0, "zero rows were returned from
database select for resource id $resource_id");
+ return ();
+ }
+
+ #my %return_hash = %{$selected_rows[0]};
+ my %return_hash;
+ for (@selected_rows) {
+ my %resgrps = %{$_};
+ my $resgrpid = $resgrps{resource_groupid};
+ $return_hash{$resgrpid}{"groupid"} = $resgrpid;
+ $return_hash{$resgrpid}{"groupname"} =
$resgrps{resource_groupname};
+ }
+
+ return \%return_hash;
+
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 get_managable_resource_groups
+
+ Parameters : $management_node_grp_id
+ Returns : hash containing list of resource groups that can be controlled
+ Description :
+
+=cut
+
+sub get_managable_resource_groups {
+ my ($managing_resgrp_id) = @_;
+
+ if(!defined($managing_resgrp_id)){
+ notify($ERRORS{'WARNING'}, $LOGFILE, "managing_resgrp_id
resource_id was not supplied");
+ return 0;
+ }
+
+ my $select_statement = "
+ SELECT DISTINCT
+ resourcemap.resourcegroupid2 AS resource_groupid,
+ resourcegroup.name AS resource_groupname
+ FROM
+ resourcemap,
+ resourcegroup,
+ resourcetype
+ WHERE
+ resourcemap.resourcetypeid2 = resourcetype.id
+ AND resourcetype.name = 'computer'
+ AND resourcegroup.id = resourcemap.resourcegroupid2
+ AND resourcemap.resourcegroupid1 = $managing_resgrp_id
+ ";
+
+ # Call the database select subroutine
+ # This will return an array of one or more rows based on the select
statement
+ my @selected_rows = database_select($select_statement);
+
+ # Check to make sure 1 row was returned
+ if (scalar @selected_rows == 0) {
+ notify($ERRORS{'OK'}, 0, "zero rows were returned from database
select for resource id $managing_resgrp_id");
+ return ();
+ }
+ my %return_hash;
+ for (@selected_rows) {
+ my %resgrps = %{$_};
+ my $resgrpid = $resgrps{resource_groupid};
+ $return_hash{$resgrpid}{"groupid"} = $resgrpid;
+ $return_hash{$resgrpid}{"groupname"} = $resgrps{resource_groupname};
+ }
+ return \%return_hash;
+}
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 get_computer_grp_members
+
+ Parameters : $computer_grp_id
+ Returns : hash containing list of of computer ids
+ Description :
+
+=cut
+
+sub get_computer_grp_members {
+ my ($computer_grp_id) = @_;
+
+ if(!defined($computer_grp_id)){
+ notify($ERRORS{'WARNING'}, $LOGFILE, "computer_grp_id
resource_id was not supplied");
+ return 0;
+ }
+
+ my $select_statement = "
+ SELECT DISTINCT
+ resource.subid AS computer_id
+ FROM
+ resourcegroupmembers,
+ resourcetype,
+ resource
+ WHERE
+ resourcegroupmembers.resourceid = resource.id
+ AND resourcetype.id = resource.resourcetypeid
+ AND resourcetype.name = 'computer'
+ AND resourcegroupmembers.resourcegroupid = $computer_grp_id
+ ";
+
+ # Call the database select subroutine
+ # This will return an array of one or more rows based on the select
statement
+ my @selected_rows = database_select($select_statement);
+
+ # Check to make sure 1 row was returned
+ if (scalar @selected_rows == 0) {
+ notify($ERRORS{'OK'}, 0, "zero rows were returned from database
select for computer grp id $computer_grp_id");
+ return ();
+ }
+ my %return_hash;
+ for (@selected_rows) {
+ my %computerids = %{$_};
+ my $compid = $computerids{computer_id};
+ $return_hash{$compid}{"computer_id"} = $compid;
+ }
+ return \%return_hash;
+
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 get_computer_info
+
+ Parameters : $computer_id
+ Returns : hash containing information on computer id
+ Description :
+
+=cut
+
+sub get_computer_info {
+ my ($computer_id) = @_;
+
+ if(!defined($computer_id)){
+ notify($ERRORS{'WARNING'}, $LOGFILE, "computer_id was not
supplied");
+ return 0;
+ }
+
+ my $select_statement = "
+ SELECT DISTINCT
+ computer.id AS computer_id,
+ computer.ownerid AS computer_ownerid,
+ computer.platformid AS computer_platformid,
+ computer.currentimageid AS computer_currentimageid,
+ computer.imagerevisionid AS computer_imagerevisionid,
+ computer.RAM AS computer_RAM,
+ computer.procnumber AS computer_procnumber,
+ computer.procspeed AS computer_procspeed,
+ computer.hostname AS computer_hostname,
+ computer.IPaddress AS computer_IPaddress,
+ computer.privateIPaddress AS computer_privateIPaddress,
+ computer.eth0macaddress AS computer_eth0macaddress,
+ computer.eth1macaddress AS computer_eth1macaddress,
+ computer.type AS computer_type,
+ computer.provisioningid AS computer_provisioningid,
+ computer.drivetype AS computer_drivetype,
+ computer.deleted AS computer_deleted,
+ computer.notes AS computer_notes,
+ computer.lastcheck AS computer_lastcheck,
+ computer.location AS computer_location,
+ computer.vmhostid AS computer_vmhostid,
+ computerplatform.name AS computerplatform_name,
+ computerstate.name AS computerstate_name,
+
+ computerprovisioning.name AS computerprovisioning_name,
+ computerprovisioning.prettyname AS computerprovisioning_prettyname,
+ computerprovisioning.moduleid AS computerprovisioning_moduleid,
+
+ computerprovisioningmodule.name AS computerprovisioningmodule_name,
+ computerprovisioningmodule.prettyname AS
computerprovisioningmodule_prettyname,
+ computerprovisioningmodule.perlpackage AS
computerprovisioningmodule_perlpackage,
+
+ imagerevision.id AS imagerevision_id,
+ imagerevision.revision AS imagerevision_revision,
+ imagerevision.imagename AS imagerevision_imagename,
+
+ image.id AS image_id,
+ image.name AS image_name,
+ image.prettyname AS image_prettyname,
+ image.platformid AS image_platformid,
+ image.OSid AS image_OSid,
+ image.imagemetaid AS image_imagemetaid,
+ image.architecture AS image_architecture,
+
+ imageplatform.name AS imageplatform_name,
+
+ OS.name AS OS_name,
+ OS.prettyname AS OS_prettyname,
+ OS.type AS OS_type,
+ OS.installtype AS OS_installtype,
+ OS.sourcepath AS OS_sourcepath,
+ imageOSmodule.name AS imageOSmodule_name,
+ imageOSmodule.perlpackage AS imageOSmodule_perlpackage
+
+ FROM
+ computer,
+ platform computerplatform,
+ platform imageplatform,
+ state computerstate,
+ provisioning computerprovisioning,
+ module computerprovisioningmodule,
+ image,
+ OS,
+ imagerevision,
+ module imageOSmodule
+
+ WHERE
+ computerplatform.id = computer.platformid
+ AND computerstate.id = computer.stateid
+ AND computerprovisioning.id = computer.provisioningid
+ AND computerprovisioningmodule.id = computerprovisioning.moduleid
+ AND imagerevision.id = computer.imagerevisionid
+ AND image.id = imagerevision.imageid
+ AND OS.id = image.OSid
+ AND imageplatform.id = image.platformid
+ AND imageOSmodule.id = OS.moduleid
+ AND computer.deleted != '1'
+ AND computer.id = $computer_id;
+ ";
+
+
+ # Call the database select subroutine
+ # This will return an array of one or more rows based on the select
statement
+ my @selected_rows = database_select($select_statement);
+
+ # Check to make sure only 1 row was returned
+ if (scalar @selected_rows == 0) {
+ notify($ERRORS{'DEBUG'}, 0, "zero rows were returned from
database select for computer id $computer_id");
+ return ();
+ }
+ elsif (scalar @selected_rows > 1) {
+ notify($ERRORS{'WARNING'}, 0, "" . scalar @selected_rows . "
rows were returned from database select");
+ return ();
+ }
+
+ # Build the hash
+ my %comp_info;
+
+ for (@selected_rows) {
+ my %computer_row = %{$_};
+ # Check if the computer associated with this reservation has
a vmhostid set
+ if ($computer_row{computer_vmhostid}) {
+ my %vmhost_info =
get_vmhost_info($computer_row{computer_vmhostid});
+ # Make sure vmhost was located if vmhostid was specified for the
image
+ if (!%vmhost_info) {
+ notify($ERRORS{'WARNING'}, 0, "vmhostid=" .
$computer_row{computer_vmhostid} . " was specified for computer id=" .
$computer_row{computer_id} . " but vmhost could not be found");
+ }
+ else {
+ # Image meta data found, add it to the hash
+ $comp_info{vmhost} = \%vmhost_info;
+ }
+ } ## end if ($reservation_row{computer_vmhostid})
+
+
+ # Loop through all the columns returned for the reservation
+ foreach my $key (keys %computer_row) {
+ my $value = $computer_row{$key};
+ # Create another variable by stripping off the
column_ part of each key
+ # This variable stores the original (correct) column name
+ (my $original_key = $key) =~ s/^.+_//;
+
+ if ($key =~ /computer_/) {
+ $comp_info{computer}{$original_key} = $value;
+ }
+ elsif ($key =~ /computerplatform_/) {
+ $comp_info{computer}{platform}{$original_key}
= $value;
+ }
+ elsif ($key =~ /computerstate_/) {
+ $comp_info{computer}{state}{$original_key} =
$value;
+ }
+ elsif ($key =~ /computerprovisioning_/) {
+
$comp_info{computer}{provisioning}{$original_key} = $value;
+ }
+ elsif ($key =~ /computerprovisioningmodule_/) {
+
$comp_info{computer}{provisioning}{module}{$original_key} = $value;
+ }
+ elsif ($key =~ /image_/) {
+ $comp_info{image}{$original_key} = $value;
+ }
+ elsif ($key =~ /imageplatform_/) {
+ $comp_info{platform}{$original_key} = $value;
+ }
+ elsif ($key =~ /imagerevision_/) {
+ $comp_info{imagerevision}{$original_key} =
$value;
+ }
+ elsif ($key =~ /OS_/) {
+ $comp_info{image}{OS}{$original_key} = $value;
+ }
+ elsif ($key =~ /imageOSmodule_/) {
+ $comp_info{image}{OS}{module}{$original_key}
= $value;
+ }
+ elsif ($key =~ /user_/) {
+ $comp_info{user}{$original_key} = $value;
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "unknown key
found in SQL data: $key");
+ }
+
+ }
+
+ }
+
+ return \%comp_info;
+
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
=head2 insert_request
Parameters : $managementnode_id, $request_state_name,
$request_laststate_name, $end_minutes_in_future, $user_unityid, $computer_id,
$image_id, $imagerevision_id