enhance postscrit perfomance when getting monitoring variables. defect 3605
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/branches/2.8@16703 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -864,6 +864,8 @@ sub getNodeID { | ||||
|   return undef; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3   getLocalNodeID | ||||
|     This function goes to RMC and gets the nodeid for the local host. | ||||
| @@ -1415,34 +1417,53 @@ sub getDescription { | ||||
|     node monitoring.  These data-value pairs will be used as environmental variables  | ||||
|     on the given node. | ||||
|     Arguments: | ||||
|         node   | ||||
|         pointer to a hash that will take the data. | ||||
|         pointet to a arry of nodes  | ||||
|     Returns: | ||||
|         none | ||||
|         pointer to a 2-level hash. For format will as following: | ||||
|         { | ||||
|            'node1'=>{'NODEID'=>'123', | ||||
|                      'MS_NODEID'=>'456'}, | ||||
|            'node2'=>{'NODEID'=>'789', | ||||
|                      ''MS_NODEID'=>'0AB'} | ||||
|         } | ||||
|  | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getNodeConfData { | ||||
|   my $ref_ret; | ||||
|   #check if rsct is installed or not | ||||
|   if (! -e "/usr/bin/lsrsrc") { | ||||
|     return; | ||||
|     return $ref_ret; | ||||
|   } | ||||
|  | ||||
|   my $node=shift; | ||||
|   if ($node =~ /xCAT_monitoring::rmcmon/) { | ||||
|     $node=shift; | ||||
|   my $noderef=shift; | ||||
|   if ($noderef =~ /xCAT_monitoring::rmcmon/) { | ||||
|     $noderef=shift; | ||||
|   } | ||||
|   my $ref_ret=shift; | ||||
|   my $tab=xCAT::Table->new("mac", -create =>0); | ||||
|   my $machash=$tab->getNodesAttribs($noderef, ['mac']); | ||||
|   $tab->close(); | ||||
|  | ||||
|   #get node ids for RMC monitoring | ||||
|   my $nodeid=xCAT_monitoring::rmcmon->getNodeID($node); | ||||
|   if (defined($nodeid)) { | ||||
|     $ref_ret->{NODEID}=$nodeid; | ||||
|   } | ||||
|   my $ms_nodeid=xCAT_monitoring::rmcmon->getLocalNodeID(); | ||||
|   if (defined($ms_nodeid)) { | ||||
|     $ref_ret->{MS_NODEID}=$ms_nodeid; | ||||
|  | ||||
|   foreach my $node (@$noderef) { | ||||
|       #get node ids for RMC monitoring | ||||
|       if ($machash && defined($machash->{$node}) && defined($machash->{$node}->[0])) { | ||||
| 	  my $mac=$machash->{$node}->[0]->{'mac'}; | ||||
| 	  if ($mac) { | ||||
| 	      $mac =~ s/\|.*//g; #use the first mac | ||||
| 	      $mac =~ s/\!.*//g; #remove the hostname | ||||
| 	      $mac =~ s/://g;    #remove : | ||||
| 	      $mac = "EA" . $mac . "EA"; | ||||
| 	      $ref_ret->{$node}->{NODEID}=$mac; | ||||
| 	  } | ||||
|       } | ||||
|  | ||||
|       if (defined($ms_nodeid)) { | ||||
| 	  $ref_ret->{$node}->{MS_NODEID}=$ms_nodeid; | ||||
|       } | ||||
|   } | ||||
|   return; | ||||
|   return $ref_ret; | ||||
| } | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
|   | ||||
| @@ -325,6 +325,9 @@ sub makescript { | ||||
|   $t_inc =~ s/#SITE_TABLE_ALL_ATTRIBS_EXPORT#/$allattribsfromsitetable/eg; | ||||
|   $t_inc =~ s/#AIX_ROOT_PW_VARS_EXPORT#/$aixrootpasswdvars/eg;  | ||||
|   $t_inc =~ s/tabdump\(([\w]+)\)/tabdump($1)/eg; | ||||
|  | ||||
|   my $monhash=getMonItems($nodes); | ||||
|   #print "getMonItems get called " . Dumper($monhash) . "\n"; | ||||
|   | ||||
|   foreach my $n (@$nodes ) { | ||||
|       $node = $n;  | ||||
| @@ -387,8 +390,13 @@ sub makescript { | ||||
|     ## get monitoring server and other configuration data for monitoring setup on nodes | ||||
|     # for #MONITORING_VARS_EXPORT# | ||||
|     my $mon_vars; | ||||
|     $mon_vars = getMonItems($node);     | ||||
|  | ||||
|     if ($monhash && exists($monhash->{$node})) { | ||||
| 	my $mon_conf=$monhash->{$node}; | ||||
| 	foreach (keys(%$mon_conf))  { | ||||
| 	    $mon_vars .= "$_='" . $mon_conf->{$_} . "'\n"; | ||||
| 	    $mon_vars .= "export $_\n"; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|     #print "nodesetstate:$nodesetstate\n"; | ||||
|     ## OSPKGDIR export | ||||
| @@ -655,21 +663,15 @@ sub getVlanItems | ||||
|  | ||||
| sub getMonItems | ||||
| { | ||||
|  | ||||
|     my $node = shift; | ||||
|     my $result; | ||||
|     my $nodes = shift; | ||||
|  | ||||
|     #get monitoring server and other configuration data for monitoring setup on nodes | ||||
|     my %mon_conf = xCAT_monitoring::monitorctrl->getNodeConfData($node); | ||||
|     foreach (keys(%mon_conf)) | ||||
|     { | ||||
|         $result .= "$_='" . $mon_conf{$_} . "'\n"; | ||||
|         $result .= "export $_\n"; | ||||
|     my $mon_conf = xCAT_monitoring::monitorctrl->getNodeConfData($nodes); | ||||
|  | ||||
|     if(ref($mon_conf) eq "ARRAY") { | ||||
| 	$mon_conf={}; | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     return $result; | ||||
|     return $mon_conf; | ||||
| } | ||||
|  | ||||
| sub getImage | ||||
|   | ||||
| @@ -1363,60 +1363,88 @@ sub deconfig { | ||||
|     These data-value pairs will be used as environmental variables  | ||||
|     on the given node. | ||||
|     Arguments: | ||||
|         node   | ||||
|         noderef -- a pointer to an array of nodes.  | ||||
|     Returns: | ||||
|         ret a hash with enviromental variable name as the key. | ||||
|         ret: pointer to a 2-level hash like this: | ||||
|         { | ||||
|            'node1'=>{'env1'=>'value1', | ||||
|                      'env2'=>'value2'}, | ||||
|            'node2'=>{'env1'=>'value3', | ||||
|                      'env2'=>'value4'} | ||||
|         } | ||||
|       | ||||
|         or a pointer to array if there is an error. [error code, error message] | ||||
|          | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub  getNodeConfData { | ||||
|   my $node=shift; | ||||
|   if ($node =~ /xCAT_monitoring::monitorctrl/) { | ||||
|     $node=shift; | ||||
|   } | ||||
|  | ||||
|   my %ret=(); | ||||
|   #get monitoring server | ||||
|   my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$node], 0); | ||||
|   if (ref($pHash) eq 'ARRAY') {  | ||||
|       xCAT::MsgUtils->message('S', "[mon]: getPostScripts: " . $pHash->[1]); | ||||
|       return %ret;    | ||||
|   } | ||||
|  | ||||
|   my @pair_array=split(':', $pHash->{$node}); | ||||
|   my $monserver=$pair_array[0]; | ||||
|   if ($monserver eq 'noservicenode') { $monserver=hostname(); } | ||||
|   $ret{MONSERVER}=$monserver; | ||||
|   $ret{MONMASTER}=$pair_array[1]; | ||||
|  | ||||
|   #get all the module names from monitoring table | ||||
|   my %names=();    | ||||
|   my $table=xCAT::Table->new("monitoring", -create =>1); | ||||
|   if ($table) { | ||||
|     my $tmp1=$table->getAllEntries("all"); | ||||
|     if (defined($tmp1) && (@$tmp1 > 0)) { | ||||
|       foreach(@$tmp1) { $names{$_->{name}}=1; } | ||||
|     my $noderef=shift; | ||||
|     if ($noderef =~ /xCAT_monitoring::monitorctrl/) { | ||||
| 	$noderef=shift; | ||||
|     } | ||||
|   } else { | ||||
|     xCAT::MsgUtils->message('S', "[mon]: getPostScripts for node $node: cannot open monitoring table.\n"); | ||||
|     return %ret;  | ||||
|   } | ||||
|  | ||||
|  | ||||
|   #get node conf data from each plug-in module | ||||
|   foreach my $pname (keys(%names)) { | ||||
|     my $file_name="$::XCATROOT/lib/perl/xCAT_monitoring/$pname.pm"; | ||||
|     my $module_name="xCAT_monitoring::$pname"; | ||||
|     #load the module in memory | ||||
|     eval {require($file_name)}; | ||||
|     if (!$@) {    | ||||
|       no strict  "refs"; | ||||
|       if (defined(${$module_name."::"}{getNodeConfData})) { | ||||
|         ${$module_name."::"}{getNodeConfData}->($node, \%ret); | ||||
|       }   | ||||
|     my $nodes; | ||||
|     if(ref($noderef) eq "ARRAY") { | ||||
| 	$nodes=$noderef; | ||||
|     } else { | ||||
| 	$nodes=[$noderef]; | ||||
|     } | ||||
|   }  | ||||
| 	 | ||||
|  | ||||
|   return %ret; | ||||
|     my $ret; | ||||
|     #get monitoring server | ||||
|     my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair($nodes, 0); | ||||
|     if (ref($pHash) eq 'ARRAY') {  | ||||
| 	xCAT::MsgUtils->message('S', "[mon]: getPostScripts: " . $pHash->[1]); | ||||
| 	return [1, $pHash->[1]];    | ||||
|     } | ||||
|  | ||||
|     my $hostname=hostname(); | ||||
|     foreach my $node (@$nodes) { | ||||
| 	my @pair_array=split(':', $pHash->{$node}); | ||||
| 	my $monserver=$pair_array[0]; | ||||
| 	if ($monserver eq 'noservicenode') { $monserver=$hostname; } | ||||
| 	$ret->{$node}->{MONSERVER}=$monserver; | ||||
| 	$ret->{$node}->{MONMASTER}=$pair_array[1]; | ||||
|     } | ||||
|  | ||||
|     #get all the module names from monitoring table | ||||
|     my %names=();    | ||||
|     my $table=xCAT::Table->new("monitoring", -create =>1); | ||||
|     if ($table) { | ||||
| 	my $tmp1=$table->getAllEntries("all"); | ||||
| 	if (defined($tmp1) && (@$tmp1 > 0)) { | ||||
| 	    foreach(@$tmp1) { $names{$_->{name}}=1; } | ||||
| 	} | ||||
|     } else { | ||||
| 	xCAT::MsgUtils->message('S', "[mon]: getPostScripts. Cannot open monitoring table.\n"); | ||||
| 	return [1, "Cannot open monitoring table."];  | ||||
|     } | ||||
|  | ||||
|  | ||||
|     #get node conf data from each plug-in module | ||||
|     foreach my $pname (keys(%names)) { | ||||
| 	my $file_name="$::XCATROOT/lib/perl/xCAT_monitoring/$pname.pm"; | ||||
| 	my $module_name="xCAT_monitoring::$pname"; | ||||
| 	#load the module in memory | ||||
| 	eval {require($file_name)}; | ||||
| 	if (!$@) {    | ||||
| 	    no strict  "refs"; | ||||
| 	    if (defined(${$module_name."::"}{getNodeConfData})) { | ||||
| 		my $ref_ret=${$module_name."::"}{getNodeConfData}->($nodes); | ||||
| 		if ($ref_ret) { | ||||
| 		    foreach my $node (keys %$ref_ret) { | ||||
|                         my $data=$ref_ret->{$node}; | ||||
| 			my $olddata=$ret->{$node}; | ||||
|                         my %newhash=(%$olddata,%$data); | ||||
| 			$ret->{$node}=\%newhash; | ||||
| 		    } | ||||
| 		} | ||||
| 	    }   | ||||
| 	} | ||||
|     }  | ||||
|      | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
|   | ||||
| @@ -437,22 +437,29 @@ sub getPostscripts { | ||||
|      the postscripts are invoked. It gets a list of environmental variables for  | ||||
|      the postscripts.   | ||||
|     Arguments: | ||||
|         node  the node being deployed/installed.  | ||||
|         pointer to a hash that will take the data. | ||||
|         pointet to a arry of nodes being deployed. | ||||
|     Returns: | ||||
|         none | ||||
|         ret: pointer to a 2-level hash like this: | ||||
|         { | ||||
|            'node1'=>{'env1'=>'value1', | ||||
|                      'env2'=>'value2'}, | ||||
|            'node2'=>{'env1'=>'value3', | ||||
|                      'env2'=>'value4'} | ||||
|         } | ||||
|                  | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getNodeConfData { | ||||
|   my $node=shift; | ||||
|   if ($node =~ /xCAT_monitoring::templatemon/) { | ||||
|     $node=shift; | ||||
|   } | ||||
|   my $ref_ret=shift; | ||||
|  | ||||
|   #sample | ||||
|   $ref_ret->{MY_ENV1}="abcde"; | ||||
|   $ref_ret->{MY_ENV2}="abcde2"; | ||||
|  | ||||
|   return; | ||||
|     my $noderef=shift; | ||||
|     if ($noderef =~ /xCAT_monitoring::templatemon/) { | ||||
| 	$noderef=shift; | ||||
|     } | ||||
|      | ||||
|     #sample | ||||
|     my $ref_ret; | ||||
|     foreach my $node (@$noderef) {   | ||||
| 	$ref_ret->{$node}->{MY_ENV1}="abcde"; | ||||
| 	$ref_ret->{$node}->{MY_ENV2}="abcde2"; | ||||
|     } | ||||
|     return $ref_ret; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user