From fc1d1c3b8f79971fc6d17b262ac3318883e42b0b Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 13 Jun 2024 15:42:53 +0200 Subject: [PATCH] osbuild-worker-executor: `job-id` in control.json as hostname This commit adds support to set the hostname to the job-id that is part of the control.json. --- cmd/osbuild-worker-executor/export_test.go | 8 ++++++ cmd/osbuild-worker-executor/handler_build.go | 16 +++++++++++ .../handler_build_test.go | 27 +++++++++++++++++++ cmd/osbuild-worker-executor/main_test.go | 5 ++++ 4 files changed, 56 insertions(+) diff --git a/cmd/osbuild-worker-executor/export_test.go b/cmd/osbuild-worker-executor/export_test.go index 9698623c8..b47976633 100644 --- a/cmd/osbuild-worker-executor/export_test.go +++ b/cmd/osbuild-worker-executor/export_test.go @@ -12,6 +12,14 @@ var ( HandleIncludedSources = handleIncludedSources ) +func MockUnixSethostname(new func([]byte) error) (restore func()) { + saved := unixSethostname + unixSethostname = new + return func() { + unixSethostname = saved + } +} + func MockOsbuildBinary(t *testing.T, new string) (restore func()) { t.Helper() diff --git a/cmd/osbuild-worker-executor/handler_build.go b/cmd/osbuild-worker-executor/handler_build.go index eed9b740d..13edd9ab7 100644 --- a/cmd/osbuild-worker-executor/handler_build.go +++ b/cmd/osbuild-worker-executor/handler_build.go @@ -13,6 +13,7 @@ import ( "strings" "golang.org/x/exp/slices" + "golang.org/x/sys/unix" "github.com/sirupsen/logrus" ) @@ -108,6 +109,7 @@ func runOsbuild(logger *logrus.Logger, buildDir string, control *controlJSON, ou type controlJSON struct { Environments []string `json:"environments"` Exports []string `json:"exports"` + JobID string `json:"job-id"` } func mustRead(atar *tar.Reader, name string) error { @@ -235,6 +237,15 @@ func handleIncludedSources(atar *tar.Reader, buildDir string) error { } } +var unixSethostname = unix.Sethostname + +func setHostname(name string) error { + if name == "" { + return nil + } + return unixSethostname([]byte(name)) +} + // test for real via: // curl -o - --data-binary "@./test.tar" -H "Content-Type: application/x-tar" -X POST http://localhost:8001/api/v1/build func handleBuild(logger *logrus.Logger, config *Config) http.Handler { @@ -262,6 +273,11 @@ func handleBuild(logger *logrus.Logger, config *Config) http.Handler { http.Error(w, "cannot decode control.json", http.StatusBadRequest) return } + if err := setHostname(control.JobID); err != nil { + logger.Error(err) + http.Error(w, "cannot set hostname", http.StatusBadRequest) + return + } buildDir, err := createBuildDir(config) if err != nil { diff --git a/cmd/osbuild-worker-executor/handler_build_test.go b/cmd/osbuild-worker-executor/handler_build_test.go index 57decab58..d70f1c19f 100644 --- a/cmd/osbuild-worker-executor/handler_build_test.go +++ b/cmd/osbuild-worker-executor/handler_build_test.go @@ -324,3 +324,30 @@ func TestBuildErrorHandlingTar(t *testing.T) { assert.Contains(t, string(body), "cannot tar output directory:") assert.Contains(t, loggerHook.LastEntry().Message, "cannot tar output directory:") } + +func TestBuildSethostname(t *testing.T) { + baseURL, baseBuildDir, _ := runTestServer(t) + endpoint := baseURL + "api/v1/build" + + restore := main.MockOsbuildBinary(t, fmt.Sprintf(`#!/bin/sh -e +# simulate output +mkdir -p %[1]s/build/output/image +echo "fake-build-result" > %[1]s/build/output/image/disk.img +`, baseBuildDir)) + t.Cleanup(restore) + + var hostnameCalls []string + restore = main.MockUnixSethostname(func(hn []byte) error { + hostnameCalls = append(hostnameCalls, string(hn)) + return nil + }) + t.Cleanup(restore) + + buf := makeTestPost(t, `{"exports": ["tree"], "job-id": "1234-56"}`, `{"fake": "manifest"}`) + rsp, err := http.Post(endpoint, "application/x-tar", buf) + assert.NoError(t, err) + defer func() { _, _ = io.ReadAll(rsp.Body) }() + defer rsp.Body.Close() + + assert.Equal(t, []string{"1234-56"}, hostnameCalls) +} diff --git a/cmd/osbuild-worker-executor/main_test.go b/cmd/osbuild-worker-executor/main_test.go index 97aca273f..f989d24f8 100644 --- a/cmd/osbuild-worker-executor/main_test.go +++ b/cmd/osbuild-worker-executor/main_test.go @@ -55,6 +55,11 @@ func runTestServer(t *testing.T) (baseURL, buildBaseDir string, loggerHook *logr buildBaseDir = t.TempDir() baseURL = fmt.Sprintf("http://%s:%s/", host, port) + restore := main.MockUnixSethostname(func([]byte) error { + return nil + }) + t.Cleanup(restore) + ctx, cancel := context.WithCancel(context.Background()) t.Cleanup(cancel)