Skip to content

Commit d542196

Browse files
committed
WIP
1 parent ab9c7bd commit d542196

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

pkg/provider/core.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"errors"
1212
"fmt"
1313
"slices"
14+
"strconv"
1415
"strings"
1516

1617
"github.com/gardener/machine-controller-manager/pkg/util/provider/driver"
@@ -28,6 +29,8 @@ const (
2829
StackitRoleLabel = "mcm.gardener.cloud/role"
2930
)
3031

32+
const migratedMachineAnnotation = "stackit.cloud/migrated-machine"
33+
3134
// CreateMachine handles a machine creation request by creating a STACKIT server
3235
//
3336
// This method creates a new server in STACKIT infrastructure based on the ProviderSpec
@@ -357,6 +360,29 @@ func (p *Provider) DeleteMachine(ctx context.Context, req *driver.DeleteMachineR
357360
return nil, status.Error(codes.Internal, fmt.Sprintf("failed to delete server: %v", err))
358361
}
359362

363+
if m, _ := strconv.ParseBool(req.Machine.Annotations[migratedMachineAnnotation]); m {
364+
nics, err := p.client.ListNICs(ctx, projectID, providerSpec.Region, providerSpec.Networking.NetworkID)
365+
if err != nil {
366+
return nil, err
367+
}
368+
for _, nic := range nics {
369+
if nic.Name != req.Machine.Name {
370+
continue
371+
}
372+
err = p.client.DeleteNIC(ctx, projectID, providerSpec.Region, nic.NetworkID, nic.ID)
373+
if err != nil {
374+
// Check if server was not found (404) - this is OK for idempotency
375+
if errors.Is(err, ErrNicNotFound) {
376+
klog.V(2).Infof("Nic %q already deleted for machine %q (idempotent)", serverID[1], req.Machine.Name)
377+
return &driver.DeleteMachineResponse{}, nil
378+
}
379+
// All other errors are internal errors
380+
klog.Errorf("Failed to delete nic for machine %q: %v", req.Machine.Name, err)
381+
return nil, status.Error(codes.Internal, fmt.Sprintf("failed to delete nic: %v", err))
382+
}
383+
}
384+
385+
}
360386
klog.V(2).Infof("Successfully deleted server %q for machine %q", serverID, req.Machine.Name)
361387

362388
return &driver.DeleteMachineResponse{}, nil

pkg/provider/sdk_client.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func NewStackitClient(serviceAccountKey string) (*SdkStackitClient, error) {
4141
var (
4242
// ErrServerNotFound indicates the server was not found (404)
4343
ErrServerNotFound = errors.New("server not found")
44+
ErrNicNotFound = errors.New("nic not found")
4445
)
4546

4647
// createIAASClient creates a new STACKIT SDK IAAS API client
@@ -320,6 +321,36 @@ func (c *SdkStackitClient) GetNICsForServer(ctx context.Context, projectID, regi
320321
return nics, nil
321322
}
322323

324+
func (c *SdkStackitClient) ListNICs(ctx context.Context, projectID, region, networkID string) ([]*NIC, error) {
325+
res, err := c.iaasClient.ListNics(ctx, projectID, region, networkID).Execute()
326+
if err != nil {
327+
return nil, fmt.Errorf("SDK ListServerNICs failed: %w", err)
328+
}
329+
330+
if res.Items == nil {
331+
return []*NIC{}, nil
332+
}
333+
334+
nics := make([]*NIC, 0)
335+
for _, nic := range *res.Items {
336+
nics = append(nics, convertSDKNICtoNIC(&nic))
337+
}
338+
339+
return nics, nil
340+
}
341+
342+
func (c *SdkStackitClient) DeleteNIC(ctx context.Context, projectID, region, networkID, nicID string) error {
343+
err := c.iaasClient.DeleteNic(ctx, projectID, region, networkID, nicID).Execute()
344+
if err != nil {
345+
// Check if error is 404 Not Found - this is OK (idempotent)
346+
if isNotFoundError(err) {
347+
return fmt.Errorf("%w: %v", ErrNicNotFound, err)
348+
}
349+
return fmt.Errorf("SDK DeleteNic failed: %w", err)
350+
}
351+
return nil
352+
}
353+
323354
func (c *SdkStackitClient) UpdateNIC(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error) {
324355
addresses := make([]iaas.AllowedAddressesInner, len(allowedAddresses))
325356

@@ -361,6 +392,7 @@ func convertSDKNICtoNIC(nic *iaas.NIC) *NIC {
361392
ID: getStringValue(nic.Id),
362393
NetworkID: getStringValue(nic.NetworkId),
363394
AllowedAddresses: addresses,
395+
Name: getStringValue(nic.Name),
364396
}
365397
}
366398

pkg/provider/stackit_client.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ type StackitClient interface {
3030
ListServers(ctx context.Context, projectID, region string, labelSelector map[string]string) ([]*Server, error)
3131
// GetNICsForServer retrieves a network interfaces for a given server
3232
GetNICsForServer(ctx context.Context, projectID, region, serverID string) ([]*NIC, error)
33+
// ListNics list all nics for a network
34+
ListNICs(ctx context.Context, projectID, region, networkID string) ([]*NIC, error)
35+
// DeleteNIC delete a given nic by ID
36+
DeleteNIC(ctx context.Context, projectID, region, networkID, nicID string) error
3337
// UpdateNIC updates a network interface
3438
UpdateNIC(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error)
3539
}
@@ -97,4 +101,5 @@ type NIC struct {
97101
ID string
98102
NetworkID string
99103
AllowedAddresses []string
104+
Name string
100105
}

0 commit comments

Comments
 (0)