forked from JointCloud/pcm-coordinator
146 lines
4.3 KiB
Go
146 lines
4.3 KiB
Go
package tianhe
|
|
|
|
/*
|
|
#cgo LDFLAGS: -lslurmdb
|
|
|
|
#include <stdio.h>
|
|
#include <slurm/slurm.h>
|
|
#include <slurm/slurmdb.h>
|
|
#include <memory.h>
|
|
#include <malloc.h>
|
|
|
|
typedef struct assoc_info_msg {
|
|
uint32_t record_count;
|
|
slurmdb_association_rec_t *assoc_array;
|
|
} assoc_info_msg_t;
|
|
|
|
typedef struct list_assoc_req {
|
|
uint32_t slurm_version;
|
|
char *cluster;
|
|
char *account;
|
|
char *user;
|
|
char *partition;
|
|
} list_assoc_req_t;
|
|
|
|
typedef struct slurmdb_association_rec{
|
|
List accounting_list;
|
|
char *acct;
|
|
char *cluster;
|
|
uint32_t def_qos_id;
|
|
uint64_t grp_cpu_mins;
|
|
uint64_t grp_cpu_run_mins;
|
|
uint32_t grp_cpus;
|
|
uint32_t grp_jobs;
|
|
uint32_t grp_mem;
|
|
uint32_t grp_nodes;
|
|
uint32_t grp_submit_jobs;
|
|
uint32_t grp_wall;
|
|
uint32_t id;
|
|
uint16_t is_def;
|
|
uint32_t lft;
|
|
uint64_t max_cpu_mins_pj;
|
|
uint64_t max_cpu_run_mins;
|
|
uint32_t max_cpus_pj;
|
|
uint32_t max_jobs;
|
|
uint32_t max_nodes_pj;
|
|
uint32_t max_submit_jobs;
|
|
uint32_t max_wall_pj;
|
|
char *parent_acct;
|
|
uint32_t parent_id;
|
|
char *partition;
|
|
List qos_list;
|
|
uint32_t rgt;
|
|
uint32_t shares_raw;
|
|
uint32_t uid;
|
|
assoc_mgr_association_usage_t *usage;
|
|
char *user;
|
|
} slurmdb_association_rec_pcm;
|
|
|
|
struct assoc_info_msg get_assoc_infos() {
|
|
struct assoc_info_msg associnfo;
|
|
List assocList = NULL;
|
|
slurmdb_association_cond_t *assoc_cond = NULL;
|
|
void *db_conn;
|
|
db_conn = slurmdb_connection_get();
|
|
assocList = slurmdb_associations_get(db_conn, assoc_cond);
|
|
slurmdb_connection_close(&db_conn);
|
|
|
|
slurmdb_association_rec_t *rec = NULL;
|
|
ListIterator itr = slurm_list_iterator_create(assocList);
|
|
int i = 0;
|
|
uint32_t length;
|
|
length = slurm_list_count(assocList);
|
|
associnfo.record_count = length;
|
|
associnfo.assoc_array = malloc(length * sizeof(slurmdb_association_rec_t));
|
|
while ((rec = slurm_list_next(itr))) {
|
|
associnfo.assoc_array[i] = *rec;
|
|
i++;
|
|
}
|
|
return associnfo;
|
|
}
|
|
|
|
struct slurmdb_association_rec *assoc_from_list(struct assoc_info_msg *list, int i) {
|
|
return (struct slurmdb_association_rec *) &list->assoc_array[i];
|
|
}
|
|
|
|
*/
|
|
import "C"
|
|
import pbslurm "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_slurm/gen/idl"
|
|
|
|
type AssocInfoMsg struct {
|
|
LastUpdate int64
|
|
RecordCount uint32
|
|
AssocInfoList []pbslurm.AssociationInfo
|
|
}
|
|
|
|
func AssocDescriptorConvertCToGo(cStruct *C.struct_slurmdb_association_rec) pbslurm.AssociationInfo {
|
|
var goStruct pbslurm.AssociationInfo
|
|
//goStruct.AccountingList = cStruct.accounting_list
|
|
goStruct.Acct = C.GoString(cStruct.acct)
|
|
goStruct.Cluster = C.GoString(cStruct.cluster)
|
|
goStruct.DefQosId = int32(cStruct.def_qos_id)
|
|
goStruct.GrpCpuMins = int64(cStruct.grp_cpu_mins)
|
|
goStruct.GrpGpuRunMins = int64(cStruct.grp_cpu_run_mins)
|
|
goStruct.GrpCpus = int32(cStruct.grp_cpus)
|
|
goStruct.GrpJobs = int32(cStruct.grp_jobs)
|
|
goStruct.GrpMem = int32(cStruct.grp_mem)
|
|
goStruct.GrpNodes = int32(cStruct.grp_nodes)
|
|
goStruct.GrpSubmitJobs = int32(cStruct.grp_submit_jobs)
|
|
goStruct.GrpWall = int32(cStruct.grp_wall)
|
|
goStruct.Id = int32(cStruct.id)
|
|
goStruct.IsDef = int32(cStruct.is_def)
|
|
goStruct.Lft = int32(cStruct.lft)
|
|
goStruct.MaxCpuMinsPj = int64(cStruct.max_cpu_mins_pj)
|
|
goStruct.MaxCpuRunMins = int64(cStruct.max_cpu_run_mins)
|
|
goStruct.MaxCpusPj = int32(cStruct.max_cpus_pj)
|
|
goStruct.MaxJobs = int32(cStruct.max_jobs)
|
|
goStruct.MaxNodesPj = int32(cStruct.max_nodes_pj)
|
|
goStruct.MaxSubmitJobs = int32(cStruct.max_submit_jobs)
|
|
goStruct.MaxWallPj = int32(cStruct.max_wall_pj)
|
|
goStruct.ParentAcct = C.GoString(cStruct.parent_acct)
|
|
goStruct.ParentId = int32(cStruct.parent_id)
|
|
goStruct.Partition = C.GoString(cStruct.partition)
|
|
//goStruct.QosList = cStruct.qos_list
|
|
goStruct.Rgt = int32(cStruct.rgt)
|
|
goStruct.SharesRaw = int32(cStruct.shares_raw)
|
|
goStruct.Uid = int32(cStruct.uid)
|
|
//goStruct.AssocUsage = cStruct.usage
|
|
goStruct.User = C.GoString(cStruct.user)
|
|
return goStruct
|
|
}
|
|
|
|
// GetAssociationInfos list info for all associations
|
|
func GetAssociationInfos() AssocInfoMsg {
|
|
var goAssocBuffer AssocInfoMsg
|
|
cAssocBuffer := C.get_assoc_infos()
|
|
goAssocBuffer.RecordCount = uint32(cAssocBuffer.record_count)
|
|
goAssocBuffer.AssocInfoList = make([]pbslurm.AssociationInfo, cAssocBuffer.record_count, cAssocBuffer.record_count)
|
|
|
|
for i := uint32(0); i < goAssocBuffer.RecordCount; i++ {
|
|
assoc := C.assoc_from_list(&cAssocBuffer, C.int(i))
|
|
goAssociation := AssocDescriptorConvertCToGo(assoc)
|
|
goAssocBuffer.AssocInfoList[i] = goAssociation
|
|
}
|
|
return goAssocBuffer
|
|
}
|