diff --git a/cmd/osbuild-worker/job.go b/cmd/osbuild-worker/job.go new file mode 100644 index 000000000..1a64c41a7 --- /dev/null +++ b/cmd/osbuild-worker/job.go @@ -0,0 +1,79 @@ +package main + +import ( + "encoding/json" + "os" + "os/exec" + + "github.com/google/uuid" + + "osbuild-composer/internal/pipeline" + "osbuild-composer/internal/target" +) + +type Job struct { + ID uuid.UUID + Pipeline pipeline.Pipeline + Targets []target.Target +} + +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 _, target := range job.Targets { + if target.Name != "org.osbuild.local" { + panic("foo") + } + + err = os.MkdirAll(target.Options.Location, 0755) + if err != nil { + panic(err) + } + + cp := exec.Command("cp", "-a", "-L", "/var/cache/osbuild-composer/store/refs/" + result.OutputID, target.Options.Location) + cp.Stderr = os.Stderr + cp.Stdout = os.Stdout + err = cp.Run() + if err != nil { + panic(err) + } + } + + return nil +} diff --git a/cmd/osbuild-worker/main.go b/cmd/osbuild-worker/main.go index 94602ecb8..7fd527a79 100644 --- a/cmd/osbuild-worker/main.go +++ b/cmd/osbuild-worker/main.go @@ -8,7 +8,6 @@ import ( "fmt" "net" "net/http" - "time" "github.com/google/uuid" @@ -20,12 +19,6 @@ type ComposerClient struct { client *http.Client } -type Job struct { - ID uuid.UUID - Pipeline pipeline.Pipeline - Target target.Target -} - func NewClient() *ComposerClient { client := &http.Client{ Transport: &http.Transport{ @@ -43,7 +36,7 @@ func (c *ComposerClient) AddJob() (*Job, error) { } type reply struct { Pipeline *pipeline.Pipeline `json:"pipeline"` - Target *target.Target `json:"target"` + Targets *[]target.Target `json:"targets"` } job := &Job{ @@ -64,7 +57,7 @@ func (c *ComposerClient) AddJob() (*Job, error) { err = json.NewDecoder(response.Body).Decode(&reply{ Pipeline: &job.Pipeline, - Target: &job.Target, + Targets: &job.Targets, }) if err != nil { return nil, err @@ -110,7 +103,7 @@ func main() { } fmt.Printf("Running job %s\n", job.ID.String()) - time.Sleep(15 * time.Second) + job.Run() client.UpdateJob(job, "finished") }