pcm-coordinator/adaptor/pcm_slurm/service/tianhe/association.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
}