You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

slurmdb_qos.go 3.7 kB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package slurmer
  2. import "C"
  3. import pbslurm "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_slurm/gen/idl"
  4. /*
  5. #cgo LDFLAGS: -lslurmdb
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <stdint.h>
  9. #include <slurm/slurm.h>
  10. #include <slurm/slurmdb.h>
  11. #include<slurm/slurm_errno.h>
  12. #include <memory.h>
  13. #include <malloc.h>
  14. typedef struct slurmdb_qos_rec {
  15. char *description;
  16. uint32_t id;
  17. uint32_t flags;
  18. uint32_t grace_time;
  19. uint64_t grp_cpu_mins;
  20. uint64_t grp_cpu_run_mins;
  21. uint32_t grp_cpus;
  22. uint32_t grp_jobs;
  23. uint32_t grp_mem;
  24. uint32_t grp_nodes;
  25. uint32_t grp_submit_jobs;
  26. uint32_t grp_wall;
  27. uint64_t max_cpu_mins_pj;
  28. uint64_t max_cpu_run_mins_pu;
  29. uint32_t max_cpus_pj;
  30. uint32_t max_cpus_pu;
  31. uint32_t max_jobs_pu;
  32. uint32_t max_nodes_pj;
  33. uint32_t max_nodes_pu;
  34. uint32_t max_submit_jobs_pu;
  35. uint32_t max_wall_pj;
  36. char *name;
  37. bitstr_t *preempt_bitstr;
  38. List preempt_list;
  39. uint16_t preempt_mode;
  40. uint32_t priority;
  41. assoc_mgr_qos_usage_t *usage;
  42. double usage_factor;
  43. double usage_thres;
  44. } slurmdb_qos_rec_a;
  45. typedef struct qos_info {
  46. uint32_t record_count;
  47. slurmdb_qos_rec_t *array;
  48. } qos_info_t;
  49. struct qos_info get_qos_list() {
  50. struct qos_info qosinfo;
  51. slurmdb_qos_cond_t *qos_cond = NULL;
  52. void *conn = slurmdb_connection_get();
  53. List qoslist = slurmdb_qos_get(conn, qos_cond);
  54. uint16_t size = slurm_list_count(qoslist);
  55. qosinfo.record_count = size;
  56. qosinfo.array = malloc(size * sizeof(slurmdb_qos_rec_t));
  57. //slurmdb_qos_rec_t qosArray[size];
  58. slurmdb_qos_rec_t *rec = NULL;
  59. ListIterator itr = slurm_list_iterator_create(qoslist);
  60. int i = 0;
  61. while ((rec = slurm_list_next(itr))) {
  62. qosinfo.array[i] = *rec;
  63. i++;
  64. }
  65. slurmdb_connection_close(&conn);
  66. slurm_list_destroy(qoslist);
  67. return qosinfo;
  68. }
  69. struct slurmdb_qos_rec *qos_from_list(struct qos_info *qos_rec_t, int i) {
  70. return (struct slurmdb_qos_rec *) &qos_rec_t->array[i];
  71. }
  72. */
  73. import "C"
  74. import (
  75. "context"
  76. )
  77. type Slurmdb_qos_rec struct {
  78. Description string
  79. Id uint32
  80. Flags uint32
  81. GraceTime uint32
  82. GrpCpuMins uint64
  83. GrpCpuRunMins uint64
  84. GrpCpus uint32
  85. GrpJobs uint32
  86. GrpMem uint32
  87. GrpNodes uint32
  88. GrpSubmitJobs uint32
  89. MaxCpuMinsPj uint64
  90. MaxCpuRunMinsPu uint64
  91. MaxCpusPj uint32
  92. MaxCpusPu uint32
  93. MaxJobsPu uint32
  94. MaxNodesPj uint32
  95. MaxNodesPu uint32
  96. MaxSubmitJobsPu uint32
  97. MaxWallPj uint32
  98. Name string
  99. preemptList []string
  100. preempt_mode uint16
  101. priority uint32
  102. usage_factor float64
  103. usage_thres float64
  104. }
  105. type QosInfoMsg struct {
  106. RecordCount uint32
  107. QosList []pbslurm.QosInfo
  108. }
  109. func QosDescriptorConvertCToGo(cStruct *C.struct_slurmdb_qos_rec) pbslurm.QosInfo {
  110. var goStruct pbslurm.QosInfo
  111. goStruct.Name = C.GoString(cStruct.name)
  112. return goStruct
  113. }
  114. func GetQosInfo() QosInfoMsg {
  115. var goQosBuffer QosInfoMsg
  116. cQosBuffer := C.get_qos_list()
  117. goQosBuffer.RecordCount = uint32(cQosBuffer.record_count)
  118. goQosBuffer.QosList = make([]pbslurm.QosInfo, cQosBuffer.record_count, cQosBuffer.record_count)
  119. for i := uint32(0); i < goQosBuffer.RecordCount; i++ {
  120. qos := C.qos_from_list(&cQosBuffer, C.int(i))
  121. goQos := QosDescriptorConvertCToGo(qos)
  122. goQosBuffer.QosList[i] = goQos
  123. }
  124. return goQosBuffer
  125. }
  126. func (slurmStruct SlurmStruct) ListQoss(ctx context.Context, req *pbslurm.ListQossReq) (*pbslurm.ListQossResp, error) {
  127. qosList := GetQosInfo()
  128. resp := pbslurm.ListQossResp{}
  129. for _, qos := range qosList.QosList {
  130. qosInfoResult := qos
  131. //userInfoResult.Name = user.Name
  132. resp.QosInfos = append(resp.QosInfos, &qosInfoResult)
  133. }
  134. return &resp, nil
  135. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.