-
Notifications
You must be signed in to change notification settings - Fork 6
/
show.go
124 lines (117 loc) · 3.31 KB
/
show.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package router
import (
"github.com/UpCloudLtd/upcloud-go-api/v4/upcloud"
"github.com/UpCloudLtd/upcloud-go-api/v4/upcloud/request"
"github.com/UpCloudLtd/upcloud-cli/internal/commands"
"github.com/UpCloudLtd/upcloud-cli/internal/completion"
"github.com/UpCloudLtd/upcloud-cli/internal/output"
"github.com/UpCloudLtd/upcloud-cli/internal/resolver"
"github.com/UpCloudLtd/upcloud-cli/internal/ui"
)
// ShowCommand creates the "router show" command
func ShowCommand() commands.Command {
return &showCommand{
BaseCommand: commands.New(
"show",
"Show current router",
"upctl router show 04d0a7f6-ee78-42b5-8077-6947f9e67c5a",
"upctl router show 04d0a7f6-ee78-42b5-8077-6947f9e67c5a 04d031ab-4b85-4cbc-9f0e-6a2977541327",
`upctl router show "My Turbo Router" my_super_router`,
),
}
}
type showCommand struct {
*commands.BaseCommand
resolver.CachingRouter
completion.Router
}
// InitCommand implements Command.InitCommand
func (s *showCommand) InitCommand() {
}
// Execute implements commands.MultipleArgumentCommand
func (s *showCommand) Execute(exec commands.Executor, arg string) (output.Output, error) {
router, err := s.CachingRouter.GetCached(arg)
if err != nil {
return nil, err
}
exec.Debug("got router", "uuid", router.UUID)
networks, err := getNetworks(exec, router.AttachedNetworks)
if err != nil {
return nil, err
}
exec.Debug("got router networks", "networks", len(networks))
networkRows := make([]output.TableRow, len(networks))
for i, network := range networks {
networkRows[i] = output.TableRow{
network.UUID,
network.Name,
network.Type,
network.Zone}
}
return output.Combined{
output.CombinedSection{
Key: "",
Title: "Common",
Contents: output.Details{
Sections: []output.DetailSection{
{Rows: []output.DetailRow{
{Key: "uuid", Title: "UUID:", Colour: ui.DefaultUUUIDColours, Value: router.UUID},
{Key: "name", Title: "Name:", Value: router.Name},
{Key: "type", Title: "Type:", Value: router.Type},
}},
},
},
},
output.CombinedSection{
Key: "networks",
Title: "Networks:",
Contents: output.Table{
Columns: []output.TableColumn{
{Key: "uuid", Header: "UUID", Colour: ui.DefaultUUUIDColours},
{Key: "name", Header: "Name"},
{Key: "type", Header: "Type"},
{Key: "zone", Header: "Zone"},
},
Rows: networkRows,
},
},
}, nil
}
func getNetworks(exec commands.Executor, attached upcloud.RouterNetworkSlice) ([]upcloud.Network, error) {
if len(attached) == 0 {
return []upcloud.Network{}, nil
}
var idleWorkers = make(chan int, maxRouterActions)
for n := 0; n < maxRouterActions; n++ {
idleWorkers <- n
}
results := make(chan *upcloud.Network)
errors := make(chan error)
for _, routerNetwork := range attached {
go func(uuid string) {
// get worker
workerID := <-idleWorkers
nw, err := exec.Network().GetNetworkDetails(&request.GetNetworkDetailsRequest{UUID: uuid})
if err != nil {
errors <- err
} else {
results <- nw
}
// return worker
idleWorkers <- workerID
}(routerNetwork.NetworkUUID)
}
// collect results
returns := make([]upcloud.Network, 0, len(attached))
for {
select {
case err := <-errors:
return nil, err
case result := <-results:
returns = append(returns, *result)
if len(returns) >= len(attached) {
return returns, nil
}
}
}
}