diff --git a/database/handler.go b/database/handler.go index ad31a6e..ce67644 100644 --- a/database/handler.go +++ b/database/handler.go @@ -192,11 +192,15 @@ func (handler *Handler) UpdateK8s(id string, k8s string, conf string) error { } //UpdateStatus Updates the status of a job -func (handler *Handler) UpdateStatus(id string, status api.JobStatusEnum, errorMsg string) error { +func (handler *Handler) UpdateStatus(id string, status api.JobStatusEnum, errorMsg string, isDeleted bool) error { job := Job{ JobID: id, } + if isDeleted { + job.IsDeleted = true + } + updateResult := handler.DB.Model(&job).Updates(Job{Status: status.String(), Error: errorMsg}) if updateResult.Error != nil { log.Println(updateResult.Error) diff --git a/database/models.go b/database/models.go index 7f33cdd..189b1a2 100644 --- a/database/models.go +++ b/database/models.go @@ -18,4 +18,5 @@ type Job struct { Error string ExpiryDate time.Time ConfString string + IsDeleted bool } diff --git a/endpoints/job.go b/endpoints/job.go index 897c8de..8ec9d3c 100644 --- a/endpoints/job.go +++ b/endpoints/job.go @@ -106,6 +106,8 @@ func (apiHandler *BaktaJobAPI) GetJobsStatus(ctx context.Context, request *api.J var jobIDs []string for _, jobID := range request.GetJobs() { + isDeleted := false + err := apiHandler.dbHandler.CheckSecret(jobID.GetJobID(), jobID.GetSecret()) if err != nil { err = fmt.Errorf("JobID does not match secret ID") @@ -124,8 +126,18 @@ func (apiHandler *BaktaJobAPI) GetJobsStatus(ctx context.Context, request *api.J return nil, err } + if newStatus.Status == api.JobStatusEnum_SUCCESSFULL || newStatus.Status == api.JobStatusEnum_ERROR { + err := apiHandler.scheduler.DeleteJob(job.K8sID) + if err != nil { + err = fmt.Errorf("could not get updated job status") + return nil, err + } + + isDeleted = true + } + if job.Status != newStatus.Status.String() { - err = apiHandler.dbHandler.UpdateStatus(jobID.GetJobID(), newStatus.Status, newStatus.ErrorMsg) + err = apiHandler.dbHandler.UpdateStatus(jobID.GetJobID(), newStatus.Status, newStatus.ErrorMsg, isDeleted) if err != nil { err = fmt.Errorf("could not update job status") return nil, err diff --git a/endpoints/update.go b/endpoints/update.go index e000495..126b0e3 100644 --- a/endpoints/update.go +++ b/endpoints/update.go @@ -27,11 +27,31 @@ func (apiHandler *BaktaUpdateAPI) UpdateStatus(ctx context.Context, request *api return } - err = apiHandler.dbHandler.UpdateStatus(request.GetJobID(), status.Status, status.ErrorMsg) + isDeleted := false + + if status.Status == api.JobStatusEnum_SUCCESSFULL || status.Status == api.JobStatusEnum_ERROR { + job, err := apiHandler.dbHandler.GetJob(request.GetJobID()) + if err != nil { + log.Println(err.Error()) + return + } + if !job.IsDeleted { + err = apiHandler.scheduler.DeleteJob(job.K8sID) + if err != nil { + log.Println(err.Error()) + return + } + + isDeleted = true + } + } + + err = apiHandler.dbHandler.UpdateStatus(request.GetJobID(), status.Status, status.ErrorMsg, isDeleted) if err != nil { log.Println(err.Error()) return } + }() return &api.Empty{}, nil diff --git a/scheduler/SimpleScheduler.go b/scheduler/SimpleScheduler.go index ba4552e..596cd6f 100644 --- a/scheduler/SimpleScheduler.go +++ b/scheduler/SimpleScheduler.go @@ -12,11 +12,11 @@ import ( "github.com/ag-computational-bio/bakta-web-api-go/api" "github.com/ag-computational-bio/bakta-web-backend/database" - restclient "k8s.io/client-go/rest" - batchv1 "k8s.io/api/batch/v1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" + restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" ) @@ -104,6 +104,16 @@ func (scheduler *SimpleScheduler) StartJob(jobID string, jobConfig *api.JobConfi return scheduledJob, nil } +func (scheduler *SimpleScheduler) DeleteJob(jobName string) error { + err := scheduler.k8sClient.BatchV1().Jobs(scheduler.namespace).Delete(context.TODO(), jobName, metav1.DeleteOptions{}) + if err != nil && !errors.IsNotFound(err) { + log.Println(err.Error()) + return err + } + + return nil +} + func createOutOfClusterConfig() (*restclient.Config, error) { var kubeconfig *string if home := homedir.HomeDir(); home != "" {