mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
f3e90b334d
## Problem `coder exp sync want` and `coder exp sync start` both printed generic success messages, which hid the dependency units involved in startup coordination. Before, declaring dependencies with `sync want` printed: ```text Success ``` Before, `sync start` printed while waiting, then finished with another generic success message: ```text Waiting for dependencies of unit 'test-unit' to be satisfied... Success ``` ## Solution Print the dependency units in both cases, using wording that matches where the command is in the lifecycle. After, `sync want` prints the dependencies it declared for the unit: ```text Unit "test-unit" declared dependencies: [dep-unit] ``` After, `sync start` enumerates the dependencies while it is waiting, then prints the same dependencies after the unit starts executing: ```text Unit "test-unit" is waiting for dependencies to be satisfied: [dep-unit, dep-unit-2] Unit "test-unit" finished waiting for dependencies: [dep-unit, dep-unit-2] ``` The sync golden tests now cover the updated output, including multiple dependencies for `sync start`.
53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/coder/coder/v2/agent/agentsocket"
|
|
"github.com/coder/coder/v2/agent/unit"
|
|
"github.com/coder/coder/v2/cli/cliui"
|
|
"github.com/coder/serpent"
|
|
)
|
|
|
|
func (*RootCmd) syncWant(socketPath *string) *serpent.Command {
|
|
cmd := &serpent.Command{
|
|
Use: "want <unit> <depends-on> [depends-on...]",
|
|
Short: "Declare that a unit depends on other units completing before it can start",
|
|
Long: "Declare that a unit depends on one or more other units completing before it can start. The unit specified first will not start until all subsequent units have signaled that they have completed.",
|
|
Handler: func(i *serpent.Invocation) error {
|
|
ctx := i.Context()
|
|
|
|
if len(i.Args) < 2 {
|
|
return xerrors.New("at least two arguments are required: unit and one or more depends-on")
|
|
}
|
|
dependentUnit := unit.ID(i.Args[0])
|
|
|
|
opts := []agentsocket.Option{}
|
|
if *socketPath != "" {
|
|
opts = append(opts, agentsocket.WithPath(*socketPath))
|
|
}
|
|
|
|
client, err := agentsocket.NewClient(ctx, opts...)
|
|
if err != nil {
|
|
return xerrors.Errorf("connect to agent socket: %w", err)
|
|
}
|
|
defer client.Close()
|
|
|
|
for _, dep := range i.Args[1:] {
|
|
if err := client.SyncWant(ctx, dependentUnit, unit.ID(dep)); err != nil {
|
|
return xerrors.Errorf("declare dependency failed: %w", err)
|
|
}
|
|
}
|
|
|
|
cliui.Info(i.Stdout, fmt.Sprintf("Unit %q declared dependencies: [%s]", dependentUnit, strings.Join(i.Args[1:], ", ")))
|
|
|
|
return nil
|
|
},
|
|
}
|
|
|
|
return cmd
|
|
}
|