--- /dev/null
+#include <getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+/*headers*/
+#include "glite/jobid/cjobid.h"
+#include "glite/lb/events.h"
+#include "glite/lb/consumer.h"
+/*end headers*/
+
+
+static struct option opts[] = {
+ {"help", 0, NULL, 'h'},
+ {"server", 1, NULL, 's'},
+ {"port", 1, NULL, 'p'},
+ {"jobid", 1, NULL, 'j'},
+ {"user", 1, NULL, 'u'},
+};
+
+static void usage(char *me)
+{
+ fprintf(stderr, "usage: %s [option]\n"
+ "\t-h, --help Shows this screen.\n"
+ "\t-s, --server Server address.\n"
+ "\t-p, --port Query server port.\n"
+ "\t-j, --jobid ID of requested job.\n"
+ "\t-u, --user User DN.\n"
+ , me);
+}
+
+
+int main(int argc, char *argv[])
+{
+ char *server, *jobid_s, *user;
+ int opt, err = 0;
+ edg_wlc_JobId jobid = NULL;
+ long i;
+ int port = 0;
+
+ server = jobid_s = user = NULL;
+ while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF)
+ switch (opt) {
+ case 'h': usage(argv[0]); return 0;
+ case 's': server = strdup(optarg); break;
+ case 'p': port = atoi(optarg); break;
+ case 'j': jobid_s = strdup(optarg); break;
+ case 'u': user = strdup(optarg); break;
+ case '?': usage(argv[0]); return 1;
+ }
+
+ if ( !jobid_s ) { fprintf(stderr, "JobId not given\n"); return 1; }
+ //if ( !server ) { fprintf(stderr, "LB proxy socket not given\n"); return 1; }
+
+ /*variables*/
+ edg_wll_Context ctx;
+ edg_wll_QueryRec jc[4];
+ edg_wll_JobStat *statesOut = NULL;
+ edg_wlc_JobId *jobsOut = NULL;
+ /*end variables*/
+
+ if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; }
+
+ /*context*/
+ edg_wll_InitContext(&ctx);
+
+ edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server);
+ if (port) edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port);
+ /*end context*/
+
+ /*queryrec*/
+ jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER;
+ jc[0].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[0].value.c = NULL;
+ jc[1].attr = EDG_WLL_QUERY_ATTR_STATUS;
+ jc[1].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[1].value.i = EDG_WLL_JOB_RUNNING;
+ jc[2].attr = EDG_WLL_QUERY_ATTR_DESTINATION;
+ jc[2].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[2].value.c = "XYZ";
+ jc[3].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+ /*end queryrec*/
+
+ /*query*/
+ err = edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); //* \label{l:queryjobs}
+ if ( err == E2BIG ) {
+ fprintf(stderr,"Warning: only limited result returned!\n");
+ return 0;
+ } else if (err) {
+ char *et,*ed;
+
+ edg_wll_Error(ctx,&et,&ed);
+ fprintf(stderr,"%s: edg_wll_QueryJobs(): %s (%s)\n",argv[0],et,ed);
+
+ free(et); free(ed);
+ }
+ /*end query*/
+
+ /*printstates*/
+ for (i = 0; statesOut[i].state; i++ ) {
+ printf("jobId : %s\n", edg_wlc_JobIdUnparse(statesOut[i].jobId));
+ printf("state : %s\n\n", edg_wll_StatToString(statesOut[i].state));
+ }
+ /*end printstates*/
+
+ if ( jobsOut ) {
+ for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]);
+ free(jobsOut);
+ }
+ if ( statesOut ) {
+ for (i=0; statesOut[i].state; i++) edg_wll_FreeStatus(&statesOut[i]);
+ free(statesOut);
+ }
+
+ edg_wll_FreeContext(ctx);
+
+ return err;
+}
--- /dev/null
+#include <getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+/*headers*/
+#include "glite/jobid/cjobid.h"
+#include "glite/lb/events.h"
+#include "glite/lb/consumer.h"
+/*end headers*/
+
+
+static struct option opts[] = {
+ {"help", 0, NULL, 'h'},
+ {"server", 1, NULL, 's'},
+ {"port", 1, NULL, 'p'},
+ {"jobid", 1, NULL, 'j'},
+ {"user", 1, NULL, 'u'},
+};
+
+static void usage(char *me)
+{
+ fprintf(stderr, "usage: %s [option]\n"
+ "\t-h, --help Shows this screen.\n"
+ "\t-s, --server LB server.\n"
+ "\t-p, --port LB server port.\n"
+ "\t-j, --jobid ID of requested job.\n"
+ "\t-u, --user User DN.\n"
+ , me);
+}
+
+
+int main(int argc, char *argv[])
+{
+ char *server, *jobid_s, *user;
+ edg_wlc_JobId jobid = NULL;
+ int opt, err = 0;
+ long i;
+ int port = 0;
+
+ server = jobid_s = user = NULL;
+ while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF)
+ switch (opt) {
+ case 'h': usage(argv[0]); return 0;
+ case 's': server = strdup(optarg); break;
+ case 'p': port = atoi(optarg); break;
+ case 'j': jobid_s = strdup(optarg); break;
+ case 'u': user = strdup(optarg); break;
+ case '?': usage(argv[0]); return 1;
+ }
+
+ if ( !jobid_s ) { fprintf(stderr, "JobId not given\n"); return 1; }
+
+ /*variables*/
+ edg_wll_Context ctx;
+ edg_wll_QueryRec *jc[4];
+ edg_wll_JobStat *statesOut = NULL;
+ edg_wlc_JobId *jobsOut = NULL;
+ /*end variables*/
+
+ if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; }
+
+ /*context*/
+ edg_wll_InitContext(&ctx);
+
+ edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server);
+ if (port) edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port);
+ /*end context*/
+
+ /*queryrec*/
+ jc[0] = (edg_wll_QueryRec *) malloc(2*sizeof(edg_wll_QueryRec));
+ jc[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER;
+ jc[0][0].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[0][0].value.c = NULL;
+ jc[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+
+ jc[1] = (edg_wll_QueryRec *) malloc(2*sizeof(edg_wll_QueryRec));
+ jc[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS;
+ jc[1][0].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[1][0].value.i = EDG_WLL_JOB_RUNNING;
+ jc[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+
+ jc[2] = (edg_wll_QueryRec *) malloc(3*sizeof(edg_wll_QueryRec));
+ jc[2][0].attr = EDG_WLL_QUERY_ATTR_DESTINATION;
+ jc[2][0].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[2][0].value.c = "XXX";
+ jc[2][1].attr = EDG_WLL_QUERY_ATTR_DESTINATION;
+ jc[2][1].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[2][1].value.c = "YYY";
+ jc[2][2].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+
+ jc[3] = NULL;
+ /*end queryrec*/
+
+ /*query*/
+ err = edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **)jc,
+ 0, &jobsOut, &statesOut);
+ /*end query*/
+
+ if ( err == E2BIG ) {
+ fprintf(stderr,"Warning: only limited result returned!\n");
+ return 0;
+ } else if (err) {
+ char *et,*ed;
+
+ edg_wll_Error(ctx,&et,&ed);
+ fprintf(stderr,"%s: edg_wll_QueryJobs(): %s (%s)\n",argv[0],et,ed);
+
+ free(et); free(ed);
+ }
+
+ /*printstates*/
+ for (i = 0; statesOut[i].state; i++ ) {
+ printf("jobId : %s\n", edg_wlc_JobIdUnparse(statesOut[i].jobId));
+ printf("state : %s\n\n", edg_wll_StatToString(statesOut[i].state));
+ }
+ /*end printstates*/
+
+ if ( jobsOut ) {
+ for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]);
+ free(jobsOut);
+ }
+ if ( statesOut ) {
+ for (i=0; statesOut[i].state; i++) edg_wll_FreeStatus(&statesOut[i]);
+ free(statesOut);
+ }
+ free(jc[0]); free(jc[1]); free(jc[2]);
+
+ edg_wll_FreeContext(ctx);
+
+ return err;
+}
--- /dev/null
+extern "C" {
+#include <getopt.h>
+#include <stdlib.h>
+}
+
+#include <iostream>
+#include <string>
+
+/*headers*/
+#include "glite/jobid/JobId.h"
+#include "glite/lb/Event.h"
+#include "glite/lb/ServerConnection.h"
+/*end headers*/
+
+using namespace std;
+
+static struct option opts[] = {
+ {"help", 0, NULL, 'h'},
+ {"server", 1, NULL, 's'},
+ {"port", 1, NULL, 'p'},
+ {"jobid", 1, NULL, 'j'},
+ {"user", 1, NULL, 'u'},
+};
+
+static void usage(char *me)
+{
+ cerr << "usage: %s [option]\n"
+ << "\t-h, --help Shows this screen.\n"
+ << "\t-s, --server LB server.\n"
+ << "\t-p, --port LB server port.\n"
+ << "\t-j, --jobid ID of requested job.\n"
+ << "\t-u, --user User DN.\n"
+ << me << endl;
+}
+
+
+int main(int argc, char *argv[])
+{
+ string server_s, jobid_s, user;
+ int opt, err = 0;
+ glite_jobid_t jobid = NULL;
+ long i;
+ int port = 0;
+
+
+ server = jobid_s = NULL;
+ while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF)
+ switch (opt) {
+ case 'h': usage(argv[0]); return 0;
+ case 's': server_s = optarg; break;
+ case 'p': port = atoi(optarg); break;
+ case 'j': jobid_s = optarg; break;
+ case 'u': user = optarg; break;
+ case '?': usage(argv[0]); return 1;
+ }
+
+ if ( jobid_s.empty() ) {
+ cerr << "JobId not given\n"; return 1;
+ }
+
+ /*variables*/
+ ServerConnection server;
+ Event *eventsOut;
+ vector<ServerConnection::QueryRec> jc;
+ vector<ServerConnection::QueryRec> ec;
+ /*end variables*/
+
+ if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; }
+
+ /*context*/
+ edg_wll_InitContext(&ctx);
+
+ edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server);
+ if (port) edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port);
+ /*end context*/
+
+ /*queryrec*/
+ jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG;
+ jc[0].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[0].attr_id.tag = "color";
+ jc[0].value.c = "red";
+ jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+ ec[0].attr = EDG_WLL_QUERY_ATTR_USERTAG;
+ ec[0].op = EDG_WLL_QUERY_OP_EQUAL;
+ ec[0].attr_id.tag = "color";
+ ec[0].value.c = "green";
+ ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+ /*end queryrec*/
+
+ /*query*/
+ err = edg_wll_QueryEvents(ctx, jc, ec, &eventsOut);
+ /*end query*/
+
+ if ( err == E2BIG ) {
+ fprintf(stderr,"Warning: only limited result returned!\n");
+ return 0;
+ } else if (err) {
+ char *et,*ed;
+
+ edg_wll_Error(ctx,&et,&ed);
+ fprintf(stderr,"%s: edg_wll_QueryEvents(): %s (%s)\n",argv[0],et,ed);
+
+ free(et); free(ed);
+ }
+
+ if ( err == ENOENT ) return err;
+
+ /*printevents*/
+ for (i = 0; eventsOut && (eventsOut[i].type); i++ ) {
+ //printf("jobId : %s\n", edg_wlc_JobIdUnparse(eventsOut[i].jobId));
+ printf("event : %s\n\n", edg_wll_EventToString(eventsOut[i].type));
+ }
+ /*end printevents*/
+
+ if ( eventsOut ) {
+ for (i=0; &(eventsOut[i]); i++) edg_wll_FreeEvent(&(eventsOut[i]));
+ free(eventsOut);
+ }
+
+ edg_wll_FreeContext(ctx);
+
+ return err;
+}
dumpEvent(Event *event)
{
// list of attribute names and types
- typedef std::vector<std::pair<Event::Attr, Event::AttrType>> AttrListType;
+ typedef vector<pair<Event::Attr, Event::AttrType>> AttrListType;
cout << "Event name: " << event->name() << endl;
- AttrListType attr_list = event->getAttrs();
+ AttrListType attr_list = event->getAttrs(); //* \label{l:getattrs}
for(AttrListType::iterator i = attr_list.begin();
i != attr_list.end();
i++) {
- Event::Attr attr = attr_list[i].first();
+ Event::Attr attr = attr_list[i].first;
- cout << Event::getAttrName(attr) << " = ";
- switch(attr_list[i].second()) {
+ cout << Event::getAttrName(attr) << " = ";
+ switch(attr_list[i].second) {
case Event::INT_T:
case Event::PORT_T:
case Event::LOGSRC_T:
/*status*/
void dumpState(JobStatus *status)
{
-
+ typedef vector<pair<JobStatus:Attr, JobStatus::AttrType>> AttrListType;
+
+ cout << "Job status: " << status->name << endl;
+
+ AttrListType attr_list = status->getAttrs(); //* \label{l:jgetattrs}
+ for(AttrListType::iterator i = attr_list.begin();
+ i != attr_list.end();
+ i++) {
+ JobStatus::Attr attr = attr_list[i].first;
+ cout << JobStatus::getAttrName(attr) << " = ";
+ switch(attr_list[i].second) {
+
+ case INT_T:
+ cout << status->getValInt(attr) << endl;
+ break;
+
+ case STRING_T:
+ cout << status->getValInt(attr) << endl;
+ break;
+
+ case TIMEVAL_T:
+ cout << status->getValTime(attr).tv_sec << endl;
+ break;
+
+ case BOOL_T:
+ cout << status->getValBool(attr).tv_sec << endl;
+ break;
+
+ case JOBID_T:
+ cout << status->getValJobid(attr).toString() << endl;
+ break;
+
+ case INTLIST_T:
+ vector<int> list = status->getValIntList(attr);
+ for(vector<int>::iterator i = list.begin();
+ i != list.end();
+ i++) {
+ cout << list[i] << " ";
+ }
+ cout << endl;
+ break;
+
+ case STRLIST_T:
+ vector<string> list = status->getValStringList(attr);
+ for(vector<string>::iterator i = list.begin();
+ i != list.end();
+ i++) {
+ cout << list[i] << " ";
+ }
+ cout << endl;
+ break;
+
+ case TAGLIST_T: /**< List of user tags. */
+ vector<pair<string, string>> list = status->getValTagList(attr);
+ for(vector<pair<string,string>>::iterator i = list.begin();
+ i != list.end();
+ i++) {
+ cout << list[i].first << "=" << list[i].second << " ";
+ }
+ cout << endl;
+ break;
+
+ case STSLIST_T: /**< List of states. */
+ vector<JobStatus> list = status->getValJobStatusList(attr);
+ for(vector<JobStatus>::iterator i = list.begin();
+ i != list.end();
+ i++) {
+ // recursion
+ dumpState(&list[i]);
+ }
+ cout << endl;
+ break;
+
+ default:
+ cout << "attribute type not supported" << endl;
+ break;
+
+ }
+ }
}
/*end status*/
\verb'ServerConnection' class for performing the queries. \\
glite/lb/Job.h & Defines \verb'Job' class with methods for job
specific queries. \\
-
\end{tabularx}
+\caption{Consumer C++ API header files}
+\label{t:ccppheaders}
\end{table}
\subsubsection{QueryRecord}
+
\subsubsection{Event}
The objects of class \verb'glite::lb::Event' are returned by the \LB event
queries. The \verb'Event' class introduces symbolic names for event
-type (enumeration \verb'Event::Type'), event attributes (enumeration
-\verb'Event::Attr') and their types (enumeration
+type (enum \verb'Event::Type'), event attributes (enum
+\verb'Event::Attr') and their types (enum
\verb'Event::AttrType'), feature not available through the C API, as
well as (read only) access to the attribute values. Using
these methods you can:
\begin{itemize}
-\item get the string name for the symbolic event type:
-\begin{lstlisting}
- static const std::string getEventName(Type type);
-\end{lstlisting}
\item get the event type (both symbolic and string):
\begin{lstlisting}
- const std::string & name(void) const;
-\end{lstlisting}
-\item get the list of attribute types and values:
-\begin{lstlisting}
- const std::vector<std::pair<Attr,AttrType> > & getAttrs(void) const;
-\end{lstlisting}
-\item get string representation of attribute names:
-\begin{lstlisting}
- static const std::string & getAttrName(Attr name);
-\end{lstlisting}
-\item get value of given attribute:
-\begin{lstlisting}
- int getValInt(Attr name) const;
- float getValFloat(Attr name) const;
- double getValDouble(Attr name) const;
- std::string getValString(Attr name) const;
- struct timeval getValTime(Attr name) const;
- const glite::jobid::JobId getValJobId(Attr name) const;
+ Event event;
+
+ // we suppose event gets somehow filled in
+ cout << "Event type: " << event.type << endl;
+
+ cout << "Event name:" << endl;
+ // these two lines should print the same string
+ cout << Event::getEventName(event.type) << endl;
+ cout << event.name() << endl;
\end{lstlisting}
+\item get the list of attribute types and values (see
+line~\ref{l:getattrs} of the example),
+\item get string representation of attribute names,
+\item get value of given attribute.
\end{itemize}
-
-Following example demonstrates this by printing the event attributes:
+The following example demonstrates this by printing event name and attributes:
\lstinputlisting[title={\bf File:}\lstname,numbers=left,linerange=event-end\ event]{util.C}
\subsubsection{JobStatus}
The \verb'glite::lb::JobStatus' serves as a result type of job status
queries in the same way the \verb'glite::lb::Event' serves in event
queries. The \verb'JobStatus' class provides symbolic names for job
-states (enumeration \verb'JobStatus::Code'), state attributes
-(enumeration \verb'JobStatus::Attr') and their types (enumeration
+states (enum \verb'JobStatus::Code'), state attributes
+(enum \verb'JobStatus::Attr') and their types (enum
\verb'JobStatus::AttrType'), and read only access to the
attribute values. Using the \verb'JobStatus' interface you can:
\begin{itemize}
\item get the string name for the symbolic job state:
\begin{lstlisting}
- static const std::string &getStateName(Code state);
-\end{lstlisting}
-\item get the job state name (both symbolic and string):
-\begin{lstlisting}
- const std::string & name(void) const;
-\end{lstlisting}
-\item get the list of job state attributes and types:
-\begin{lstlisting}
- const std::vector<std::pair<Attr,AttrType> >& getAttrs(void) const;
+ JobStatus status;
+
+ // we suppose status gets somehow filled in
+ cout << "Job state: " << status.type << endl;
+
+ cout << "State name: " << endl;
+ // these two lines should print the same string
+ cout << JobStatus::getStateName(status.type) << endl;
+ cout << status.name() << endl;
\end{lstlisting}
+\item get the job state name (both symbolic and string),
+\item get the list of job state attributes and types,
\item convert the attribute names from symbolic to string form and
-vice versa:
-\begin{lstlisting}
- static const std::string& getAttrName(Attr name);
- static Attr attrByName(std::string const &);
-\end{lstlisting}
-\item get value of given attribute:
-\begin{lstlisting}
-\end{lstlisting}
+vice versa,
+\item get value of given attribute.
\end{itemize}
-
+The following example demostrates this by printing job status (name
+and attributes):
\lstinputlisting[title={\bf File:}\lstname,numbers=left,linerange=status-end\ status]{util.C}
\subsubsection{ServerConnection}\label{s:ServerConnection}
+
\subsubsection{Job}