Skip to content

Commit

Permalink
Merge pull request #15 from ag-computational-bio/json_config
Browse files Browse the repository at this point in the history
Changed job_configurator.go to use a JSON string as jobconfig.
  • Loading branch information
St4NNi authored Nov 23, 2021
2 parents ccb53f5 + 87a59d8 commit f28997c
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 132 deletions.
49 changes: 24 additions & 25 deletions scheduler/job_configurator.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package scheduler

import (
"encoding/json"
"fmt"
"path"
"reflect"
Expand All @@ -13,10 +14,6 @@ import (
"github.com/ag-computational-bio/bakta-web-backend/objectStorage"
)

func quote(s string) string {
return fmt.Sprintf("\"%v\"", strings.ReplaceAll(s, "\"", "\\\""))
}

//createDownloadConf Creates the configuration string for the download part of a bakta job
//The job has to be provided along with two bools that indicate if a prodigal training file and/or a replicon file are present
func createDownloadConf(job *database.Job, prodigaltf bool, replicontsv bool) (string, error) {
Expand All @@ -37,70 +34,70 @@ func createDownloadConf(job *database.Job, prodigaltf bool, replicontsv bool) (s
}

//createBaktaConf Creates a bakta config string based on the configuration and job settings provided
func createBaktaConf(job *database.Job, conf *api.JobConfig) (string, error) {
func createBaktaConf(job *database.Job, conf *api.JobConfig) ([]byte, error) {
var confStringElements []string

confStringElements = append(confStringElements, "--tmp-dir /cache")
confStringElements = append(confStringElements, "--threads 12")
confStringElements = append(confStringElements, "--prefix result")
confStringElements = append(confStringElements, "-o /output")
confStringElements = append(confStringElements, "--tmp-dir", "/cache")
confStringElements = append(confStringElements, "--threads", "12")
confStringElements = append(confStringElements, "--prefix", "result")
confStringElements = append(confStringElements, "-o", "/output")

if conf.HasProdigal {
confStringElements = append(confStringElements, "--prodigal-tf /data/prodigaltraining.tf")
confStringElements = append(confStringElements, "--prodigal-tf", "/data/prodigaltraining.tf")
}

if conf.HasReplicons {
if strings.HasSuffix(job.ProdigalKey, "csv") {
confStringElements = append(confStringElements, "--replicons /data/replicons.csv")
confStringElements = append(confStringElements, "--replicons", "/data/replicons.csv")
} else if strings.HasSuffix(job.ProdigalKey, "csv") {
confStringElements = append(confStringElements, "--replicons /data/replicons.tsv")
confStringElements = append(confStringElements, "--replicons", "/data/replicons.tsv")
}
}

if viper.IsSet("Testing") || viper.IsSet("Debug") {
confStringElements = append(confStringElements, "--db /db/db-mock")
confStringElements = append(confStringElements, "--db", "/db/db-mock")
} else {
confStringElements = append(confStringElements, "--db /db/db")
confStringElements = append(confStringElements, "--db", "/db/db")
}

if conf.CompleteGenome {
confStringElements = append(confStringElements, "--complete")
}

if conf.Locus != "" {
confStringElements = append(confStringElements, fmt.Sprintf("--locus %v", quote(conf.Locus)))
confStringElements = append(confStringElements, "--locus", fmt.Sprintf("%v", conf.Locus))
}

if conf.LocusTag != "" {
confStringElements = append(confStringElements, fmt.Sprintf("--locus-tag %v", quote(conf.LocusTag)))
confStringElements = append(confStringElements, "--locus-tag", fmt.Sprintf("%v", conf.LocusTag))
}

if conf.KeepContigHeaders {
confStringElements = append(confStringElements, "--keep-contig-headers")
}

if conf.Genus != "" {
confStringElements = append(confStringElements, fmt.Sprintf("--genus %v", quote(conf.Genus)))
confStringElements = append(confStringElements, "--genus", fmt.Sprintf("%v", conf.Genus))
}

if conf.Species != "" {
confStringElements = append(confStringElements, fmt.Sprintf("--species %v", quote(conf.Species)))
confStringElements = append(confStringElements, "--species", fmt.Sprintf("%v", conf.Species))
}

if conf.Strain != "" {
confStringElements = append(confStringElements, fmt.Sprintf("--strain %v", quote(conf.Strain)))
confStringElements = append(confStringElements, "--strain", fmt.Sprintf("%v", conf.Strain))
}

if conf.Plasmid != "" {
confStringElements = append(confStringElements, fmt.Sprintf("--plasmid %v", quote(conf.Plasmid)))
confStringElements = append(confStringElements, "--plasmid", fmt.Sprintf("%v", conf.Plasmid))
}

if conf.Compliant {
confStringElements = append(confStringElements, fmt.Sprintf("--compliant"))
}

if conf.TranslationalTable == 4 || conf.TranslationalTable == 11 {
confStringElements = append(confStringElements, fmt.Sprintf("--translation-table %v", conf.TranslationalTable))
confStringElements = append(confStringElements, "--translation-table", fmt.Sprintf("%v", conf.TranslationalTable))
}

dermtype := "?"
Expand All @@ -114,14 +111,16 @@ func createBaktaConf(job *database.Job, conf *api.JobConfig) (string, error) {
dermtype = "-"
}

confStringElements = append(confStringElements, fmt.Sprintf("--gram %s", dermtype))
confStringElements = append(confStringElements, "--gram", fmt.Sprintf("%s", dermtype))

confString := strings.Join(confStringElements, " ")
//confString := strings.Join(confStringElements, " ")

_, fastaFileName := path.Split(job.FastaKey)
confString = fmt.Sprintf(confString+" /data/%v", fastaFileName)
//confString = fmt.Sprintf(confString+" /data/%v", fastaFileName)

return confString, nil
confStringElements = append(confStringElements, fmt.Sprintf("/data/%v", fastaFileName))

return json.Marshal(confStringElements)
}

//createUploadConf Creates the configuration string for a bakta job
Expand Down
106 changes: 0 additions & 106 deletions scheduler/job_configurator_test.go
Original file line number Diff line number Diff line change
@@ -1,107 +1 @@
package scheduler

import (
"testing"

api "github.com/ag-computational-bio/bakta-web-api-go/bakta/web/api/proto/v1"
db "github.com/ag-computational-bio/bakta-web-backend/database"
)

func Test_species_should_be_quoted(t *testing.T) {

job := db.Job{}
job.FastaKey = "irrelevant"

config := api.JobConfig{}
config.Species = "test\"; rm -rf /"

jobstring, _ := createBaktaConf(&job, &config)
expected := "--tmp-dir /cache --threads 12 --prefix result -o /output --db /db/db --species \"test\\\"; rm -rf /\" --gram ? /data/irrelevant"
if jobstring != expected {
t.Errorf("Expected '%v', Got '%v'", expected, jobstring)
}
}
func Test_genus_should_be_quoted(t *testing.T) {
job := db.Job{}
job.FastaKey = "irrelevant"

config := api.JobConfig{}
config.Genus = "test\"; rm -rf /"

jobstring, _ := createBaktaConf(&job, &config)
expected := "--tmp-dir /cache --threads 12 --prefix result -o /output --db /db/db --genus \"test\\\"; rm -rf /\" --gram ? /data/irrelevant"
if jobstring != expected {
t.Errorf("Expected '%v', Got '%v'", expected, jobstring)
}
}
func Test_strain_should_be_quoted(t *testing.T) {
job := db.Job{}
job.FastaKey = "irrelevant"

config := api.JobConfig{}
config.Strain = "test\"; rm -rf /"

jobstring, _ := createBaktaConf(&job, &config)
expected := "--tmp-dir /cache --threads 12 --prefix result -o /output --db /db/db --strain \"test\\\"; rm -rf /\" --gram ? /data/irrelevant"
if jobstring != expected {
t.Errorf("Expected '%v', Got '%v'", expected, jobstring)
}
}

func Test_locus_should_be_quoted(t *testing.T) {
job := db.Job{}
job.FastaKey = "irrelevant"

config := api.JobConfig{}
config.Locus = "test\"; rm -rf /"

jobstring, _ := createBaktaConf(&job, &config)
expected := "--tmp-dir /cache --threads 12 --prefix result -o /output --db /db/db --locus \"test\\\"; rm -rf /\" --gram ? /data/irrelevant"
if jobstring != expected {
t.Errorf("Expected '%v', Got '%v'", expected, jobstring)
}
}
func Test_locus_tag_should_be_quoted(t *testing.T) {
job := db.Job{}
job.FastaKey = "irrelevant"

config := api.JobConfig{}
config.LocusTag = "test\"; rm -rf /"

jobstring, _ := createBaktaConf(&job, &config)
expected := "--tmp-dir /cache --threads 12 --prefix result -o /output --db /db/db --locus-tag \"test\\\"; rm -rf /\" --gram ? /data/irrelevant"
if jobstring != expected {
t.Errorf("Expected '%v', Got '%v'", expected, jobstring)
}
}

func Test_plasmid_tag_should_be_quoted(t *testing.T) {
job := db.Job{}
job.FastaKey = "irrelevant"

config := api.JobConfig{}
config.Plasmid = "test\"; rm -rf /"

jobstring, _ := createBaktaConf(&job, &config)
expected := "--tmp-dir /cache --threads 12 --prefix result -o /output --db /db/db --plasmid \"test\\\"; rm -rf /\" --gram ? /data/irrelevant"
if jobstring != expected {
t.Errorf("Expected '%v', Got '%v'", expected, jobstring)
}
}

func TestQuote(t *testing.T) {
testData := []struct {
input string
expected string
}{
{"", "\"\""},
{"test", "\"test\""},
{"test\" rm -rf /", "\"test\\\" rm -rf /\""},
}
for _, data := range testData {
quoted := quote(data.input)
if quoted != data.expected {
t.Errorf("Expected '%v', Got '%v'", data.expected, quoted)
}
}
}
2 changes: 1 addition & 1 deletion scheduler/simple_scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func (scheduler *SimpleScheduler) StartJob(jobID string, jobConfig *api.JobConfi
return nil, err
}

apiJob, err := createBaseJobConf(jobID, scheduler.namespace, downloadConf, baktaConf, uploadConf, job.Secret)
apiJob, err := createBaseJobConf(jobID, scheduler.namespace, downloadConf, string(baktaConf), uploadConf, job.Secret)
if err != nil {
log.Println(err.Error())
return nil, err
Expand Down

0 comments on commit f28997c

Please sign in to comment.