From 76a9f8e8b670f7c9304890fffcac2978b6b12171 Mon Sep 17 00:00:00 2001 From: Pavel Sviderski Date: Tue, 11 Feb 2025 16:47:52 +1000 Subject: [PATCH] refactor: client StartContainer pass serviceID --- internal/cli/client/container.go | 28 +++++++++++++++++++++------- internal/cli/client/service.go | 4 ++-- test/e2e/service_test.go | 8 ++++---- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/internal/cli/client/container.go b/internal/cli/client/container.go index 2eda8e53..57ea0c2b 100644 --- a/internal/cli/client/container.go +++ b/internal/cli/client/container.go @@ -17,6 +17,7 @@ import ( "uncloud/internal/secret" ) +// CreateContainer creates a new container for the given service on the specified machine. func (cli *Client) CreateContainer( ctx context.Context, serviceID string, spec api.ServiceSpec, machineID string, ) (container.CreateResponse, error) { @@ -218,20 +219,33 @@ func toPullProgressEvent(jm jsonmessage.JSONMessage) *progress.Event { } } -func (cli *Client) StartContainer(ctx context.Context, id string, machineID string) error { +// StartContainer starts the specified container within the service. +func (cli *Client) StartContainer(ctx context.Context, serviceID, containerID string) error { + svc, err := cli.InspectService(ctx, serviceID) + if err != nil { + return fmt.Errorf("inspect service: %w", err) + } + + var ctr api.Container + var machineID string + for _, c := range svc.Containers { + if c.Container.ID == containerID || c.Container.Names[0] == containerID { + ctr = c.Container + machineID = c.MachineID + } + } + if ctr.ID == "" { + return ErrNotFound + } + machine, err := cli.InspectMachine(ctx, machineID) if err != nil { return fmt.Errorf("inspect machine '%s': %w", machineID, err) } ctx = proxyToMachine(ctx, machine.Machine) - ctr, err := cli.Docker.InspectContainer(ctx, id) - if err != nil { - return err - } - pw := progress.ContextWriter(ctx) - eventID := fmt.Sprintf("Container %s on %s", ctr.Name, machine.Machine.Name) + eventID := fmt.Sprintf("Container %s on %s", ctr.Names[0], machine.Machine.Name) pw.Event(progress.StartingEvent(eventID)) if err = cli.Docker.StartContainer(ctx, ctr.ID, container.StartOptions{}); err != nil { diff --git a/internal/cli/client/service.go b/internal/cli/client/service.go index d9cdd5a7..fa7e31fa 100644 --- a/internal/cli/client/service.go +++ b/internal/cli/client/service.go @@ -214,7 +214,7 @@ func (cli *Client) runContainer( return resp, fmt.Errorf("create container: %w", err) } - if err = cli.StartContainer(ctx, resp.ID, machine.Name); err != nil { + if err = cli.StartContainer(ctx, serviceID, resp.ID); err != nil { return resp, fmt.Errorf("start container: %w", err) } @@ -319,7 +319,7 @@ func (cli *Client) InspectService(ctx context.Context, id string) (api.Service, serviceID := containers[0].Container.ServiceID() for _, mc := range containers[1:] { if mc.Container.ServiceID() != serviceID { - return svc, fmt.Errorf("multiple services found with name: %s", id) + return svc, fmt.Errorf("multiple services found with name '%s', use the service ID instead", id) } } } diff --git a/test/e2e/service_test.go b/test/e2e/service_test.go index 9d4e2461..22a5ab4b 100644 --- a/test/e2e/service_test.go +++ b/test/e2e/service_test.go @@ -24,9 +24,9 @@ func TestService(t *testing.T) { t.Run("container lifecycle", func(t *testing.T) { t.Parallel() - name := "busybox-container-lifecycle" + svcName := "busybox-container-lifecycle" spec := api.ServiceSpec{ - Name: name, + Name: svcName, Container: api.ContainerSpec{ Command: []string{"sleep", "infinity"}, Image: "busybox:latest", @@ -34,11 +34,11 @@ func TestService(t *testing.T) { } machineID := c.Machines[0].Name - ctr, err := cli.CreateContainer(ctx, name, spec, machineID) + ctr, err := cli.CreateContainer(ctx, svcName, spec, machineID) require.NoError(t, err) assert.NotEmpty(t, ctr.ID) - err = cli.StartContainer(ctx, ctr.ID, machineID) + err = cli.StartContainer(ctx, svcName, ctr.ID) require.NoError(t, err) }) }