greedy notification client
authorAleš Křenek <ljocha@ics.muni.cz>
Wed, 20 Oct 2004 13:21:15 +0000 (13:21 +0000)
committerAleš Křenek <ljocha@ics.muni.cz>
Wed, 20 Oct 2004 13:21:15 +0000 (13:21 +0000)
org.glite.lb.client/Makefile
org.glite.lb.client/examples/feed_shark.c [new file with mode: 0644]

index 7d76562..1d849f3 100644 (file)
@@ -19,7 +19,7 @@ ares_prefix=/opt/ares
 
 -include Makefile.inc
 
-VPATH=${top_srcdir}/src:${top_srcdir}/test
+VPATH=${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/examples
 AT3=perl -I${top_srcdir}/project ${top_srcdir}/project/at3
 
 SUFFIXES = .T 
@@ -91,6 +91,7 @@ PLUSLIB:=libglite_lb_clientpp_${nothrflavour}.la
 THRPLUSLIB:=libglite_lb_clientpp_${thrflavour}.la
 
 TOOLS:=dump load purge
+EXAMPLES:=feed_shark
 
 ${LIB}: ${LIBOBJS}
        ${LINK} -o $@ ${LIBLOBJS} -rpath ${glite_location}/lib -lglite_lb_common_${nothrflavour}
@@ -107,7 +108,7 @@ ${THRPLUSLIB}: ${PLUSTHROBJS}
 logevent: logevent.o args.o
        ${LINK} -o $@ logevent.o args.o ${LIB} ${EXT_LIB} ${GLOBUS_LIBS}
 
-${TOOLS}: %: %.o
+${TOOLS} ${EXAMPLES}: %: %.o
        ${LINK} -o $@ $< ${LIB} ${EXT_LIB} ${GLOBUS_LIBS}
 
 ${TOOLS}: ${LIB}
@@ -140,7 +141,7 @@ ${LIBTHROBJS}: %.thr.o: %.c
 
 default: all
 
-compile all: ${LIB} ${THRLIB} ${TOOLS} logevent ${PLUSLIB} ${THRPLUSLIB}
+compile all: ${LIB} ${THRLIB} ${TOOLS} logevent ${EXAMPLES} ${PLUSLIB} ${THRPLUSLIB}
 
 check: compile check.producer
 
diff --git a/org.glite.lb.client/examples/feed_shark.c b/org.glite.lb.client/examples/feed_shark.c
new file mode 100644 (file)
index 0000000..759ee95
--- /dev/null
@@ -0,0 +1,194 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <assert.h>
+#include <errno.h>
+#include <sysexits.h>
+
+#include "glite/lb/notification.h"
+
+static void usage(const char *);
+static void printstat(edg_wll_JobStat, int);
+
+int main(int argc,char *argv[])
+{
+       int     o;
+       edg_wll_Context ctx;
+       edg_wll_NotifId notif;
+       time_t  valid = 0;
+       struct timeval  timeout;
+
+       edg_wll_InitContext(&ctx);
+
+/* parse options, reflect them in the LB context */
+       while ((o = getopt(argc,argv,"s:")) >= 0) switch (o) {
+               case 's': {
+                       char    *server = strdup(optarg),
+                               *port_s = strchr(server,':');
+
+                       int     port;
+
+                       if (port_s) {
+                               *port_s = 0;
+                               port = atoi(port_s+1);
+                       }
+                       
+                       edg_wll_SetParam(ctx,EDG_WLL_PARAM_NOTIF_SERVER,server);
+                       if (port_s) edg_wll_SetParam(ctx,EDG_WLL_PARAM_NOTIF_SERVER_PORT,port);
+                       free(server);
+               } break;
+                         
+               case '?': usage(argv[0]); exit(EX_USAGE);
+       }
+
+/* no notification Id supplied -- create a new one */
+       if (argc == optind) {
+               edg_wll_QueryRec        const *empty[] = { NULL };
+               char    *notif_s;
+
+               if (edg_wll_NotifNew(ctx,empty,-1,NULL,&notif,&valid)) {
+                       char    *et,*ed;
+
+                       edg_wll_Error(ctx,&et,&ed);
+                       fprintf(stderr,"edg_wll_NotifNew(): %s (%s)\n",et,ed);
+                       exit(EX_UNAVAILABLE);
+               }
+
+               notif_s = edg_wll_NotifIdUnparse(notif);
+               printf("notification registered:\n\tId: %s\n\tExpires: %s",
+                               notif_s,ctime(&valid));
+               free(notif_s);
+       }
+/* notification Id supplied -- bind to it */
+       else if (argc == optind + 1) {
+               if (edg_wll_NotifIdParse(argv[optind],&notif)) {
+                       fprintf(stderr,"%s: invalid notification Id\n",
+                                       argv[optind]);
+                       exit(EX_DATAERR);
+               }
+
+               if (edg_wll_NotifBind(ctx,notif,-1,NULL,&valid)) {
+                       char    *et,*ed;
+
+                       edg_wll_Error(ctx,&et,&ed);
+                       fprintf(stderr,"edg_wll_NotifBind(): %s (%s)\n",et,ed);
+                       exit(EX_UNAVAILABLE);
+               }
+       }
+       else { usage(argv[0]); exit(EX_USAGE); }
+
+/* main loop */
+       while (1) {
+               edg_wll_JobStat stat;
+               char    *et,*ed;
+
+/* calculate time left for this notification */
+               gettimeofday(&timeout,NULL);
+               timeout.tv_sec = valid - timeout.tv_sec;
+               assert(timeout.tv_sec >= 0);    /* XXX: hope we are no late */
+
+/* half time before notification renewal */
+               timeout.tv_sec /= 2;
+
+               switch (edg_wll_NotifReceive(ctx,-1,&timeout,&stat,NULL)) {
+                       case 0: /* OK, got it */
+                               printstat(stat,0);
+                               edg_wll_FreeStatus(&stat);
+                               break;
+                       case EAGAIN:    /* timeout */
+                               if (edg_wll_NotifRefresh(ctx,notif,&valid)) {
+                                       edg_wll_Error(ctx,&et,&ed);
+                                       fprintf(stderr,"edg_wll_NotifRefresh(): %s (%s)\n",et,ed);
+                                       exit(EX_UNAVAILABLE);
+                               }
+                               printf("Notification refreshed, expires %s",ctime(&valid));
+                               break;
+                       default:
+                               edg_wll_Error(ctx,&et,&ed);
+                               fprintf(stderr,"edg_wll_NotifReceive(): %s (%s)\n",et,ed);
+                               exit(EX_UNAVAILABLE);
+               }
+       }
+}
+
+
+static void usage(const char *me) 
+{
+       fprintf(stderr,"usage: %s [ -s server[:port] ] [notif_id]\n",me);
+}
+
+
+
+static void printstat(edg_wll_JobStat stat, int level)
+{
+    char        *s, *j, ind[10];
+    int         i;
+
+
+    for (i=0; i < level; i++)
+        ind[i]='\t';
+    ind[i]='\0';
+
+    s = edg_wll_StatToString(stat.state);
+/* print whole flat structure */
+    printf("%sstate : %s\n", ind, s);
+    printf("%sjobId : %s\n", ind, j = edg_wlc_JobIdUnparse(stat.jobId));
+    printf("%sowner : %s\n", ind, stat.owner);
+    printf("%sjobtype : %s\n", ind, (stat.jobtype ? "DAG" : "SIMPLE") );
+    printf("%sparent_job : %s\n", ind,
+            j = edg_wlc_JobIdUnparse(stat.parent_job));
+    if (stat.jobtype) {;
+        printf("%sseed : %s\n", ind, stat.seed);
+        printf("%schildren_num : %d\n", ind, stat.children_num);
+        printf("%schildren :\n", ind);
+        if (stat.children)
+                       for  (i=0; stat.children[i]; i++)
+                printf("%s\tchildren : %s\n", ind, stat.children[i]);
+        printf("%schildren_states :\n", ind);
+        if (stat.children_states)
+            for  (i=0; stat.children_states[i].state; i++)
+                printstat(stat.children_states[i], level+1);
+        printf("%schildren_hist :\n",ind);
+        if (stat.children_hist)
+            for (i=1; i<=stat.children_hist[0]; i++)
+                printf("%s%14s  %d\n", ind, edg_wll_StatToString(i-1),stat.children_hist[i]);
+    }
+    printf("%scondorId : %s\n", ind, stat.condorId);
+    printf("%sglobusId : %s\n", ind, stat.globusId);
+    printf("%slocalId : %s\n", ind, stat.localId);
+    printf("%sjdl : %s\n", ind, stat.jdl);
+    printf("%smatched_jdl : %s\n", ind, stat.matched_jdl);
+    printf("%sdestination : %s\n", ind, stat.destination);
+    printf("%snetwork server : %s\n", ind, stat.network_server);
+    printf("%scondor_jdl : %s\n", ind, stat.condor_jdl);
+    printf("%srsl : %s\n", ind, stat.rsl);
+    printf("%sreason : %s\n", ind, stat.reason);
+    printf("%slocation : %s\n", ind, stat.location);
+       printf("%ssubjob_failed : %d\n", ind, stat.subjob_failed);
+    printf("%sdone_code : %d\n", ind, stat.done_code);
+    printf("%sexit_code : %d\n", ind, stat.exit_code);
+    printf("%sresubmitted : %d\n", ind, stat.resubmitted);
+    printf("%scancelling : %d\n", ind, stat.cancelling);
+    printf("%scancelReason : %s\n", ind, stat.cancelReason);
+    printf("%scpuTime : %d\n", ind, stat.cpuTime);
+    printf("%suser_tags :\n",ind);
+    if (stat.user_tags)
+        for (i=0; stat.user_tags[i].tag; i++) printf("%s%14s = \"%s\"\n", ind,
+                              stat.user_tags[i].tag,stat.user_tags[i].value);
+    printf("%sstateEnterTime : %ld.%06ld\n", ind, stat.stateEnterTime.tv_sec,stat.stateEnterTime.tv_usec);
+    printf("%sstateEnterTimes : \n",ind);
+    if (stat.stateEnterTimes)
+                for (i=1; i<=stat.stateEnterTimes[0]; i++)
+            printf("%s%14s  %s", ind, edg_wll_StatToString(i-1), (stat.stateEnterTimes[i] == 0) ?
+            "    - not available -\n" : ctime((time_t *) &stat.stateEnterTimes[i]));
+    printf("%slastUpdateTime : %ld.%06ld\n", ind, stat.lastUpdateTime.tv_sec,stat.lastUpdateTime.tv_usec);
+       printf("%sexpectUpdate : %d\n", ind, stat.expectUpdate);
+    printf("%sexpectFrom : %s\n", ind, stat.expectFrom);
+    printf("%sacl : %s\n", ind, stat.acl);
+    printf("\n");
+
+    free(j);
+    free(s);
+}