internal/pkg/cli/errors.go (156 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package cli
import (
"errors"
"fmt"
"github.com/aws/copilot-cli/internal/pkg/term/color"
"github.com/dustin/go-humanize/english"
)
type errCannotDowngradePipelineVersion struct {
name string
version string
templateVersion string
}
func (e *errCannotDowngradePipelineVersion) init() *errCannotDowngradeVersion {
return &errCannotDowngradeVersion{
componentName: e.name,
componentType: "pipeline",
laterVersion: e.version,
thisVersion: e.templateVersion,
}
}
func (e *errCannotDowngradePipelineVersion) Error() string {
return e.init().Error()
}
func (e *errCannotDowngradePipelineVersion) RecommendActions() string {
return e.init().RecommendActions()
}
type errCannotDowngradeWkldVersion struct {
name string
version string
templateVersion string
}
func (e *errCannotDowngradeWkldVersion) init() *errCannotDowngradeVersion {
return &errCannotDowngradeVersion{
componentName: e.name,
componentType: "workload",
laterVersion: e.version,
thisVersion: e.templateVersion,
}
}
func (e *errCannotDowngradeWkldVersion) Error() string {
return e.init().Error()
}
func (e *errCannotDowngradeWkldVersion) RecommendActions() string {
return e.init().RecommendActions()
}
type errCannotDowngradeEnvVersion struct {
envName string
envVersion string
templateVersion string
}
func (e *errCannotDowngradeEnvVersion) init() *errCannotDowngradeVersion {
return &errCannotDowngradeVersion{
componentName: e.envName,
componentType: "environment",
laterVersion: e.envVersion,
thisVersion: e.templateVersion,
}
}
func (e *errCannotDowngradeEnvVersion) Error() string {
return e.init().Error()
}
func (e *errCannotDowngradeEnvVersion) RecommendActions() string {
return e.init().RecommendActions()
}
type errCannotDowngradeAppVersion struct {
appName string
appVersion string
templateVersion string
}
func (e *errCannotDowngradeAppVersion) init() *errCannotDowngradeVersion {
return &errCannotDowngradeVersion{
componentName: e.appName,
componentType: "application",
laterVersion: e.appVersion,
thisVersion: e.templateVersion,
}
}
func (e *errCannotDowngradeAppVersion) Error() string {
return e.init().Error()
}
func (e *errCannotDowngradeAppVersion) RecommendActions() string {
return e.init().RecommendActions()
}
type errCannotDowngradeVersion struct {
componentName string
componentType string
laterVersion string
thisVersion string
}
func (e *errCannotDowngradeVersion) Error() string {
return fmt.Sprintf("cannot downgrade %s %q (currently in version %s) to version %s", e.componentType, e.componentName, e.laterVersion, e.thisVersion)
}
func (e *errCannotDowngradeVersion) RecommendActions() string {
return fmt.Sprintf(`It looks like you are trying to use an earlier version of Copilot to downgrade %s lastly updated by a newer version of Copilot.
- We recommend upgrade your local Copilot CLI version and run this command again.
- Alternatively, you can run with %s to override. However, this can cause unsuccessful deployment. Please use with caution!`,
color.HighlightCode(fmt.Sprintf("%s %s", e.componentType, e.componentName)), color.HighlightCode(fmt.Sprintf("--%s", allowDowngradeFlag)))
}
type errNoInfrastructureChanges struct {
parentErr error
}
func (e *errNoInfrastructureChanges) Error() string {
return e.parentErr.Error()
}
func (e *errNoInfrastructureChanges) ExitCode() int {
return 0
}
type errBucketEmptyingFailed struct {
failedBuckets []string
bucketErrors []error
}
func (e *errBucketEmptyingFailed) Error() string {
return fmt.Sprintf("emptying %v %v failed: %v", english.PluralWord(len(e.failedBuckets), "bucket", "buckets"),
english.WordSeries(e.failedBuckets, "and"), errors.Join(e.bucketErrors...))
}
func (e *errBucketEmptyingFailed) RecommendActions() string {
return fmt.Sprintf(`Copilot failed to empty and delete %v managed by your environment. The %v now a dangling resource.
- We recommend logging into the S3 console and manually deleting the affected %v.`,
english.PluralWord(len(e.failedBuckets), "an S3 bucket", "S3 buckets"), english.PluralWord(len(e.failedBuckets), "bucket is", "buckets are"), english.PluralWord(len(e.failedBuckets), "bucket", "buckets"))
}
type errPipelineDependsOnEnv struct {
pipeline string
env string
}
func (e *errPipelineDependsOnEnv) Error() string {
return fmt.Sprintf("environment %q cannot be deleted because pipeline %q depends on it", e.env, e.pipeline)
}
func (e *errPipelineDependsOnEnv) RecommendActions() string {
return fmt.Sprintf(`You can update the manifest of the pipeline %q to remove its dependency on environment %q,
or run %s to delete the pipeline before running %s to delete the environment`,
e.pipeline, e.env, color.HighlightCode(fmt.Sprintf("copilot pipeline delete -n %s", e.pipeline)), color.HighlightCode(fmt.Sprintf("copilot env delete -n %s", e.env)))
}
type errTaskRoleRetrievalFailed struct {
chainErrs []error
}
func (e *errTaskRoleRetrievalFailed) Error() string {
return errors.Join(e.chainErrs...).Error()
}
func (e *errTaskRoleRetrievalFailed) RecommendActions() string {
return fmt.Sprintf(`TaskRole retrieval failed. If you require the TaskRole, you can try these methods to enable it:
1. Enable exec in the service manifest:
%s
2. Add permissions for your account to assume TaskRole by adding the following YAML override to your service:
%s
For more information on YAML overrides see %s
`,
color.HighlightCodeBlock(`exec: true # Enable running commands in your container.`),
color.HighlightCodeBlock(`- op: add
path: /Resources/TaskRole/Properties/AssumeRolePolicyDocument/Statement/-
value:
Effect: Allow
Principal:
AWS: "arn:aws:iam::[app-account-ID]:root"
Action: 'sts:AssumeRole'`),
color.Emphasize("https://aws.github.io/copilot-cli/docs/developing/overrides/yamlpatch/"))
}