Skip to content

Commit 951a53e

Browse files
authored
feat(baremetal): add private networks waiter (scaleway#2240)
1 parent a30a450 commit 951a53e

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

api/baremetal/v3/server_utils.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package baremetal
2+
3+
import (
4+
"time"
5+
6+
"github.com/scaleway/scaleway-sdk-go/errors"
7+
"github.com/scaleway/scaleway-sdk-go/internal/async"
8+
"github.com/scaleway/scaleway-sdk-go/scw"
9+
)
10+
11+
const (
12+
defaultRetryInterval = 15 * time.Second
13+
defaultTimeout = 2 * time.Hour
14+
)
15+
16+
// WaitForServerPrivateNetworksRequest is used by WaitForServerPrivateNetworks method.
17+
type WaitForServerPrivateNetworksRequest struct {
18+
ServerID string
19+
Zone scw.Zone
20+
Timeout *time.Duration
21+
RetryInterval *time.Duration
22+
}
23+
24+
// WaitForServerPrivateNetworks wait for all server private networks to be in a "terminal state" before returning.
25+
// This function can be used to wait for all server private networks to be set.
26+
func (s *PrivateNetworkAPI) WaitForServerPrivateNetworks(req *WaitForServerPrivateNetworksRequest, opts ...scw.RequestOption) ([]*ServerPrivateNetwork, error) {
27+
timeout := defaultTimeout
28+
if req.Timeout != nil {
29+
timeout = *req.Timeout
30+
}
31+
retryInterval := defaultRetryInterval
32+
if req.RetryInterval != nil {
33+
retryInterval = *req.RetryInterval
34+
}
35+
36+
terminalStatus := map[ServerPrivateNetworkStatus]struct{}{
37+
ServerPrivateNetworkStatusAttached: {},
38+
ServerPrivateNetworkStatusError: {},
39+
ServerPrivateNetworkStatusUnknownStatus: {},
40+
ServerPrivateNetworkStatusLocked: {},
41+
}
42+
43+
serverPrivateNetwork, err := async.WaitSync(&async.WaitSyncConfig{
44+
Get: func() (interface{}, bool, error) {
45+
res, err := s.ListServerPrivateNetworks(&PrivateNetworkAPIListServerPrivateNetworksRequest{
46+
ServerID: &req.ServerID,
47+
Zone: req.Zone,
48+
}, opts...)
49+
if err != nil {
50+
return nil, false, err
51+
}
52+
53+
for i := range res.ServerPrivateNetworks {
54+
_, isTerminal := terminalStatus[res.ServerPrivateNetworks[i].Status]
55+
if !isTerminal {
56+
return res.ServerPrivateNetworks, isTerminal, nil
57+
}
58+
}
59+
return res.ServerPrivateNetworks, true, err
60+
},
61+
Timeout: timeout,
62+
IntervalStrategy: async.LinearIntervalStrategy(retryInterval),
63+
})
64+
if err != nil {
65+
return nil, errors.Wrap(err, "waiting for server private networks failed")
66+
}
67+
68+
return serverPrivateNetwork.([]*ServerPrivateNetwork), nil
69+
}

0 commit comments

Comments
 (0)