1package cli
2
3import (
4 "context"
5 "fmt"
6 "io"
7 "sort"
8
9 "github.com/spf13/cobra"
10
11 "github.com/bnema/gordon/internal/adapters/in/cli/ui/components"
12 "github.com/bnema/gordon/internal/adapters/in/cli/ui/styles"
13)
14
15// newStatusCmd creates the status command.
16func newStatusCmd() *cobra.Command {
17 return &cobra.Command{
18 Use: "status",
19 Short: "Show Gordon server status",
20 RunE: func(cmd *cobra.Command, args []string) error {
21 handle, err := resolveControlPlane(cliConfigPath)
22 if err != nil {
23 return err
24 }
25 defer handle.close()
26
27 return runStatusCmd(cmd.Context(), handle.plane, cmd.OutOrStdout())
28 },
29 }
30}
31
32func runStatusCmd(ctx context.Context, plane ControlPlane, out io.Writer) error {
33 status, err := plane.GetStatus(ctx)
34 if err != nil {
35 return fmt.Errorf("failed to get status: %w", err)
36 }
37 if status == nil {
38 return fmt.Errorf("failed to get status: empty response")
39 }
40
41 if err := cliWriteLine(out, styles.Theme.Title.Render("Gordon Status")); err != nil {
42 return err
43 }
44 if err := cliWriteLine(out, ""); err != nil {
45 return err
46 }
47
48 if err := cliWriteLine(out, fmt.Sprintf("%s %s", styles.Theme.Bold.Render("Domain:"), status.RegistryDomain)); err != nil {
49 return err
50 }
51 if err := cliWriteLine(out, fmt.Sprintf("%s %d", styles.Theme.Bold.Render("Registry Port:"), status.RegistryPort)); err != nil {
52 return err
53 }
54 if err := cliWriteLine(out, fmt.Sprintf("%s %d", styles.Theme.Bold.Render("Server Port:"), status.ServerPort)); err != nil {
55 return err
56 }
57 if err := cliWriteLine(out, fmt.Sprintf("%s %d", styles.Theme.Bold.Render("Apps:"), status.Apps)); err != nil {
58 return err
59 }
60 if err := cliWriteLine(out, fmt.Sprintf("%s %v", styles.Theme.Bold.Render("Network Isolation:"), status.NetworkIsolation)); err != nil {
61 return err
62 }
63
64 return renderStatusFleet(out, status.ContainerStatus)
65}
66
67func renderStatusFleet(out io.Writer, fleet map[string]string) error {
68 if len(fleet) == 0 {
69 return nil
70 }
71 if err := cliWriteLine(out, ""); err != nil {
72 return err
73 }
74 if err := cliWriteLine(out, styles.Theme.Bold.Render("Container Status:")); err != nil {
75 return err
76 }
77 names := make([]string, 0, len(fleet))
78 for name := range fleet {
79 names = append(names, name)
80 }
81 sort.Strings(names)
82 for _, name := range names {
83 badge := components.ContainerStatusBadge(fleet[name])
84 if err := cliWriteLine(out, fmt.Sprintf(" %s: %s", name, badge)); err != nil {
85 return err
86 }
87 }
88 return nil
89}