Skip to content

Commit 39b86af

Browse files
authored
EH: Add qhost's cluster queue summary (#26)
* EH: Watch qacct file; improved types * EH: Add cluster queue summary from qhost
1 parent 74d9de6 commit 39b86af

File tree

5 files changed

+104
-2
lines changed

5 files changed

+104
-2
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ run-privileged: build
4242
run: build
4343
@echo "Running the container..."
4444
mkdir -p ./installation
45-
docker run -p 7070:7070 --rm -it -h master --name $(CONTAINER_NAME) -v ./installation:/opt/cs-install -v ./:/root/go/src/github.com/hpc-gridware/go-clusterscheduler $(IMAGE_NAME):$(IMAGE_TAG) /bin/bash
45+
docker run -p 7070:7070 -p 9464:9464 --rm -it -h master --name $(CONTAINER_NAME) -v ./installation:/opt/cs-install -v ./:/root/go/src/github.com/hpc-gridware/go-clusterscheduler $(IMAGE_NAME):$(IMAGE_TAG) /bin/bash
4646

4747
# Running apptainers in containers requires more permissions. You can drop
4848
# the --privileged flag and the --cap-add SYS_ADMIN flag if you don't need

pkg/qstat/v9.0/parser.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,3 +766,67 @@ func ParseJobInfo(out string) ([]JobInfo, error) {
766766
}
767767
return jobInfos, nil
768768
}
769+
770+
// ParseClusterQueueSummary parses the output of qstat -g c
771+
func ParseClusterQueueSummary(out string) ([]ClusterQueueSummary, error) {
772+
var summaries []ClusterQueueSummary
773+
lines := strings.Split(out, "\n")
774+
775+
// Skip the header lines
776+
for _, line := range lines[2:] {
777+
fields := strings.Fields(line)
778+
if len(fields) != 8 {
779+
continue // Skip lines that don't have the expected number of fields
780+
}
781+
782+
cqLoad, err := strconv.ParseFloat(fields[1], 64)
783+
if err != nil {
784+
return nil, fmt.Errorf("failed to parse CQLoad: %v", err)
785+
}
786+
787+
used, err := strconv.Atoi(fields[2])
788+
if err != nil {
789+
return nil, fmt.Errorf("failed to parse Used: %v", err)
790+
}
791+
792+
reserved, err := strconv.Atoi(fields[3])
793+
if err != nil {
794+
return nil, fmt.Errorf("failed to parse Reserved: %v", err)
795+
}
796+
797+
available, err := strconv.Atoi(fields[4])
798+
if err != nil {
799+
return nil, fmt.Errorf("failed to parse Available: %v", err)
800+
}
801+
802+
total, err := strconv.Atoi(fields[5])
803+
if err != nil {
804+
return nil, fmt.Errorf("failed to parse Total: %v", err)
805+
}
806+
807+
aoACDS, err := strconv.Atoi(fields[6])
808+
if err != nil {
809+
return nil, fmt.Errorf("failed to parse AoACDS: %v", err)
810+
}
811+
812+
cdsuE, err := strconv.Atoi(fields[7])
813+
if err != nil {
814+
return nil, fmt.Errorf("failed to parse CdsuE: %v", err)
815+
}
816+
817+
summary := ClusterQueueSummary{
818+
ClusterQueue: fields[0],
819+
CQLoad: cqLoad,
820+
Used: used,
821+
Reserved: reserved,
822+
Available: available,
823+
Total: total,
824+
AoACDS: aoACDS,
825+
CdsuE: cdsuE,
826+
}
827+
828+
summaries = append(summaries, summary)
829+
}
830+
831+
return summaries, nil
832+
}

pkg/qstat/v9.0/parser_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,4 +420,36 @@ var _ = Describe("Parser", func() {
420420

421421
})
422422

423+
Describe("ClusterQueueSummary", func() {
424+
425+
It("should parse the output of qstat -g c", func() {
426+
input := `CLUSTER QUEUE CQLOAD USED RES AVAIL TOTAL aoACDS cdsuE
427+
--------------------------------------------------------------------------------
428+
all.q 0.08 0 0 4 4 0 0
429+
test.q 0.08 0 0 2 2 0 0`
430+
summary, err := qstat.ParseClusterQueueSummary(input)
431+
Expect(err).NotTo(HaveOccurred())
432+
Expect(len(summary)).To(Equal(2))
433+
434+
Expect(summary[0].ClusterQueue).To(Equal("all.q"))
435+
Expect(summary[0].CQLoad).To(Equal(0.08))
436+
Expect(summary[0].Used).To(Equal(0))
437+
Expect(summary[0].Reserved).To(Equal(0))
438+
Expect(summary[0].Available).To(Equal(4))
439+
Expect(summary[0].Total).To(Equal(4))
440+
Expect(summary[0].AoACDS).To(Equal(0))
441+
Expect(summary[0].CdsuE).To(Equal(0))
442+
443+
Expect(summary[1].ClusterQueue).To(Equal("test.q"))
444+
Expect(summary[1].CQLoad).To(Equal(0.08))
445+
Expect(summary[1].Used).To(Equal(0))
446+
Expect(summary[1].Reserved).To(Equal(0))
447+
Expect(summary[1].Available).To(Equal(2))
448+
Expect(summary[1].Total).To(Equal(2))
449+
Expect(summary[1].AoACDS).To(Equal(0))
450+
Expect(summary[1].CdsuE).To(Equal(0))
451+
})
452+
453+
})
454+
423455
})

pkg/qstat/v9.0/qstat.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type QStat interface {
4343
ShowFullOutput() ([]JobInfo, error)
4444
// qstat -F <resource_attributes>
4545
ShowFullOutputWithResources(resourceAttributes string) ([]JobInfo, error)
46+
// qstat -g c
4647
DisplayClusterQueueSummary() ([]ClusterQueueSummary, error)
4748
DisplayAllJobArrayTasks() ([]JobArrayTask, error)
4849
DisplayAllParallelJobTasks() ([]ParallelJobTask, error)

pkg/qstat/v9.0/qstat_impl.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,13 @@ func (q *QStatImpl) ShowFullOutputWithResources(resourceAttributes string) ([]Jo
169169
return nil, fmt.Errorf("not implemented")
170170
}
171171

172+
// DisplayClusterQueueSummary is equivalent to "qstat -g c"
172173
func (q *QStatImpl) DisplayClusterQueueSummary() ([]ClusterQueueSummary, error) {
173-
return nil, fmt.Errorf("not implemented")
174+
out, err := q.NativeSpecification([]string{"-g", "c"})
175+
if err != nil {
176+
return nil, fmt.Errorf("failed to get output of qstat: %w", err)
177+
}
178+
return ParseClusterQueueSummary(out)
174179
}
175180

176181
func (q *QStatImpl) DisplayAllJobArrayTasks() ([]JobArrayTask, error) {

0 commit comments

Comments
 (0)