blob: 30e1142c2ec2d9337f97fc2b384fdef948680867 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
/*
* Utility routines for constructing and sending proxy runtime events.
*
* These routines define the format of runtime events for communication with
* runtime proxy clients.
*
* See org.eclipse.ptp.rtsystem.AbstractProxyRuntimeSystem for a description
* of the protocol format.
*/
#ifdef __gnu_linux__
#define _GNU_SOURCE
#endif /* __gnu_linux__ */
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "proxy.h"
#include "proxy_msg.h"
#include "args.h"
#include "list.h"
#include "compat.h"
/*
* Add a string attribute to an existing event.
*/
void
proxy_add_string_attribute(proxy_msg *m, char *attr, char *value)
{
proxy_msg_add_keyval_string(m, attr, value);
}
/*
* Add an integer attribute to an existing event.
*/
void
proxy_add_int_attribute(proxy_msg *m, char *attr, int value)
{
proxy_msg_add_keyval_int(m, attr, value);
}
/*
* OK EVENT. Sent in response to a sucessfully
* completed command.
*/
proxy_msg *
proxy_ok_event(int trans_id)
{
return new_proxy_msg(PROXY_EV_OK, trans_id);
}
/*
* SHUTDOWN EVENT. Sent in response to a quit command.
*/
proxy_msg *
proxy_shutdown_event(int trans_id)
{
return new_proxy_msg(PROXY_EV_SHUTDOWN, trans_id);
}
/*
* MESSAGE EVENT. Used for sending messages that
* should be logged by the client.
*/
proxy_msg *
proxy_message_event(int trans_id, char *level, int code, char *fmt, ...)
{
va_list ap;
char * msg;
proxy_msg * m = new_proxy_msg(PROXY_EV_MESSAGE, trans_id);
va_start(ap, fmt);
vasprintf(&msg, fmt, ap);
va_end(ap);
proxy_msg_add_int(m, 3); /* 3 attributes */
proxy_msg_add_keyval_string(m, MSG_LEVEL_ATTR, level);
proxy_msg_add_keyval_int(m, MSG_CODE_ATTR, code);
proxy_msg_add_keyval_string(m, MSG_TEXT_ATTR, msg);
return m;
}
/*
* ERROR EVENT. General error event that should be sent to
* indicate an error condition. NOTE: command errors should
* use the specific error events below.
*/
proxy_msg *
proxy_error_event(int trans_id, int code, char *fmt, ...)
{
va_list ap;
char * msg;
proxy_msg * m = new_proxy_msg(PROXY_EV_ERROR, trans_id);
va_start(ap, fmt);
vasprintf(&msg, fmt, ap);
va_end(ap);
proxy_msg_add_int(m, 2); /* 2 attributes */
proxy_msg_add_keyval_int(m, ERROR_CODE_ATTR, code);
proxy_msg_add_keyval_string(m, ERROR_MSG_ATTR, msg);
return m;
}
/*
* SUBMITJOB ERROR EVENT. Used to indicate an error when attempting
* to submit a job. The jobSubId argument is the job submission ID
* that was specified to the submitJob command. This event should
* be used to indicate submission errors as soon as the job submission
* id has been obtained.
*/
proxy_msg *
proxy_submitjob_error_event(int trans_id, char *jobSubId, int code, char *msg)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_SUBMITJOB_ERROR, trans_id);
proxy_msg_add_int(m, 3); /* 3 attributes */
proxy_msg_add_keyval_string(m, JOB_SUB_ID_ATTR, jobSubId);
proxy_msg_add_keyval_int(m, ERROR_CODE_ATTR, code);
proxy_msg_add_keyval_string(m, ERROR_MSG_ATTR, msg);
return m;
}
/*
* TERMINATEJOB ERROR EVENT. Used to indicate an error when attempting
* to terminate a job. The jobId argument is the job ID
* that was specified to the terminateJob command.
*/
proxy_msg *
proxy_terminatejob_error_event(int trans_id, char *jobId, int code, char *msg)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_TERMINATEJOB_ERROR, trans_id);
proxy_msg_add_int(m, 3); /* 3 attributes */
proxy_msg_add_keyval_string(m, JOB_ID_ATTR, jobId);
proxy_msg_add_keyval_int(m, ERROR_CODE_ATTR, code);
proxy_msg_add_keyval_string(m, ERROR_MSG_ATTR, msg);
return m;
}
/*
* ATTR DEF INT EVENT. Uused to define a new INTEGER attribute that can be used
* in subsequent events.
*/
proxy_msg *
proxy_attr_def_int_event(int trans_id, char *id, char *name, char *desc, int disp, int def)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_ATTR_DEF, trans_id);
proxy_msg_add_int(m, 1); /* 1 attribute def */
proxy_msg_add_int(m, 5); /* 5 attributes */
proxy_msg_add_string(m, id);
proxy_msg_add_string(m, "INTEGER");
proxy_msg_add_string(m, name);
proxy_msg_add_string(m, desc);
proxy_msg_add_string(m, disp ? "true" : "false");
proxy_msg_add_int(m, def);
return m;
}
/*
* ATTR DEF STRING EVENT. Used to define a new STRING attribute that can be used
* in subsequent events.
*/
proxy_msg *
proxy_attr_def_string_event(int trans_id, char *id, char *name, char *desc, int disp, char *def)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_ATTR_DEF, trans_id);
proxy_msg_add_int(m, 1); /* 1 attribute def */
proxy_msg_add_int(m, 5); /* 5 attributes */
proxy_msg_add_string(m, id);
proxy_msg_add_string(m, "STRING");
proxy_msg_add_string(m, name);
proxy_msg_add_string(m, desc);
proxy_msg_add_string(m, disp ? "true" : "false");
proxy_msg_add_string(m, def);
return m;
}
/*
* NEW MACHINE. Used to define new machine model elements.
*/
proxy_msg *
proxy_new_machine_event(int trans_id, char *rm_id, char *machine_id_range, char *name, char *state)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_NEW_MACHINE, trans_id);
proxy_msg_add_string(m, rm_id);
proxy_msg_add_int(m, 1); /* 1 new machine range */
proxy_msg_add_string(m, machine_id_range);
proxy_msg_add_int(m, 2); /* 2 attributes */
proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
proxy_msg_add_keyval_string(m, MACHINE_STATE_ATTR, state);
return m;
}
/*
* NEW JOB EVENT. Used to create a job model element. Jobs can either be created in
* response to a submitJob command, or to represent existing jobs in a queue (for example).
*
* New jobs created in response to a submitJob event *MUST* provide the job submission ID.
*/
proxy_msg *
proxy_new_job_event(int trans_id, char *queue_id, char *job_id_range, char *name, char *state, char *jobSubId)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_NEW_JOB, trans_id);
proxy_msg_add_string(m, queue_id);
proxy_msg_add_int(m, 1); /* 1 new job range */
proxy_msg_add_string(m, job_id_range);
if (jobSubId != NULL) {
proxy_msg_add_int(m, 3); /* 3 attributes */
proxy_msg_add_keyval_string(m, JOB_SUB_ID_ATTR, jobSubId);
} else {
proxy_msg_add_int(m, 2); /* 2 attributes */
}
proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
proxy_msg_add_keyval_string(m, JOB_STATE_ATTR, state);
return m;
}
/*
* NEW NODE EVENT. Used to create new node model elements.
*/
proxy_msg *
proxy_new_node_event(int trans_id, char *mach_id, int num_nodes)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_NEW_NODE, trans_id);
proxy_msg_add_string(m, mach_id);
proxy_msg_add_int(m, num_nodes);
return m;
}
/*
* Add a node to a new node event.
*/
void
proxy_add_node(proxy_msg *m, char *node_id, char *name, char *state, int extra_attrs)
{
proxy_msg_add_string(m, node_id);
proxy_msg_add_int(m, 2 + extra_attrs);
proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
proxy_msg_add_keyval_string(m, NODE_STATE_ATTR, state);
}
/*
* NEW PROCESS EVENT. Used to create a new process model element.
*/
proxy_msg *
proxy_new_process_event(int trans_id, char *job_id, int num_procs)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_NEW_PROCESS, trans_id);
proxy_msg_add_string(m, job_id);
proxy_msg_add_int(m, num_procs);
return m;
}
void
proxy_add_process(proxy_msg *m, char *proc_id, char *name, char *state, int extra_attrs)
{
proxy_msg_add_string(m, proc_id);
proxy_msg_add_int(m, 2 + extra_attrs);
proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
proxy_msg_add_keyval_string(m, PROC_STATE_ATTR, state);
}
/*
* NEW QUEUE EVENT. Used to create a new queue model element.
*/
proxy_msg *
proxy_new_queue_event(int trans_id, char *rm_id, char *queue_id, char *name, char *state)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_NEW_QUEUE, trans_id);
proxy_msg_add_string(m, rm_id);
proxy_msg_add_int(m, 1); /* 1 new queue */
proxy_msg_add_string(m, queue_id);
proxy_msg_add_int(m, 2); /* 2 attributes */
proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
proxy_msg_add_keyval_string(m, QUEUE_STATE_ATTR, state);
return m;
}
/*
* JOB CHANGE EVENT. Used to change attributes on a job.
*/
proxy_msg *
proxy_job_change_event(int trans_id, char *id_range, int num_attrs)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_JOB_CHANGE, trans_id);
proxy_msg_add_int(m, 1); /* 1 id range */
proxy_msg_add_string(m, id_range);
proxy_msg_add_int(m, num_attrs);
return m;
}
/*
* MACHINE CHANGE EVENT. Used to change attributes on a machine.
*/
proxy_msg *
proxy_machine_change_event(int trans_id, char *id_range, int num_attrs)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_MACHINE_CHANGE, trans_id);
proxy_msg_add_int(m, 1); /* 1 id range */
proxy_msg_add_string(m, id_range);
proxy_msg_add_int(m, num_attrs);
return m;
}
/*
* NODE CHANGE EVENT. Used to change attributes on a node.
*/
proxy_msg *
proxy_node_change_event(int trans_id, char *id_range, int num_attrs)
{
proxy_msg * m = new_proxy_msg(PROXY_EV_RT_NODE_CHANGE, trans_id);
proxy_msg_add_int(m, 1); /* 1 id range */
proxy_msg_add_string(m, id_range);
proxy_msg_add_int(m, num_attrs);
return m;
}
/*
* PROCESS CHANGE EVENT. Used to change attributes on a process.
*/
proxy_msg *
proxy_process_change_event(int trans_id, char *id_range, int num_attrs)
{
proxy_msg *m = new_proxy_msg(PROXY_EV_RT_PROCESS_CHANGE, trans_id);
proxy_msg_add_int(m, 1); /* 1 id range */
proxy_msg_add_string(m, id_range);
proxy_msg_add_int(m, num_attrs);
return m;
}
/*
* QUEUE CHANGE EVENT. Used to change attributes on a queue.
*/
proxy_msg *
proxy_queue_change_event(int trans_id, char *id_range, int num_attrs)
{
proxy_msg *m = new_proxy_msg(PROXY_EV_RT_QUEUE_CHANGE, trans_id);
proxy_msg_add_int(m, 1); /* 1 id range */
proxy_msg_add_string(m, id_range);
proxy_msg_add_int(m, num_attrs);
return m;
}
/*
* REMOVE ALL EVENT. Used to remove all model elements.
*/
proxy_msg *
proxy_remove_all_event(int trans_id)
{
return new_proxy_msg(PROXY_EV_RT_REMOVE_ALL, trans_id);
}
/*
* REMOVE JOB EVENT. Used to remove job model elements.
*/
proxy_msg *
proxy_remove_job_event(int trans_id, char *id_range)
{
proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_JOB, trans_id);
proxy_msg_add_string(m, id_range);
return m;
}
/*
* REMOVE MACHINE EVENT. Used to remove machine model elements.
*/
proxy_msg *
proxy_remove_machine_event(int trans_id, char *id_range)
{
proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_MACHINE, trans_id);
proxy_msg_add_string(m, id_range);
return m;
}
/*
* REMOVE NODE EVENT. Used to remove node model elements.
*/
proxy_msg *
proxy_remove_node_event(int trans_id, char *id_range)
{
proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_NODE, trans_id);
proxy_msg_add_string(m, id_range);
return m;
}
/*
* REMOVE PROCESS EVENT. Used to remove process model elements.
*/
proxy_msg *
proxy_remove_process_event(int trans_id, char *id_range)
{
proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_PROCESS, trans_id);
proxy_msg_add_string(m, id_range);
return m;
}
/*
* REMOVE QUEUE EVENT. Used to remove queue model elements.
*/
proxy_msg *
proxy_remove_queue_event(int trans_id, char *id_range)
{
proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_QUEUE, trans_id);
proxy_msg_add_string(m, id_range);
return m;
}