Add the full call chain for host control operations from the Go API server through the C library to the controller: - schema/controller.capnp: HostControl struct + hostctrlmsg @21 in Request.body union - include/typemap.h: xce_hostctrl_t* hostctrlmsg in body union (placed after @20 clrpreasonmsg, matching capnp ordinal) - include/client.h, xceapi.h, request.h: declarations for xcecli_hostctrl, xce_hostctrl, xce_hostctrl_req - lib/client.c: xcecli_hostctrl (validate + delegate to xce_hostctrl) - lib/xceapi.c: xce_hostctrl (validate ctx state + send + wait reply) - lib/request.c: xce_hostctrl_req (validate hostname/empty/nil, accept only HOST_OPEN/HOST_CLOSE, reject HOST_TAG/UNTAG) - lib/helper.c: Request_body_hostctrlmsg cases in xce_request_body() and xce_request_msg_name() - controller/cluster.c: OPCode_hostcontrol dispatch - controller/include/cluster.h: do_hostcontrol_op declaration - controller/worker.c: do_hostcontrol_op + fix pre-existing goto-clean bug in worker_ctrl that leaked write lock and reference on HOST_OPEN/HOST_CLOSE no-op paths TDD: 8 xce_hostctrl_req validation tests (null ep, null ctrl, null/empty hostname, HOST_DO_NONE no-op, HOST_TAG/UNTAG reject, negative action reject, HOST_OPEN/CLOSE accept via xce_request). 116/116 xcelib tests pass. CGO_ENABLED=0 Go backend tests pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
78 lines
3.5 KiB
C
78 lines
3.5 KiB
C
#if !defined(_CLIENT_H_)
|
|
|
|
#define _CLIENT_H_ 1
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "netio.h"
|
|
#include "request.h"
|
|
#include "xce/types.h"
|
|
#include "xceapi.h"
|
|
|
|
typedef void* xcecli_ctx_t;
|
|
|
|
#define N_MAX_MASTERS (3)
|
|
|
|
typedef struct {
|
|
int nmasters;
|
|
char* masters[N_MAX_MASTERS];
|
|
int master_ports[N_MAX_MASTERS];
|
|
char* from;
|
|
char* key;
|
|
} xce_client_config_t;
|
|
|
|
#define xcecli_jobfinish(ctx, finish) xcecli_notify_jobfinish(ctx, finish)
|
|
|
|
extern int xcecli_ctx_init(xcecli_ctx_t*, xce_client_config_t*);
|
|
extern void xcecli_ctx_fini(xcecli_ctx_t);
|
|
extern int xcecli_set_handler(xcecli_ctx_t, xce_request_handler_t, void*);
|
|
extern int xcecli_start(xcecli_ctx_t);
|
|
extern int xcecli_stop(xcecli_ctx_t);
|
|
extern int xcecli_wakeup(xcecli_ctx_t, int);
|
|
extern int xcecli_hello(xcecli_ctx_t, char*);
|
|
extern int xcecli_nop(xcecli_ctx_t);
|
|
extern int xcecli_heartbeat(xcecli_ctx_t, int);
|
|
extern int xcecli_shutdown(xcecli_ctx_t);
|
|
extern int xcecli_reslist(xcecli_ctx_t, xce_resource_t***);
|
|
extern int xcecli_join(xcecli_ctx_t, int, hostattrs_t*);
|
|
extern int xcecli_workerlist(xcecli_ctx_t, xce_worker_t***);
|
|
extern int xcecli_jobdispatch(xcecli_ctx_t, xce_job_dispatch_t*);
|
|
extern int xcecli_joblist(xcecli_ctx_t, xce_job_t***);
|
|
extern int xcecli_clusterconf(xcecli_ctx_t, xce_clusterconf_t**);
|
|
extern int xcecli_notify_jobfinish(xcecli_ctx_t, xce_jobfinish_t*);
|
|
extern int xcecli_notify_jobstart(xcecli_ctx_t, job_pidinfo_t*);
|
|
extern int xcecli_notify_jobfail(xcecli_ctx_t c, job_failinfo_t*);
|
|
extern int xcecli_notify_jobstop(xcecli_ctx_t, uint64_t);
|
|
extern int xcecli_notify_jobresume(xcecli_ctx_t, uint64_t);
|
|
extern int xcecli_notify_jobpostdone(xcecli_ctx_t, uint64_t);
|
|
extern int xcecli_jobsubmit(xcecli_ctx_t, xce_job_submit_t*, uint64_t*);
|
|
extern int xcecli_update_resvals(xcecli_ctx_t, int, xce_resval_t**);
|
|
extern int xcecli_resval(xcecli_ctx_t, char*, char*, xce_resval_t***);
|
|
extern int xcecli_update_jusage(xcecli_ctx_t, uint64_t, int, int*, int, int*,
|
|
int, xce_rusage_t**);
|
|
extern int xcecli_notify(xcecli_ctx_t, xce_notify_data_t*);
|
|
extern int xcecli_jobctrl(xcecli_ctx_t, xce_jobctrl_t*);
|
|
extern int xcecli_notify_jobchkpt(xcecli_ctx_t, uint64_t, char*);
|
|
extern int xcecli_queuectrl(xcecli_ctx_t, xce_queuectrl_t*);
|
|
extern int xcecli_hostctrl(xcecli_ctx_t, xce_hostctrl_t*);
|
|
extern int xcecli_runtask(xcecli_ctx_t, xce_taskrun_t*);
|
|
extern int xcecli_notify_taskstart(xcecli_ctx_t, xce_task_pidinfo_t*);
|
|
extern int xcecli_notify_taskfail(xcecli_ctx_t, xce_task_failinfo_t*);
|
|
extern int xcecli_notify_taskfinish(xcecli_ctx_t, xce_task_finish_t*);
|
|
extern endpoint_t* xcecli_get_my_endpoint(xcecli_ctx_t);
|
|
extern xce_peerinfo_t* xcecli_get_myinfo(xcecli_ctx_t);
|
|
extern void xcecli_block_tasks(xcecli_ctx_t);
|
|
extern void xcecli_unblock_tasks(xcecli_ctx_t);
|
|
extern int xcecli_set_pend_reason(xcecli_ctx_t, xce_preason_set_t*);
|
|
extern int xcecli_clear_reason(xcecli_ctx_t, int, uint64_t*);
|
|
extern int xcecli_jobinfo(xcecli_ctx_t, uint64_t, xce_job_t**);
|
|
|
|
#define xcecli_free_ress(nres, ress) xce_free_ress(nres, ress)
|
|
#define xcecli_free_workers(nworkers, workers) \
|
|
xce_free_workers(nworkers, workers)
|
|
#define xcecli_free_jobs(njobs, jobs) xce_free_jobs(njobs, jobs)
|
|
#define xcecli_free_queues(nqueues, queues) xce_free_queues(nqueues, queues)
|
|
#define xcecli_free_groups(ngroups, groups) xce_free_groups(ngroups, groups)
|
|
#define xcecli_free_clusterconf(conf) xce_free_clusterconf(conf)
|
|
|
|
#endif
|