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_reservation.go 6.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package slurmer
  2. /*
  3. #cgo LDFLAGS: -lslurm
  4. #include<stdlib.h>
  5. #include<slurm/slurm.h>
  6. #include<slurm/slurm_errno.h>
  7. struct reserve_info_msg *get_reserve_info(){
  8. struct reserve_info_msg* reservation_buffer;
  9. if(slurm_load_reservations ((time_t) NULL,
  10. &reservation_buffer))
  11. return NULL;
  12. return reservation_buffer;
  13. }
  14. struct reserve_info* reservation_from_list(struct reserve_info_msg *list, int i){
  15. return &list->reservation_array[i];
  16. }
  17. void free_reservation_buffer(void* buffer){
  18. slurm_free_reservation_info_msg ((struct reserve_info_msg*)buffer);
  19. }
  20. */
  21. import "C"
  22. import (
  23. pbslurm "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_slurm/gen/idl"
  24. "context"
  25. "strings"
  26. )
  27. type ReservationInfoMsg struct {
  28. LastUpdate int64
  29. RecordCount uint32
  30. ReservationList []pbslurm.ReservationInfo
  31. ErrorCode uint32
  32. }
  33. func Reservation_info_convert_c_to_go(c_struct *C.struct_reserve_info) pbslurm.ReservationInfo {
  34. var go_struct pbslurm.ReservationInfo
  35. go_struct.Accounts = C.GoString(c_struct.accounts)
  36. go_struct.EndTime = int64(c_struct.end_time)
  37. go_struct.Features = C.GoString(c_struct.features)
  38. go_struct.Flags = uint32(c_struct.flags)
  39. go_struct.Licenses = C.GoString(c_struct.licenses)
  40. go_struct.Name = C.GoString(c_struct.name)
  41. go_struct.Features = C.GoString(c_struct.features)
  42. go_struct.NodeCnt = uint32(c_struct.node_cnt)
  43. go_struct.CoreCnt = uint32(c_struct.core_cnt)
  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.NodeList = C.GoString(c_struct.node_list)
  51. go_struct.Partition = C.GoString(c_struct.partition)
  52. go_struct.StartTime = int64(c_struct.start_time)
  53. //go_struct.clusters = C.GoString(c_struct.clusters)
  54. return go_struct
  55. }
  56. func Get_all_reservation() ReservationInfoMsg {
  57. var go_reservation_buffer ReservationInfoMsg
  58. c_reservation_buffer := C.get_reserve_info()
  59. if c_reservation_buffer == nil {
  60. go_reservation_buffer.LastUpdate = int64(0)
  61. go_reservation_buffer.RecordCount = uint32(0)
  62. go_reservation_buffer.ErrorCode = uint32(C.slurm_get_errno())
  63. return go_reservation_buffer
  64. }
  65. go_reservation_buffer.LastUpdate = int64(c_reservation_buffer.last_update)
  66. go_reservation_buffer.RecordCount = uint32(c_reservation_buffer.record_count)
  67. go_reservation_buffer.ReservationList = make([]pbslurm.ReservationInfo, c_reservation_buffer.record_count, c_reservation_buffer.record_count)
  68. for i := uint32(0); i < go_reservation_buffer.RecordCount; i++ {
  69. reservation := C.reservation_from_list(c_reservation_buffer, C.int(i))
  70. go_reservation := Reservation_info_convert_c_to_go(reservation)
  71. go_reservation_buffer.ReservationList[i] = go_reservation
  72. }
  73. C.slurm_free_reservation_info_msg(c_reservation_buffer)
  74. return go_reservation_buffer
  75. }
  76. func (slurmStruct SlurmStruct) ListReservations(ctx context.Context, req *pbslurm.ListReservationsReq) (*pbslurm.ListReservationsResp, error) {
  77. reservationList := Get_all_reservation()
  78. var resp = pbslurm.ListReservationsResp{}
  79. for _, reservation := range reservationList.ReservationList {
  80. reservationInfoResult := reservation
  81. resp.ReservationList = append(resp.ReservationList, &reservationInfoResult)
  82. }
  83. return &resp, nil
  84. }
  85. func GetReservationsInfo() ReservationInfoMsg {
  86. var goReservationBuffer ReservationInfoMsg
  87. cReservationBuffer := C.get_reservation_info()
  88. goReservationBuffer.RecordCount = uint32(cReservationBuffer.record_count)
  89. goReservationBuffer.ReservationList = make([]pbslurm.ReservationInfo, cReservationBuffer.record_count, cReservationBuffer.record_count)
  90. for i := uint32(0); i < goReservationBuffer.RecordCount; i++ {
  91. Reservation := C.reservation_from_list(&cReservationBuffer, C.int(i))
  92. goReservation := ReservationDescriptorConvertCToGo(Reservation)
  93. goReservationBuffer.ReservationList[i] = goReservation
  94. }
  95. return goReservationBuffer
  96. }
  97. func ReservationDescriptorConvertCToGo(cStruct *C.struct_slurmdb_reservation_rec) pbslurm.ReservationInfo {
  98. var goStruct pbslurm.ReservationInfo
  99. goStruct.Name = C.GoString(cStruct.name)
  100. return goStruct
  101. }
  102. func (slurmStruct SlurmStruct) GetReservation(ctx context.Context, req *pbslurm.GetReservationReq) (*pbslurm.GetReservationResp, error) {
  103. ReservationList := GetReservationsInfo()
  104. resp := pbslurm.GetReservationResp{}
  105. for _, reservation := range ReservationList.ReservationList {
  106. reservationInfoResult := reservation
  107. if strings.Contains(reservation.Name, req.ReservationName) {
  108. resp.ReservationInfos = append(resp.ReservationInfos, &reservationInfoResult)
  109. }
  110. }
  111. return &resp, nil
  112. }
  113. /*func (slurmStruct SlurmStruct) GetReservationByName(ctx context.Context, req *pbslurm.ReservationInfoMsgReq) (*pbslurm.ReservationInfoMsgResp, error) {
  114. reservation := Get_reservation_info(req.ReservationName)
  115. var resp = pbslurm.ReservationInfoMsgResp{}
  116. for _, reservation := range reservation.Reservation_list {
  117. reservationInfoResult := pbslurm.Reservation_Info{}
  118. reservationInfoResult.Name = reservation.Name
  119. /*nodeInfoResult.Boards = uint32(node.Boards)
  120. nodeInfoResult.RealMemory = node.Real_memory
  121. nodeInfoResult.Sockets = uint32(node.Sockets)
  122. nodeInfoResult.Threads = uint32(node.Threads)*
  123. resp.ReservationList = append(resp.ReservationList, &reservationInfoResult)
  124. }
  125. return &resp, nil
  126. }
  127. func Get_reservation_info(name string) ReserveInfoMsg {
  128. go_reservation_buffer := Get_all_reservation()
  129. //partitionList := list.New()
  130. for i := range go_reservation_buffer.ReservationList {
  131. //遍历nodeList集合
  132. reservation := go_reservation_buffer.ReservationList[i]
  133. fmt.Println("reservationName: " + reservation.Name)
  134. //当集合中的名字等于传过来的值
  135. if name == reservation.Name {
  136. /*partitionList.PushFront(partition.Name)
  137. partitionList.PushFront(partition.Nodes)*
  138. } else {
  139. }
  140. //fmt.Println(partition.Node_inx)
  141. }
  142. return go_reservation_buffer
  143. }*/

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.