PageRenderTime 25ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/amfphp_full_install/amfphp/services/slurm_web/main.php

https://github.com/jcftang/flex-slurm
PHP | 351 lines | 311 code | 35 blank | 5 comment | 45 complexity | b3b9506b6a8744a0df1ff243579230b0 MD5 | raw file
  1. <?php
  2. class main
  3. {
  4. // CONSTRUCTOR
  5. public function __construct()
  6. {}
  7. // FUNCTIONS
  8. public function get_slurm_version($option=4)
  9. {
  10. $result = slurm_version($option);
  11. switch($option)
  12. {
  13. case 0:
  14. case 1:
  15. case 2:
  16. break;
  17. default:
  18. $result = $result[0].".".$result[1].".".$result[2];
  19. break;
  20. }
  21. return "".$result;
  22. }
  23. public function get_configuration()
  24. {
  25. require_once("objects/key_value.php");
  26. $keys = slurm_get_control_configuration_keys();
  27. $values = slurm_get_control_configuration_values();
  28. $rslt_arr = array();
  29. $lngth = count($keys);
  30. for($i=0;$i<$lngth;$i++) {
  31. array_push($rslt_arr,new key_value($keys[$i],$values[$i]));
  32. }
  33. return $rslt_arr;
  34. }
  35. public function slurmctld_status() {
  36. $arr = slurm_ping();
  37. return array($arr["Prim. Controller"],$arr["Sec. Controller"]);
  38. }
  39. public function get_full_job_summary()
  40. {
  41. require_once("objects/summary/partition_job_cpus.php");
  42. require_once("objects/summary/partition_node_summary.php");
  43. require_once("objects/Partition.php");
  44. require_once("includes/constants.php");
  45. $jobs = slurm_load_job_information();
  46. if(count($jobs>0)) {
  47. $partNames = slurm_print_partition_names();
  48. if(is_array($partNames)) {
  49. $return_arr = array("TOTAL"=> array("JOBS"=>array(0,0),"CPUS"=>array(0,0)),"PARTITION"=>array());
  50. foreach($partNames as $val) {
  51. // Job Check 0 = pending | 1 = running
  52. // Cpus 0 = Idle | 1 = In Use
  53. $new_arr = array("JOBS" => array(0,0),"CPUS" => array(0,0,0,0));
  54. $return_arr["PARTITION"][$val] = $new_arr;
  55. }
  56. foreach($jobs as $key_job => $value_job) {
  57. switch($value_job["JobState"]) {
  58. case "PENDING":
  59. $return_arr["TOTAL"]["JOBS"][0]++;
  60. $return_arr["TOTAL"]["CPUS"][0]+=$value_job["NumCPUs"];
  61. $return_arr["PARTITION"][$value_job["Partition"]]["JOBS"][0]++;
  62. $return_arr["PARTITION"][$value_job["Partition"]]["CPUS"][0] += $value_job["NumCPUs"];
  63. break;
  64. case "RUNNING":
  65. $return_arr["TOTAL"]["JOBS"][1]++;
  66. $return_arr["TOTAL"]["CPUS"][1]+=$value_job["NumCPUs"];
  67. $return_arr["PARTITION"][$value_job["Partition"]]["JOBS"][1]++;
  68. $return_arr["PARTITION"][$value_job["Partition"]]["CPUS"][1] += $value_job["NumCPUs"];
  69. break;
  70. default:
  71. break;
  72. }
  73. }
  74. // Update available cpus with partition data :)
  75. foreach($return_arr["PARTITION"] as $key => $val) {
  76. $var = $this->get_partition_node_summary($key);
  77. if(is_object($var) && $var != NULL) {
  78. $return_arr["PARTITION"][$key]["CPUS"][2] += $var->cpu_arr[SLURM_NODE_STATE_UNKNOWN];
  79. $return_arr["PARTITION"][$key]["CPUS"][2] += $var->cpu_arr[SLURM_NODE_STATE_DOWN];
  80. $return_arr["PARTITION"][$key]["CPUS"][2] += $var->cpu_arr[SLURM_NODE_STATE_ERROR];
  81. }
  82. }
  83. foreach($this->get_partition_list() as $part_obj) {
  84. $return_arr["PARTITION"][$part_obj->PartitionName]["CPUS"][3] = $part_obj->TotalCPUs -
  85. $return_arr["PARTITION"][$part_obj->PartitionName]["CPUS"][2] -
  86. $return_arr["PARTITION"][$part_obj->PartitionName]["CPUS"][1];
  87. }
  88. $tmp = array();
  89. array_push($tmp,new partition_job_cpus("TOTAL",$return_arr["TOTAL"]["JOBS"][0],$return_arr["TOTAL"]["JOBS"][1],$return_arr["TOTAL"]["CPUS"][0],$return_arr["TOTAL"]["CPUS"][1],0,0));
  90. foreach($return_arr["PARTITION"] as $key => $value)
  91. {
  92. array_push($tmp,new partition_job_cpus($key,$value["JOBS"][0],$value["JOBS"][1],$value["CPUS"][0],$value["CPUS"][1],$value["CPUS"][2],$value["CPUS"][3]));
  93. }
  94. return $tmp;
  95. } else {
  96. return NULL;
  97. }
  98. } else {
  99. return NULL;
  100. }
  101. }
  102. function get_partition_node_summary($value)
  103. {
  104. return $this->get_full_node_summary($value,$this->get_nodes_from_partition($value));
  105. }
  106. function get_partition_list()
  107. {
  108. $part_names = slurm_print_partition_names();
  109. if(is_array($part_names)) {
  110. return $this->process_partition_names($part_names);
  111. } else {
  112. return $part_names;
  113. }
  114. }
  115. private function process_partition_names($name_array)
  116. {
  117. require_once("objects/Partition.php");
  118. $length = count($name_array);
  119. if($length == 0) { // Sanity check :)
  120. return NULL;
  121. }
  122. $result = array();
  123. $part;
  124. for($i=0;$i<$length;$i++) {
  125. $part = new Partition();
  126. $part->parse_partition_array(slurm_get_specific_partition_info($name_array[$i]));
  127. array_push($result,$part);
  128. }
  129. return $result;
  130. }
  131. function get_full_node_summary($name=NULL,$tmp=NULL)
  132. {
  133. require_once("includes/constants.php");
  134. require_once("objects/Node.php");
  135. require_once("objects/summary/partition_node_summary.php");
  136. $part_sum;
  137. if($name == NULL) {
  138. $part_sum = new partition_node_summary("TOTAL");
  139. } else {
  140. $part_sum = new partition_node_summary($name);
  141. }
  142. if($tmp == NULL) {
  143. foreach(slurm_get_node_elements() as $arr) {
  144. if($arr["State"]<SLURM_LAST_STATE) {
  145. $part_sum->core_arr[$arr["State"]] += $arr["#Cores/CPU"];
  146. $part_sum->cpu_arr[$arr["State"]] += $arr["#CPU'S"];
  147. $part_sum->state_arr[$arr["State"]] += 1;
  148. } else {
  149. $part_sum->core_arr[0] += $arr["#Cores/CPU"];
  150. $part_sum->cpu_arr[0] += $arr["#CPU'S"];
  151. $part_sum->state_arr[0] += 1;
  152. }
  153. }
  154. } else {
  155. foreach($tmp as $nde) {
  156. if($nde->node_state<SLURM_LAST_STATE) {
  157. $part_sum->core_arr[$nde->node_state] += $nde->cores;
  158. $part_sum->cpu_arr[$nde->node_state] += $nde->cpus;
  159. $part_sum->state_arr[$nde->node_state] += 1;
  160. } else {
  161. $part_sum->core_arr[0] += $nde->cores;
  162. $part_sum->cpu_arr[0] += $nde->cpus;
  163. $part_sum->state_arr[0] += 1;
  164. }
  165. }
  166. }
  167. return $part_sum;
  168. }
  169. public function get_sinfo_rows($part_name=NULL)
  170. {
  171. require_once("objects/summary/sinfo_object.php");
  172. $nodes = array();
  173. if(strcmp($part_name,"")==0 || strcmp($part_name,"TOTAL")==0 || $part_name==NULL) {
  174. foreach(slurm_print_partition_names() as $tmp) {
  175. $nodes = $this->get_sinfo_for_partition($tmp,$nodes);
  176. if(!is_array($nodes)) {
  177. break;
  178. }
  179. }
  180. return $nodes;
  181. } else {
  182. $nodes = $this->get_sinfo_for_partition($part_name,$nodes);
  183. }
  184. return $nodes;
  185. }
  186. private function get_sinfo_for_partition($tmp,$nodes) {
  187. $partition_nodes = $this->get_nodes_from_partition($tmp);
  188. if(is_array($partition_nodes)) {
  189. $partition_nodes = $this->split_into_associative_arrays($partition_nodes);
  190. foreach($partition_nodes as $key => $val) {
  191. array_push($nodes,$this->convert_to_sinfo_row($val,$tmp));
  192. }
  193. return $nodes;
  194. } else {
  195. return $partition_nodes; // ERROR
  196. }
  197. }
  198. public function get_specific_partition_info($part_name) {
  199. require_once("objects/Partition.php");
  200. if(is_string($part_name) && ($part_name != NULL || $part_name != null)) {
  201. if(strcmp($part_name,"")==0)
  202. return null;
  203. $tmp = slurm_get_specific_partition_info($part_name);
  204. if(is_array($tmp)) {
  205. $part = new Partition();
  206. $part->parse_partition_array($tmp);
  207. return $part;
  208. } else {
  209. return $tmp;
  210. }
  211. }
  212. }
  213. private function convert_to_sinfo_row($val,$partname) {
  214. $names = array();
  215. foreach($val as $nde) {
  216. array_push($names,$nde->name);
  217. }
  218. $names = slurm_array_to_hostlist($names);
  219. return new sinfo_object(
  220. $names["HOSTLIST"],
  221. count($val),
  222. $partname,
  223. $val[0]->node_state,
  224. $val[0]->cpus,
  225. $val[0]->sockets.":".$val[0]->cores.":".$val[0]->threads,
  226. $val[0]->real_memory,
  227. $val[0]->tmp_disk,
  228. $val[0]->weight,
  229. $val[0]->features,
  230. $val[0]->reason);
  231. }
  232. private function split_into_associative_arrays($origin)
  233. {
  234. $key_assoc_arr = array();
  235. foreach($origin as $inner) {
  236. $str = $inner->create_my_key();
  237. if(!array_key_exists($str,$key_assoc_arr)) {
  238. $key_assoc_arr[$str] = array();
  239. }
  240. array_push($key_assoc_arr[$str],$inner);
  241. }
  242. return $key_assoc_arr;
  243. }
  244. public function get_nodes_from_partition($value)
  245. {
  246. require_once("objects/Partition.php");
  247. require_once("objects/Node.php");
  248. $partition = new Partition();
  249. $tmp = slurm_get_specific_partition_info($value);
  250. if(is_array($tmp)) {
  251. $partition->parse_partition_array($tmp);
  252. $node_tmp = array();
  253. foreach(slurm_hostlist_to_array($partition->Nodes) as $split_node) {
  254. $temp_nde = slurm_get_node_element_by_name($split_node);
  255. $nde = new Node();
  256. $nde->parse_node_array($temp_nde[$split_node]);
  257. array_push($node_tmp,$nde);
  258. }
  259. return $node_tmp;
  260. } else {
  261. return $tmp;
  262. }
  263. }
  264. public function get_filtered_node_list()
  265. {
  266. require_once("objects/Partition.php");
  267. require_once("objects/Node.php");
  268. require_once("objects/summary/partition_nodes.php");
  269. $partnames = slurm_print_partition_names();
  270. $tmp;
  271. if(is_array($partnames)) {
  272. $result = array();
  273. for($i = 0;$i < count($partnames); $i++) {
  274. $rslt = $this->get_nodes_from_partition($partnames[$i]);
  275. $tmp = new partition_nodes();
  276. $tmp->partition = $partnames[$i];
  277. $tmp->nodes = $rslt;
  278. array_push($result,$tmp);
  279. }
  280. return $this->calculate_hostlists($result);
  281. } else {
  282. return NULL;
  283. }
  284. }
  285. private function calculate_hostlists($arr_part_nodes) {
  286. require_once("objects/Node.php");
  287. require_once("includes/constants.php");
  288. foreach($arr_part_nodes as $pnde) {
  289. $part_hostlists = array();
  290. $node_arr = array(
  291. array(),
  292. array(),
  293. array(),
  294. array(),
  295. array(),
  296. array(),
  297. array(),
  298. array()
  299. );
  300. foreach($pnde->nodes as $nde) {
  301. if($nde->node_state <= SLURM_LAST_STATE) {
  302. array_push($node_arr[$nde->node_state],$nde->name);
  303. continue;
  304. }
  305. array_push($node_arr[0],$nde->name);
  306. }
  307. foreach($node_arr as $narr) {
  308. $host_arr = slurm_array_to_hostlist($narr);
  309. array_push($part_hostlists,$host_arr["HOSTLIST"]);
  310. }
  311. $pnde->hostlists = $part_hostlists;
  312. }
  313. return $arr_part_nodes;
  314. }
  315. }
  316. ?>