mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2025-07-23 21:01:40 +02:00
Extend Job Hooks and add unit tests
Add job tagger control
This commit is contained in:
3
internal/tagger/apps/python.txt
Normal file
3
internal/tagger/apps/python.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
python
|
||||
anaconda
|
||||
conda
|
@@ -8,6 +8,7 @@ import (
|
||||
"bufio"
|
||||
"embed"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
@@ -27,16 +28,10 @@ type appInfo struct {
|
||||
}
|
||||
|
||||
type AppTagger struct {
|
||||
apps []appInfo
|
||||
apps map[string]appInfo
|
||||
}
|
||||
|
||||
func (t *AppTagger) Register() error {
|
||||
files, err := appFiles.ReadDir("apps")
|
||||
if err != nil {
|
||||
return fmt.Errorf("error reading app folder: %#v", err)
|
||||
}
|
||||
t.apps = make([]appInfo, 0)
|
||||
|
||||
func (t *AppTagger) scanApps(files []fs.DirEntry) error {
|
||||
for _, fn := range files {
|
||||
fns := fn.Name()
|
||||
log.Debugf("Process: %s", fns)
|
||||
@@ -50,12 +45,25 @@ func (t *AppTagger) Register() error {
|
||||
for scanner.Scan() {
|
||||
ai.strings = append(ai.strings, scanner.Text())
|
||||
}
|
||||
t.apps = append(t.apps, ai)
|
||||
delete(t.apps, ai.tag)
|
||||
t.apps[ai.tag] = ai
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// func (t *AppTagger) Reload() error {
|
||||
//
|
||||
// }
|
||||
|
||||
func (t *AppTagger) Register() error {
|
||||
files, err := appFiles.ReadDir("apps")
|
||||
if err != nil {
|
||||
return fmt.Errorf("error reading app folder: %#v", err)
|
||||
}
|
||||
t.apps = make(map[string]appInfo, 0)
|
||||
return t.scanApps(files)
|
||||
}
|
||||
|
||||
func (t *AppTagger) Match(job *schema.Job) {
|
||||
r := repository.GetJobRepository()
|
||||
meta, err := r.FetchMetadata(job)
|
||||
|
@@ -35,7 +35,7 @@ func TestRegister(t *testing.T) {
|
||||
err := tagger.Register()
|
||||
noErr(t, err)
|
||||
|
||||
if len(tagger.apps) != 3 {
|
||||
if len(tagger.apps) != 4 {
|
||||
t.Errorf("wrong summary for diagnostic \ngot: %d \nwant: 3", len(tagger.apps))
|
||||
}
|
||||
}
|
||||
|
@@ -4,14 +4,48 @@
|
||||
// license that can be found in the LICENSE file.
|
||||
package tagger
|
||||
|
||||
import "github.com/ClusterCockpit/cc-backend/pkg/schema"
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/ClusterCockpit/cc-backend/internal/repository"
|
||||
"github.com/ClusterCockpit/cc-backend/pkg/schema"
|
||||
)
|
||||
|
||||
type Tagger interface {
|
||||
Register() error
|
||||
Match(job *schema.Job)
|
||||
}
|
||||
|
||||
func Init() error {
|
||||
var (
|
||||
initOnce sync.Once
|
||||
jobTagger *JobTagger
|
||||
)
|
||||
|
||||
return nil
|
||||
type JobTagger struct {
|
||||
startTaggers []Tagger
|
||||
stopTaggers []Tagger
|
||||
}
|
||||
|
||||
func Init() {
|
||||
initOnce.Do(func() {
|
||||
jobTagger = &JobTagger{}
|
||||
jobTagger.startTaggers = make([]Tagger, 0)
|
||||
jobTagger.startTaggers = append(jobTagger.startTaggers, &AppTagger{})
|
||||
|
||||
for _, tagger := range jobTagger.startTaggers {
|
||||
tagger.Register()
|
||||
}
|
||||
|
||||
// jobTagger.stopTaggers = make([]Tagger, 0)
|
||||
repository.RegisterJobJook(jobTagger)
|
||||
})
|
||||
}
|
||||
|
||||
func (jt *JobTagger) JobStartCallback(job *schema.Job) {
|
||||
for _, tagger := range jobTagger.startTaggers {
|
||||
tagger.Match(job)
|
||||
}
|
||||
}
|
||||
|
||||
func (jt *JobTagger) JobStopCallback(job *schema.Job) {
|
||||
}
|
||||
|
31
internal/tagger/tagger_test.go
Normal file
31
internal/tagger/tagger_test.go
Normal file
@@ -0,0 +1,31 @@
|
||||
// Copyright (C) NHR@FAU, University Erlangen-Nuremberg.
|
||||
// All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
package tagger
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/ClusterCockpit/cc-backend/internal/repository"
|
||||
"github.com/ClusterCockpit/cc-backend/pkg/schema"
|
||||
)
|
||||
|
||||
func TestInit(t *testing.T) {
|
||||
Init()
|
||||
}
|
||||
|
||||
func TestJobStartCallback(t *testing.T) {
|
||||
Init()
|
||||
r := setup(t)
|
||||
job, err := r.FindByIdDirect(2)
|
||||
noErr(t, err)
|
||||
|
||||
jobs := make([]*schema.Job, 0, 1)
|
||||
jobs = append(jobs, job)
|
||||
|
||||
repository.CallJobStartHooks(jobs)
|
||||
if !r.HasTag(2, "app", "python") {
|
||||
t.Errorf("missing tag python")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user