fence-agents: master - fence_zvm: Add support for "on" and "status"

Marek GrĂ¡c marx at fedoraproject.org
Wed Aug 27 11:12:14 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=fence-agents.git;a=commitdiff;h=32a2f80f5a44f00aaab57835a34f73345d9b127d
Commit:        32a2f80f5a44f00aaab57835a34f73345d9b127d
Parent:        4fb2dd8eb8649942dd7fe180508a31f2f46beae3
Author:        Marek 'marx' Grac <mgrac at redhat.com>
AuthorDate:    Wed Aug 27 13:07:44 2014 +0200
Committer:     Marek 'marx' Grac <mgrac at redhat.com>
CommitterDate: Wed Aug 27 13:07:44 2014 +0200

fence_zvm: Add support for "on" and "status"

Developed by: Neale Ferguson
---
 fence/agents/zvm/fence_zvm.8   |    4 +-
 fence/agents/zvm/fence_zvm.c   |  286 ++++++++++++++++++++++++++++++++++---
 fence/agents/zvm/fence_zvm.h   |    1 +
 fence/agents/zvm/fence_zvmip.8 |    5 +-
 fence/agents/zvm/fence_zvmip.c |  309 ++++++++++++++++++++++++++++++++++++++--
 5 files changed, 575 insertions(+), 30 deletions(-)

diff --git a/fence/agents/zvm/fence_zvm.8 b/fence/agents/zvm/fence_zvm.8
index 0b34e2c..359436e 100644
--- a/fence/agents/zvm/fence_zvm.8
+++ b/fence/agents/zvm/fence_zvm.8
@@ -22,7 +22,7 @@ Vendor URL: http://www.sinenomine.net
 .SH OPTIONS
 .TP
 \fB-o --action\fP
-Fencing action: "off" - fence off device; "metadata" - display device metadata
+Fencing action: "off" - deactivate virtual machine; "on" - activate virtual machine; "metadata" - display device metadata" - describe fence agent parameters; "status" - state of virtual machine
 .TP
 \fB--delay\fP \fIseconds\fP
 Time to delay fencing action in seconds
@@ -52,7 +52,7 @@ forcibly terminated. Currently, this option is ignored.
 This option is used by fence_node(8) and is ignored by fence_zvm.
 .TP
 \fIaction = < action >\fP
-Fencing action: "off" - fence off device; "metadata" - display device metadata
+Fencing action: "off" - fence off device; "metadata" - display device metadata; "status" - state of device
 .TP
 \fIport = < target >\fP
 Name of virtual machine to recycle.
