worker: introduce JobImplementation interface
Introduce JobImplementation and turn the current RunJob() into OSBuildJobImpl. Make main() select a job impl based on job type. This is in preparation to add additional impls.
This commit is contained in:
parent
3bc642e4aa
commit
6b6cd7ca9f
2 changed files with 33 additions and 5 deletions
|
|
@ -23,6 +23,11 @@ import (
|
||||||
"github.com/osbuild/osbuild-composer/internal/worker"
|
"github.com/osbuild/osbuild-composer/internal/worker"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type OSBuildJobImpl struct {
|
||||||
|
Store string
|
||||||
|
KojiServers map[string]koji.GSSAPICredentials
|
||||||
|
}
|
||||||
|
|
||||||
func packageMetadataToSignature(pkg osbuild.RPMPackageMetadata) *string {
|
func packageMetadataToSignature(pkg osbuild.RPMPackageMetadata) *string {
|
||||||
if pkg.SigGPG != "" {
|
if pkg.SigGPG != "" {
|
||||||
return &pkg.SigGPG
|
return &pkg.SigGPG
|
||||||
|
|
@ -56,7 +61,7 @@ func osbuildStagesToRPMs(stages []osbuild.StageResult) []koji.RPM {
|
||||||
return rpms
|
return rpms
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunJob(job worker.Job, store string, kojiServers map[string]koji.GSSAPICredentials) error {
|
func (impl *OSBuildJobImpl) Run(job worker.Job) error {
|
||||||
outputDirectory, err := ioutil.TempDir("/var/tmp", "osbuild-worker-*")
|
outputDirectory, err := ioutil.TempDir("/var/tmp", "osbuild-worker-*")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating temporary output directory: %v", err)
|
return fmt.Errorf("error creating temporary output directory: %v", err)
|
||||||
|
|
@ -76,7 +81,7 @@ func RunJob(job worker.Job, store string, kojiServers map[string]koji.GSSAPICred
|
||||||
|
|
||||||
start_time := time.Now()
|
start_time := time.Now()
|
||||||
|
|
||||||
osbuildOutput, err := RunOSBuild(args.Manifest, store, outputDirectory, os.Stderr)
|
osbuildOutput, err := RunOSBuild(args.Manifest, impl.Store, outputDirectory, os.Stderr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -194,7 +199,7 @@ func RunJob(job worker.Job, store string, kojiServers map[string]koji.GSSAPICred
|
||||||
}
|
}
|
||||||
|
|
||||||
kojiServer, _ := url.Parse(options.Server)
|
kojiServer, _ := url.Parse(options.Server)
|
||||||
creds, exists := kojiServers[kojiServer.Hostname()]
|
creds, exists := impl.KojiServers[kojiServer.Hostname()]
|
||||||
if !exists {
|
if !exists {
|
||||||
r = append(r, fmt.Errorf("Koji server has not been configured: %s", kojiServer.Hostname()))
|
r = append(r, fmt.Errorf("Koji server has not been configured: %s", kojiServer.Hostname()))
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,11 @@ type connectionConfig struct {
|
||||||
ClientCertFile string
|
ClientCertFile string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Represents the implementation of a job type as defined by the worker API.
|
||||||
|
type JobImplementation interface {
|
||||||
|
Run(job worker.Job) error
|
||||||
|
}
|
||||||
|
|
||||||
func createTLSConfig(config *connectionConfig) (*tls.Config, error) {
|
func createTLSConfig(config *connectionConfig) (*tls.Config, error) {
|
||||||
caCertPEM, err := ioutil.ReadFile(config.CACertFile)
|
caCertPEM, err := ioutil.ReadFile(config.CACertFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -144,19 +149,37 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jobImpls := map[string]JobImplementation{
|
||||||
|
"osbuild": &OSBuildJobImpl{
|
||||||
|
Store: store,
|
||||||
|
KojiServers: kojiServers,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
acceptedJobTypes := []string{}
|
||||||
|
for jt := range jobImpls {
|
||||||
|
acceptedJobTypes = append(acceptedJobTypes, jt)
|
||||||
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
fmt.Println("Waiting for a new job...")
|
fmt.Println("Waiting for a new job...")
|
||||||
job, err := client.RequestJob([]string{"osbuild"})
|
job, err := client.RequestJob(acceptedJobTypes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl, exists := jobImpls[job.Type()]
|
||||||
|
if !exists {
|
||||||
|
log.Printf("Ignoring job with unknown type %s", job.Type())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Printf("Running '%s' job %v\n", job.Type(), job.Id())
|
fmt.Printf("Running '%s' job %v\n", job.Type(), job.Id())
|
||||||
|
|
||||||
ctx, cancelWatcher := context.WithCancel(context.Background())
|
ctx, cancelWatcher := context.WithCancel(context.Background())
|
||||||
go WatchJob(ctx, job)
|
go WatchJob(ctx, job)
|
||||||
|
|
||||||
err = RunJob(job, store, kojiServers)
|
err = impl.Run(job)
|
||||||
cancelWatcher()
|
cancelWatcher()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Job %s failed: %v", job.Id(), err)
|
log.Printf("Job %s failed: %v", job.Id(), err)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue