diff --git a/pkg/manager/operations.go b/pkg/manager/operations.go index 619100e..c81a1ca 100644 --- a/pkg/manager/operations.go +++ b/pkg/manager/operations.go @@ -8,6 +8,8 @@ import ( "path/filepath" ) +type MaxRunningInstancesError error + // ListInstances returns a list of all instances managed by the instance manager. func (im *instanceManager) ListInstances() ([]*instance.Process, error) { im.mu.RLock() @@ -42,7 +44,7 @@ func (im *instanceManager) CreateInstance(name string, options *instance.CreateI // Check max instances limit after acquiring the lock if len(im.instances) >= im.instancesConfig.MaxInstances && im.instancesConfig.MaxInstances != -1 { - return nil, fmt.Errorf("maximum number of instances (%d) reached", im.instancesConfig.MaxInstances) + return nil, MaxRunningInstancesError(fmt.Errorf("maximum number of instances (%d) reached", im.instancesConfig.MaxInstances)) } // Check if instance with this name already exists @@ -182,7 +184,7 @@ func (im *instanceManager) StartInstance(name string) (*instance.Process, error) } if len(im.runningInstances) >= im.instancesConfig.MaxRunningInstances && im.instancesConfig.MaxRunningInstances != -1 { - return nil, fmt.Errorf("maximum number of running instances (%d) reached", im.instancesConfig.MaxRunningInstances) + return nil, MaxRunningInstancesError(fmt.Errorf("maximum number of running instances (%d) reached", im.instancesConfig.MaxRunningInstances)) } if err := instance.Start(); err != nil { diff --git a/pkg/server/handlers.go b/pkg/server/handlers.go index 9c5d9a9..7fe2224 100644 --- a/pkg/server/handlers.go +++ b/pkg/server/handlers.go @@ -272,6 +272,12 @@ func (h *Handler) StartInstance() http.HandlerFunc { inst, err := h.InstanceManager.StartInstance(name) if err != nil { + // Check if error is due to maximum running instances limit + if _, ok := err.(manager.MaxRunningInstancesError); ok { + http.Error(w, err.Error(), http.StatusConflict) + return + } + http.Error(w, "Failed to start instance: "+err.Error(), http.StatusInternalServerError) return }