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.

slurm_partition.go 4.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package slurmer
  2. /*
  3. #cgo LDFLAGS: -lslurm
  4. #include<stdlib.h>
  5. #include<slurm/slurm.h>
  6. struct partition_info_msg *get_partition_info(){
  7. struct partition_info_msg* partition_buffer;
  8. if( slurm_load_partitions ((time_t) NULL,
  9. &partition_buffer, SHOW_ALL))
  10. return NULL;
  11. return partition_buffer;
  12. }
  13. struct partition_info* partition_from_list(struct partition_info_msg *list, int i){
  14. return &list->partition_array[i];
  15. }
  16. void free_partition_buffer(void* buffer){
  17. slurm_free_partition_info_msg ((struct partition_info_msg*)buffer);
  18. }
  19. */
  20. import "C"
  21. import (
  22. pbslurm "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_slurm/gen/idl"
  23. "context"
  24. "strings"
  25. )
  26. func Partition_info_convert_c_to_go(c_struct *C.struct_partition_info) pbslurm.PartitionInfo {
  27. var go_struct pbslurm.PartitionInfo
  28. go_struct.AllowAllocNodes = C.GoString(c_struct.allow_alloc_nodes)
  29. go_struct.AllowGroups = C.GoString(c_struct.allow_groups)
  30. go_struct.Alternate = C.GoString(c_struct.alternate)
  31. go_struct.CrType = uint32(c_struct.cr_type)
  32. go_struct.DefMemPerCpu = uint64(c_struct.def_mem_per_cpu)
  33. go_struct.DefaultTime = uint32(c_struct.default_time)
  34. go_struct.Flags = uint32(c_struct.flags)
  35. go_struct.GraceTime = uint32(c_struct.grace_time)
  36. go_struct.MaxCpusPerNode = uint32(c_struct.max_cpus_per_node)
  37. go_struct.MaxMemPerCpu = uint64(c_struct.max_mem_per_cpu)
  38. go_struct.MaxNodes = uint32(c_struct.max_nodes)
  39. go_struct.MaxShare = uint32(c_struct.max_share)
  40. go_struct.MaxTime = uint32(c_struct.max_time)
  41. go_struct.MinNodes = uint32(c_struct.min_nodes)
  42. go_struct.Name = C.GoString(c_struct.name)
  43. //go_struct.Node_inx = int32(C.int32_ptr(c_struct.node_inx))
  44. /*t := C.find_node_inx(c_struct.node_inx)
  45. fmt.Printf("%d", t)
  46. go_struct.Node_inx = make([]int32, t, t)
  47. for i := int32(0); i < int32(t); i++ {
  48. go_struct.Node_inx[i] = int32(C.int32_ptr(c_struct.node_inx, C.int(i)))
  49. }*/
  50. go_struct.Nodes = C.GoString(c_struct.nodes)
  51. go_struct.PreemptMode = uint32(c_struct.preempt_mode)
  52. go_struct.StateUp = uint32(c_struct.state_up)
  53. go_struct.TotalCpus = uint32(c_struct.total_cpus)
  54. go_struct.TotalNodes = uint32(c_struct.total_nodes)
  55. return go_struct
  56. }
  57. type PartitionInfoMsg struct {
  58. LastUpdate int64
  59. RecordCount uint32
  60. PartitionInfoList []pbslurm.PartitionInfo
  61. }
  62. func Get_partitions() PartitionInfoMsg {
  63. var go_partition_buffer PartitionInfoMsg
  64. c_partition_buffer := C.get_partition_info()
  65. if c_partition_buffer == nil {
  66. go_partition_buffer.LastUpdate = int64(0)
  67. go_partition_buffer.RecordCount = uint32(0)
  68. return go_partition_buffer
  69. }
  70. go_partition_buffer.LastUpdate = int64(c_partition_buffer.last_update)
  71. go_partition_buffer.RecordCount = uint32(c_partition_buffer.record_count)
  72. go_partition_buffer.PartitionInfoList = make([]pbslurm.PartitionInfo, c_partition_buffer.record_count, c_partition_buffer.record_count)
  73. for i := uint32(0); i < go_partition_buffer.RecordCount; i++ {
  74. partition := C.partition_from_list(c_partition_buffer, C.int(i))
  75. go_partition := Partition_info_convert_c_to_go(partition)
  76. go_partition_buffer.PartitionInfoList[i] = go_partition
  77. }
  78. C.slurm_free_partition_info_msg(c_partition_buffer)
  79. return go_partition_buffer
  80. }
  81. func (slurmStruct SlurmStruct) ListPartitions(ctx context.Context, req *pbslurm.ListPartitionsReq) (*pbslurm.ListPartitionsResp, error) {
  82. partitionList := Get_partitions()
  83. var resp = pbslurm.ListPartitionsResp{}
  84. for _, partition := range partitionList.PartitionInfoList {
  85. partitionInfoResult := partition
  86. resp.PartitionList = append(resp.PartitionList, &partitionInfoResult)
  87. }
  88. return &resp, nil
  89. }
  90. func GetPartitionsInfo() PartitionInfoMsg {
  91. var goPartitionBuffer PartitionInfoMsg
  92. cPartitionBuffer := C.get_partition_info()
  93. goPartitionBuffer.RecordCount = uint32(cPartitionBuffer.record_count)
  94. goPartitionBuffer.PartitionInfoList = make([]pbslurm.PartitionInfo, cPartitionBuffer.record_count, cPartitionBuffer.record_count)
  95. for i := uint32(0); i < goPartitionBuffer.RecordCount; i++ {
  96. partition := C.partition_from_list(cPartitionBuffer, C.int(i))
  97. goPartition := PartitionDescriptorConvertCToGo(partition)
  98. goPartitionBuffer.PartitionInfoList[i] = goPartition
  99. }
  100. return goPartitionBuffer
  101. }
  102. func PartitionDescriptorConvertCToGo(cStruct *C.struct_partition_info) pbslurm.PartitionInfo {
  103. var goStruct pbslurm.PartitionInfo
  104. goStruct.Name = C.GoString(cStruct.name)
  105. return goStruct
  106. }
  107. func (slurmStruct SlurmStruct) GetPartition(ctx context.Context, req *pbslurm.GetPartitionReq) (*pbslurm.GetPartitionResp, error) {
  108. PartitionList := GetPartitionsInfo()
  109. resp := pbslurm.GetPartitionResp{}
  110. for _, partition := range PartitionList.PartitionInfoList {
  111. partitionInfoResult := partition
  112. if strings.Contains(partition.Name, req.PartitionName) {
  113. resp.PartitionInfos = append(resp.PartitionInfos, &partitionInfoResult)
  114. }
  115. }
  116. return &resp, nil
  117. }

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.