From: Zdeněk Šustr Date: Wed, 8 Aug 2012 15:48:40 +0000 (+0000) Subject: Added support for job_type query attribute (query for jobs by type) X-Git-Tag: glite-lbjp-common-gss_R_3_2_4_1~21 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=69bad1b6b59eb90d4d3d00ee1be866a27711791e;p=jra1mw.git Added support for job_type query attribute (query for jobs by type) --- diff --git a/org.glite.lb.client/examples/job_status.c b/org.glite.lb.client/examples/job_status.c index b5c3356..16d4d45 100644 --- a/org.glite.lb.client/examples/job_status.c +++ b/org.glite.lb.client/examples/job_status.c @@ -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); diff --git a/org.glite.lb.client/examples/query_ext.c b/org.glite.lb.client/examples/query_ext.c index 0ee7679..afc67f1 100644 --- a/org.glite.lb.client/examples/query_ext.c +++ b/org.glite.lb.client/examples/query_ext.c @@ -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 ) diff --git a/org.glite.lb.common/interface/query_rec.h b/org.glite.lb.common/interface/query_rec.h index a7c78f3..1941916 100644 --- a/org.glite.lb.common/interface/query_rec.h +++ b/org.glite.lb.common/interface/query_rec.h @@ -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; diff --git a/org.glite.lb.common/src/query_rec.c b/org.glite.lb.common/src/query_rec.c index 224ebfb..799ed48 100644 --- a/org.glite.lb.common/src/query_rec.c +++ b/org.glite.lb.common/src/query_rec.c @@ -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: diff --git a/org.glite.lb.common/src/xml_conversions.c b/org.glite.lb.common/src/xml_conversions.c index fec92e6..45c7498 100644 --- a/org.glite.lb.common/src/xml_conversions.c +++ b/org.glite.lb.common/src/xml_conversions.c @@ -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", }; diff --git a/org.glite.lb.common/src/xml_parse.c.T b/org.glite.lb.common/src/xml_parse.c.T index d8554b7..1fbffe5 100644 --- a/org.glite.lb.common/src/xml_parse.c.T +++ b/org.glite.lb.common/src/xml_parse.c.T @@ -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: diff --git a/org.glite.lb.server/src/cond_dump.c b/org.glite.lb.server/src/cond_dump.c index 0a40349..0161607 100644 --- a/org.glite.lb.server/src/cond_dump.c +++ b/org.glite.lb.server/src/cond_dump.c @@ -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; diff --git a/org.glite.lb.server/src/lb_proto.c b/org.glite.lb.server/src/lb_proto.c index 45bcf41..59a73f3 100644 --- a/org.glite.lb.server/src/lb_proto.c +++ b/org.glite.lb.server/src/lb_proto.c @@ -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); diff --git a/org.glite.lb.server/src/lb_xml_parse.c.T b/org.glite.lb.server/src/lb_xml_parse.c.T index d775b9c..5c91d19 100644 --- a/org.glite.lb.server/src/lb_xml_parse.c.T +++ b/org.glite.lb.server/src/lb_xml_parse.c.T @@ -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--; diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c index abd676f..8e3f7b7 100644 --- a/org.glite.lb.server/src/query.c +++ b/org.glite.lb.server/src/query.c @@ -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; } diff --git a/org.glite.lb.server/src/ws_typemap.h b/org.glite.lb.server/src/ws_typemap.h index 7d15630..65e4712 100644 --- a/org.glite.lb.server/src/ws_typemap.h +++ b/org.glite.lb.server/src/ws_typemap.h @@ -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 diff --git a/org.glite.lb.server/src/ws_typeref.c.T b/org.glite.lb.server/src/ws_typeref.c.T index 152aa4a..46559ea 100644 --- a/org.glite.lb.server/src/ws_typeref.c.T +++ b/org.glite.lb.server/src/ws_typeref.c.T @@ -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; diff --git a/org.glite.lb.ws-interface/src/LBTypes.xml.T b/org.glite.lb.ws-interface/src/LBTypes.xml.T index 97997c3..b42da9e 100644 --- a/org.glite.lb.ws-interface/src/LBTypes.xml.T +++ b/org.glite.lb.ws-interface/src/LBTypes.xml.T @@ -289,6 +289,7 @@ Staus enter time. Last update time. Network server aka RB aka WMproxy endpoint + Type of the job