Add CanStartInstance method to check instance start conditions

This commit is contained in:
2025-08-30 22:47:15 +02:00
parent a9f1c1a619
commit 68253be3e8
2 changed files with 27 additions and 0 deletions

View File

@@ -21,6 +21,7 @@ type InstanceManager interface {
UpdateInstance(name string, options *instance.CreateInstanceOptions) (*instance.Process, error)
DeleteInstance(name string) error
StartInstance(name string) (*instance.Process, error)
CanStartInstance(inst *instance.Process) (bool, error)
StopInstance(name string) (*instance.Process, error)
RestartInstance(name string) (*instance.Process, error)
GetInstanceLogs(name string) (string, error)

View File

@@ -201,6 +201,32 @@ func (im *instanceManager) StartInstance(name string) (*instance.Process, error)
return instance, nil
}
// CanStartInstance checks if an instance can be started.
// An instance can be started if:
// 1. It is not already running, AND
// 2. Either:
// a) There is capacity (MaxRunningInstances is unlimited or not reached), OR
// b) The instance has on-demand start enabled AND LRU eviction is enabled
// (allowing older instances to be evicted to make room)
func (im *instanceManager) CanStartInstance(inst *instance.Process) (bool, error) {
im.mu.RLock()
defer im.mu.RUnlock()
if inst == nil {
return false, fmt.Errorf("instance is nil")
}
if inst.IsRunning() {
return false, fmt.Errorf("instance with name %s is already running", inst.Name)
}
allowMaxRunning := im.instancesConfig.MaxRunningInstances == -1 || len(im.runningInstances) < im.instancesConfig.MaxRunningInstances
allowOnDemand := inst.GetOptions() != nil && inst.GetOptions().OnDemandStart != nil && *inst.GetOptions().OnDemandStart
allowLRUEviction := im.instancesConfig.EnableLRUEviction
return allowMaxRunning || (allowOnDemand && allowLRUEviction), nil
}
// StopInstance stops a running instance and returns it.
func (im *instanceManager) StopInstance(name string) (*instance.Process, error) {
im.mu.RLock()