diff --git a/app/api/controller/gitspace/delete.go b/app/api/controller/gitspace/delete.go index 044859646..c95eb8940 100644 --- a/app/api/controller/gitspace/delete.go +++ b/app/api/controller/gitspace/delete.go @@ -43,56 +43,53 @@ func (c *Controller) Delete( if err != nil { return fmt.Errorf("failed to authorize: %w", err) } - gitspaceConfig, err := c.gitspaceConfigStore.FindByIdentifier(ctx, space.ID, identifier) + gitspaceConfig.SpacePath = space.Path if err != nil || gitspaceConfig == nil { log.Err(err).Msg(gitspaceConfigNotFound + identifier) return err } instance, _ := c.gitspaceInstanceStore.FindLatestByGitspaceConfigID(ctx, gitspaceConfig.ID) gitspaceConfig.GitspaceInstance = instance - gitspaceConfig.SpacePath = space.Path - if instance == nil || instance.State.IsFinalStatus() { + if instance == nil || instance.State == enum.GitspaceInstanceStateUninitialized { gitspaceConfig.IsDeleted = true - err = c.gitspaceSvc.UpdateConfig(ctx, gitspaceConfig) - if err != nil { + if err = c.gitspaceSvc.UpdateConfig(ctx, gitspaceConfig); err != nil { return fmt.Errorf("failed to mark gitspace config as deleted: %w", err) } } else { + if instance.State.IsBusyStatus() { + return fmt.Errorf("in busy operation, please try again later") + } ctxWithoutCancel := context.WithoutCancel(ctx) - go c.stopRunningGitspace(ctxWithoutCancel, *gitspaceConfig) + go c.removeGitspace(ctxWithoutCancel, *gitspaceConfig) } return nil } -func (c *Controller) stopRunningGitspace(ctx context.Context, config types.GitspaceConfig) { +func (c *Controller) removeGitspace(ctx context.Context, config types.GitspaceConfig) { activeTimeEnded := time.Now().UnixMilli() config.GitspaceInstance.ActiveTimeEnded = &activeTimeEnded config.GitspaceInstance.TotalTimeUsed = *(config.GitspaceInstance.ActiveTimeEnded) - *(config.GitspaceInstance.ActiveTimeStarted) - config.GitspaceInstance.State = enum.GitspaceInstanceStateStopping - err := c.gitspaceSvc.UpdateInstance(ctx, config.GitspaceInstance) - if err != nil { - log.Ctx(ctx).Err(err).Msgf("failed to update instance %s before triggering delete", - config.GitspaceInstance.Identifier) - return + if config.GitspaceInstance.State == enum.GitspaceInstanceStateRunning { + config.GitspaceInstance.State = enum.GitspaceInstanceStateStopping + err := c.gitspaceSvc.UpdateInstance(ctx, config.GitspaceInstance) + if err != nil { + log.Ctx(ctx).Err(err).Msgf("failed to update instance %s before triggering delete", + config.GitspaceInstance.Identifier) + return + } } - - err = c.gitspaceSvc.TriggerDelete(ctx, config) - if err != nil { + if err := c.gitspaceSvc.TriggerDelete(ctx, config); err != nil { log.Ctx(ctx).Err(err).Msgf("error during triggering delete for gitspace instance %s", config.GitspaceInstance.Identifier) - config.GitspaceInstance.State = enum.GitspaceInstanceStateError - updateErr := c.gitspaceSvc.UpdateInstance(ctx, config.GitspaceInstance) - if updateErr != nil { + if updateErr := c.gitspaceSvc.UpdateInstance(ctx, config.GitspaceInstance); updateErr != nil { log.Ctx(ctx).Err(updateErr).Msgf("failed to update instance %s after error in triggering delete", config.GitspaceInstance.Identifier) } - return } - log.Ctx(ctx).Debug().Msgf("successfully triggered delete for gitspace instance %s", config.GitspaceInstance.Identifier) } diff --git a/app/gitspace/orchestrator/orchestrator_impl.go b/app/gitspace/orchestrator/orchestrator_impl.go index a4d9349c2..eb5dcaf80 100644 --- a/app/gitspace/orchestrator/orchestrator_impl.go +++ b/app/gitspace/orchestrator/orchestrator_impl.go @@ -114,8 +114,9 @@ func (o orchestrator) TriggerStopGitspace( "unable to find provisioned infra while triggering stop for gitspace instance %s: %w", gitspaceConfig.GitspaceInstance.Identifier, err) } - - err = o.stopGitspaceContainer(ctx, gitspaceConfig, *infra) + if gitspaceConfig.GitspaceInstance.State == enum.GitspaceInstanceStateRunning { + err = o.stopGitspaceContainer(ctx, gitspaceConfig, *infra) + } if err != nil { return err } @@ -207,12 +208,9 @@ func (o orchestrator) TriggerDeleteGitspace( "unable to find provisioned infra while triggering delete for gitspace instance %s: %w", gitspaceConfig.GitspaceInstance.Identifier, err) } - - err = o.stopAndRemoveGitspaceContainer(ctx, gitspaceConfig, *infra) - if err != nil { + if err = o.stopAndRemoveGitspaceContainer(ctx, gitspaceConfig, *infra); err != nil { return err } - o.emitGitspaceEvent(ctx, gitspaceConfig, enum.GitspaceEventTypeInfraDeprovisioningStart) err = o.infraProvisioner.TriggerDeprovision(ctx, gitspaceConfig, *infra)