Skip to content

Commit 610f879

Browse files
committed
fix(server): show also private IP addresses on list --show-ip-addresses
1 parent 0cfa308 commit 610f879

1 file changed

Lines changed: 52 additions & 19 deletions

File tree

internal/commands/server/list.go

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package server
33
import (
44
"fmt"
55
"strings"
6+
"sync"
67

78
"github.com/UpCloudLtd/upcloud-cli/internal/commands"
89
"github.com/UpCloudLtd/upcloud-cli/internal/config"
910
"github.com/UpCloudLtd/upcloud-cli/internal/output"
1011
"github.com/UpCloudLtd/upcloud-cli/internal/service"
1112
"github.com/UpCloudLtd/upcloud-cli/internal/ui"
1213
"github.com/UpCloudLtd/upcloud-go-api/v4/upcloud"
14+
"github.com/UpCloudLtd/upcloud-go-api/v4/upcloud/request"
1315
"github.com/jedib0t/go-pretty/v6/text"
1416
"github.com/spf13/pflag"
1517
)
@@ -27,6 +29,12 @@ type listIPAddress struct {
2729
Floating bool `json:"floating"`
2830
}
2931

32+
type listServerIpaddresses struct {
33+
ServerUUID string
34+
IPAddresses []listIPAddress
35+
Error error
36+
}
37+
3038
type listCommand struct {
3139
*commands.BaseCommand
3240
showIPAddresses config.OptionalBoolean
@@ -75,7 +83,7 @@ func (ls *listCommand) ExecuteWithoutArguments(exec commands.Executor) (output.O
7583
}
7684

7785
if ls.showIPAddresses.Value() {
78-
ipaddressMap, err := getIPAddressesByServerUUID(svc)
86+
ipaddressMap, err := getIPAddressesByServerUUID(servers, svc)
7987
if err != nil {
8088
return nil, err
8189
}
@@ -84,14 +92,8 @@ func (ls *listCommand) ExecuteWithoutArguments(exec commands.Executor) (output.O
8492
uuid := row[0].(string)
8593

8694
var listIpaddresses []listIPAddress
87-
if apiIpaddresses, ok := ipaddressMap[uuid]; ok {
88-
for _, ipa := range apiIpaddresses {
89-
listIpaddresses = append(listIpaddresses, listIPAddress{
90-
Access: ipa.Access,
91-
Address: ipa.Address,
92-
Floating: ipa.Floating.Bool(),
93-
})
94-
}
95+
if serverIpaddresses, ok := ipaddressMap[uuid]; ok {
96+
listIpaddresses = append(listIpaddresses, serverIpaddresses.IPAddresses...)
9597
}
9698
row = append(row[:3], row[2:]...)
9799
row[2] = listIpaddresses
@@ -112,23 +114,54 @@ func (ls *listCommand) ExecuteWithoutArguments(exec commands.Executor) (output.O
112114
}
113115

114116
// getIPAddressesByServerUUID returns IP addresses grouped by server UUID. This function will be removed when server end-point response includes IP addresses.
115-
func getIPAddressesByServerUUID(svc service.AllServices) (map[string][]upcloud.IPAddress, error) {
116-
ipaddresses, err := svc.GetIPAddresses()
117+
func getIPAddressesByServerUUID(servers *upcloud.Servers, svc service.AllServices) (map[string]listServerIpaddresses, error) {
118+
returnChan := make(chan listServerIpaddresses)
119+
var wg sync.WaitGroup
120+
121+
for _, server := range servers.Servers {
122+
wg.Add(1)
123+
go func(server upcloud.Server) {
124+
defer wg.Done()
125+
ipaddresses, err := getServerIPAddresses(server.UUID, svc)
126+
returnChan <- listServerIpaddresses{
127+
ServerUUID: server.UUID,
128+
IPAddresses: ipaddresses,
129+
Error: err,
130+
}
131+
}(server)
132+
}
133+
134+
go func() {
135+
wg.Wait()
136+
close(returnChan)
137+
}()
138+
139+
ipaddressMap := make(map[string]listServerIpaddresses)
140+
for response := range returnChan {
141+
ipaddressMap[response.ServerUUID] = response
142+
}
143+
144+
return ipaddressMap, nil
145+
}
146+
147+
func getServerIPAddresses(uuid string, svc service.AllServices) ([]listIPAddress, error) {
148+
server, err := svc.GetServerNetworks(&request.GetServerNetworksRequest{ServerUUID: uuid})
117149
if err != nil {
118150
return nil, err
119151
}
120152

121-
ipaddressMap := make(map[string][]upcloud.IPAddress)
122-
for _, ipaddress := range ipaddresses.IPAddresses {
123-
current, ok := ipaddressMap[ipaddress.ServerUUID]
124-
if ok {
125-
ipaddressMap[ipaddress.ServerUUID] = append(current, ipaddress)
126-
} else {
127-
ipaddressMap[ipaddress.ServerUUID] = []upcloud.IPAddress{ipaddress}
153+
var ipaddresses []listIPAddress
154+
for _, iface := range server.Interfaces {
155+
for _, ipa := range iface.IPAddresses {
156+
ipaddresses = append(ipaddresses, listIPAddress{
157+
Access: iface.Type,
158+
Address: ipa.Address,
159+
Floating: ipa.Floating.Bool(),
160+
})
128161
}
129162
}
130163

131-
return ipaddressMap, nil
164+
return ipaddresses, nil
132165
}
133166

134167
func formatListIPAddresses(val interface{}) (text.Colors, string, error) {

0 commit comments

Comments
 (0)