@@ -3,13 +3,15 @@ package server
33import (
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+
3038type 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
134167func formatListIPAddresses (val interface {}) (text.Colors , string , error ) {
0 commit comments