Skip to content

Commit e2b9161

Browse files
committed
ensure all volumes are detached
Signed-off-by: Jan Jansen <[email protected]>
1 parent 2c32f08 commit e2b9161

File tree

2 files changed

+111
-54
lines changed

2 files changed

+111
-54
lines changed

pkg/client/client.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ type Server struct {
3535
DatacenterID string
3636
}
3737

38+
type Volume struct {
39+
ID string
40+
Name string
41+
ServerID string
42+
DatacenterID string
43+
}
44+
3845
func New(datacenterId string, secret []byte) (IONOSClient, error) {
3946
var cfg *ionoscloud.Configuration
4047
if secret[0] == '{' {
@@ -72,6 +79,35 @@ func (a *IONOSClient) GetServer(ctx context.Context, providerID string) (*cloudp
7279
return a.convertServerToInstanceMetadata(ctx, &server)
7380
}
7481

82+
func (a *IONOSClient) GetServerVolumes(ctx context.Context, providerID string) ([]Volume, error) {
83+
if a.client == nil {
84+
return nil, errors.New("client isn't initialized")
85+
}
86+
volumesReq := a.client.ServersApi.DatacentersServersVolumesGet(ctx, a.DatacenterId, providerID)
87+
volumes, req, err := volumesReq.Depth(1).Execute()
88+
if err != nil || req != nil && req.StatusCode == 404 {
89+
if err != nil {
90+
return nil, nil
91+
}
92+
return nil, err
93+
}
94+
95+
var list []Volume
96+
97+
for _, volume := range *volumes.Items {
98+
if volume.Properties == nil {
99+
continue
100+
}
101+
list = append(list, Volume{
102+
DatacenterID: a.DatacenterId,
103+
ServerID: providerID,
104+
ID: *volume.Id,
105+
Name: *volume.Properties.Name,
106+
})
107+
}
108+
return list, nil
109+
}
110+
75111
func (a *IONOSClient) RemoveIPFromNode(ctx context.Context, loadBalancerIP, providerID string) error {
76112
if a.client == nil {
77113
return errors.New("client isn't initialized")

pkg/ionos/instances.go

Lines changed: 75 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,100 @@
11
package ionos
22

33
import (
4-
"context"
5-
"errors"
6-
"fmt"
7-
"strings"
4+
"context"
5+
"errors"
6+
"fmt"
7+
"strings"
88

9-
v1 "k8s.io/api/core/v1"
10-
cloudprovider "k8s.io/cloud-provider"
11-
"k8s.io/klog/v2"
9+
v1 "k8s.io/api/core/v1"
10+
cloudprovider "k8s.io/cloud-provider"
11+
"k8s.io/klog/v2"
1212

13-
client2 "github.com/GDATASoftwareAG/cloud-provider-ionoscloud/pkg/client"
14-
"github.com/GDATASoftwareAG/cloud-provider-ionoscloud/pkg/config"
13+
client2 "github.com/GDATASoftwareAG/cloud-provider-ionoscloud/pkg/client"
14+
"github.com/GDATASoftwareAG/cloud-provider-ionoscloud/pkg/config"
1515
)
1616

1717
var _ cloudprovider.InstancesV2 = &instances{}
1818

1919
func GetUUIDFromNode(node *v1.Node) string {
20-
if node == nil {
21-
return ""
22-
}
23-
withoutPrefix := strings.TrimPrefix(node.Spec.ProviderID, config.ProviderPrefix)
24-
return strings.ToLower(strings.TrimSpace(withoutPrefix))
20+
if node == nil {
21+
return ""
22+
}
23+
return ProviderIDWitPrefix(node.Spec.ProviderID)
24+
}
25+
26+
func ProviderIDWitPrefix(providerID string) string {
27+
withoutPrefix := strings.TrimPrefix(providerID, config.ProviderPrefix)
28+
return strings.ToLower(strings.TrimSpace(withoutPrefix))
2529
}
2630

2731
func (i instances) AddClient(datacenterId string, token []byte) error {
28-
if i.ionosClients[datacenterId] == nil {
29-
c, err := client2.New(datacenterId, token)
30-
if err != nil {
31-
return err
32-
}
33-
i.ionosClients[datacenterId] = &c
34-
}
35-
return nil
32+
if i.ionosClients[datacenterId] == nil {
33+
c, err := client2.New(datacenterId, token)
34+
if err != nil {
35+
return err
36+
}
37+
i.ionosClients[datacenterId] = &c
38+
}
39+
return nil
3640
}
3741

3842
// no caching
39-
func (i instances) discoverNode(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, error) {
40-
for _, client := range i.ionosClients {
41-
var err error
42-
var server *cloudprovider.InstanceMetadata
43-
providerID := GetUUIDFromNode(node)
44-
klog.Infof("discoverNode (datacenterId %s) %s %s", client.DatacenterId, node.Name, providerID)
45-
if providerID != "" {
46-
server, err = client.GetServer(ctx, providerID)
47-
} else {
48-
server, err = client.GetServerByName(ctx, node.Name)
49-
}
50-
if err != nil {
51-
return nil, fmt.Errorf("failed to discoverNode %v", err)
52-
}
53-
if server == nil {
54-
continue
55-
}
56-
return server, nil
57-
}
58-
return nil, errors.New("failed to discoverNode")
43+
func (i instances) discoverNode(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, *client2.IONOSClient, error) {
44+
for _, client := range i.ionosClients {
45+
var err error
46+
var server *cloudprovider.InstanceMetadata
47+
providerID := GetUUIDFromNode(node)
48+
klog.Infof("discoverNode (datacenterId %s) %s %s", client.DatacenterId, node.Name, providerID)
49+
if providerID != "" {
50+
server, err = client.GetServer(ctx, providerID)
51+
} else {
52+
server, err = client.GetServerByName(ctx, node.Name)
53+
}
54+
if err != nil {
55+
return nil, nil, fmt.Errorf("failed to discoverNode %v", err)
56+
}
57+
if server == nil {
58+
continue
59+
}
60+
return server, client, nil
61+
}
62+
return nil, nil, nil
5963
}
6064

6165
func (i instances) InstanceExists(ctx context.Context, node *v1.Node) (bool, error) {
62-
klog.Infof("InstanceExists %s", node.Name)
63-
server, err := i.discoverNode(ctx, node)
64-
klog.InfoDepth(1, server)
65-
return server != nil, err
66+
klog.Infof("InstanceExists %s", node.Name)
67+
server, _, err := i.discoverNode(ctx, node)
68+
klog.InfoDepth(1, server)
69+
return server != nil, err
6670
}
6771

68-
func (i instances) InstanceShutdown(_ context.Context, node *v1.Node) (bool, error) {
69-
klog.Infof("InstanceShutdown %s", node.Name)
70-
// TODO check here for mounted volumes
71-
return true, nil
72+
func (i instances) InstanceShutdown(ctx context.Context, node *v1.Node) (bool, error) {
73+
klog.Infof("InstanceShutdown %s", node.Name)
74+
server, client, err := i.discoverNode(ctx, node)
75+
if (server == nil && err == nil) || server == nil {
76+
return true, nil
77+
}
78+
79+
volumes, err := client.GetServerVolumes(ctx, ProviderIDWitPrefix(server.ProviderID))
80+
if err != nil {
81+
return false, err
82+
}
83+
84+
for _, volume := range volumes {
85+
if strings.HasPrefix(volume.Name, "csi-pv.k8s.") {
86+
return false, nil
87+
}
88+
}
89+
return true, nil
7290
}
7391

7492
func (i instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, error) {
75-
klog.Infof("InstanceMetadata %s", node.Name)
76-
server, err := i.discoverNode(ctx, node)
77-
klog.InfoDepth(1, server)
78-
return server, err
93+
klog.Infof("InstanceMetadata %s", node.Name)
94+
server, _, err := i.discoverNode(ctx, node)
95+
if server == nil && err == nil {
96+
return nil, errors.New("failed to discoverNode")
97+
}
98+
klog.InfoDepth(1, server)
99+
return server, err
79100
}

0 commit comments

Comments
 (0)