mirror of https://github.com/docker/cli.git
clean-up "resolve image" option logic
- change `validateResolveImageFlag()` to only perform _validation_, and not combine it with modifying the option. - use a `switch` instead of `if` in `validateResolveImageFlag()` - `deployServices()`: break up some `switch` cases to make them easier to read/understand the logic. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
674c80af89
commit
47fce8f4bc
|
@ -25,25 +25,26 @@ const (
|
||||||
func RunDeploy(dockerCli command.Cli, opts options.Deploy, cfg *composetypes.Config) error {
|
func RunDeploy(dockerCli command.Cli, opts options.Deploy, cfg *composetypes.Config) error {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
if err := validateResolveImageFlag(dockerCli, &opts); err != nil {
|
if err := validateResolveImageFlag(&opts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return deployCompose(ctx, dockerCli, opts, cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// validateResolveImageFlag validates the opts.resolveImage command line option
|
|
||||||
// and also turns image resolution off if the version is older than 1.30
|
|
||||||
func validateResolveImageFlag(dockerCli command.Cli, opts *options.Deploy) error {
|
|
||||||
if opts.ResolveImage != ResolveImageAlways && opts.ResolveImage != ResolveImageChanged && opts.ResolveImage != ResolveImageNever {
|
|
||||||
return errors.Errorf("Invalid option %s for flag --resolve-image", opts.ResolveImage)
|
|
||||||
}
|
|
||||||
// client side image resolution should not be done when the supported
|
// client side image resolution should not be done when the supported
|
||||||
// server version is older than 1.30
|
// server version is older than 1.30
|
||||||
if versions.LessThan(dockerCli.Client().ClientVersion(), "1.30") {
|
if versions.LessThan(dockerCli.Client().ClientVersion(), "1.30") {
|
||||||
opts.ResolveImage = ResolveImageNever
|
opts.ResolveImage = ResolveImageNever
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return deployCompose(ctx, dockerCli, opts, cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// validateResolveImageFlag validates the opts.resolveImage command line option
|
||||||
|
func validateResolveImageFlag(opts *options.Deploy) error {
|
||||||
|
switch opts.ResolveImage {
|
||||||
|
case ResolveImageAlways, ResolveImageChanged, ResolveImageNever:
|
||||||
return nil
|
return nil
|
||||||
|
default:
|
||||||
|
return errors.Errorf("Invalid option %s for flag --resolve-image", opts.ResolveImage)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkDaemonIsSwarmManager does an Info API call to verify that the daemon is
|
// checkDaemonIsSwarmManager does an Info API call to verify that the daemon is
|
||||||
|
|
|
@ -192,6 +192,7 @@ func createNetworks(
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nolint: gocyclo
|
||||||
func deployServices(
|
func deployServices(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
dockerCli command.Cli,
|
dockerCli command.Cli,
|
||||||
|
@ -214,10 +215,12 @@ func deployServices(
|
||||||
}
|
}
|
||||||
|
|
||||||
for internalName, serviceSpec := range services {
|
for internalName, serviceSpec := range services {
|
||||||
name := namespace.Scope(internalName)
|
var (
|
||||||
|
name = namespace.Scope(internalName)
|
||||||
|
image = serviceSpec.TaskTemplate.ContainerSpec.Image
|
||||||
|
encodedAuth string
|
||||||
|
)
|
||||||
|
|
||||||
encodedAuth := ""
|
|
||||||
image := serviceSpec.TaskTemplate.ContainerSpec.Image
|
|
||||||
if sendAuth {
|
if sendAuth {
|
||||||
// Retrieve encoded auth token from the image reference
|
// Retrieve encoded auth token from the image reference
|
||||||
encodedAuth, err = command.RetrieveAuthTokenFromImage(ctx, dockerCli, image)
|
encodedAuth, err = command.RetrieveAuthTokenFromImage(ctx, dockerCli, image)
|
||||||
|
@ -231,20 +234,33 @@ func deployServices(
|
||||||
|
|
||||||
updateOpts := types.ServiceUpdateOptions{EncodedRegistryAuth: encodedAuth}
|
updateOpts := types.ServiceUpdateOptions{EncodedRegistryAuth: encodedAuth}
|
||||||
|
|
||||||
switch {
|
switch resolveImage {
|
||||||
case resolveImage == ResolveImageAlways || (resolveImage == ResolveImageChanged && image != service.Spec.Labels[convert.LabelImage]):
|
case ResolveImageAlways:
|
||||||
// image should be updated by the server using QueryRegistry
|
// image should be updated by the server using QueryRegistry
|
||||||
updateOpts.QueryRegistry = true
|
updateOpts.QueryRegistry = true
|
||||||
case image == service.Spec.Labels[convert.LabelImage]:
|
case ResolveImageChanged:
|
||||||
|
if image != service.Spec.Labels[convert.LabelImage] {
|
||||||
|
// Query the registry to resolve digest for the updated image
|
||||||
|
updateOpts.QueryRegistry = true
|
||||||
|
} else {
|
||||||
// image has not changed; update the serviceSpec with the
|
// image has not changed; update the serviceSpec with the
|
||||||
// existing information that was set by QueryRegistry on the
|
// existing information that was set by QueryRegistry on the
|
||||||
// previous deploy. Otherwise this will trigger an incorrect
|
// previous deploy. Otherwise this will trigger an incorrect
|
||||||
// service update.
|
// service update.
|
||||||
serviceSpec.TaskTemplate.ContainerSpec.Image = service.Spec.TaskTemplate.ContainerSpec.Image
|
serviceSpec.TaskTemplate.ContainerSpec.Image = service.Spec.TaskTemplate.ContainerSpec.Image
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
if image == service.Spec.Labels[convert.LabelImage] {
|
||||||
|
// image has not changed; update the serviceSpec with the
|
||||||
|
// existing information that was set by QueryRegistry on the
|
||||||
|
// previous deploy. Otherwise this will trigger an incorrect
|
||||||
|
// service update.
|
||||||
|
serviceSpec.TaskTemplate.ContainerSpec.Image = service.Spec.TaskTemplate.ContainerSpec.Image
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Stack deploy does not have a `--force` option. Preserve existing ForceUpdate
|
// Stack deploy does not have a `--force` option. Preserve existing
|
||||||
// value so that tasks are not re-deployed if not updated.
|
// ForceUpdate value so that tasks are not re-deployed if not updated.
|
||||||
// TODO move this to API client?
|
// TODO move this to API client?
|
||||||
serviceSpec.TaskTemplate.ForceUpdate = service.Spec.TaskTemplate.ForceUpdate
|
serviceSpec.TaskTemplate.ForceUpdate = service.Spec.TaskTemplate.ForceUpdate
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue