diff --git a/api/http/handler/stacks/stack_associate.go b/api/http/handler/stacks/stack_associate.go index f7fe64741..96a2b8144 100644 --- a/api/http/handler/stacks/stack_associate.go +++ b/api/http/handler/stacks/stack_associate.go @@ -21,7 +21,7 @@ import ( // @security jwt // @produce json // @param id path int true "Stack identifier" -// @param endpointId query int true "Stacks created before version 1.18.0 might not have an associated environment(endpoint) identifier. Use this optional parameter to set the environment(endpoint) identifier used by the stack." +// @param endpointId query int true "Environment identifier" // @param swarmId query int true "Swarm identifier" // @param orphanedRunning query boolean true "Indicates whether the stack is orphaned" // @success 200 {object} portainer.Stack "Success" diff --git a/api/http/handler/stacks/stack_delete.go b/api/http/handler/stacks/stack_delete.go index da2bd008f..805d7a949 100644 --- a/api/http/handler/stacks/stack_delete.go +++ b/api/http/handler/stacks/stack_delete.go @@ -29,7 +29,7 @@ import ( // @security jwt // @param id path int true "Stack identifier" // @param external query boolean false "Set to true to delete an external stack. Only external Swarm stacks are supported" -// @param endpointId query int true "Environment(Endpoint) identifier used to remove an external stack (required when external is set to true)" +// @param endpointId query int true "Environment identifier" // @success 204 "Success" // @failure 400 "Invalid request" // @failure 403 "Permission denied" diff --git a/api/http/handler/stacks/stack_start.go b/api/http/handler/stacks/stack_start.go index f0bee2345..d171f6d6c 100644 --- a/api/http/handler/stacks/stack_start.go +++ b/api/http/handler/stacks/stack_start.go @@ -25,6 +25,7 @@ import ( // @security ApiKeyAuth // @security jwt // @param id path int true "Stack identifier" +// @param endpointId query int true "Environment identifier" // @success 200 {object} portainer.Stack "Success" // @failure 400 "Invalid request" // @failure 403 "Permission denied" @@ -53,7 +54,12 @@ func (handler *Handler) stackStart(w http.ResponseWriter, r *http.Request) *http return httperror.BadRequest("Starting a kubernetes stack is not supported", err) } - endpoint, err := handler.DataStore.Endpoint().Endpoint(stack.EndpointID) + endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", false) + if err != nil { + return httperror.BadRequest("Invalid query parameter: endpointId", err) + } + + endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID)) if handler.DataStore.IsErrObjectNotFound(err) { return httperror.NotFound("Unable to find an endpoint with the specified identifier inside the database", err) } else if err != nil { diff --git a/api/http/handler/stacks/stack_stop.go b/api/http/handler/stacks/stack_stop.go index 24a7dec0d..6097c1e74 100644 --- a/api/http/handler/stacks/stack_stop.go +++ b/api/http/handler/stacks/stack_stop.go @@ -23,6 +23,7 @@ import ( // @security ApiKeyAuth // @security jwt // @param id path int true "Stack identifier" +// @param endpointId query int true "Environment identifier" // @success 200 {object} portainer.Stack "Success" // @failure 400 "Invalid request" // @failure 403 "Permission denied" @@ -51,7 +52,12 @@ func (handler *Handler) stackStop(w http.ResponseWriter, r *http.Request) *httpe return httperror.BadRequest("Stopping a kubernetes stack is not supported", err) } - endpoint, err := handler.DataStore.Endpoint().Endpoint(stack.EndpointID) + endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", false) + if err != nil { + return httperror.BadRequest("Invalid query parameter: endpointId", err) + } + + endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID)) if handler.DataStore.IsErrObjectNotFound(err) { return httperror.NotFound("Unable to find an environment with the specified identifier inside the database", err) } else if err != nil { diff --git a/api/http/handler/stacks/stack_update.go b/api/http/handler/stacks/stack_update.go index 3431f65a1..0dc3f25dc 100644 --- a/api/http/handler/stacks/stack_update.go +++ b/api/http/handler/stacks/stack_update.go @@ -63,7 +63,7 @@ func (payload *updateSwarmStackPayload) Validate(r *http.Request) error { // @accept json // @produce json // @param id path int true "Stack identifier" -// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated environment(endpoint) identifier. Use this optional parameter to set the environment(endpoint) identifier used by the stack." +// @param endpointId query int true "Environment identifier" // @param body body updateSwarmStackPayload true "Stack details" // @success 200 {object} portainer.Stack "Success" // @failure 400 "Invalid request" @@ -85,9 +85,9 @@ func (handler *Handler) stackUpdate(w http.ResponseWriter, r *http.Request) *htt } // TODO: this is a work-around for stacks created with Portainer version >= 1.17.1 - // The EndpointID property is not available for these stacks, this API environment(endpoint) + // The EndpointID property is not available for these stacks, this API endpoint // can use the optional EndpointID query parameter to associate a valid environment(endpoint) identifier to the stack. - endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true) + endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", false) if err != nil { return httperror.BadRequest("Invalid query parameter: endpointId", err) }