Added support for job_type query attribute (query for jobs by type)
authorZdeněk Šustr <sustr4@cesnet.cz>
Wed, 8 Aug 2012 15:48:40 +0000 (15:48 +0000)
committerZdeněk Šustr <sustr4@cesnet.cz>
Wed, 8 Aug 2012 15:48:40 +0000 (15:48 +0000)
13 files changed:
org.glite.lb.client/examples/job_status.c
org.glite.lb.client/examples/query_ext.c
org.glite.lb.common/interface/query_rec.h
org.glite.lb.common/src/query_rec.c
org.glite.lb.common/src/xml_conversions.c
org.glite.lb.common/src/xml_parse.c.T
org.glite.lb.server/src/cond_dump.c
org.glite.lb.server/src/lb_proto.c
org.glite.lb.server/src/lb_xml_parse.c.T
org.glite.lb.server/src/query.c
org.glite.lb.server/src/ws_typemap.h
org.glite.lb.server/src/ws_typeref.c.T
org.glite.lb.ws-interface/src/LBTypes.xml.T

index b5c3356..16d4d45 100644 (file)
@@ -31,6 +31,7 @@ limitations under the License.
 #endif
 #include "glite/lb/xml_conversions.h"
 #include "glite/lb/jobstat.h"
+#include "glite/lb/events_parse.h"
 
 static void dgerr(edg_wll_Context,char *);
 static void printstat(edg_wll_JobStat,int);
index 0ee7679..afc67f1 100644 (file)
@@ -434,6 +434,7 @@ static char *get_job_condition(char *src, edg_wll_QueryRec *cond)
        else if ( !strcmp(tmps, "state_enter_time") ) cond->attr = EDG_WLL_QUERY_ATTR_STATEENTERTIME;
        else if ( !strcmp(tmps, "last_update_time") ) cond->attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME;
        else if ( !strcmp(tmps, "jdl_attr") ) cond->attr = EDG_WLL_QUERY_ATTR_JDL_ATTR;
+       else if ( !strcmp(tmps, "job_type") ) cond->attr = EDG_WLL_QUERY_ATTR_JOB_TYPE;
 
 
        /**< When entered current status */
@@ -489,17 +490,7 @@ static char *get_job_condition(char *src, edg_wll_QueryRec *cond)
                break;
 
        case EDG_WLL_QUERY_ATTR_STATUS:
-               if ( !strcasecmp(tmps, "Submitted") ) cond->value.i = EDG_WLL_JOB_SUBMITTED;
-               else if ( !strcasecmp(tmps, "Waiting") ) cond->value.i = EDG_WLL_JOB_WAITING;
-               else if ( !strcasecmp(tmps, "Ready") ) cond->value.i = EDG_WLL_JOB_READY;
-               else if ( !strcasecmp(tmps, "Scheduled") ) cond->value.i = EDG_WLL_JOB_SCHEDULED;
-               else if ( !strcasecmp(tmps, "Running") ) cond->value.i = EDG_WLL_JOB_RUNNING;
-               else if ( !strcasecmp(tmps, "Done") ) cond->value.i = EDG_WLL_JOB_DONE;
-               else if ( !strcasecmp(tmps, "Aborted") ) cond->value.i = EDG_WLL_JOB_ABORTED;
-               else if ( !strcasecmp(tmps, "Cancelled") ) cond->value.i = EDG_WLL_JOB_CANCELLED;
-               else if ( !strcasecmp(tmps, "Cleared") ) cond->value.i = EDG_WLL_JOB_CLEARED;
-               else
-               {
+               if ( 0 > (cond->value.i = edg_wll_StringToStat(tmps))) {
                        fprintf(stderr,"%s: invalid status value (%s)\n", myname, tmps);
                        return 0;
                }
@@ -538,17 +529,7 @@ static char *get_job_condition(char *src, edg_wll_QueryRec *cond)
                        fprintf(stderr,"%s: time condition must be associated with state condition\n", myname);
                        return NULL;
                }
