worker: move Job type to the jobqueue package

The main purpose of this is to share the structs between the server
and the client, and let the compiler ensure that our marshaling and
unmarshaling matches.

In the future we also want to make it easier to write unittests for
this code.

Signed-off-by: Tom Gundersen <teg@jklm.no>
This commit is contained in:
Tom Gundersen 2019-10-29 14:04:51 +01:00 committed by Lars Karlitski
parent fabd40da1c
commit aa404dcb99
3 changed files with 16 additions and 23 deletions

83
internal/jobqueue/job.go Normal file
View file

@ -0,0 +1,83 @@
package jobqueue
import (
"encoding/json"
"os"
"os/exec"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/pipeline"
"github.com/osbuild/osbuild-composer/internal/target"
)
type Job struct {
ID uuid.UUID `json:"id"`
Pipeline *pipeline.Pipeline `json:"pipeline"`
Targets []*target.Target `json:"targets"`
}
type JobStatus struct {
Status string `json:"status"`
}
func (job *Job) Run() error {
cmd := exec.Command("osbuild", "--store", "/var/cache/osbuild-composer/store", "--json", "-")
cmd.Stderr = os.Stderr
stdin, err := cmd.StdinPipe()
if err != nil {
return err
}
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
err = cmd.Start()
if err != nil {
return err
}
err = json.NewEncoder(stdin).Encode(job.Pipeline)
if err != nil {
return err
}
stdin.Close()
var result struct {
TreeID string `json:"tree_id"`
OutputID string `json:"output_id"`
}
err = json.NewDecoder(stdout).Decode(&result)
if err != nil {
return err
}
err = cmd.Wait()
if err != nil {
return err
}
for _, t := range job.Targets {
switch options := t.Options.(type) {
case *target.LocalTargetOptions:
err = os.MkdirAll(options.Location, 0755)
if err != nil {
panic(err)
}
cp := exec.Command("cp", "-a", "-L", "/var/cache/osbuild-composer/store/refs/"+result.OutputID+"/.", options.Location)
cp.Stderr = os.Stderr
cp.Stdout = os.Stdout
err = cp.Run()
if err != nil {
panic(err)
}
default:
panic("foo")
}
}
return nil
}