Skip to content

Commit

Permalink
Check docker image validity
Browse files Browse the repository at this point in the history
  • Loading branch information
brmzkw committed Feb 13, 2024
1 parent c059039 commit 007ec27
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 12 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
- https://github.com/koyeb/koyeb-cli/issues/182
* `koyeb deployment get` and `koyeb deployment describe` now display the GIT commit hash for git services types
- https://github.com/koyeb/koyeb-cli/pull/184
* Check the validity of the docker image when creating or updating a service
- https://github.com/koyeb/koyeb-cli/pull/185

## v3.7.1

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
github.com/gofrs/uuid v4.3.0+incompatible
github.com/gorilla/websocket v1.5.0
github.com/iancoleman/strcase v0.2.0
github.com/koyeb/koyeb-api-client-go v0.0.0-20240110103113-73fa7445f3bd
github.com/koyeb/koyeb-api-client-go v0.0.0-20240212154451-b30246307e85
github.com/logrusorgru/aurora v2.0.3+incompatible
github.com/manifoldco/promptui v0.9.0
github.com/mitchellh/go-homedir v1.1.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/koyeb/koyeb-api-client-go v0.0.0-20240110103113-73fa7445f3bd h1:GHOJc3H1G0lXOidMgKTzic+bFSxEtLvgd7mPUPb0WAU=
github.com/koyeb/koyeb-api-client-go v0.0.0-20240110103113-73fa7445f3bd/go.mod h1:+oQfFj2WL3gi9Pb+UHbob4D7xaT52mPfKyH1UvWa4PQ=
github.com/koyeb/koyeb-api-client-go v0.0.0-20240212154451-b30246307e85 h1:CIeO0R3lCwzqUV8pkwyZnZ+yrhyQ0ULp5XsXnBtg2Ng=
github.com/koyeb/koyeb-api-client-go v0.0.0-20240212154451-b30246307e85/go.mod h1:+oQfFj2WL3gi9Pb+UHbob4D7xaT52mPfKyH1UvWa4PQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
Expand Down
2 changes: 1 addition & 1 deletion pkg/koyeb/apps.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func NewAppCmd() *cobra.Command {
createService := koyeb.NewCreateServiceWithDefaults()
createDefinition := koyeb.NewDeploymentDefinitionWithDefaults()

err := parseServiceDefinitionFlags(cmd.Flags(), createDefinition)
err := parseServiceDefinitionFlags(ctx, cmd.Flags(), createDefinition)
if err != nil {
return err
}
Expand Down
57 changes: 49 additions & 8 deletions pkg/koyeb/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ $> koyeb service create myservice --app myapp --git github.com/org/name --git-br
createService := koyeb.NewCreateServiceWithDefaults()
createDefinition := koyeb.NewDeploymentDefinitionWithDefaults()

err := parseServiceDefinitionFlags(cmd.Flags(), createDefinition)
err := parseServiceDefinitionFlags(ctx, cmd.Flags(), createDefinition)
if err != nil {
return err
}
Expand Down Expand Up @@ -170,7 +170,7 @@ $> koyeb service update myapp/myservice --env PORT=8001 --env '!DEBUG'`,
updateDef.Git.Sha = koyeb.PtrString("")
}

err = parseServiceDefinitionFlags(cmd.Flags(), updateDef)
err = parseServiceDefinitionFlags(ctx, cmd.Flags(), updateDef)
if err != nil {
return err
}
Expand Down Expand Up @@ -349,7 +349,7 @@ func addServiceDefinitionFlags(flags *pflag.FlagSet) {
})
}

func parseServiceDefinitionFlags(flags *pflag.FlagSet, definition *koyeb.DeploymentDefinition) error {
func parseServiceDefinitionFlags(ctx *CLIContext, flags *pflag.FlagSet, definition *koyeb.DeploymentDefinition) error {
type_, err := parseType(flags, definition.GetType())
if err != nil {
return err
Expand Down Expand Up @@ -408,7 +408,7 @@ func parseServiceDefinitionFlags(flags *pflag.FlagSet, definition *koyeb.Deploym
// Scalings and environment variables refer to regions, so we must call setRegions after definition.SetScalings and definition.SetEnv.
setRegions(definition, regions)

err = setSource(definition, flags)
err = setSource(ctx, definition, flags)
if err != nil {
return err
}
Expand Down Expand Up @@ -799,7 +799,7 @@ func setScalingsTargets(flags *pflag.FlagSet, scaling *koyeb.DeploymentScaling)
}

// Parse --git-* and --docker-* flags to set deployment.Git or deployment.Docker
func setSource(definition *koyeb.DeploymentDefinition, flags *pflag.FlagSet) error {
func setSource(ctx *CLIContext, definition *koyeb.DeploymentDefinition, flags *pflag.FlagSet) error {
hasGitFlags := false
hasDockerFlags := false
flags.VisitAll(func(flag *pflag.Flag) {
Expand All @@ -826,7 +826,10 @@ func setSource(definition *koyeb.DeploymentDefinition, flags *pflag.FlagSet) err
}
if hasDockerFlags || definition.HasDocker() {
docker := definition.GetDocker()
source := parseDockerSource(flags, &docker)
source, err := parseDockerSource(ctx, flags, &docker)
if err != nil {
return err
}
definition.SetDocker(*source)
definition.Git = nil
} else if hasGitFlags || definition.HasGit() {
Expand All @@ -842,10 +845,13 @@ func setSource(definition *koyeb.DeploymentDefinition, flags *pflag.FlagSet) err
}

// Parse --docker-* flags
func parseDockerSource(flags *pflag.FlagSet, source *koyeb.DockerSource) *koyeb.DockerSource {
func parseDockerSource(ctx *CLIContext, flags *pflag.FlagSet, source *koyeb.DockerSource) (*koyeb.DockerSource, error) {
if flags.Lookup("docker").Changed {
image, _ := flags.GetString("docker")
source.SetImage(image)
if err := checkDockerImage(ctx, source); err != nil {
return nil, err
}
}
if flags.Lookup("docker-args").Changed {
args, _ := flags.GetStringSlice("docker-args")
Expand All @@ -867,7 +873,7 @@ func parseDockerSource(flags *pflag.FlagSet, source *koyeb.DockerSource) *koyeb.
privileged, _ := flags.GetBool("privileged")
source.SetPrivileged(privileged)
}
return source
return source, nil
}

// Parse --git-* flags
Expand Down Expand Up @@ -1209,3 +1215,38 @@ func parseAppName(cmd *cobra.Command, serviceName string) (string, error) {
}
return split[0], nil
}

// checkDockerImage calls the API /v1/docker-helper/verify to check the validity
// of the docker image in the given source. It returns nil if the image is
// valid, or an error if the image is invalid.
func checkDockerImage(ctx *CLIContext, source *koyeb.DockerSource) error {
req := ctx.Client.DockerHelperApi.VerifyDockerImage(ctx.Context).Image(source.GetImage())

secret := source.GetImageRegistrySecret()
if len(secret) > 0 {
req = req.SecretId(source.GetImageRegistrySecret())
}

res, resp, err := req.Execute()
if err != nil {
return errors.NewCLIErrorFromAPIError(
fmt.Sprintf("Error while checking the validity of the docker image `%s`", source.GetImage()),
err,
resp,
)
}

if !res.GetSuccess() {
return &errors.CLIError{
What: fmt.Sprintf("Error while checking the validity of the docker image `%s`", source.GetImage()),
Why: res.GetReason(),
Additional: []string{
fmt.Sprintf("Make sure the image name `%s` is correct and that the image exists.", source.GetImage()),
"If the image requires authentication, make sure to provide the parameter --docker-private-registry-secret.",
},
Orig: nil,
Solution: "Fix the image name or provide the required authentication and try again",
}
}
return nil
}

0 comments on commit 007ec27

Please sign in to comment.