diff --git a/api/stacks/stackbuilders/compose_file_content_builder.go b/api/stacks/stackbuilders/compose_file_content_builder.go index 813136162..796631611 100644 --- a/api/stacks/stackbuilders/compose_file_content_builder.go +++ b/api/stacks/stackbuilders/compose_file_content_builder.go @@ -1,6 +1,7 @@ package stackbuilders import ( + "fmt" "strconv" portainer "github.com/portainer/portainer/api" @@ -8,7 +9,6 @@ import ( "github.com/portainer/portainer/api/filesystem" "github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/stacks/deployments" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type ComposeStackFileContentBuilder struct { @@ -55,7 +55,7 @@ func (b *ComposeStackFileContentBuilder) SetFileContent(payload *StackPayload) F stackFolder := strconv.Itoa(int(b.stack.ID)) projectPath, err := b.fileService.StoreStackFileFromBytes(stackFolder, b.stack.EntryPoint, []byte(payload.StackFileContent)) if err != nil { - b.err = httperror.InternalServerError("Unable to persist Compose file on disk", err) + b.err = fmt.Errorf("Unable to persist Compose file on disk: %w", err) return b } b.stack.ProjectPath = projectPath @@ -70,7 +70,7 @@ func (b *ComposeStackFileContentBuilder) Deploy(payload *StackPayload, endpoint composeDeploymentConfig, err := deployments.CreateComposeStackDeploymentConfig(b.SecurityContext, b.stack, endpoint, b.dataStore, b.fileService, b.stackDeployer, false, false) if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = err return b } diff --git a/api/stacks/stackbuilders/compose_file_upload_builder.go b/api/stacks/stackbuilders/compose_file_upload_builder.go index e7968bc8c..608e12024 100644 --- a/api/stacks/stackbuilders/compose_file_upload_builder.go +++ b/api/stacks/stackbuilders/compose_file_upload_builder.go @@ -6,7 +6,6 @@ import ( "github.com/portainer/portainer/api/filesystem" "github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/stacks/deployments" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type ComposeStackFileUploadBuilder struct { @@ -61,7 +60,7 @@ func (b *ComposeStackFileUploadBuilder) Deploy(payload *StackPayload, endpoint * composeDeploymentConfig, err := deployments.CreateComposeStackDeploymentConfig(b.SecurityContext, b.stack, endpoint, b.dataStore, b.fileService, b.stackDeployer, false, false) if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = err return b } diff --git a/api/stacks/stackbuilders/compose_git_builder.go b/api/stacks/stackbuilders/compose_git_builder.go index 43d10d376..0b2d1590b 100644 --- a/api/stacks/stackbuilders/compose_git_builder.go +++ b/api/stacks/stackbuilders/compose_git_builder.go @@ -6,7 +6,6 @@ import ( "github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/scheduler" "github.com/portainer/portainer/api/stacks/deployments" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type ComposeStackGitBuilder struct { @@ -61,7 +60,7 @@ func (b *ComposeStackGitBuilder) Deploy(payload *StackPayload, endpoint *portain composeDeploymentConfig, err := deployments.CreateComposeStackDeploymentConfig(b.SecurityContext, b.stack, endpoint, b.dataStore, b.fileService, b.stackDeployer, false, false) if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = err return b } diff --git a/api/stacks/stackbuilders/director.go b/api/stacks/stackbuilders/director.go index 7da9a4660..0f671433a 100644 --- a/api/stacks/stackbuilders/director.go +++ b/api/stacks/stackbuilders/director.go @@ -18,38 +18,76 @@ func NewStackBuilderDirector(b any) *StackBuilderDirector { } } +// Build executes the stack build process based on the builder type. It returns the +// created stack and any error encountered during the process. +// The returned error is of type *httperror.HandlerError, which could be a BadRequest +// or InternalServerError depending on the error encountered during the stack build process. func (d *StackBuilderDirector) Build(payload *StackPayload, endpoint *portainer.Endpoint) (*portainer.Stack, *httperror.HandlerError) { - + var ( + stack *portainer.Stack + err error + ) + // To align with the flow of the actual service deployment tools, we save + // the stack before the deployment. This allows us to track the stack + // metadata and partially created resources. switch builder := d.builder.(type) { case GitMethodStackBuildProcess: - return builder.SetGeneralInfo(payload, endpoint). + stack, err = builder.SetGeneralInfo(payload, endpoint). SetUniqueInfo(payload). SetGitRepository(payload). - Deploy(payload, endpoint). - SetAutoUpdate(payload). SaveStack() + if err != nil { + return nil, httperror.InternalServerError("Failed to save stack via Git repository method", err) + } + + // Since AutoUpdate job for stack is created after a successful + // deployment, we need to update the stack with the new generated job ID + stack, err = builder.Deploy(payload, endpoint). + SetAutoUpdate(payload). + UpdateStack(stack) case FileUploadMethodStackBuildProcess: - return builder.SetGeneralInfo(payload, endpoint). + stack, err = builder.SetGeneralInfo(payload, endpoint). SetUniqueInfo(payload). SetUploadedFile(payload). - Deploy(payload, endpoint). SaveStack() + if err != nil { + return nil, httperror.InternalServerError("Failed to save stack via File Upload method", err) + } + + builder.Deploy(payload, endpoint) + err = builder.Error() case FileContentMethodStackBuildProcess: - return builder.SetGeneralInfo(payload, endpoint). + stack, err = builder.SetGeneralInfo(payload, endpoint). SetUniqueInfo(payload). SetFileContent(payload). - Deploy(payload, endpoint). SaveStack() + if err != nil { + return nil, httperror.InternalServerError("Failed to save stack via File Content method", err) + } + + builder.Deploy(payload, endpoint) + err = builder.Error() case UrlMethodStackBuildProcess: - return builder.SetGeneralInfo(payload, endpoint). + stack, err = builder.SetGeneralInfo(payload, endpoint). SetUniqueInfo(payload). SetURL(payload). - Deploy(payload, endpoint). SaveStack() + if err != nil { + return nil, httperror.InternalServerError("Failed to save stack via URL method", err) + } + + builder.Deploy(payload, endpoint) + err = builder.Error() + + default: + return nil, httperror.BadRequest("Invalid value for query parameter: method. Value must be one of: string or repository or url or file", errors.New(request.ErrInvalidQueryParameter)) + } + if err != nil { + return nil, httperror.InternalServerError("Failed to deploy stack", err) } - return nil, httperror.BadRequest("Invalid value for query parameter: method. Value must be one of: string or repository or url or file", errors.New(request.ErrInvalidQueryParameter)) + return stack, nil } diff --git a/api/stacks/stackbuilders/k8s_file_content_builder.go b/api/stacks/stackbuilders/k8s_file_content_builder.go index cc168d183..fae2ceec5 100644 --- a/api/stacks/stackbuilders/k8s_file_content_builder.go +++ b/api/stacks/stackbuilders/k8s_file_content_builder.go @@ -1,6 +1,7 @@ package stackbuilders import ( + "fmt" "strconv" "sync" @@ -10,7 +11,6 @@ import ( k "github.com/portainer/portainer/api/kubernetes" "github.com/portainer/portainer/api/stacks/deployments" "github.com/portainer/portainer/api/stacks/stackutils" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type K8sStackFileContentBuilder struct { @@ -66,7 +66,7 @@ func (b *K8sStackFileContentBuilder) SetFileContent(payload *StackPayload) FileC stackFolder := strconv.Itoa(int(b.stack.ID)) projectPath, err := b.fileService.StoreStackFileFromBytes(stackFolder, b.stack.EntryPoint, []byte(payload.StackFileContent)) if err != nil { - b.err = httperror.InternalServerError("Unable to persist Kubernetes Manifest file on disk", err) + b.err = fmt.Errorf("Unable to persist Kubernetes Manifest file on disk: %w", err) return b } @@ -93,7 +93,7 @@ func (b *K8sStackFileContentBuilder) Deploy(payload *StackPayload, endpoint *por k8sDeploymentConfig, err := deployments.CreateKubernetesStackDeploymentConfig(b.stack, b.KuberneteDeployer, k8sAppLabel, b.User, endpoint) if err != nil { - b.err = httperror.InternalServerError("failed to create temp kub deployment files", err) + b.err = fmt.Errorf("failed to create temp kub deployment files: %w", err) return b } diff --git a/api/stacks/stackbuilders/k8s_git_builder.go b/api/stacks/stackbuilders/k8s_git_builder.go index 6fe0254b4..8fcbe3e3f 100644 --- a/api/stacks/stackbuilders/k8s_git_builder.go +++ b/api/stacks/stackbuilders/k8s_git_builder.go @@ -1,6 +1,7 @@ package stackbuilders import ( + "fmt" "sync" portainer "github.com/portainer/portainer/api" @@ -9,7 +10,6 @@ import ( "github.com/portainer/portainer/api/scheduler" "github.com/portainer/portainer/api/stacks/deployments" "github.com/portainer/portainer/api/stacks/stackutils" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type KubernetesStackGitBuilder struct { @@ -83,7 +83,7 @@ func (b *KubernetesStackGitBuilder) Deploy(payload *StackPayload, endpoint *port k8sDeploymentConfig, err := deployments.CreateKubernetesStackDeploymentConfig(b.stack, b.KuberneteDeployer, k8sAppLabel, b.user, endpoint) if err != nil { - b.err = httperror.InternalServerError("failed to create temp kub deployment files", err) + b.err = fmt.Errorf("failed to create temp kub deployment files: %w", err) return b } diff --git a/api/stacks/stackbuilders/k8s_url_builder.go b/api/stacks/stackbuilders/k8s_url_builder.go index 21a1387f1..312bea01c 100644 --- a/api/stacks/stackbuilders/k8s_url_builder.go +++ b/api/stacks/stackbuilders/k8s_url_builder.go @@ -1,6 +1,7 @@ package stackbuilders import ( + "fmt" "strconv" "sync" @@ -11,7 +12,6 @@ import ( k "github.com/portainer/portainer/api/kubernetes" "github.com/portainer/portainer/api/stacks/deployments" "github.com/portainer/portainer/api/stacks/stackutils" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type KubernetesStackUrlBuilder struct { @@ -65,7 +65,7 @@ func (b *KubernetesStackUrlBuilder) SetURL(payload *StackPayload) UrlMethodStack manifestContent, err := client.Get(payload.ManifestURL, 30) if err != nil { - b.err = httperror.InternalServerError("Unable to retrieve manifest from URL", err) + b.err = fmt.Errorf("Unable to retrieve manifest from URL: %w", err) return b } @@ -73,7 +73,7 @@ func (b *KubernetesStackUrlBuilder) SetURL(payload *StackPayload) UrlMethodStack stackFolder := strconv.Itoa(int(b.stack.ID)) projectPath, err := b.fileService.StoreStackFileFromBytes(stackFolder, b.stack.EntryPoint, manifestContent) if err != nil { - b.err = httperror.InternalServerError("Unable to persist Kubernetes manifest file on disk", err) + b.err = fmt.Errorf("Unable to persist Kubernetes manifest file on disk: %w", err) return b } @@ -99,7 +99,7 @@ func (b *KubernetesStackUrlBuilder) Deploy(payload *StackPayload, endpoint *port k8sDeploymentConfig, err := deployments.CreateKubernetesStackDeploymentConfig(b.stack, b.KuberneteDeployer, k8sAppLabel, b.user, endpoint) if err != nil { - b.err = httperror.InternalServerError("failed to create temp kub deployment files", err) + b.err = fmt.Errorf("failed to create temp kub deployment files: %w", err) return b } diff --git a/api/stacks/stackbuilders/stack_builder.go b/api/stacks/stackbuilders/stack_builder.go index 89a9701f3..f8054ffa0 100644 --- a/api/stacks/stackbuilders/stack_builder.go +++ b/api/stacks/stackbuilders/stack_builder.go @@ -1,10 +1,11 @@ package stackbuilders import ( + "fmt" + portainer "github.com/portainer/portainer/api" "github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/stacks/deployments" - httperror "github.com/portainer/portainer/pkg/libhttp/error" "github.com/rs/zerolog/log" ) @@ -15,7 +16,7 @@ type StackBuilder struct { fileService portainer.FileService stackDeployer deployments.StackDeployer deploymentConfiger deployments.StackDeploymentConfiger - err *httperror.HandlerError + err error doCleanUp bool } @@ -29,7 +30,7 @@ func CreateStackBuilder(dataStore dataservices.DataStore, fileService portainer. } } -func (b *StackBuilder) SaveStack() (*portainer.Stack, *httperror.HandlerError) { +func (b *StackBuilder) SaveStack() (*portainer.Stack, error) { defer func() { _ = b.cleanUp() }() if b.hasError() { @@ -38,7 +39,7 @@ func (b *StackBuilder) SaveStack() (*portainer.Stack, *httperror.HandlerError) { if err := b.dataStore.UpdateTx(func(tx dataservices.DataStoreTx) error { if err := tx.Stack().Create(b.stack); err != nil { - b.err = httperror.InternalServerError("Unable to persist the stack inside the database", err) + b.err = fmt.Errorf("Unable to persist the stack inside the database: %w", err) return b.err } @@ -49,7 +50,11 @@ func (b *StackBuilder) SaveStack() (*portainer.Stack, *httperror.HandlerError) { b.doCleanUp = false - return b.stack, b.err + return b.stack, nil +} + +func (b *StackBuilder) Error() error { + return b.err } func (b *StackBuilder) cleanUp() error { diff --git a/api/stacks/stackbuilders/stack_file_content_builder.go b/api/stacks/stackbuilders/stack_file_content_builder.go index 5e29208a6..4f08d7e0b 100644 --- a/api/stacks/stackbuilders/stack_file_content_builder.go +++ b/api/stacks/stackbuilders/stack_file_content_builder.go @@ -4,7 +4,6 @@ import ( "time" portainer "github.com/portainer/portainer/api" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type FileContentMethodStackBuildProcess interface { @@ -15,11 +14,12 @@ type FileContentMethodStackBuildProcess interface { // Deploy stack based on the configuration Deploy(payload *StackPayload, endpoint *portainer.Endpoint) FileContentMethodStackBuildProcess // Save the stack information to database - SaveStack() (*portainer.Stack, *httperror.HandlerError) + SaveStack() (*portainer.Stack, error) // Get response from HTTP request. Use if it is needed GetResponse() string // Process the file content SetFileContent(payload *StackPayload) FileContentMethodStackBuildProcess + Error() error } type FileContentMethodStackBuilder struct { @@ -50,9 +50,7 @@ func (b *FileContentMethodStackBuilder) Deploy(payload *StackPayload, endpoint * } // Deploy the stack - if err := b.deploymentConfiger.Deploy(); err != nil { - b.err = httperror.InternalServerError(err.Error(), err) - } + b.err = b.deploymentConfiger.Deploy() return b } @@ -60,3 +58,7 @@ func (b *FileContentMethodStackBuilder) Deploy(payload *StackPayload, endpoint * func (b *FileContentMethodStackBuilder) GetResponse() string { return "" } + +func (b *FileContentMethodStackBuilder) Error() error { + return b.err +} diff --git a/api/stacks/stackbuilders/stack_file_upload_builder.go b/api/stacks/stackbuilders/stack_file_upload_builder.go index ab8eb597a..7a92f66d4 100644 --- a/api/stacks/stackbuilders/stack_file_upload_builder.go +++ b/api/stacks/stackbuilders/stack_file_upload_builder.go @@ -1,11 +1,11 @@ package stackbuilders import ( + "fmt" "strconv" "time" portainer "github.com/portainer/portainer/api" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type FileUploadMethodStackBuildProcess interface { @@ -16,11 +16,12 @@ type FileUploadMethodStackBuildProcess interface { // Deploy stack based on the configuration Deploy(payload *StackPayload, endpoint *portainer.Endpoint) FileUploadMethodStackBuildProcess // Save the stack information to database - SaveStack() (*portainer.Stack, *httperror.HandlerError) + SaveStack() (*portainer.Stack, error) // Get response from HTTP request. Use if it is needed GetResponse() string // Process the upload file SetUploadedFile(payload *StackPayload) FileUploadMethodStackBuildProcess + Error() error } type FileUploadMethodStackBuilder struct { @@ -49,7 +50,7 @@ func (b *FileUploadMethodStackBuilder) SetUploadedFile(payload *StackPayload) Fi stackFolder := strconv.Itoa(int(b.stack.ID)) projectPath, err := b.fileService.StoreStackFileFromBytes(stackFolder, b.stack.EntryPoint, payload.StackFileContentBytes) if err != nil { - b.err = httperror.InternalServerError("Unable to persist Compose file on disk", err) + b.err = fmt.Errorf("Unable to persist file on disk: %w", err) return b } @@ -65,7 +66,7 @@ func (b *FileUploadMethodStackBuilder) Deploy(payload *StackPayload, endpoint *p // Deploy the stack if err := b.deploymentConfiger.Deploy(); err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = err return b } diff --git a/api/stacks/stackbuilders/stack_git_builder.go b/api/stacks/stackbuilders/stack_git_builder.go index 8fdf25138..d10f7be4a 100644 --- a/api/stacks/stackbuilders/stack_git_builder.go +++ b/api/stacks/stackbuilders/stack_git_builder.go @@ -6,12 +6,12 @@ import ( "time" portainer "github.com/portainer/portainer/api" + "github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/filesystem" gittypes "github.com/portainer/portainer/api/git/types" "github.com/portainer/portainer/api/scheduler" "github.com/portainer/portainer/api/stacks/deployments" "github.com/portainer/portainer/api/stacks/stackutils" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type GitMethodStackBuildProcess interface { @@ -21,14 +21,16 @@ type GitMethodStackBuildProcess interface { SetUniqueInfo(payload *StackPayload) GitMethodStackBuildProcess // Deploy stack based on the configuration Deploy(payload *StackPayload, endpoint *portainer.Endpoint) GitMethodStackBuildProcess - // Save the stack information to database and return the stack object - SaveStack() (*portainer.Stack, *httperror.HandlerError) + // Save the stack information to database + SaveStack() (*portainer.Stack, error) // Get response from HTTP request. Use if it is needed GetResponse() string // Set git repository configuration SetGitRepository(payload *StackPayload) GitMethodStackBuildProcess // Set auto update setting SetAutoUpdate(payload *StackPayload) GitMethodStackBuildProcess + UpdateStack(stack *portainer.Stack) (*portainer.Stack, error) + Error() error } type GitMethodStackBuilder struct { @@ -91,7 +93,7 @@ func (b *GitMethodStackBuilder) SetGitRepository(payload *StackPayload) GitMetho commitHash, err := stackutils.DownloadGitRepository(repoConfig, b.gitService, getProjectPath) if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = fmt.Errorf("failed to download git repository: %w", err) return b } @@ -108,15 +110,34 @@ func (b *GitMethodStackBuilder) Deploy(payload *StackPayload, endpoint *portaine } // Deploy the stack - err := b.deploymentConfiger.Deploy() - if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) - return b - } + b.err = b.deploymentConfiger.Deploy() return b } +func (b *GitMethodStackBuilder) UpdateStack(stack *portainer.Stack) (*portainer.Stack, error) { + if b.hasError() { + return nil, b.err + } + + b.stack = stack + + // Ideally, we should replace b.dataStore with b.tx and manage the transaction + // at a higher layer. However, that would require significant changes to other + // logic unrelated to this builder. + // To keep this change focused and minimize the scope, we will retain b.dataStore + // and perform the update within a transaction here for now. + b.err = b.dataStore.UpdateTx(func(tx dataservices.DataStoreTx) error { + if err := tx.Stack().Update(b.stack.ID, b.stack); err != nil { + return fmt.Errorf("Unable to update the stack inside the database: %w", err) + } + + return nil + }) + + return b.stack, b.err +} + func (b *GitMethodStackBuilder) SetAutoUpdate(payload *StackPayload) GitMethodStackBuildProcess { if b.hasError() { return b diff --git a/api/stacks/stackbuilders/stack_url_builder.go b/api/stacks/stackbuilders/stack_url_builder.go index 8254b02ea..c91c90392 100644 --- a/api/stacks/stackbuilders/stack_url_builder.go +++ b/api/stacks/stackbuilders/stack_url_builder.go @@ -4,7 +4,6 @@ import ( "time" portainer "github.com/portainer/portainer/api" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type UrlMethodStackBuildProcess interface { @@ -15,11 +14,12 @@ type UrlMethodStackBuildProcess interface { // Deploy stack based on the configuration Deploy(payload *StackPayload, endpoint *portainer.Endpoint) UrlMethodStackBuildProcess // Save the stack information to database - SaveStack() (*portainer.Stack, *httperror.HandlerError) + SaveStack() (*portainer.Stack, error) // Get reponse from http request. Use if it is needed GetResponse() string // Set manifest url SetURL(payload *StackPayload) UrlMethodStackBuildProcess + Error() error } type UrlMethodStackBuilder struct { @@ -55,7 +55,7 @@ func (b *UrlMethodStackBuilder) Deploy(payload *StackPayload, endpoint *portaine // Deploy the stack err := b.deploymentConfiger.Deploy() if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = err return b } @@ -65,3 +65,7 @@ func (b *UrlMethodStackBuilder) Deploy(payload *StackPayload, endpoint *portaine func (b *UrlMethodStackBuilder) GetResponse() string { return "" } + +func (b *UrlMethodStackBuilder) Error() error { + return b.err +} diff --git a/api/stacks/stackbuilders/swarm_file_content_builder.go b/api/stacks/stackbuilders/swarm_file_content_builder.go index 2ae3c4753..c8fa5d82b 100644 --- a/api/stacks/stackbuilders/swarm_file_content_builder.go +++ b/api/stacks/stackbuilders/swarm_file_content_builder.go @@ -1,6 +1,7 @@ package stackbuilders import ( + "fmt" "strconv" portainer "github.com/portainer/portainer/api" @@ -8,7 +9,6 @@ import ( "github.com/portainer/portainer/api/filesystem" "github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/stacks/deployments" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type SwarmStackFileContentBuilder struct { @@ -56,7 +56,7 @@ func (b *SwarmStackFileContentBuilder) SetFileContent(payload *StackPayload) Fil stackFolder := strconv.Itoa(int(b.stack.ID)) projectPath, err := b.fileService.StoreStackFileFromBytes(stackFolder, b.stack.EntryPoint, []byte(payload.StackFileContent)) if err != nil { - b.err = httperror.InternalServerError("Unable to persist Compose file on disk", err) + b.err = fmt.Errorf("Unable to persist Swarm file on disk: %w", err) return b } b.stack.ProjectPath = projectPath @@ -71,7 +71,7 @@ func (b *SwarmStackFileContentBuilder) Deploy(payload *StackPayload, endpoint *p swarmDeploymentConfig, err := deployments.CreateSwarmStackDeploymentConfig(b.SecurityContext, b.stack, endpoint, b.dataStore, b.fileService, b.stackDeployer, false, true) if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = err return b } diff --git a/api/stacks/stackbuilders/swarm_file_upload_builder.go b/api/stacks/stackbuilders/swarm_file_upload_builder.go index d8be9054b..c4ab1f837 100644 --- a/api/stacks/stackbuilders/swarm_file_upload_builder.go +++ b/api/stacks/stackbuilders/swarm_file_upload_builder.go @@ -6,7 +6,6 @@ import ( "github.com/portainer/portainer/api/filesystem" "github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/stacks/deployments" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type SwarmStackFileUploadBuilder struct { @@ -65,7 +64,7 @@ func (b *SwarmStackFileUploadBuilder) Deploy(payload *StackPayload, endpoint *po swarmDeploymentConfig, err := deployments.CreateSwarmStackDeploymentConfig(b.SecurityContext, b.stack, endpoint, b.dataStore, b.fileService, b.stackDeployer, false, true) if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = err return b } diff --git a/api/stacks/stackbuilders/swarm_git_builder.go b/api/stacks/stackbuilders/swarm_git_builder.go index c3d6fab6a..25167fb21 100644 --- a/api/stacks/stackbuilders/swarm_git_builder.go +++ b/api/stacks/stackbuilders/swarm_git_builder.go @@ -6,7 +6,6 @@ import ( "github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/scheduler" "github.com/portainer/portainer/api/stacks/deployments" - httperror "github.com/portainer/portainer/pkg/libhttp/error" ) type SwarmStackGitBuilder struct { @@ -63,7 +62,7 @@ func (b *SwarmStackGitBuilder) Deploy(payload *StackPayload, endpoint *portainer swarmDeploymentConfig, err := deployments.CreateSwarmStackDeploymentConfig(b.SecurityContext, b.stack, endpoint, b.dataStore, b.fileService, b.stackDeployer, false, true) if err != nil { - b.err = httperror.InternalServerError(err.Error(), err) + b.err = err return b }