Skip to content

Commit 08407f9

Browse files
authored
Merge pull request #49 from GDATASoftwareAG/search-for-node
check current state for instanceshutdown
2 parents 2c32f08 + 63111ab commit 08407f9

File tree

3 files changed

+40
-6
lines changed

3 files changed

+40
-6
lines changed

.editorconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ trim_trailing_whitespace = true
99
charset = utf-8
1010
max_line_length = 120
1111

12-
[{*.go}]
12+
[*.go]
1313
indent_style = tab
1414
insert_final_newline = true
1515

pkg/client/client.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,22 @@ func (a *IONOSClient) GetServer(ctx context.Context, providerID string) (*cloudp
7272
return a.convertServerToInstanceMetadata(ctx, &server)
7373
}
7474

75+
func (a *IONOSClient) GetServerState(ctx context.Context, providerID string) (string, error) {
76+
if a.client == nil {
77+
return "", errors.New("client isn't initialized")
78+
}
79+
serverReq := a.client.ServersApi.DatacentersServersFindById(ctx, a.DatacenterId, providerID)
80+
server, req, err := serverReq.Depth(0).Execute()
81+
if err != nil || req != nil && req.StatusCode == 404 {
82+
if err != nil {
83+
return "", nil
84+
}
85+
return "", err
86+
}
87+
// Possible states: "NOSTATE" "RUNNING" "BLOCKED" "PAUSED" "SHUTDOWN" "SHUTOFF" "CRASHED" "SUSPENDED"
88+
return *server.Properties.VmState, nil
89+
}
90+
7591
func (a *IONOSClient) RemoveIPFromNode(ctx context.Context, loadBalancerIP, providerID string) error {
7692
if a.client == nil {
7793
return errors.New("client isn't initialized")

pkg/ionos/instances.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ func (i instances) AddClient(datacenterId string, token []byte) error {
3737

3838
// no caching
3939
func (i instances) discoverNode(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, error) {
40+
providerID := GetUUIDFromNode(node)
4041
for _, client := range i.ionosClients {
4142
var err error
4243
var server *cloudprovider.InstanceMetadata
43-
providerID := GetUUIDFromNode(node)
4444
klog.Infof("discoverNode (datacenterId %s) %s %s", client.DatacenterId, node.Name, providerID)
4545
if providerID != "" {
4646
server, err = client.GetServer(ctx, providerID)
@@ -55,7 +55,7 @@ func (i instances) discoverNode(ctx context.Context, node *v1.Node) (*cloudprovi
5555
}
5656
return server, nil
5757
}
58-
return nil, errors.New("failed to discoverNode")
58+
return nil, nil
5959
}
6060

6161
func (i instances) InstanceExists(ctx context.Context, node *v1.Node) (bool, error) {
@@ -65,15 +65,33 @@ func (i instances) InstanceExists(ctx context.Context, node *v1.Node) (bool, err
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
71-
return true, nil
70+
providerID := GetUUIDFromNode(node)
71+
if providerID == "" {
72+
return false, nil
73+
}
74+
for _, client := range i.ionosClients {
75+
serverState, err := client.GetServerState(ctx, providerID)
76+
if err != nil {
77+
continue
78+
}
79+
if serverState == "" {
80+
continue
81+
}
82+
if serverState != "RUNNING" && serverState != "NOSTATE" && serverState != "BLOCKED" {
83+
return true, nil
84+
}
85+
}
86+
return false, nil
7287
}
7388

7489
func (i instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, error) {
7590
klog.Infof("InstanceMetadata %s", node.Name)
7691
server, err := i.discoverNode(ctx, node)
92+
if server == nil && err == nil {
93+
return nil, errors.New("failed to discoverNode")
94+
}
7795
klog.InfoDepth(1, server)
7896
return server, err
7997
}

0 commit comments

Comments
 (0)