hetzner: add dependency logic to deletion

This avoids warnings about deleting e.g. the volume while it is still
attached to a server.

Co-authored-by: Ciprian Hacman <ciprian@hakman.dev>
This commit is contained in:
justinsb 2023-02-12 10:17:26 -05:00
parent 9ec9d42910
commit 1ad3f6012c
1 changed files with 19 additions and 2 deletions

View File

@ -182,6 +182,10 @@ func listServers(cloud fi.Cloud, clusterName string) ([]*resources.Resource, err
Obj: server, Obj: server,
} }
for _, firewall := range server.PublicNet.Firewalls {
resourceTracker.Blocks = append(resourceTracker.Blocks, fmt.Sprintf("%s:%d", resourceTypeFirewall, firewall.Firewall.ID))
}
resourceTrackers = append(resourceTrackers, resourceTracker) resourceTrackers = append(resourceTrackers, resourceTracker)
} }
@ -206,6 +210,10 @@ func listVolumes(cloud fi.Cloud, clusterName string) ([]*resources.Resource, err
Obj: volume, Obj: volume,
} }
if volume.Server != nil {
resourceTracker.Blocked = append(resourceTracker.Blocked, fmt.Sprintf("%s:%d", resourceTypeServer, volume.Server.ID))
}
resourceTrackers = append(resourceTrackers, resourceTracker) resourceTrackers = append(resourceTrackers, resourceTracker)
} }
@ -269,16 +277,25 @@ func deleteLoadBalancer(cloud fi.Cloud, r *resources.Resource) error {
} }
func deleteServer(cloud fi.Cloud, r *resources.Resource) error { func deleteServer(cloud fi.Cloud, r *resources.Resource) error {
ctx := context.TODO()
klog.Infof("Deleting Server: %s(%s)", r.Name, r.ID) klog.Infof("Deleting Server: %s(%s)", r.Name, r.ID)
c := cloud.(hetzner.HetznerCloud) c := cloud.(hetzner.HetznerCloud)
client := c.ServerClient() serverClient := c.ServerClient()
actionClient := c.ActionClient()
server := r.Obj.(*hcloud.Server) server := r.Obj.(*hcloud.Server)
_, err := client.Delete(context.TODO(), server) result, _, err := serverClient.DeleteWithResult(ctx, server)
if err != nil { if err != nil {
return fmt.Errorf("failed to delete server %s(%s): %w", r.Name, r.ID, err) return fmt.Errorf("failed to delete server %s(%s): %w", r.Name, r.ID, err)
} }
_, errCh := actionClient.WatchProgress(ctx, result.Action)
if err := <-errCh; err != nil {
return err
}
return nil return nil
} }