From 6e4439bf490857609393c8e86afc5d149a98ef83 Mon Sep 17 00:00:00 2001 From: Pasha Sviderski Date: Tue, 4 Nov 2025 18:15:16 +1000 Subject: [PATCH] chore: show container image for the remove container plan operation --- pkg/api/container.go | 6 ++++++ pkg/client/deploy/operation.go | 33 ++++++++++++++++++--------------- pkg/client/deploy/strategy.go | 25 ++++++++++--------------- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/pkg/api/container.go b/pkg/api/container.go index 561e6b4c..cab49443 100644 --- a/pkg/api/container.go +++ b/pkg/api/container.go @@ -8,6 +8,7 @@ import ( "time" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/pkg/stringid" "github.com/docker/go-units" ) @@ -144,6 +145,11 @@ type ServiceContainer struct { ServiceSpec ServiceSpec } +// ShortID returns the truncated ID of the container (12 characters). +func (c *ServiceContainer) ShortID() string { + return stringid.TruncateID(c.ID) +} + // ServiceID returns the ID of the service this container belongs to. func (c *ServiceContainer) ServiceID() string { return c.Config.Labels[LabelServiceID] diff --git a/pkg/client/deploy/operation.go b/pkg/client/deploy/operation.go index fee69cda..317082ea 100644 --- a/pkg/client/deploy/operation.go +++ b/pkg/client/deploy/operation.go @@ -29,6 +29,8 @@ type NameResolver interface { ContainerName(containerID string) string } +// TODO: pass api.ServiceContainer to operations to simplify operation formatting in the plan. + // RunContainerOperation creates and starts a new container on a specific machine. type RunContainerOperation struct { ServiceID string @@ -56,8 +58,8 @@ func (o *RunContainerOperation) Format(resolver NameResolver) string { } func (o *RunContainerOperation) String() string { - return fmt.Sprintf("RunContainerOperation[service_id=%s, image=%s, machine_id=%s]", - o.ServiceID, o.Spec.Container.Image, o.MachineID) + return fmt.Sprintf("RunContainerOperation[machine_id=%s service_id=%s image=%s]", + o.MachineID, o.ServiceID, o.Spec.Container.Image) } // StopContainerOperation stops a container on a specific machine. @@ -76,26 +78,26 @@ func (o *StopContainerOperation) Execute(ctx context.Context, cli Client) error func (o *StopContainerOperation) Format(resolver NameResolver) string { machineName := resolver.MachineName(o.MachineID) - return fmt.Sprintf("%s: Stop container [name=%s]", machineName, resolver.ContainerName(o.ContainerID)) + return fmt.Sprintf("%s: Stop container [id=%s name=%s]", machineName, + o.ContainerID, resolver.ContainerName(o.ContainerID)) } func (o *StopContainerOperation) String() string { - return fmt.Sprintf("StopContainerOperation[service_id=%s, container_id=%s, machine_id=%s]", - o.ServiceID, o.ContainerID, o.MachineID) + return fmt.Sprintf("StopContainerOperation[machine_id=%s service_id=%s container_id=%s]", + o.MachineID, o.ServiceID, o.ContainerID) } // RemoveContainerOperation stops and removes a container from a specific machine. type RemoveContainerOperation struct { - ServiceID string - ContainerID string - MachineID string + MachineID string + Container api.ServiceContainer } func (o *RemoveContainerOperation) Execute(ctx context.Context, cli Client) error { - if err := cli.StopContainer(ctx, o.ServiceID, o.ContainerID, container.StopOptions{}); err != nil { + if err := cli.StopContainer(ctx, o.Container.ServiceID(), o.Container.ID, container.StopOptions{}); err != nil { return fmt.Errorf("stop container: %w", err) } - if err := cli.RemoveContainer(ctx, o.ServiceID, o.ContainerID, container.RemoveOptions{ + if err := cli.RemoveContainer(ctx, o.Container.ServiceID(), o.Container.ID, container.RemoveOptions{ // Remove anonymous volumes created by the container. RemoveVolumes: true, }); err != nil { @@ -107,12 +109,13 @@ func (o *RemoveContainerOperation) Execute(ctx context.Context, cli Client) erro func (o *RemoveContainerOperation) Format(resolver NameResolver) string { machineName := resolver.MachineName(o.MachineID) - return fmt.Sprintf("%s: Remove container [name=%s]", machineName, resolver.ContainerName(o.ContainerID)) + return fmt.Sprintf("%s: Remove container [ID=%s image=%s]", + machineName, o.Container.ShortID(), o.Container.Config.Image) } func (o *RemoveContainerOperation) String() string { - return fmt.Sprintf("RemoveContainerOperation[service_id=%s, container_id=%s, machine_id=%s]", - o.ServiceID, o.ContainerID, o.MachineID) + return fmt.Sprintf("RemoveContainerOperation[machine_id=%s service_id=%s container_id=%s]", + o.MachineID, o.Container.ServiceID(), o.Container.ID) } // CreateVolumeOperation creates a volume on a specific machine. @@ -151,8 +154,8 @@ func (o *CreateVolumeOperation) Format(_ NameResolver) string { } func (o *CreateVolumeOperation) String() string { - return fmt.Sprintf("CreateVolumeOperation[volume=%s, machine_id=%s]", - o.VolumeSpec.DockerVolumeName(), o.MachineID) + return fmt.Sprintf("CreateVolumeOperation[machine_id=%s volume=%s]", + o.MachineID, o.VolumeSpec.DockerVolumeName()) } // SequenceOperation is a composite operation that executes a sequence of operations in order. diff --git a/pkg/client/deploy/strategy.go b/pkg/client/deploy/strategy.go index f1479b00..72b82c8c 100644 --- a/pkg/client/deploy/strategy.go +++ b/pkg/client/deploy/strategy.go @@ -182,9 +182,8 @@ func (s *RollingStrategy) planReplicated(svc *api.Service, spec api.ServiceSpec) // Remove the old container. plan.Operations = append(plan.Operations, &RemoveContainerOperation{ - ServiceID: plan.ServiceID, - ContainerID: ctr.ID, - MachineID: m.Id, + MachineID: m.Id, + Container: ctr, }) } @@ -192,9 +191,8 @@ func (s *RollingStrategy) planReplicated(svc *api.Service, spec api.ServiceSpec) for mid, containers := range containersOnMachine { for _, c := range containers { plan.Operations = append(plan.Operations, &RemoveContainerOperation{ - ServiceID: plan.ServiceID, - ContainerID: c.ID, - MachineID: mid, + MachineID: mid, + Container: c, }) } } @@ -244,9 +242,8 @@ func (s *RollingStrategy) planGlobal(svc *api.Service, spec api.ServiceSpec) (Pl for _, containers := range containersOnMachine { for _, c := range containers { plan.Operations = append(plan.Operations, &RemoveContainerOperation{ - ServiceID: plan.ServiceID, - ContainerID: c.Container.ID, - MachineID: c.MachineID, + MachineID: c.MachineID, + Container: c.Container, }) } } @@ -295,9 +292,8 @@ func reconcileGlobalContainer( continue } ops = append(ops, &RemoveContainerOperation{ - ServiceID: serviceID, - ContainerID: old.Container.ID, - MachineID: old.MachineID, + MachineID: old.MachineID, + Container: old.Container, }) } break @@ -338,9 +334,8 @@ func reconcileGlobalContainer( // Remove the old containers. for _, c := range containers { ops = append(ops, &RemoveContainerOperation{ - ServiceID: serviceID, - ContainerID: c.Container.ID, - MachineID: c.MachineID, + MachineID: c.MachineID, + Container: c.Container, }) }