diff --git a/cmd/osbuild-worker/jobimpl-file-resolve.go b/cmd/osbuild-worker/jobimpl-file-resolve.go new file mode 100644 index 000000000..7e836eecc --- /dev/null +++ b/cmd/osbuild-worker/jobimpl-file-resolve.go @@ -0,0 +1,81 @@ +package main + +import ( + "github.com/sirupsen/logrus" + + "github.com/osbuild/osbuild-composer/internal/remotefile" + "github.com/osbuild/osbuild-composer/internal/worker" + "github.com/osbuild/osbuild-composer/internal/worker/clienterrors" +) + +type FileResolveJobImpl struct{} + +func (impl *FileResolveJobImpl) Run(job worker.Job) error { + logWithId := logrus.WithField("jobId", job.Id()) + + var err error + result := worker.FileResolveJobResult{ + Success: false, + Results: []worker.FileResolveJobResultItem{}, + } + + defer func() { + logWithId := logrus.WithField("jobId", job.Id().String()) + if result.JobError != nil { + logWithId.Errorf("file content resolve job failed: %s", result.JobError.Reason) + if result.JobError.Details != nil { + logWithId.Errorf("failure details: %v", result.JobError.Details) + } + } + + if result.Results == nil || len(result.Results) == 0 { + logWithId.Infof("Resolving file contents failed: %v", err) + result.JobError = clienterrors.WorkerClientError( + clienterrors.ErrorRemoteFileResolution, + "Error resolving file contents", + "All remote file contents returned empty", + ) + } + + err := job.Update(result) + if err != nil { + logWithId.Errorf("Error reporting job result: %v", err) + } + }() + + var args worker.FileResolveJob + err = job.Args(&args) + if err != nil { + return err + } + + logWithId.Infof("Resolving file contents (%d)", len(args.URLs)) + + resolver := remotefile.NewResolver() + for _, url := range args.URLs { + resolver.Add(url) + } + + resultItems := resolver.Finish() + + for idx := range resultItems { + result.Results = append(result.Results, worker.FileResolveJobResultItem{ + URL: resultItems[idx].URL, + Content: resultItems[idx].Content, + ResolutionError: resultItems[idx].ResolutionError, + }) + } + + resolutionErrors := result.ResolutionErrors() + if len(resolutionErrors) == 0 { + result.Success = true + } else { + result.JobError = clienterrors.WorkerClientError( + clienterrors.ErrorRemoteFileResolution, + "at least one file resolution failed", + resolutionErrors, + ) + } + + return nil +} diff --git a/cmd/osbuild-worker/main.go b/cmd/osbuild-worker/main.go index fcfe4b843..bc0159e52 100644 --- a/cmd/osbuild-worker/main.go +++ b/cmd/osbuild-worker/main.go @@ -466,6 +466,7 @@ func main() { AuthFilePath: containersAuthFilePath, }, worker.JobTypeOSTreeResolve: &OSTreeResolveJobImpl{}, + worker.JobTypeFileResolve: &FileResolveJobImpl{}, worker.JobTypeAWSEC2Copy: &AWSEC2CopyJobImpl{ AWSCreds: awsCredentials, },