-               if ( !strcasecmp(tmps, "Submitted") ) cond->attr_id.state = EDG_WLL_JOB_SUBMITTED;
-               else if ( !strcasecmp(tmps, "Waiting") ) cond->attr_id.state = EDG_WLL_JOB_WAITING;
-               else if ( !strcasecmp(tmps, "Ready") ) cond->attr_id.state = EDG_WLL_JOB_READY;
-               else if ( !strcasecmp(tmps, "Scheduled") ) cond->attr_id.state = EDG_WLL_JOB_SCHEDULED;
-               else if ( !strcasecmp(tmps, "Running") ) cond->attr_id.state = EDG_WLL_JOB_RUNNING;
-               else if ( !strcasecmp(tmps, "Done") ) cond->attr_id.state = EDG_WLL_JOB_DONE;
-               else if ( !strcasecmp(tmps, "Aborted") ) cond->attr_id.state = EDG_WLL_JOB_ABORTED;
-               else if ( !strcasecmp(tmps, "Cancelled") ) cond->attr_id.state = EDG_WLL_JOB_CANCELLED;
-               else if ( !strcasecmp(tmps, "Cleared") ) cond->attr_id.state = EDG_WLL_JOB_CLEARED;
-               else
-               {
+               if ( 0 > (cond->value.i = edg_wll_StringToStat(tmps))) {
                        fprintf(stderr,"%s: invalid status value (%s)\n", myname, tmps);
                        return 0;
                }
@@ -568,6 +549,12 @@ static char *get_job_condition(char *src, edg_wll_QueryRec *cond)
                        cond->value2.t.tv_sec = StrToTime(tmps);
                }
                break;
+       case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+               if ( 0 > (cond->value.i = edg_wll_JobtypeStrToCode(tmps))) {
+                       fprintf(stderr,"%s: invalid job type (%s)\n", myname, tmps);
+                       return 0;
+               }
+               break;
 
        default:
                break;
@@ -808,6 +795,7 @@ static void printconds(edg_wll_QueryRec **cond)
                        case EDG_WLL_QUERY_ATTR_SOURCE: printf("source"); break;
                        case EDG_WLL_QUERY_ATTR_INSTANCE: printf("instance"); break;
                        case EDG_WLL_QUERY_ATTR_EVENT_TYPE: printf("ev_type"); break;
+                       case EDG_WLL_QUERY_ATTR_JOB_TYPE: printf("job_type"); break;
                        default: break;
                        }
                        switch ( cond[i][j].op )
index a7c78f3..1941916 100644 (file)
@@ -68,12 +68,13 @@ typedef enum _edg_wll_QueryAttr{
        EDG_WLL_QUERY_ATTR_EVENT_TYPE,  /**< Event type \see _edg_wll_QueryRec */
        EDG_WLL_QUERY_ATTR_CHKPT_TAG,   /**< Checkpoint tag */
        EDG_WLL_QUERY_ATTR_RESUBMITTED, /**< Job was resubmitted */
-       EDG_WLL_QUERY_ATTR_PARENT,      /**< Job was resubmitted */
+       EDG_WLL_QUERY_ATTR_PARENT,      /**< Parent Job ID */
        EDG_WLL_QUERY_ATTR_EXITCODE,    /**< Unix exit code */
        EDG_WLL_QUERY_ATTR_JDL_ATTR,    /**< Arbitrary JDL attribute */
        EDG_WLL_QUERY_ATTR_STATEENTERTIME,      /**< When entered current status */
        EDG_WLL_QUERY_ATTR_LASTUPDATETIME,      /**< Time of the last known event of the job */
        EDG_WLL_QUERY_ATTR_NETWORK_SERVER,      /**< Network server aka RB aka WMproxy endpoint */
+       EDG_WLL_QUERY_ATTR_JOB_TYPE,    /**< Event type \see _edg_wll_QueryRec */
        EDG_WLL_QUERY_ATTR__LAST
 /*     if adding new attribute, add conversion string to common/xml_conversions.c too !! */
 } edg_wll_QueryAttr;
index 224ebfb..799ed48 100644 (file)
@@ -35,7 +35,7 @@ char     *edg_wll_QueryAttrNames[] = {    "undef", "jobid","owner","status","loc
                                 "donecode","usertag","time","level","host","source",
                                 "instance","type","chkpt_tag", "resubmitted", "parent_job",
                                 "exitcode", "jdl", "stateentertime", "lastupdatetime",
-                                "networkserver"  };
+                                "networkserver", "jobtype"  };
 
 /**
  * Names for the predefined types of query operands
@@ -78,6 +78,7 @@ void edg_wll_QueryRecFree(edg_wll_QueryRec *prec)
                case EDG_WLL_QUERY_ATTR_TIME:
                case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
                case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
+               case EDG_WLL_QUERY_ATTR_JOB_TYPE:
                        /* do nothing */
                        break;
                default:
