From 08e0793f3da4ce7419eb12d1e7a8e39301524f23 Mon Sep 17 00:00:00 2001 From: Douglas Dawson Date: Wed, 24 Jul 2024 17:35:56 -0400 Subject: [PATCH] Update PBS to allow other install directories. Push changes to goreleaser for Palmetto 2. --- .gitignore | 1 + .goreleaser.yaml | 17 +++++++++++++++++ pbs/pbs.go | 21 +++++++++++++++------ pbs/qstat.go | 23 +++-------------------- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index a0f6104..9a9c28e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /cmd/jobperf/jobperf dist/ +.DS_Store diff --git a/.goreleaser.yaml b/.goreleaser.yaml index a760f9b..59932ac 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -30,6 +30,23 @@ builds: - linux goarch: - amd64 + - id: "palmetto2" + main: "./cmd/jobperf" + binary: "jobperf-palmetto2" + ldflags: + - "-X main.buildVersion={{.Version}}" + - "-X main.buildCommit={{.Commit}}" + - "-X main.buildDate={{.Date}}" + - "-X main.defaultSupportURL=https://docs.rcd.clemson.edu/support" + - "-X main.defaultDocsURL=https://docs.rcd.clemson.edu/" + - "-X main.defaultUseOpenOnDemand=true" + - "-X main.defaultOpenOnDemandURL=https://ondemand.rcd.clemson.edu" + env: + - CGO_ENABLED=0 + goos: + - linux + goarch: + - amd64 - id: "palmetto" main: "./cmd/jobperf" binary: "jobperf-palmetto" diff --git a/pbs/pbs.go b/pbs/pbs.go index eaef779..0edd03b 100644 --- a/pbs/pbs.go +++ b/pbs/pbs.go @@ -24,21 +24,30 @@ func IsAvailable() bool { return false } -type jobEngine struct{} +type jobEngine struct { + pbsBinPath string +} func NewJobEngine() jobperf.JobEngine { - return jobEngine{} + var err error + var engine jobEngine + engine.pbsBinPath, err = exec.LookPath("qstat") + if err != nil { + slog.Error("failed to find pbs binary path. Defaulting to /opt/pbs/default/bin", "err", err) + engine.pbsBinPath = "/opt/pbs/default/bin" + } + return engine } -func (_ jobEngine) GetJobByID(jobID string) (*jobperf.Job, error) { - return qstatGetJob(jobID) +func (e jobEngine) GetJobByID(jobID string) (*jobperf.Job, error) { + return e.qstatGetJob(jobID) } func (_ jobEngine) SelectJobIDs(q jobperf.JobQuery) ([]string, error) { return nil, nil } -func (_ jobEngine) NodeStatsSession(j *jobperf.Job, hostname string) (jobperf.NodeStatsSession, error) { +func (e jobEngine) NodeStatsSession(j *jobperf.Job, hostname string) (jobperf.NodeStatsSession, error) { var statsSession nodeStatsSession var err error statsSession.jobID = j.ID @@ -63,7 +72,7 @@ func (_ jobEngine) NodeStatsSession(j *jobperf.Job, hostname string) (jobperf.No if err != nil { return nil, fmt.Errorf("failed find jobperf: %w", err) } - cmd := fmt.Sprintf("/opt/pbs/default/bin/pbs_attach -j %v %v -nodestats", j.ID, ex) + cmd := fmt.Sprintf("%s/pbs_attach -j %v %v -nodestats", e.pbsBinPath, j.ID, ex) err = statsSession.sshSession.Start(cmd) if err != nil { return nil, fmt.Errorf("failed start nodestats with cmd=%v on node %v with ssh: %w", cmd, hostname, err) diff --git a/pbs/qstat.go b/pbs/qstat.go index c2e2032..101d30c 100644 --- a/pbs/qstat.go +++ b/pbs/qstat.go @@ -118,9 +118,9 @@ func parseExecVNode(execVNode string) ([]jobperf.Node, error) { return nodes, nil } -func qstatGetJob(jobID string) (*jobperf.Job, error) { +func (e jobEngine) qstatGetJob(jobID string) (*jobperf.Job, error) { slog.Debug("fetching job by id", "jobID", jobID) - cmd := exec.Command("/opt/pbs/default/bin/qstat", "-xf", "-Fjson", jobID) + cmd := exec.Command(e.pbsBinPath+"/qstat", "-xf", "-Fjson", jobID) var out bytes.Buffer cmd.Stdout = &out err := cmd.Run() @@ -209,24 +209,7 @@ func qstatGetJob(jobID string) (*jobperf.Job, error) { return nil, fmt.Errorf("failed to parse exec_vnode: %w", err) } } - slog.Debug("succesfully parsed qstat response", "job", j) + slog.Debug("successfully parsed qstat response", "job", j) return &j, nil } - -type QSelectOptions struct { - State string - // TODO: support other options -} - -func QSelectJobs(opt QSelectOptions) ([]string, error) { - cmd := exec.Command("/opt/pbs/default/bin/qselect", "-s", opt.State) - var out bytes.Buffer - cmd.Stdout = &out - err := cmd.Run() - if err != nil { - return nil, fmt.Errorf("failed to run qselect with opt %v: %w", opt, err) - } - - return strings.Split(out.String(), "\n"), nil -}