Update z/VM code
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4434 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -36,7 +36,15 @@ use warnings; | ||||
| #------------------------------------------------------- | ||||
|  | ||||
| sub handled_commands { | ||||
| 	return { zvm => "zvm" }; | ||||
| 	return { | ||||
| 		rpower => "zvm", | ||||
| 		rinv   => "zvm", | ||||
| 		mkvm   => "zvm", | ||||
| 		rmvm   => "zvm", | ||||
| 		lsvm   => "zvm", | ||||
| 		chvm   => "zvm", | ||||
| 		rscan  => "zvm", | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| #------------------------------------------------------- | ||||
| @@ -396,6 +404,12 @@ sub removeVM { | ||||
| 	$out = `ssh $hcp $::DIR/deletevs $userId`; | ||||
| 	xCAT::zvmUtils->printLn( $callback, "$out" ); | ||||
|  | ||||
| 	# Check for errors | ||||
| 	my $rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| 	if ( $rtn == -1 ) { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	# Remove node from 'zvm', 'nodelist', 'nodehm', and 'hosts' table | ||||
| 	xCAT::zvmUtils->delTabNode( 'zvm',      $node ); | ||||
| 	xCAT::zvmUtils->delTabNode( 'nodelist', $node ); | ||||
| @@ -479,7 +493,10 @@ sub changeVM { | ||||
| 		my $mode    = $args->[3]; | ||||
| 		my $blksize = $args->[4]; | ||||
| 		my $blks    = $args->[5]; | ||||
| 		$out = `ssh $hcp $::DIR/add9336 $userId $pool $addr $mode $blksize $blks`; | ||||
| 		my $readPw  = $args->[6]; | ||||
| 		my $writePw = $args->[7]; | ||||
| 		my $multiPw = $args->[8]; | ||||
| 		$out = `ssh $hcp $::DIR/add9336 $userId $pool $addr $mode $blksize $blks $readPw $writePw $multiPw`; | ||||
| 	} | ||||
|  | ||||
| 	# addnic [address] [type] [device count] | ||||
| @@ -542,6 +559,12 @@ sub changeVM { | ||||
| 		$out = `ssh $hcp $::DIR/deleteipl $userId`; | ||||
| 	} | ||||
|  | ||||
| 	# grantvswitch [VSwitch] | ||||
| 	elsif ( $args->[0] eq "--grantvswitch" ) { | ||||
| 		my $vsw = $args->[1]; | ||||
| 		$out = xCAT::zvmCPUtils->grantVSwitch( $callback, $hcp, $userId, $vsw ); | ||||
| 	} | ||||
|  | ||||
| 	# disconnectnic [address] | ||||
| 	elsif ( $args->[0] eq "--disconnectnic" ) { | ||||
| 		my $addr = $args->[1]; | ||||
| @@ -1087,19 +1110,9 @@ sub cloneVM { | ||||
| 	} | ||||
|  | ||||
| 	# Get read, write, and multi password | ||||
| 	my $readPw = $inputs{"readpw"}; | ||||
| 	if ( !$readPw ) { | ||||
| 		xCAT::zvmUtils->printLn( $callback, "Error: Missing read password" ); | ||||
| 		return; | ||||
| 	} | ||||
| 	my $writePw = $inputs{"writepw"}; | ||||
| 	if ( !$writePw ) { | ||||
| 		xCAT::zvmUtils->printLn( $callback, "Error: Missing write password" ); | ||||
| 		return; | ||||
| 	} | ||||
| 	my $multiPw = $inputs{"multipw"}; | ||||
| 	if ( !$multiPw ) { | ||||
| 		xCAT::zvmUtils->printLn( $callback, "Error: Missing multi password" ); | ||||
| 	my $trgtPw = $inputs{"pw"}; | ||||
| 	if ( !$trgtPw ) { | ||||
| 		xCAT::zvmUtils->printLn( $callback, "Error: Missing read/write/multi password" ); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| @@ -1128,6 +1141,7 @@ sub cloneVM { | ||||
| 	} | ||||
|  | ||||
| 	# Load VMCP module | ||||
| 	$out = xCAT::zvmCPUtils->loadVmcp($hcp); | ||||
| 	$out = xCAT::zvmCPUtils->loadVmcp($sourceNode); | ||||
|  | ||||
| 	# Get VSwitch of master node | ||||
| @@ -1137,7 +1151,7 @@ sub cloneVM { | ||||
| 	# GuestLan do not need permissions | ||||
| 	xCAT::zvmUtils->printLn( $callback, "$targetNode: Granting VSwitch access" ); | ||||
| 	foreach (@vswitchId) { | ||||
| 		$out = xCAT::zvmUtils->grantVSwitch( $callback, $hcp, $targetUserId, $_ ); | ||||
| 		$out = xCAT::zvmCPUtils->grantVSwitch( $callback, $hcp, $targetUserId, $_ ); | ||||
|  | ||||
| 		# Check for errors | ||||
| 		$rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| @@ -1155,14 +1169,16 @@ sub cloneVM { | ||||
| 	my $type; | ||||
| 	my $mode; | ||||
| 	my $cyl; | ||||
| 	my $srcMultiPw; | ||||
| 	foreach (@srcDisks) { | ||||
|  | ||||
| 		# Get disk device address | ||||
| 		@parms = split( ' ', $_ ); | ||||
| 		$addr = $parms[1]; | ||||
| 		push( @trgtDisks, $addr ); | ||||
| 		$type = $parms[2]; | ||||
| 		$mode = $parms[6]; | ||||
| 		$type       = $parms[2]; | ||||
| 		$mode       = $parms[6]; | ||||
| 		$srcMultiPw = $parms[9]; | ||||
|  | ||||
| 		# Add ECKD disk | ||||
| 		if ( $type eq '3390' ) { | ||||
| @@ -1174,7 +1190,7 @@ sub cloneVM { | ||||
|  | ||||
| 			# Add disk | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$targetNode: Adding minidisk" ); | ||||
| 			$out = `ssh $hcp $::DIR/add3390 $targetUserId $pool $addr $mode $cyl $readPw $writePw $multiPw`; | ||||
| 			$out = `ssh $hcp $::DIR/add3390 $targetUserId $pool $addr $mode $cyl $trgtPw $trgtPw $trgtPw`; | ||||
|  | ||||
| 			# Check for errors | ||||
| 			$rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| @@ -1194,15 +1210,33 @@ sub cloneVM { | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	# Format and copy source disks | ||||
| 	my $targetAddr; | ||||
| 	my $targetDevNode; | ||||
| 	my $sourceDevNode; | ||||
| 	foreach (@trgtDisks) { | ||||
| 		$targetAddr = $_ + 1000; | ||||
| 	# Load VMCP module on HCP | ||||
| 	$out = xCAT::zvmCPUtils->loadVmcp($hcp); | ||||
|  | ||||
| 		# Check if there is an existing address | ||||
| 		$out = xCAT::zvmUtils->isAddressUsed( $sourceNode, $targetAddr ); | ||||
| 	# Link , format, and copy source disks | ||||
| 	my $srcAddr; | ||||
| 	my $targetAddr; | ||||
| 	my $sourceDevNode; | ||||
| 	my $targetDevNode; | ||||
| 	foreach (@trgtDisks) { | ||||
| 		$srcAddr    = $_ + 1000; | ||||
| 		$targetAddr = $_ + 2000; | ||||
|  | ||||
| 		# Check if there is an existing address (source address) | ||||
| 		$out = xCAT::zvmUtils->isAddressUsed( $hcp, $srcAddr ); | ||||
|  | ||||
| 		# If there is an existing address | ||||
| 		while ( $out == 0 ) { | ||||
|  | ||||
| 			# Generate a new address | ||||
| 			# Sleep 2 seconds to let existing disk appear | ||||
| 			sleep(2); | ||||
| 			$srcAddr = $srcAddr + 1; | ||||
| 			$out = xCAT::zvmUtils->isAddressUsed( $hcp, $srcAddr ); | ||||
| 		} | ||||
|  | ||||
| 		# Check if there is an existing address (target address) | ||||
| 		$out = xCAT::zvmUtils->isAddressUsed( $hcp, $targetAddr ); | ||||
|  | ||||
| 		# If there is an existing address | ||||
| 		while ( $out == 0 ) { | ||||
| @@ -1211,74 +1245,99 @@ sub cloneVM { | ||||
| 			# Sleep 2 seconds to let existing disk appear | ||||
| 			sleep(2); | ||||
| 			$targetAddr = $targetAddr + 1; | ||||
| 			$out = xCAT::zvmUtils->isAddressUsed( $sourceNode, $targetAddr ); | ||||
| 			$out = xCAT::zvmUtils->isAddressUsed( $hcp, $targetAddr ); | ||||
| 		} | ||||
|  | ||||
| 		# Link target disk to source disk | ||||
| 		$out = `ssh $sourceNode vmcp link $targetUserId $_ $targetAddr MW $multiPw`; | ||||
| 		# Link source disk | ||||
| 		$out = `ssh -o ConnectTimeout=5 $hcp vmcp link $sourceId $_ $srcAddr MW $srcMultiPw`; | ||||
|  | ||||
| 		# Get for errors | ||||
| 		# Check for errors | ||||
| 		$rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| 		if ( $rtn == -1 ) { | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$out" ); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		# Enable target disk | ||||
| 		$out = xCAT::zvmUtils->disableEnableDisk( $callback, $sourceNode, "-e", $targetAddr ); | ||||
| 		# Link target disk | ||||
| 		$out = `ssh -o ConnectTimeout=5 $hcp vmcp link $targetUserId $_ $targetAddr MW $trgtPw`; | ||||
|  | ||||
| 		# Determine target device node | ||||
| 		$out           = `ssh $sourceNode cat /proc/dasd/devices | grep ".$targetAddr("`; | ||||
| 		@parms         = split( ' ', $out ); | ||||
| 		$targetDevNode = $parms[6]; | ||||
| 		# Check for errors | ||||
| 		$rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| 		if ( $rtn == -1 ) { | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$out" ); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		# Determine source device node | ||||
| 		$out           = `ssh $sourceNode cat /proc/dasd/devices | grep "$_"`; | ||||
| 		@parms         = split( ' ', $out ); | ||||
| 		$sourceDevNode = $parms[6]; | ||||
|  | ||||
| 		# Format disk | ||||
| 		xCAT::zvmUtils->printLn( $callback, "$targetNode: Formating disk" ); | ||||
| 		$out = `ssh $sourceNode dasdfmt -b 4096 -y -f /dev/$targetDevNode`; | ||||
| 		# Use FLASHCOPY | ||||
| 		xCAT::zvmUtils->printLn( $callback, "$targetNode: Copying source disk using FLASHCOPY" ); | ||||
| 		$out = xCAT::zvmCPUtils->flashCopy( $hcp, $srcAddr, $targetAddr ); | ||||
|  | ||||
| 		# Check for errors | ||||
| 		$rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| 		if ( $rtn == -1 ) { | ||||
|  | ||||
| 			# Exit on bad output | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$out" ); | ||||
| 			return; | ||||
| 			# FLASHCOPY is not supported | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$targetNode: FLASHCOPY not supported.  Using Linux DD" ); | ||||
|  | ||||
| 			# Enable source disk | ||||
| 			$out = xCAT::zvmUtils->disableEnableDisk( $callback, $hcp, "-e", $srcAddr ); | ||||
|  | ||||
| 			# Enable target disk | ||||
| 			$out = xCAT::zvmUtils->disableEnableDisk( $callback, $hcp, "-e", $targetAddr ); | ||||
|  | ||||
| 			# Determine source device node | ||||
| 			$out           = `ssh $hcp cat /proc/dasd/devices | grep ".$srcAddr("`; | ||||
| 			@parms         = split( ' ', $out ); | ||||
| 			$sourceDevNode = $parms[6]; | ||||
|  | ||||
| 			# Determine target device node | ||||
| 			$out           = `ssh $hcp cat /proc/dasd/devices | grep ".$targetAddr("`; | ||||
| 			@parms         = split( ' ', $out ); | ||||
| 			$targetDevNode = $parms[6]; | ||||
|  | ||||
| 			# Format target disk | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$targetNode: Formating disk" ); | ||||
| 			$out = `ssh $hcp dasdfmt -b 4096 -y -f /dev/$targetDevNode`; | ||||
|  | ||||
| 			# Check for errors | ||||
| 			$rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| 			if ( $rtn == -1 ) { | ||||
|  | ||||
| 				# Exit on bad output | ||||
| 				xCAT::zvmUtils->printLn( $callback, "$out" ); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			# Sleep 2 seconds to let the system settle | ||||
| 			sleep(2); | ||||
|  | ||||
| 			# Copy source disk to target disk | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$targetNode: Copying source disk" ); | ||||
| 			$out = `ssh $hcp dd if=/dev/$sourceDevNode of=/dev/$targetDevNode bs=4096`; | ||||
|  | ||||
| 			# Check for error | ||||
| 			$rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| 			if ( $rtn == -1 ) { | ||||
| 				xCAT::zvmUtils->printLn( $callback, "$out" ); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			# Sleep 2 seconds to let the system settle | ||||
| 			sleep(2); | ||||
| 		} | ||||
|  | ||||
| 		# Sleep 2 seconds to let the system settle | ||||
| 		sleep(2); | ||||
|  | ||||
| 		# Copy source disk to target disk | ||||
| 		xCAT::zvmUtils->printLn( $callback, "$targetNode: Copying source disk" ); | ||||
| 		$out = `ssh $sourceNode dd if=/dev/$sourceDevNode of=/dev/$targetDevNode bs=4096`; | ||||
|  | ||||
| 		# Check for error | ||||
| 		$rtn = xCAT::zvmUtils->isOutputGood( $callback, $out ); | ||||
| 		if ( $rtn == -1 ) { | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$out" ); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		# Sleep 2 seconds to let the system settle | ||||
| 		sleep(2); | ||||
|  | ||||
| 		# Disable and enable target disk | ||||
| 		$out = xCAT::zvmUtils->disableEnableDisk( $callback, $sourceNode, "-d", $targetAddr ); | ||||
| 		$out = xCAT::zvmUtils->disableEnableDisk( $callback, $sourceNode, "-e", $targetAddr ); | ||||
| 		$out = xCAT::zvmUtils->disableEnableDisk( $callback, $hcp, "-d", $targetAddr ); | ||||
| 		$out = xCAT::zvmUtils->disableEnableDisk( $callback, $hcp, "-e", $targetAddr ); | ||||
|  | ||||
| 		# Determine target device node | ||||
| 		$out           = `ssh $sourceNode cat /proc/dasd/devices | grep ".$targetAddr("`; | ||||
| 		# Determine target device node (it might have changed) | ||||
| 		$out           = `ssh $hcp cat /proc/dasd/devices | grep ".$targetAddr("`; | ||||
| 		@parms         = split( ' ', $out ); | ||||
| 		$targetDevNode = $parms[6]; | ||||
|  | ||||
| 		# Get source device node that is mounted on (/) | ||||
| 		my $sourceRootDevNode = xCAT::zvmUtils->getRootNode($sourceNode); | ||||
| 		if ( $sourceRootDevNode =~ m/$sourceDevNode/i ) { | ||||
| 		# Get disk address that is the root partition | ||||
| 		my $rootPartitionAddr = xCAT::zvmUtils->getRootDiskAddr($sourceNode); | ||||
| 		if ( $_ eq $rootPartitionAddr ) { | ||||
|  | ||||
| 			# Set network configuration | ||||
| 			xCAT::zvmUtils->printLn( $callback, "$targetNode: Setting network configuration" ); | ||||
| @@ -1286,14 +1345,11 @@ sub cloneVM { | ||||
| 			# Mount target disk | ||||
| 			my $cloneMntPt = "/mnt/$targetUserId"; | ||||
| 			$targetDevNode .= "1"; | ||||
|  | ||||
| 			# xCAT::zvmUtils->printLn( $callback, "Mounting $cloneMntPt..." ); | ||||
| 			$out = `ssh $sourceNode mkdir $cloneMntPt`; | ||||
| 			$out = `ssh $sourceNode mount /dev/$targetDevNode $cloneMntPt`; | ||||
| 			$out = `ssh $hcp mkdir $cloneMntPt`; | ||||
| 			$out = `ssh $hcp mount /dev/$targetDevNode $cloneMntPt`; | ||||
|  | ||||
| 			# Set hostname | ||||
| 			$out = `ssh $sourceNode sed --in-place -e "s/$sourceNode/$targetNode/g" $cloneMntPt/etc/HOSTNAME`; | ||||
| 			$out = `ssh $sourceNode cat $cloneMntPt/etc/HOSTNAME`; | ||||
| 			$out = `ssh $hcp sed --in-place -e "s/$sourceNode/$targetNode/g" $cloneMntPt/etc/HOSTNAME`; | ||||
|  | ||||
| 			# Set IP address | ||||
| 			my $sourceIp  = xCAT::zvmUtils->getIp($sourceNode); | ||||
| @@ -1302,19 +1358,23 @@ sub cloneVM { | ||||
| 			my $ifcfgPath = $cloneMntPt; | ||||
| 			$ifcfgPath .= $ifcfg; | ||||
| 			$out = | ||||
| `ssh $sourceNode sed --in-place -e "s/$sourceNode/$targetNode/g" \ -e "s/$sourceIp/$targetIp/g" $cloneMntPt/etc/hosts`; | ||||
| 			$out = | ||||
| `ssh $sourceNode sed --in-place -e "s/$sourceIp/$targetIp/g" \ -e "s/$sourceNode/$targetNode/g" $ifcfgPath`; | ||||
| `ssh $hcp sed --in-place -e "s/$sourceNode/$targetNode/g" \ -e "s/$sourceIp/$targetIp/g" $cloneMntPt/etc/hosts`; | ||||
| 			$out = `ssh $hcp sed --in-place -e "s/$sourceIp/$targetIp/g" \ -e "s/$sourceNode/$targetNode/g" $ifcfgPath`; | ||||
|  | ||||
| 			# Flush disk | ||||
| 			$out = `ssh $sourceNode sync`; | ||||
| 			$out = `ssh $hcp sync`; | ||||
|  | ||||
| 			# Unmount disk | ||||
| 			$out = `ssh $sourceNode umount $cloneMntPt`; | ||||
| 			$out = `ssh $hcp umount $cloneMntPt`; | ||||
| 		} | ||||
|  | ||||
| 		# Detatch disk | ||||
| 		$out = `ssh $sourceNode vmcp det $targetAddr`; | ||||
| 		# Disable disks | ||||
| 		$out = xCAT::zvmUtils->disableEnableDisk( $callback, $hcp, "-d", $srcAddr ); | ||||
| 		$out = xCAT::zvmUtils->disableEnableDisk( $callback, $hcp, "-d", $targetAddr ); | ||||
|  | ||||
| 		# Detatch disks | ||||
| 		$out = `ssh $hcp vmcp det $srcAddr`; | ||||
| 		$out = `ssh $hcp vmcp det $targetAddr`; | ||||
| 	} | ||||
|  | ||||
| 	# Power on target virtual server | ||||
|   | ||||
		Reference in New Issue
	
	Block a user