You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by fa...@apache.org on 2009/05/05 19:06:23 UTC

svn commit: r771936 - /incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/vmware.pm

Author: fapeeler
Date: Tue May  5 17:06:23 2009
New Revision: 771936

URL: http://svn.apache.org/viewvc?rev=771936&view=rev
Log:
VCL-7

updated node_status routine so it can be called by tools outside of
vcld  - specifically healthcheck
node_status:
- extended to accept non-class method calls
- changed basic flow to always get the state of a vm
- vmstate is now on,off,stuck instead of 0,1



Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/vmware.pm

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/vmware.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/vmware.pm?rev=771936&r1=771935&r2=771936&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/vmware.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/vmware.pm Tue May  5 17:06:23 2009
@@ -53,6 +53,7 @@
 use strict;
 use warnings;
 use diagnostics;
+use English qw( -no_match_vars );
 
 use VCL::utils;
 use Fcntl qw(:DEFAULT :flock);
@@ -391,12 +392,12 @@
 										if ($a =~ /^(on|off|stuck)/i) {
 											$vmlist{$v}{"state"} = $a;
 										}
-										else{
+										else {
 											notify($ERRORS{'WARNING'}, 0, "unknown state $a for $vmlist{$v}{path} on $hostnode");
 											$vmlist{$v}{"state"} = $a;
 										}
 
-									}
+									} ## end foreach $a (@{$sshcmd_2[1]})
 								} ## end foreach my $v (keys %vmlist)
 								notify($ERRORS{'OK'}, 0, "ls datastorepath $datastorepath ");
 								my @sshcmd_3 = run_ssh_command($hostnode, $identity, "ls -1 $datastorepath", "root");
@@ -831,18 +832,18 @@
 						#good vm still on
 						notify($ERRORS{'OK'}, 0, "vm $computer_shortname reports on");
 
-						if($sloop > 15 ){
+						if ($sloop > 15) {
 							my $sshd_status = _sshd_status($computer_shortname, $requestedimagename);
-                     if ($sshd_status eq "on") {
-                        notify($ERRORS{'OK'}, 0, "$computer_shortname now has active sshd running, maybe we missed the READY flag setting STAGE5 flag");
-                        $s5 = 1;
-                        #speed this up a bit
-                        close(TAIL);
-                        goto VMWAREROUND2;
-                     }
-						}
+							if ($sshd_status eq "on") {
+								notify($ERRORS{'OK'}, 0, "$computer_shortname now has active sshd running, maybe we missed the READY flag setting STAGE5 flag");
+								$s5 = 1;
+								#speed this up a bit
+								close(TAIL);
+								goto VMWAREROUND2;
+							}
+						} ## end if ($sloop > 15)
 
-					}
+					} ## end if ($l =~ /= on/)
 					elsif ($l =~ /= off/) {
 						#good vm still on
 						notify($ERRORS{'CRITICAL'}, 0, "state of vm $computer_shortname reports off after pass number $sloop attempting to restart: start attempts $vmware_starts");
@@ -918,7 +919,7 @@
 							$sloop = $sloop - 5;
 						}
 