diff --git a/fence/agents/zvm/fence_zvm.c b/fence/agents/zvm/fence_zvm.c
index d2fb4a9..2ec4be9 100644
--- a/fence/agents/zvm/fence_zvm.c
+++ b/fence/agents/zvm/fence_zvm.c
@@ -185,6 +185,240 @@ zvm_smapi_imageRecycle(zvm_driver_t *zvm)
 }
 
 /**
+ * zvm_smapi_imageDeactivate
+ * @zvm: z/VM driver information
+ *
+ * Deactivates a virtual image
+ */
+int
+zvm_smapi_imageDeactivate(zvm_driver_t *zvm)
+{
+	struct _inPlist {
+		int32_t	lPlist;
+		int32_t	lFName;
+		char	fName[16];
+		int32_t lUser;
+		int32_t lPass;
+		int32_t	lTarget;
+		char	target[0];
+	} __attribute__ ((__packed__)) *inPlist;
+	struct _deactTime {
+		int32_t lForceTime;
+		char	forceTime[5];
+	} __attribute__ ((__packed__)) *deactTime;
+	int32_t	lInPlist;
+	struct	_outPlist {
+		smapiOutHeader_t hdr;
+		int32_t	nActive;
+		int32_t	nInActive;
+		int32_t	lFail;
+		char	failArray[0];
+	} *outPlist = NULL;
+	void	*pOut = NULL;
+	int32_t	lRsp;
+	uint32_t reqId;
+	int	rc;
+
+	/*
+	 * Implement any delay
+	 */ 
+	if (zvm->delay > 0) 
+		sleep(zvm->delay);
+
+	lInPlist = sizeof(*inPlist) + strlen(zvm->target) + sizeof(*deactTime);
+	inPlist = malloc(lInPlist);
+	if (inPlist != NULL) {
+		inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist);
+		inPlist->lFName = sizeof(inPlist->fName);
+		memcpy(inPlist->fName, Image_Deactivate, sizeof(inPlist->fName));
+		deactTime = (void *) ((intptr_t) inPlist + sizeof(*inPlist) + strlen(zvm->target));
+		deactTime->lForceTime = sizeof(deactTime->forceTime);
+		memcpy(deactTime->forceTime, "IMMED", sizeof(deactTime->forceTime));
+		inPlist->lUser = inPlist->lPass = 0;
+		inPlist->lTarget = strlen(zvm->target);
+		memcpy(inPlist->target, zvm->target, inPlist->lTarget);
+		if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) {
+			if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) {
+				outPlist = pOut;
+				if (outPlist->hdr.rc == 0) {
+					syslog(LOG_INFO, "Deactivation of %s successful",
+					       zvm->target);
+					rc = 0;
+				} else {
+					if ((outPlist->hdr.rc == RCERR_IMAGEOP) &
+					    ((outPlist->hdr.reason == RS_NOT_ACTIVE) |
+					     (outPlist->hdr.reason == RS_BEING_DEACT))) {
+						syslog(LOG_INFO, "Deactivation of %s successful",
+						       zvm->target);
+						rc = 0;
+					} else {
+						rc = outPlist->hdr.rc;
+						zvm->reason = outPlist->hdr.reason;
+						(void) zvm_smapi_reportError(inPlist, outPlist);
+					}
+				}
+			}
+		}
+		free(inPlist);
+		free(outPlist);
+	} else {
+		syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__);
+		rc = -1;
+	}
+	return(rc);
+}
+
+/**
+ * zvm_smapi_imageActivate
+ * @zvm: z/VM driver information
+ *
+ * Deactivates a virtual image
+ */
+int
+zvm_smapi_imageActivate(zvm_driver_t *zvm)
+{
+	struct _inPlist {
+		int32_t	lPlist;
+		int32_t	lFName;
+		char	fName[14];
+		int32_t lUser;
+		int32_t lPass;
+		int32_t	lTarget;
+		char	target[0];
+	} __attribute__ ((__packed__)) *inPlist;
+	int32_t	lInPlist;
+	struct	_outPlist {
+		smapiOutHeader_t hdr;
+		int32_t	nActive;
+		int32_t	nInActive;
+		int32_t	lFail;
+		char	failArray[0];
+	} *outPlist = NULL;
+	void	*pOut = NULL;
+	int32_t	lRsp;
+	uint32_t reqId;
+	int	rc;
+
+	/*
+	 * Implement any delay
+	 */ 
+	if (zvm->delay > 0) 
+		sleep(zvm->delay);
+
+	lInPlist = sizeof(*inPlist) + strlen(zvm->target);
+	inPlist = malloc(lInPlist);
+	if (inPlist != NULL) {
+		inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist);
+		inPlist->lFName = sizeof(inPlist->fName);
+		memcpy(inPlist->fName, Image_Activate, sizeof(inPlist->fName));
+		inPlist->lUser = inPlist->lPass = 0;
+		inPlist->lTarget = strlen(zvm->target);
+		memcpy(inPlist->target, zvm->target, inPlist->lTarget);
+		if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) {
+			if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) {
+				outPlist = pOut;
+				if (outPlist->hdr.rc == 0) {
+					syslog(LOG_INFO, "Activation of %s successful",
+					       zvm->target);
+					rc = 0;
+				} else {
+					if ((outPlist->hdr.rc == RCERR_IMAGEOP) &
+					    ((outPlist->hdr.reason == RS_NOT_ACTIVE) |
+					     (outPlist->hdr.reason == RS_BEING_DEACT))) {
+						syslog(LOG_INFO, "Activation of %s successful",
+						       zvm->target);
+						rc = 0;
+					} else {
+						rc = outPlist->hdr.rc;
+						zvm->reason = outPlist->hdr.reason;
+						(void) zvm_smapi_reportError(inPlist, outPlist);
+					}
+				}
+			}
+		}
+		free(inPlist);
+		free(outPlist);
+	} else {
+		syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__);
+		rc = -1;
+	}
+	return(rc);
+}
+
+/**
+ * zvm_smapi_imageQuery
+ * @zvm: z/VM driver information
+ *
+ * Queries the state of a virtual image
+ */
+int
+zvm_smapi_imageQuery(zvm_driver_t *zvm)
+{
+	struct _inPlist {
+		int32_t	lPlist;
+		int32_t	lFName;
+		char	fName[18];
+		int32_t lUser;
+		int32_t lPass;
+		int32_t	lTarget;
+		char	target[0];
+	} __attribute__ ((__packed__)) *inPlist;
+	int32_t	lInPlist;
+	struct	_outPlist {
+		smapiOutHeader_t hdr;
+		int32_t	lNames;
+		char	nameArray[0];
+	} *outPlist = NULL;
+	void	*pOut = NULL;
+	int32_t	lRsp;
+	uint32_t reqId;
+	int	rc;
+
+	/*
+	 * Implement any delay
+	 */ 
+	if (zvm->delay > 0) 
+		sleep(zvm->delay);
+
+	lInPlist = sizeof(*inPlist) + strlen(zvm->target);
+	inPlist = malloc(lInPlist);
+	if (inPlist != NULL) {
+		inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist);
+		inPlist->lFName = sizeof(inPlist->fName);
+		memcpy(inPlist->fName, Image_Status_Query, sizeof(inPlist->fName));
+		inPlist->lUser = inPlist->lPass = 0;
+		inPlist->lTarget = strlen(zvm->target);
+		memcpy(inPlist->target, zvm->target, inPlist->lTarget);
+		if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) {
+			if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) {
+				outPlist = pOut;
+				if (outPlist->hdr.rc == 0) {
+					if (outPlist->hdr.reason == 0) {
+						syslog(LOG_INFO, "Node %s is active",
+						       zvm->target);
+						rc = 0;
+					} else { 
+						syslog(LOG_INFO, "Node %s is inactive",
+						       zvm->target);
+						rc = 2;
+					}
+				} else {
+					rc = 1;
+					zvm->reason = outPlist->hdr.reason;
+					(void) zvm_smapi_reportError(inPlist, outPlist);
+				}
+			}
+		}
+		free(inPlist);
+		free(outPlist);
+	} else {
+		syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__);
+		rc = -1;
+	}
+	return(rc);
+}
+
+/**
  * zvm_smapi_send:
  * @zvm: z/VM driver information
  * @reqid: Returned request id
@@ -414,7 +648,9 @@ zvm_metadata()
 
 	fprintf (stdout, "<actions>\n");
 	fprintf (stdout, "\t<action name=\"off\" />\n");
+	fprintf (stdout, "\t<action name=\"on\" />\n");
 	fprintf (stdout, "\t<action name=\"metadata\" />\n");
+	fprintf (stdout, "\t<action name=\"status\" />\n");
 	fprintf (stdout, "</actions>\n");
 
 	fprintf (stdout, "</resource-agent>\n");
@@ -463,10 +699,14 @@ get_options_stdin (zvm_driver_t *zvm)
 		if (!strcasecmp (opt, "action")) {
 			if (strcasecmp(arg, "off") == 0) {
 				fence = 0;
-			} else if (strcasecmp(arg, "metadata") == 0) {
+			} else if (strcasecmp(arg, "on") == 0) {
 				fence = 1;
-			} else {
+			} else if (strcasecmp(arg, "metadata") == 0) {
 				fence = 2;
+			} else if (strcasecmp(arg, "status") == 0) {
+				fence = 3;
+			} else {
+				fence = 4;
 			}
 		} else if (!strcasecmp (opt, "ipaddr")) {
 			lSrvName = MIN(strlen(arg), sizeof(zvm->smapiSrv));
@@ -497,7 +737,7 @@ get_options_stdin (zvm_driver_t *zvm)
 				zvm->delay = DEFAULT_DELAY;
 			}
 		} else if (!strcasecmp (opt, "help")) {
-			fence = 2;
+			fence = 4;
 		}
 	}
 	return(fence);
@@ -529,10 +769,14 @@ get_options(int argc, char **argv, zvm_driver_t *zvm)
 		case 'o' :
 			if (strcasecmp(optarg, "off") == 0) {
 				fence = 0;
-			} else if (strcasecmp(optarg, "metadata") == 0) {
+			} else if (strcasecmp(optarg, "on") == 0) {
 				fence = 1;
-			} else {
+			} else if (strcasecmp(optarg, "metadata") == 0) {
 				fence = 2;
+			} else if (strcasecmp(optarg, "status") == 0) {
+				fence = 3;
+			} else {
+				fence = 4;
 			}
 			break;
 		case 'a' :
@@ -562,7 +806,7 @@ get_options(int argc, char **argv, zvm_driver_t *zvm)
 			memcpy(zvm->node, optarg, lSrvNode);
 			break;
 		default :
-			fence = 2;
+			fence = 4;
 		}
 	}
 	return(fence);
@@ -577,13 +821,13 @@ usage()
 {
 	fprintf(stderr,"Usage: fence_zvm [options]\n\n"
 		"\tWhere [options] =\n"
-		"\t-o --action [action]    - \"off\", \"metadata\"\n"
-		"\t--delay [seconds]       - Time to delay fencing action in seconds\n"
-		"\t-n --plug [target]      - Name of virtual machine to fence\n"
-		"\t-a --ip [server]        - Name of SMAPI IUCV Request server\n"
-		"\t-T --timeout [secs]     - Time to wait for fence in seconds - currently ignored\n"
-		"\t--zvmsys [node]         - z/VM Node on which SMAPI server lives\n"
-		"\t-h --help               - Display this usage information\n");
+		"\t-o --action [action] - \"off\", \"on\", \"metadata\", \"status\"\n"
+		"\t--delay [seconds]    - Time to delay fencing action in seconds\n"
+		"\t-n --plug [target]   - Name of virtual machine to fence\n"
+		"\t-a --ip [server]     - Name of SMAPI IUCV Request server\n"
+		"\t-T --timeout [secs]  - Time to wait for fence in seconds - currently ignored\n"
+		"\t--zvmsys [node]      - z/VM Node on which SMAPI server lives\n"
+		"\t-h --help            - Display this usage information\n");
 	return(1);
 }
 
@@ -629,14 +873,22 @@ main(int argc, char **argv)
 		fence = get_options_stdin(&zvm);
 
 	switch(fence) {
-		case 0 :
+		case 0 :	// OFF
+			if ((rc = check_parm(&zvm)) == 0)
+				rc = zvm_smapi_imageDeactivate(&zvm);
+			break;
+		case 1 :	// ON
 			if ((rc = check_parm(&zvm)) == 0)
-				rc = zvm_smapi_imageRecycle(&zvm);
+				rc = zvm_smapi_imageActivate(&zvm);
 			break;
-		case 1 :
+		case 2 :	// METADATA
 			rc = zvm_metadata();
 			break;
-		case 2 :
+		case 3 :	// STATUS
+			if ((rc = check_parm(&zvm)) == 0)
+				rc = zvm_smapi_imageQuery(&zvm);
+			break;
+		case 4 :
 			rc = usage();
 	}
 	closelog();
diff --git a/fence/agents/zvm/fence_zvm.h b/fence/agents/zvm/fence_zvm.h
index 6178fa5..ca18e4d 100644
--- a/fence/agents/zvm/fence_zvm.h
+++ b/fence/agents/zvm/fence_zvm.h
@@ -578,5 +578,6 @@ int zvm_smapi_imageActivate(zvm_driver_t *);
 int zvm_smapi_imageActiveQuery(zvm_driver_t *);
 int zvm_smapi_imageDeactivate(zvm_driver_t *);
 int zvm_smapi_imageRecycle(zvm_driver_t *);
+int zvm_smapi_imageQuery(zvm_driver_t *);
 
 #endif /* FENCE_ZVM_H */
