iop/apps/edge/internal/edgecmd/nodes.go
toki 3f8da3354c feat: provider catalog device status milestone completion and catalog view implementation
- Add provider catalog device status milestone tracking
- Implement catalog status HTTP endpoints
- Add client catalog view implementation
- Update control-plane HTTP views and tests
- Update edge cmd nodes and tests
- Update roadmap and phase documentation
2026-06-20 19:51:45 +09:00

91 lines
2.6 KiB
Go

package edgecmd
import (
"fmt"
"sort"
"strings"
"github.com/spf13/cobra"
"iop/packages/go/config"
)
func nodesCmd() *cobra.Command {
c := &cobra.Command{
Use: "nodes",
Short: "Inspect registered edge nodes",
Long: `Inspect and list configured or connected execution nodes.`,
}
c.AddCommand(nodesListCmd())
return c
}
func nodesListCmd() *cobra.Command {
return &cobra.Command{
Use: "list",
Short: "List configured edge nodes and connection status",
Long: `List all nodes registered in the edge configuration file.
When the server is offline or this command is run standalone, all nodes will show their status as 'offline' or 'configured'.`,
Example: ` iop-edge nodes list`,
RunE: func(cmd *cobra.Command, _ []string) error {
cfg, path, err := LoadEdgeConfig(cmd)
if err != nil {
return err
}
fmt.Fprintf(cmd.OutOrStdout(), "Config Source: %s\n\n", path)
if len(cfg.Nodes) == 0 {
fmt.Fprintln(cmd.OutOrStdout(), "No nodes configured.")
return nil
}
nodes := make([]config.NodeDefinition, len(cfg.Nodes))
copy(nodes, cfg.Nodes)
sort.Slice(nodes, func(i, j int) bool {
return nodes[i].ID < nodes[j].ID
})
fmt.Fprintf(cmd.OutOrStdout(), "%-25s %-20s %-40s %-12s\n", "NODE ID", "ALIAS", "TOKEN", "STATUS")
fmt.Fprintf(cmd.OutOrStdout(), "%s\n", strings.Repeat("-", 100))
for _, n := range nodes {
fmt.Fprintf(cmd.OutOrStdout(), "%-25s %-20s %-40s %-12s\n", n.ID, n.Alias, n.Token, "offline (configured)")
if summary := formatConfiguredProviders(n.Providers); summary != "" {
fmt.Fprintf(cmd.OutOrStdout(), " providers: %s\n", summary)
}
}
return nil
},
}
}
func formatConfiguredProviders(providers []config.NodeProviderConf) string {
if len(providers) == 0 {
return ""
}
summaries := make([]string, 0, len(providers))
for _, p := range providers {
if p.ID == "" {
continue
}
parts := []string{p.ID}
if p.Type != "" || p.Category != "" {
typeCategory := string(p.Category)
if p.Type != "" && typeCategory != "" {
typeCategory = p.Type + "/" + typeCategory
} else if p.Type != "" {
typeCategory = p.Type
}
parts = append(parts, "type="+typeCategory)
}
if len(p.Models) > 0 {
parts = append(parts, "models="+strings.Join(p.Models, ","))
}
if p.Capacity > 0 {
parts = append(parts, fmt.Sprintf("capacity=%d", p.Capacity))
}
if len(p.LifecycleCapabilities) > 0 {
parts = append(parts, "lifecycle="+strings.Join(p.LifecycleCapabilities, ","))
}
summaries = append(summaries, strings.Join(parts, " "))
}
return strings.Join(summaries, "; ")
}