From bc3921606bac3139aaae59784866ddc34d5cea13 Mon Sep 17 00:00:00 2001 From: saffronjam Date: Sat, 18 Nov 2023 13:34:49 +0100 Subject: [PATCH 1/2] fix gpu not attaching and activites not being removed --- pkg/jobs/runner.go | 50 ++++++++++++++++++++++++------- pkg/subsystems/cs/vm.go | 11 +++---- service/resources/cs_generator.go | 1 + 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/pkg/jobs/runner.go b/pkg/jobs/runner.go index 5c44c0ab..4bf9b287 100644 --- a/pkg/jobs/runner.go +++ b/pkg/jobs/runner.go @@ -42,7 +42,7 @@ func (runner *Runner) Run() { } } - go wrapper(jobDef.JobFunc, runner.Job) + go wrapper(jobDef) } else { utils.PrettyPrintError(fmt.Errorf("unknown job type: %s", runner.Job.Type)) @@ -54,39 +54,69 @@ func (runner *Runner) Run() { } } -func wrapper(fn func(job *jobModel.Job) error, job *jobModel.Job) { - err := fn(job) +func wrapper(def *JobDefinition) { + if def.EntryFunc != nil { + err := def.EntryFunc(def.Job) + if err != nil { + utils.PrettyPrintError(fmt.Errorf("error executing job (%s) entry function. details: %w", def.Job.Type, err)) + + err = jobModel.New().MarkFailed(def.Job.ID, err.Error()) + if err != nil { + utils.PrettyPrintError(fmt.Errorf("error marking job as failed. details: %w", err)) + return + } + return + } + } + + defer func() { + if def.ExitFunc != nil { + err := def.ExitFunc(def.Job) + if err != nil { + utils.PrettyPrintError(fmt.Errorf("error executing job (%s) exit function. details: %w", def.Job.Type, err)) + + err = jobModel.New().MarkFailed(def.Job.ID, err.Error()) + if err != nil { + utils.PrettyPrintError(fmt.Errorf("error marking job as failed. details: %w", err)) + return + } + return + } + } + }() + + err := def.JobFunc(def.Job) if err != nil { if strings.HasPrefix(err.Error(), "failed") { err = errors.Unwrap(err) - utils.PrettyPrintError(fmt.Errorf("failed job (%s). details: %w", job.Type, err)) + utils.PrettyPrintError(fmt.Errorf("failed job (%s). details: %w", def.Job.Type, err)) - err = jobModel.New().MarkFailed(job.ID, err.Error()) + err = jobModel.New().MarkFailed(def.Job.ID, err.Error()) if err != nil { utils.PrettyPrintError(fmt.Errorf("error marking job as failed. details: %w", err)) return } } else if strings.HasPrefix(err.Error(), "terminated") { err = errors.Unwrap(err) - utils.PrettyPrintError(fmt.Errorf("terminated job (%s). details: %w", job.Type, err)) + utils.PrettyPrintError(fmt.Errorf("terminated job (%s). details: %w", def.Job.Type, err)) - err = jobModel.New().MarkTerminated(job.ID, err.Error()) + err = jobModel.New().MarkTerminated(def.Job.ID, err.Error()) if err != nil { utils.PrettyPrintError(fmt.Errorf("error marking job as terminated. details: %w", err)) return } } else { - utils.PrettyPrintError(fmt.Errorf("error executing job (%s). details: %w", job.Type, err)) + utils.PrettyPrintError(fmt.Errorf("error executing job (%s). details: %w", def.Job.Type, err)) - err = jobModel.New().MarkFailed(job.ID, err.Error()) + err = jobModel.New().MarkFailed(def.Job.ID, err.Error()) if err != nil { utils.PrettyPrintError(fmt.Errorf("error marking job as failed. details: %w", err)) return } } } else { - err = jobModel.New().MarkCompleted(job.ID) + err = jobModel.New().MarkCompleted(def.Job.ID) if err != nil { utils.PrettyPrintError(fmt.Errorf("error marking job as completed. details: %w", err)) return diff --git a/pkg/subsystems/cs/vm.go b/pkg/subsystems/cs/vm.go index 45df8cb5..92c6542d 100644 --- a/pkg/subsystems/cs/vm.go +++ b/pkg/subsystems/cs/vm.go @@ -9,6 +9,7 @@ import ( "gopkg.in/yaml.v3" "log" "math/rand" + "net/url" "strings" "time" ) @@ -120,11 +121,11 @@ func (client *Client) UpdateVM(public *models.VmPublic) (*models.VmPublic, error params.SetName(public.Name) params.SetDisplayname(public.Name) - //if public.ExtraConfig == "" { - // params.SetExtraconfig(url.QueryEscape("none")) - //} else { - // params.SetExtraconfig(url.QueryEscape(public.ExtraConfig)) - //} + if public.ExtraConfig == "" { + params.SetExtraconfig(url.QueryEscape("none")) + } else { + params.SetExtraconfig(url.QueryEscape(public.ExtraConfig)) + } _, err = client.CsClient.VirtualMachine.UpdateVirtualMachine(params) if err != nil { diff --git a/service/resources/cs_generator.go b/service/resources/cs_generator.go index 6ea47d8c..5f59c52e 100644 --- a/service/resources/cs_generator.go +++ b/service/resources/cs_generator.go @@ -51,6 +51,7 @@ func (cr *CsGenerator) VMs() []models.VmPublic { if csVM := &cr.v.vm.Subsystems.CS.VM; service.Created(csVM) { csVM.Name = cr.v.vm.Name csVM.ServiceOfferingID = cr.v.vm.Subsystems.CS.ServiceOffering.ID + csVM.ExtraConfig = cr.v.vm.Subsystems.CS.VM.ExtraConfig res = append(res, *csVM) return res } else { From cbc9e4c31244aeea3c5fcb8484b88054e070368f Mon Sep 17 00:00:00 2001 From: saffronjam Date: Sat, 18 Nov 2023 13:45:47 +0100 Subject: [PATCH 2/2] fix repair if missing extra-config --- service/resources/cs_generator.go | 2 ++ service/vm_service/cs_service/cs_service.go | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/service/resources/cs_generator.go b/service/resources/cs_generator.go index 5f59c52e..5a09c3dd 100644 --- a/service/resources/cs_generator.go +++ b/service/resources/cs_generator.go @@ -52,6 +52,7 @@ func (cr *CsGenerator) VMs() []models.VmPublic { csVM.Name = cr.v.vm.Name csVM.ServiceOfferingID = cr.v.vm.Subsystems.CS.ServiceOffering.ID csVM.ExtraConfig = cr.v.vm.Subsystems.CS.VM.ExtraConfig + res = append(res, *csVM) return res } else { @@ -60,6 +61,7 @@ func (cr *CsGenerator) VMs() []models.VmPublic { ServiceOfferingID: cr.v.vm.Subsystems.CS.ServiceOffering.ID, TemplateID: constants.TemplateID, Tags: createTags(cr.v.vm.Name, cr.v.vm.Name), + ExtraConfig: cr.v.vm.Subsystems.CS.VM.ExtraConfig, }) return res } diff --git a/service/vm_service/cs_service/cs_service.go b/service/vm_service/cs_service/cs_service.go index b89ab197..2d6bc31c 100644 --- a/service/vm_service/cs_service/cs_service.go +++ b/service/vm_service/cs_service/cs_service.go @@ -5,6 +5,7 @@ import ( "fmt" configModels "go-deploy/models/config" vmModel "go-deploy/models/sys/vm" + gpuModel "go-deploy/models/sys/vm/gpu" "go-deploy/pkg/config" "go-deploy/pkg/subsystems/cs/commands" csModels "go-deploy/pkg/subsystems/cs/models" @@ -341,6 +342,18 @@ func Repair(id string) error { // only repair if the vm is stopped to prevent downtime for the user if status == "Stopped" { + var gpu *gpuModel.GPU + if context.VM.GpuID != "" { + gpu, err = gpuModel.New().GetByID(context.VM.GpuID) + if err != nil { + return makeError(err) + } + } + + if gpu != nil { + vm.ExtraConfig = CreateExtraConfig(gpu) + } + err = resources.SsRepairer( context.Client.ReadVM, context.Client.CreateVM,