index fec92e6..45c7498 100644 (file)
@@ -638,6 +638,22 @@ edg_wll_JobStatCode edg_wll_from_string_to_edg_wll_JobStatCode(edg_wll_XML_ctx *
 
 
 
+enum edg_wll_StatJobtype edg_wll_from_string_to_edg_wll_StatJobtype(edg_wll_XML_ctx *XMLCtx)
+{
+        enum edg_wll_StatJobtype out = -1;
+        char *s;
+
+        s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
+        if (s) {
+           out = edg_wll_JobtypeStrToCode(s);
+           free(s);
+        }
+        edg_wll_freeBuf(XMLCtx); 
+
+        return(out);
+}
+
+
 
 /* XMLCtx->eventsOutGlobal[XMLCtx->position].jobClear.clearReason = 
        edg_wll_from_string_to_int(XMLCtx);                             */
@@ -976,6 +992,7 @@ static const char * const query_attrConsts[] = {
        "EDG_WLL_QUERY_ATTR_JDL_ATTR",
        "EDG_WLL_QUERY_ATTR_STATEENTERTIME",
        "EDG_WLL_QUERY_ATTR_LASTUPDATETIME",
+        "EDG_WLL_QUERY_ATTR_JOB_TYPE",
         "EDG_WLL_QUERY_ATTR__LAST",
 };
 
index d8554b7..1fbffe5 100644 (file)
@@ -2656,7 +2656,8 @@ int edg_wll_JobQueryRecToXML(
                                                        edg_wll_add_time_t_to_XMLBody(&pomValue, conditions[row][i].value.t.tv_sec, "lastupdatetime", -1);
                                                break;
                                        case EDG_WLL_QUERY_ATTR_JOB_TYPE:
-                                               edg_wll_add_int_to_XMLBody(&pomValue, conditions[row][i].value.i, "jobtype", -1);
+                                               edg_wll_add_string_to_XMLBody(&pomValue, edg_wll_StatusJobtypeNames[conditions[row][i].value.i],
+                                                        "jobtype", NULL);
                                                break;
 
                                default:
index 0a40349..0161607 100644 (file)
@@ -102,6 +102,8 @@ int edg_wll_Condition_Dump(notifInfo *ni, char **output, int oneline){
                                break;
                        case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: GS("networkserver");
                                break;
+                       case EDG_WLL_QUERY_ATTR_JOB_TYPE: GS("jobtype");
+                               break;
                        default:
                                assert(! "Unknown attribute!");
                                break;
@@ -216,6 +218,11 @@ int edg_wll_Condition_Dump(notifInfo *ni, char **output, int oneline){
                                        GS(buf);
                                         free(buf);
                                        break;
+                               case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+                                       asprintf(&buf, "%s", edg_wll_StatusJobtypeNames[l2->value.i]);
+                                       GS(buf);
+                                       free(buf);
+                                       break;
                                default:
                                        assert(! "Unknown condition attribute!");
                                        break;
index 45bcf41..59a73f3 100644 (file)
@@ -593,6 +593,13 @@ int parse_query_conditions(edg_wll_Context ctx, const char *query, edg_wll_Query
                                        }
                                        conds[i][j].value.t.tv_usec = 0;
                                        break;
+                               case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+                                       if ( 0 > (conds[i][j].value.i = edg_wll_JobtypeStrToCode(value))) {
+                                               asprintf(&errmsg, "Unknown job type \"%s\" in query", value);
+                                               err = edg_wll_SetError(ctx, EINVAL, errmsg);
+                                               goto err;
+                                       }
+                                       break;
                                default:
                                        asprintf(&errmsg, "Value conversion for attribute \"%s\" not supported in current implementation", attribute);
                                        err = edg_wll_SetError(ctx, ENOSYS, errmsg);
index d775b9c..5c91d19 100644 (file)
@@ -481,7 +481,6 @@ static void endJobQueryRec(void *data, const char *el UNUSED_VAR)
        char *e;
        char *s;
 
-
        if (XMLCtx->level == 4 &&
                XMLCtx->job_conditions != NULL &&
                XMLCtx->job_conditions[XMLCtx->row] != NULL) {
@@ -558,6 +557,11 @@ static void endJobQueryRec(void *data, const char *el UNUSED_VAR)
                                        XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec =
                                                edg_wll_from_string_to_time_t(XMLCtx);
                                break;
+                       case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = 
+                                               edg_wll_from_string_to_edg_wll_StatJobtype(XMLCtx);
+
+                               break;
                        default: 
                                edg_wll_freeBuf(XMLCtx);
                                XMLCtx->level--;
@@ -682,6 +686,11 @@ static void endQueryEventsRequest(void *data, const char *el UNUSED_VAR)
                                                XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec =
                                                        edg_wll_from_string_to_time_t(XMLCtx);
                                        break;
+                               case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = 
+                                                       edg_wll_from_string_to_edg_wll_StatJobtype(XMLCtx);
+
+                                       break;
                                default: 
                                        edg_wll_freeBuf(XMLCtx);
                                        XMLCtx->level--;
index abd676f..8e3f7b7 100644 (file)
@@ -839,6 +839,15 @@ static char *ec_to_head_where(edg_wll_Context ctx,const edg_wll_QueryRec **ec)
                        ct++;
                        break;
 
+               case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+                       if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
+                       {
+                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with jobtype");
+                               return NULL;
+                       }
+                       ct++;
+                       break;
+
                default:
                        sprintf(msg, "ec_to_head_where(): attr=%d unsupported", ec[m][n].attr);
                        edg_wll_SetError(ctx, EINVAL, msg);
@@ -1135,6 +1144,15 @@ static char *jc_to_head_where(
                                return NULL;
                        }
                        break;
+               case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+                       if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
+                       {
+                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with jobtype");
+                               return NULL;
+                       }
+                       ct++;
+                       break;
+
 
                default:
                        sprintf(msg, "jc_to_head_where(): attr=%d unsupported", jc[m][n].attr);
@@ -1269,6 +1287,7 @@ static char *jc_to_head_where(
                case EDG_WLL_QUERY_ATTR_DONECODE:
                case EDG_WLL_QUERY_ATTR_EXITCODE:
                case EDG_WLL_QUERY_ATTR_STATUS:
+               case EDG_WLL_QUERY_ATTR_JOB_TYPE:
                        if (   !is_indexed(&(jc[m][n]), ctx)
                                || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
                        {
@@ -1808,6 +1827,16 @@ int match_status(edg_wll_Context ctx, const edg_wll_JobStat *oldstat, const edg_
                                        if (oldstat->lastUpdateTime.tv_sec != stat->lastUpdateTime.tv_sec) goto or_satisfied;
                                        break;
                                }
+                       case EDG_WLL_QUERY_ATTR_JOB_TYPE: 
+                               switch ( conds[i][j].op )
+                               {
+                               case EDG_WLL_QUERY_OP_EQUAL:
+                                       if ( conds[i][j].value.i == stat->jobtype ) goto or_satisfied;
+                                       break;
+                               case EDG_WLL_QUERY_OP_UNEQUAL:
+                                       if ( conds[i][j].value.i != stat->jobtype ) goto or_satisfied;
+                                       break;
+                               }
                        default:
                                break;
                        }
index 7d15630..65e4712 100644 (file)
@@ -43,6 +43,7 @@ limitations under the License.
 #define STATEENTERTIME lbt__queryAttr__STATEENTERTIME
 #define LASTUPDATETIME lbt__queryAttr__LASTUPDATETIME
 #define NETWORKSERVER  lbt__queryAttr__NETWORKSERVER
+#define JOBTYPE                lbt__queryAttr__JOBTYPE
 
 #define EQUAL          lbt__queryOp__EQUAL
 #define UNEQUAL                lbt__queryOp__UNEQUAL
index 152aa4a..46559ea 100644 (file)
@@ -443,6 +443,7 @@ int edg_wll_SoapToAttr(const enum lbt__queryAttr in, edg_wll_QueryAttr *out)
        case STATEENTERTIME: *out = EDG_WLL_QUERY_ATTR_STATEENTERTIME; break;
        case LASTUPDATETIME: *out = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; break;
        case NETWORKSERVER: *out = EDG_WLL_QUERY_ATTR_NETWORK_SERVER; break;
+       case JOBTYPE: *out = EDG_WLL_QUERY_ATTR_JOB_TYPE; break;
        default: return 0;
        }
 
@@ -476,6 +477,7 @@ int edg_wll_AttrToSoap(const edg_wll_QueryAttr in, enum lbt__queryAttr *out)
        case EDG_WLL_QUERY_ATTR_STATEENTERTIME: *out = STATEENTERTIME; break;
        case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: *out = LASTUPDATETIME; break;
        case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: *out = NETWORKSERVER; break;
+       case EDG_WLL_QUERY_ATTR_JOB_TYPE: *out = JOBTYPE; break;
        default: return 0;
        }
 
@@ -575,6 +577,7 @@ int edg_wll_QueryValToSoap(
        case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
        case EDG_WLL_QUERY_ATTR_RESUBMITTED:
        case EDG_WLL_QUERY_ATTR_EXITCODE:
+       case EDG_WLL_QUERY_ATTR_JOB_TYPE:
                VALUEQR_SET(out, i, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, i)))));
                if ( !VALUEQR_GET(out, i) ) return SOAP_FAULT;
                *(VALUEQR_GET(out, i)) = in->i;
index 97997c3..b42da9e 100644 (file)
                        <val name="STATEENTERTIME">Staus enter time.</val>
                        <val name="LASTUPDATETIME">Last update time.</val>
                        <val name="NETWORKSERVER">Network server aka RB aka WMproxy endpoint</val>
+                       <val name="JOBTYPE">Type of the job</val>
                </enum>
 
                <struct name="queryRecord">