diff --git a/fence/agents/zvm/fence_zvmip.8 b/fence/agents/zvm/fence_zvmip.8
index 0bf91ae..8217d61 100644
--- a/fence/agents/zvm/fence_zvmip.8
+++ b/fence/agents/zvm/fence_zvmip.8
@@ -22,7 +22,7 @@ Vendor URL: http://www.sinenomine.net
 .SH OPTIONS
 .TP
 \fB-o --action\fP
-Fencing action: "off" - fence off device; "metadata" - display device metadata
+Fencing action: "off" - deactivate virtual machine; "on" - activate virtual machine; "metadata" - display device metadata" - describe fence agent parameters; "status" - state of virtual machine
 .TP
 \fB--delay\fP \fIseconds\fP
 Time to delay fencing action in seconds
@@ -54,6 +54,9 @@ Display usage information
 \fIagent = < param >\fP
 This option is used by fence_node(8) and is ignored by fence_zvmip.
 .TP
+\fIaction = < action >\fP
+Fencing action: "off" - fence off device; "metadata" - display device metadata; "status" - state of device
+.TP
 \fIplug = < plug >\fP
 Name of virtual machine to recycle.
 .TP
diff --git a/fence/agents/zvm/fence_zvmip.c b/fence/agents/zvm/fence_zvmip.c
index f4dcd1c..94c9e2e 100644
--- a/fence/agents/zvm/fence_zvmip.c
+++ b/fence/agents/zvm/fence_zvmip.c
@@ -201,6 +201,277 @@ zvm_smapi_imageRecycle(zvm_driver_t *zvm)
 }
 
 /**
+ * zvm_smapi_imageDeactivate
+ * @zvm: z/VM driver information
+ *
+ * Deactivates a virtual image
+ */
+int
+zvm_smapi_imageDeactivate(zvm_driver_t *zvm)
+{
+	struct _inPlist {
+		int32_t	lPlist;
+		int32_t	lFName;
+		char	fName[16];
+	} __attribute__ ((packed)) *inPlist;
+	struct _authUser {
+		int32_t  lAuthUser;
+		char	 userId[0];
+	} __attribute__ ((packed)) *authUser;
+	struct _authPass {
+		int32_t  lAuthPass;
+		char	 password[0];
+	} __attribute__ ((packed)) *authPass;
+	struct _image {
+		int32_t	lTarget;
+		char    target[0];
+	} __attribute__ ((packed)) *image;
+	struct _deactTime {
+		int32_t lForceTime;
+		char	forceTime[5];
+	} __attribute__ ((__packed__)) *deactTime;
+	int32_t	lInPlist;
+	struct	_outPlist {
+		smapiOutHeader_t hdr;
+		int32_t	nActive;
+		int32_t	nInActive;
+		int32_t	lFail;
+		char	failArray[0];
+	} *outPlist = NULL;
+	void	*pOut = NULL;
+	int32_t	lRsp;
+	uint32_t reqId;
+	int	rc;
+
+	/*
+	 * Implement any delay
+	 */ 
+	if (zvm->delay > 0) 
+		sleep(zvm->delay);
+
+	lInPlist = sizeof(*inPlist) + sizeof(*authUser) + strlen(zvm->authUser) +
+		   sizeof(*authPass) + strlen(zvm->authPass) + sizeof(*image) + 
+		   sizeof(*deactTime) + strlen(zvm->target);
+	inPlist = malloc(lInPlist);
+	if (inPlist != NULL) {
+		authUser =  (void *) ((uintptr_t) inPlist + sizeof(*inPlist));
+		authPass =  (void *) ((uintptr_t) authUser + sizeof(*authUser) +
+			    strlen(zvm->authUser));
+		image    =  (void *) ((uintptr_t) authPass + sizeof(*authPass) + 
+			    strlen(zvm->authPass));
+		deactTime = (void *) ((intptr_t) image + sizeof(*image) + 
+			    strlen(zvm->target));
+		inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist);
+		inPlist->lFName = sizeof(inPlist->fName);
+		memcpy(inPlist->fName, Image_Deactivate, sizeof(inPlist->fName));
+		authUser->lAuthUser = strlen(zvm->authUser);
+		memcpy(authUser->userId, zvm->authUser, strlen(zvm->authUser));
+		authPass->lAuthPass = strlen(zvm->authPass);
+		memcpy(authPass->password, zvm->authPass, strlen(zvm->authPass));
+		image->lTarget = strlen(zvm->target);
+		memcpy(image->target, zvm->target, strlen(zvm->target));
+		deactTime->lForceTime = sizeof(deactTime->forceTime);
+		memcpy(deactTime->forceTime, "IMMED", sizeof(deactTime->forceTime));
+		if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) {
+			if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) {
+				outPlist = pOut;
+				if (outPlist->hdr.rc == 0) {
+					syslog(LOG_INFO, "Deactivation of %s successful",
+					       zvm->target);
+					rc = 0;
+				} else {
+					if ((outPlist->hdr.rc == RCERR_IMAGEOP) &
+					    ((outPlist->hdr.reason == RS_NOT_ACTIVE) |
+					     (outPlist->hdr.reason == RS_BEING_DEACT))) {
+						syslog(LOG_INFO, "Deactivation of %s successful",
+						       zvm->target);
+						rc = 0;
+					} else {
+						rc = outPlist->hdr.rc;
+						zvm->reason = outPlist->hdr.reason;
+						(void) zvm_smapi_reportError(inPlist, outPlist);
+					}
+				}
+			}
+		}
+		free(inPlist);
+		free(outPlist);
+	} else {
+		syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__);
+		rc = -1;
+	}
+	return(rc);
+}
+
+/**
+ * zvm_smapi_imageActivate
+ * @zvm: z/VM driver information
+ *
+ * Deactivates a virtual image
+ */
+int
+zvm_smapi_imageActivate(zvm_driver_t *zvm)
+{
+	struct _inPlist {
+		int32_t	lPlist;
+		int32_t	lFName;
+		char	fName[14];
+	} __attribute__ ((packed)) *inPlist;
+	struct _authUser {
+		int32_t  lAuthUser;
+		char	 userId[0];
+	} __attribute__ ((packed)) *authUser;
+	struct _authPass {
+		int32_t  lAuthPass;
+		char	 password[0];
+	} __attribute__ ((packed)) *authPass;
+	struct _image {
+		int32_t	lTarget;
+		char    target[0];
+	} __attribute__ ((packed)) *image;
+	int32_t	lInPlist;
+	struct	_outPlist {
+		smapiOutHeader_t hdr;
+		int32_t	nActive;
+		int32_t	nInActive;
+		int32_t	lFail;
+		char	failArray[0];
+	} *outPlist = NULL;
+	void	*pOut = NULL;
+	int32_t	lRsp;
+	uint32_t reqId;
+	int	rc;
+
+	/*
+	 * Implement any delay
+	 */ 
+	if (zvm->delay > 0) 
+		sleep(zvm->delay);
+
+	lInPlist = sizeof(*inPlist) + sizeof(*authUser) + strlen(zvm->authUser) +
+		   sizeof(*authPass) + strlen(zvm->authPass) + sizeof(*image) + 
+		   strlen(zvm->target);
+	inPlist = malloc(lInPlist);
+	if (inPlist != NULL) {
+		authUser = (void *) ((uintptr_t) inPlist + sizeof(*inPlist));
+		authPass = (void *) ((uintptr_t) authUser + sizeof(*authUser) +
+			   strlen(zvm->authUser));
+		image    = (void *) ((uintptr_t) authPass + sizeof(*authPass) + 
+			   strlen(zvm->authPass));
+		inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist);
+		inPlist->lFName = sizeof(inPlist->fName);
+		memcpy(inPlist->fName, Image_Activate, sizeof(inPlist->fName));
+		authUser->lAuthUser = strlen(zvm->authUser);
+		memcpy(authUser->userId, zvm->authUser, strlen(zvm->authUser));
+		authPass->lAuthPass = strlen(zvm->authPass);
+		memcpy(authPass->password, zvm->authPass, strlen(zvm->authPass));
+		image->lTarget = strlen(zvm->target);
+		memcpy(image->target, zvm->target, strlen(zvm->target));
+		if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) {
+			if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) {
+				outPlist = pOut;
+				if (outPlist->hdr.rc == 0) {
+					syslog(LOG_INFO, "Activation of %s successful",
+					       zvm->target);
+					rc = 0;
+				} else {
+					if ((outPlist->hdr.rc == RCERR_IMAGEOP) &
+					    ((outPlist->hdr.reason == RS_NOT_ACTIVE) |
+					     (outPlist->hdr.reason == RS_BEING_DEACT))) {
+						syslog(LOG_INFO, "Activation of %s successful",
+						       zvm->target);
+						rc = 0;
+					} else {
+						rc = outPlist->hdr.rc;
+						zvm->reason = outPlist->hdr.reason;
+						(void) zvm_smapi_reportError(inPlist, outPlist);
+					}
+				}
+			}
+		}
+		free(inPlist);
+		free(outPlist);
+	} else {
+		syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__);
+		rc = -1;
+	}
+	return(rc);
+}
+
+/**
+ * zvm_smapi_imageQuery
+ * @zvm: z/VM driver information
+ *
+ * Queries the state of a virtual image
+ */
+int
+zvm_smapi_imageQuery(zvm_driver_t *zvm)
+{
+	struct _inPlist {
+		int32_t	lPlist;
+		int32_t	lFName;
+		char	fName[18];
+		int32_t lUser;
+		int32_t lPass;
+		int32_t	lTarget;
+		char	target[0];
+	} __attribute__ ((__packed__)) *inPlist;
+	int32_t	lInPlist;
+	struct	_outPlist {
+		smapiOutHeader_t hdr;
+		int32_t	lNames;
+		char	nameArray[0];
+	} *outPlist = NULL;
+	void	*pOut = NULL;
+	int32_t	lRsp;
+	uint32_t reqId;
+	int	rc;
+
+	/*
+	 * Implement any delay
+	 */ 
+	if (zvm->delay > 0) 
+		sleep(zvm->delay);
+
+	lInPlist = sizeof(*inPlist) + strlen(zvm->target);
+	inPlist = malloc(lInPlist);
+	if (inPlist != NULL) {
+		inPlist->lPlist = lInPlist - sizeof(inPlist->lPlist);
+		inPlist->lFName = sizeof(inPlist->fName);
+		memcpy(inPlist->fName, Image_Status_Query, sizeof(inPlist->fName));
+		inPlist->lUser = inPlist->lPass = 0;
+		inPlist->lTarget = strlen(zvm->target);
+		memcpy(inPlist->target, zvm->target, inPlist->lTarget);
+		if ((rc = zvm_smapi_send(zvm, inPlist, &reqId, lInPlist)) != -1) {
+			if ((rc = zvm_smapi_recv(zvm, &pOut, &lRsp)) != -1) {
+				outPlist = pOut;
+				if (outPlist->hdr.rc == 0) {
+					if (outPlist->hdr.reason == 0) {
+						syslog(LOG_INFO, "Node %s is active",
+						       zvm->target);
+						rc = 0;
+					} else { 
+						syslog(LOG_INFO, "Node %s is inactive",
+						       zvm->target);
+						rc = 2;
+					}
+				} else {
+					rc = 1;
+					zvm->reason = outPlist->hdr.reason;
+					(void) zvm_smapi_reportError(inPlist, outPlist);
+				}
+			}
+		}
+		free(inPlist);
+		free(outPlist);
+	} else {
+		syslog(LOG_ERR, "%s - cannot allocate parameter list", __func__);
+		rc = -1;
+	}
+	return(rc);
+}
+
+/**
  * zvm_smapi_send:
  * @zvm: z/VM driver information
  * @reqid: Returned request id
@@ -407,10 +678,14 @@ get_options_stdin (zvm_driver_t *zvm)
 		if (!strcasecmp (opt, "action")) {
 			if (strcasecmp(arg, "off") == 0) {
 				fence = 0;
-			} else if (strcasecmp(arg, "metadata") == 0) {
+			} else if (strcasecmp(arg, "on") == 0) {
 				fence = 1;
-			} else {
+			} else if (strcasecmp(arg, "metadata") == 0) {
 				fence = 2;
+			} else if (strcasecmp(arg, "status") == 0) {
+				fence = 3;
+			} else {
+				fence = 4;
 			}
 		} else if (!strcasecmp (opt, "ipaddr")) {
 			lSrvName = MIN(strlen(arg), sizeof(zvm->smapiSrv)-1);
@@ -472,10 +747,14 @@ get_options(int argc, char **argv, zvm_driver_t *zvm)
 		case 'o' :
 			if (strcasecmp(optarg, "off") == 0) {
 				fence = 0;
-			} else if (strcasecmp(optarg, "metadata") == 0) {
+			} else if (strcasecmp(optarg, "on") == 0) {
 				fence = 1;
-			} else {
+			} else if (strcasecmp(optarg, "metadata") == 0) {
 				fence = 2;
+			} else if (strcasecmp(optarg, "status") == 0) {
+				fence = 3;
+			} else {
+				fence = 4;
 			}
 			break;
 		case 'p' :
@@ -505,7 +784,7 @@ get_options(int argc, char **argv, zvm_driver_t *zvm)
 			}
 			break;
 		default :
-			fence = 2;
+			fence = 4;
 		}
 	}
 	return(fence);
@@ -581,7 +860,9 @@ zvm_metadata()
 
 	fprintf (stdout, "<actions>\n");
 	fprintf (stdout, "\t<action name=\"off\" />\n");
+	fprintf (stdout, "\t<action name=\"on\" />\n");
 	fprintf (stdout, "\t<action name=\"metadata\" />\n");
+	fprintf (stdout, "\t<action name=\"status\" />\n");
 	fprintf (stdout, "</actions>\n");
 
 	fprintf (stdout, "</resource-agent>\n");
@@ -599,7 +880,7 @@ usage()
 {
 	fprintf(stderr,"Usage: fence_zvmip [options]\n\n"
 		"\tWhere [options] =\n"
-		"\t-o --action [action] - \"off\", \"metadata\"\n"
+		"\t-o --action [action] - \"off\", \"on\", \"metadata\", \"status\"\n"
 		"\t--delay [seconds]    - Time to delay fencing action in seconds\n"
 		"\t-n --plug [target]   - Name of virtual machine to fence\n"
 		"\t-a --ip [server]     - IP Name/Address of SMAPI Server\n"
@@ -662,14 +943,22 @@ main(int argc, char **argv)
 		fence = get_options_stdin(&zvm);
 
 	switch(fence) {
-		case 0 :
+		case 0 :	// OFF
+			if ((rc = check_parm(&zvm)) == 0)
+				rc = zvm_smapi_imageDeactivate(&zvm);
+			break;
+		case 1 :	// ON
 			if ((rc = check_parm(&zvm)) == 0)
-				rc = zvm_smapi_imageRecycle(&zvm);
+				rc = zvm_smapi_imageActivate(&zvm);
 			break;
-		case 1 :
+		case 2 :	// METADATA
 			rc = zvm_metadata();
 			break;
-		case 2 :
+		case 3 :	// STATUS
+			if ((rc = check_parm(&zvm)) == 0)
+				rc = zvm_smapi_imageQuery(&zvm);
+			break;
+		case 4 :
 			rc = usage();
 	}
 	closelog();


More information about the cluster-commits mailing list