-						my $sshd_status = _sshd_status($computer_shortname, $requestedimagename,$image_os_type);
+						my $sshd_status = _sshd_status($computer_shortname, $requestedimagename, $image_os_type);
 						if ($sshd_status eq "on") {
 							notify($ERRORS{'OK'}, 0, "$computer_shortname now has active sshd running, maybe we missed the READY flag setting STAGE5 flag");
 							$s5 = 1;
@@ -971,7 +972,7 @@
 	$sshd_attempts++;
 	my $sshd_status = "off";
 	while (!$sshdstatus) {
-		my $sshd_status = _sshd_status($computer_shortname, $requestedimagename,$image_os_type);
+		my $sshd_status = _sshd_status($computer_shortname, $requestedimagename, $image_os_type);
 		if ($sshd_status eq "on") {
 			$sshdstatus = 1;
 			notify($ERRORS{'OK'}, 0, "$computer_shortname now has active sshd running, ok to proceed to sync ssh keys");
@@ -1083,7 +1084,7 @@
 		#not default setting
 		if ($IPCONFIGURATION eq "dynamicDHCP") {
 			insertloadlog($reservation_id, $vmclient_computerid, "dynamicDHCPaddress", "collecting dynamic IP address for node");
-			my $assignedIPaddress = getdynamicaddress($computer_shortname, $vmclient_OSname,$image_os_type);
+			my $assignedIPaddress = getdynamicaddress($computer_shortname, $vmclient_OSname, $image_os_type);
 			if ($assignedIPaddress) {
 				#update computer table
 				if (update_computer_address($vmclient_computerid, $assignedIPaddress)) {
@@ -1102,7 +1103,7 @@
 		} ## end if ($IPCONFIGURATION eq "dynamicDHCP")
 		elsif ($IPCONFIGURATION eq "static") {
 			insertloadlog($reservation_id, $vmclient_computerid, "staticIPaddress", "setting static IP address for node");
-			if (setstaticaddress($computer_shortname, $vmclient_OSname, $vmclient_publicIPaddress,$image_os_type)) {
+			if (setstaticaddress($computer_shortname, $vmclient_OSname, $vmclient_publicIPaddress, $image_os_type)) {
 				# good set static address
 			}
 		}
@@ -1149,7 +1150,7 @@
 	my $image_os_name  = $self->data->get_image_os_name;
 	my $image_identity = $self->data->get_image_identity;
 	my $image_os_type  = $self->data->get_image_os_type;
-	my $image_name          = $self->data->get_image_name();
+	my $image_name     = $self->data->get_image_name();
 
 
 	my $imagemeta_sysprep = $self->data->get_imagemeta_sysprep;
@@ -1296,7 +1297,7 @@
 				if (_pingnode($computer_nodename)) {
 					#it pingable check if sshd is open
 					notify($ERRORS{'OK'}, 0, "$computer_nodename is pingable, checking sshd port");
-					my $sshd = _sshd_status($computer_nodename, $image_name,$image_os_type);
+					my $sshd = _sshd_status($computer_nodename, $image_name, $image_os_type);
 					if ($sshd =~ /on/) {
 						$rebooted = 0;
 						notify($ERRORS{'OK'}, 0, "$computer_nodename sshd is open");
@@ -2048,26 +2049,66 @@
 sub node_status {
 	my $self = shift;
 
+	my $vmpath             = 0;
+	my $datastorepath      = 0;
+	my $requestedimagename = 0;
+	my $vmhost_type        = 0;
+	my $log                = 0;
+	my $vmhost_hostname    = 0;
+	my $vmhost_imagename   = 0;
+	my $vmclient_shortname = 0;
+	my $image_os_type      = 0;
+	my $request_forimaging = 0;
+	my $computer_node_name = 0;
+	my $identity_keys      = 0;
+
 	# Check if subroutine was called as a class method
 	if (ref($self) !~ /vmware/i) {
-		notify($ERRORS{'DEBUG'}, 0, "subroutine was called as a function, it must be called as a class method");
-	}
+		if (ref($self) eq 'HASH') {
+			$log = $self->{logfile};
+			#notify($ERRORS{'DEBUG'}, $log, "self is a hash reference");
+
+			$computer_node_name = $self->{computer}->{hostname};
+			$identity_keys      = $self->{managementnode}->{keys};
+			$requestedimagename = $self->{imagerevision}->{imagename};
+			$image_os_type      = $self->{image}->{OS}->{type};
+			$vmhost_type        = $self->{vmhost}->{vmprofile}->{vmtype}->{name};
+			$vmhost_imagename   = $self->{vmhost}->{imagename};
+			$vmpath             = $self->{vmhost}->{vmprofile}->{vmpath};
+			$datastorepath      = $self->{vmhost}->{vmprofile}->{datastorepath};
+			$vmhost_hostname    = $self->{vmhost}->{hostname};
+
+		} ## end if (ref($self) eq 'HASH')
+		# Check if node_status returned an array ref
+		elsif (ref($self) eq 'ARRAY') {
+			notify($ERRORS{'DEBUG'}, $log, "self is a array reference");
+		}
 
-	my ($package, $filename, $line, $sub) = caller(0);
+		$vmclient_shortname = $1 if ($computer_node_name =~ /([-_a-zA-Z0-9]*)(\.?)/);
 
-	# Collect local variables from DataStructure
+	} ## end if (ref($self) !~ /vmware/i)
+	else {
+		# called as an object
+		# Collect local variables from DataStructure
 
-	my $vmpath             = $self->data->get_vmhost_profile_vmpath;
-	my $datastorepath      = $self->data->get_vmhost_profile_datastore_path;
-	my $requestedimagename = $self->data->get_image_name;
-	my $vmhost_type        = $self->data->get_vmhost_type;
-	my $vmhost_hostname    = $self->data->get_vmhost_hostname;
-	my $vmhost_imagename   = $self->data->get_vmhost_image_name;
-	my $vmclient_shortname = $self->data->get_computer_short_name;
-	my $image_os_type	  = $self->data->get_image_os_type;
-	my $request_forimaging = $self->data->get_request_forimaging();
-	
-	my ($hostnode, $identity);
+		$vmpath             = $self->data->get_vmhost_profile_vmpath;
+		$datastorepath      = $self->data->get_vmhost_profile_datastore_path;
+		$requestedimagename = $self->data->get_image_name;
+		$vmhost_type        = $self->data->get_vmhost_type;
+		$vmhost_hostname    = $self->data->get_vmhost_hostname;
+		$vmhost_imagename   = $self->data->get_vmhost_image_name;
+		$vmclient_shortname = $self->data->get_computer_short_name;
+		$image_os_type      = $self->data->get_image_os_type;
+		$request_forimaging = $self->data->get_request_forimaging();
+		$identity_keys      = $self->data->get_management_node_keys;
+	} ## end else [ if (ref($self) !~ /vmware/i)
+
+	notify($ERRORS{'DEBUG'}, $log, "identity_keys= $identity_keys");
+	notify($ERRORS{'DEBUG'}, $log, "requestedimagename= $requestedimagename");
+	notify($ERRORS{'DEBUG'}, $log, "image_os_type= $image_os_type");
+	notify($ERRORS{'DEBUG'}, $log, "request_forimaging= $request_forimaging");
+	notify($ERRORS{'DEBUG'}, $log, "vmpath= $vmpath");
+	notify($ERRORS{'DEBUG'}, $log, "datastorepath= $datastorepath");
 
 	# Create a hash to store status components
 	my %status;
@@ -2080,76 +2121,65 @@
 	$status{vmstate}      = 0;    #on or off
 	$status{image_match}  = 0;
 
-	if ($vmhost_type eq "blade") {
-		$hostnode = $1 if ($vmhost_hostname =~ /([-_a-zA-Z0-9]*)(\.?)/);
-		$identity = $IDENTITY_bladerhel;    
-	}
-	else {
-		#using FQHN
-		$hostnode = $vmhost_hostname;
-		$identity = $IDENTITY_linux_lab if ($vmhost_imagename =~ /^(realmrhel)/);
-	}
-
-	if (!$identity) {
-		notify($ERRORS{'CRITICAL'}, 0, "could not set ssh identity variable for image $vmhost_imagename type= $vmhost_type host= $vmhost_hostname");
+	if (!$identity_keys) {
+		notify($ERRORS{'CRITICAL'}, $log, "could not set ssh identity variable for image $vmhost_imagename type= $vmhost_type host= $vmhost_hostname");
 	}
 
 	# Check if node is pingable
-	notify($ERRORS{'DEBUG'}, 0, "checking if $vmclient_shortname is pingable");
+	notify($ERRORS{'DEBUG'}, $log, "checking if $vmclient_shortname is pingable");
 	if (_pingnode($vmclient_shortname)) {
 		$status{ping} = 1;
-		notify($ERRORS{'OK'}, 0, "$vmclient_shortname is pingable ($status{ping})");
+		notify($ERRORS{'OK'}, $log, "$vmclient_shortname is pingable ($status{ping})");
 	}
 	else {
-		notify($ERRORS{'OK'}, 0, "$vmclient_shortname is not pingable ($status{ping})");
+		notify($ERRORS{'OK'}, $log, "$vmclient_shortname is not pingable ($status{ping})");
 		$status{status} = 'RELOAD';
 		return $status{status};
 	}
 
-	#
 	my $vmx_directory = "$requestedimagename$vmclient_shortname";
 	my $myvmx         = "$vmpath/$requestedimagename$vmclient_shortname/$requestedimagename$vmclient_shortname.vmx";
 	my $mybasedirname = $requestedimagename;
 	my $myimagename   = $requestedimagename;
 
+	# #vm running
+	my @sshcmd = run_ssh_command($vmhost_hostname, $identity_keys, "vmware-cmd $myvmx getstate", "root");
+	foreach my $l (@{$sshcmd[1]}) {
+		notify($ERRORS{'OK'}, $log, "$l");
+		$status{vmstate} = "on"    if ($l =~ /^getstate\(\) = on/);
+		$status{vmstate} = "off"   if ($l =~ /= off/);
+		$status{vmstate} = "stuck" if ($l =~ /= stuck/);
 
-	#can I ssh into it
-	my $sshd = _sshd_status($vmclient_shortname, $requestedimagename,$image_os_type);
+		if ($l =~ /No such virtual machine/) {
+			#ok wait something is using that hostname
+			#reset $status{image_match} controlVM will detect and remove it
+			$status{image_match} = 0;
+		}
+	} ## end foreach my $l (@{$sshcmd[1]})
+	notify($ERRORS{'OK'}, $log, "$vmclient_shortname vmstate reports $status{vmstate}");
 
+	#can I ssh into it
+	my $sshd = _sshd_status($vmclient_shortname, $requestedimagename, $image_os_type);
 
 	#is it running the requested image
 	if ($sshd eq "on") {
 
-		$status{ssh}          = 1;
+		$status{ssh} = 1;
+
 		$status{currentimage} = _getcurrentimage($vmclient_shortname);
 
 		if ($status{currentimage}) {
 			chomp($status{currentimage});
 			if ($status{currentimage} =~ /$requestedimagename/) {
 				$status{image_match} = 1;
-				notify($ERRORS{'OK'}, 0, "$vmclient_shortname is loaded with requestedimagename $requestedimagename");
+				notify($ERRORS{'OK'}, $log, "$vmclient_shortname is loaded with requestedimagename $requestedimagename");
 			}
 			else {
-				notify($ERRORS{'OK'}, 0, "$vmclient_shortname reports current image is currentimage= $status{currentimage} requestedimagename= $requestedimagename");
+				notify($ERRORS{'OK'}, $log, "$vmclient_shortname reports current image is currentimage= $status{currentimage} requestedimagename= $requestedimagename");
 			}
 		} ## end if ($status{currentimage})
 	} ## end if ($sshd eq "on")
 
-	# #vm running
-	if ($status{image_match}) {
-		my @sshcmd = run_ssh_command($hostnode, $identity, "vmware-cmd $myvmx getstate", "root");
-		foreach my $l (@{$sshcmd[1]}) {
-			notify($ERRORS{'OK'}, 0, "$l");
-			$status{vmstate} = 1 if ($l =~ /^getstate\(\) = on/);
-			$status{vmstate} = 0 if ($l =~ /= off/);
-
-			if ($l =~ /No such virtual machine/) {
-				#ok wait something is using that hostname
-				#reset $status{image_match} controlVM will detect and remove it
-				$status{image_match} = 0;
-			}
-		} ## end foreach my $l (@{$sshcmd[1]})
-	} ## end if ($status{image_match})
 
 	# Determine the overall machine status based on the individual status results
 	if ($status{ssh} && $status{image_match}) {
@@ -2159,12 +2189,12 @@
 		$status{status} = 'RELOAD';
 	}
 
-	if($request_forimaging){
+	if ($request_forimaging) {
 		$status{status} = 'RELOAD';
-		notify($ERRORS{'OK'}, 0, "forimaging flag enabled RELOAD machine");
+		notify($ERRORS{'OK'}, $log, "forimaging flag enabled RELOAD machine");
 	}
 
-	notify($ERRORS{'OK'}, 0, "returning node status hash reference (\$node_status->{status}=$status{status})");
+	notify($ERRORS{'OK'}, $log, "returning node status hash reference (\$node_status->{status}=$status{status})");
 	return \%status;
 
 } ## end sub node_status