/
destroy_cluster.go
124 lines (113 loc) · 3.28 KB
/
destroy_cluster.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package internal
import (
"fmt"
"github.com/airfocusio/hcloud-talos/internal/cluster"
"github.com/airfocusio/hcloud-talos/internal/utils"
"github.com/hetznercloud/hcloud-go/hcloud"
)
type DestroyClusterOpts struct {
ConfigFile string
Force bool
}
func DestroyCluster(logger *utils.Logger, dir string, opts DestroyClusterOpts) error {
cl := &cluster.Cluster{Dir: dir}
err := cl.Load(opts.ConfigFile, logger)
if err != nil {
return err
}
logger.Info.Printf("Destroying cluster %q\n", cl.Config.ClusterName)
if !opts.Force {
return fmt.Errorf("destroying the cluster must be forced")
}
servers, _, err := cl.Client.Server.List(*cl.Ctx, hcloud.ServerListOpts{
ListOpts: hcloud.ListOpts{
LabelSelector: clusterLabel + "=" + cl.Config.ClusterName,
},
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
for _, server := range servers {
cl.Logger.Info.Printf("Deleting server %d\n", server.ID)
err := utils.Retry(cl.Logger, func() error {
_, err := cl.Client.Server.Delete(*cl.Ctx, server)
return err
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
}
firewalls, _, err := cl.Client.Firewall.List(*cl.Ctx, hcloud.FirewallListOpts{
ListOpts: hcloud.ListOpts{
LabelSelector: clusterLabel + "=" + cl.Config.ClusterName,
},
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
for _, firewall := range firewalls {
cl.Logger.Info.Printf("Deleting firewall %d\n", firewall.ID)
err := utils.Retry(cl.Logger, func() error {
_, err := cl.Client.Firewall.Delete(*cl.Ctx, firewall)
return err
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
}
loadBalancers, _, err := cl.Client.LoadBalancer.List(*cl.Ctx, hcloud.LoadBalancerListOpts{
ListOpts: hcloud.ListOpts{
LabelSelector: clusterLabel + "=" + cl.Config.ClusterName,
},
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
for _, loadBalancer := range loadBalancers {
cl.Logger.Info.Printf("Deleting load balancer %d\n", loadBalancer.ID)
err := utils.Retry(cl.Logger, func() error {
_, err := cl.Client.LoadBalancer.Delete(*cl.Ctx, loadBalancer)
return err
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
}
placementGroups, _, err := cl.Client.PlacementGroup.List(*cl.Ctx, hcloud.PlacementGroupListOpts{
ListOpts: hcloud.ListOpts{
LabelSelector: clusterLabel + "=" + cl.Config.ClusterName,
},
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
for _, placementGroup := range placementGroups {
cl.Logger.Info.Printf("Deleting placement group %d\n", placementGroup.ID)
err := utils.Retry(cl.Logger, func() error {
_, err := cl.Client.PlacementGroup.Delete(*cl.Ctx, placementGroup)
return err
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
}
networks, _, err := cl.Client.Network.List(*cl.Ctx, hcloud.NetworkListOpts{
ListOpts: hcloud.ListOpts{
LabelSelector: clusterLabel + "=" + cl.Config.ClusterName,
},
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
for _, network := range networks {
cl.Logger.Info.Printf("Deleting network %d\n", network.ID)
err := utils.Retry(cl.Logger, func() error {
_, err := cl.Client.Network.Delete(*cl.Ctx, network)
return err
})
if err != nil {
logger.Warn.Printf("Error: %v\n", err)
}
}
return nil
}