Skip to content

Commit 65eecd7

Browse files
committed
ensure all volumes are detached
1 parent 2c32f08 commit 65eecd7

File tree

2 files changed

+61
-8
lines changed

2 files changed

+61
-8
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: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func (i instances) AddClient(datacenterId string, token []byte) error {
3636
}
3737

3838
// no caching
39-
func (i instances) discoverNode(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, error) {
39+
func (i instances) discoverNode(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, *client2.IONOSClient, error) {
4040
for _, client := range i.ionosClients {
4141
var err error
4242
var server *cloudprovider.InstanceMetadata
@@ -48,32 +48,49 @@ func (i instances) discoverNode(ctx context.Context, node *v1.Node) (*cloudprovi
4848
server, err = client.GetServerByName(ctx, node.Name)
4949
}
5050
if err != nil {
51-
return nil, fmt.Errorf("failed to discoverNode %v", err)
51+
return nil, nil, fmt.Errorf("failed to discoverNode %v", err)
5252
}
5353
if server == nil {
5454
continue
5555
}
56-
return server, nil
56+
return server, client, nil
5757
}
58-
return nil, errors.New("failed to discoverNode")
58+
return nil, nil, nil
5959
}
6060

6161
func (i instances) InstanceExists(ctx context.Context, node *v1.Node) (bool, error) {
6262
klog.Infof("InstanceExists %s", node.Name)
63-
server, err := i.discoverNode(ctx, node)
63+
server, _, err := i.discoverNode(ctx, node)
6464
klog.InfoDepth(1, server)
6565
return server != nil, err
6666
}
6767

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

7488
func (i instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, error) {
7589
klog.Infof("InstanceMetadata %s", node.Name)
76-
server, err := i.discoverNode(ctx, node)
90+
server, _, err := i.discoverNode(ctx, node)
91+
if server == nil && err == nil {
92+
return nil, errors.New("failed to discoverNode")
93+
}
7794
klog.InfoDepth(1, server)
7895
return server, err
7996
}

0 commit comments

Comments
 (0)