-
Notifications
You must be signed in to change notification settings - Fork 198
/
delete.go
130 lines (109 loc) · 3.8 KB
/
delete.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
125
126
127
128
129
130
// Copyright © 2017 The Kubicorn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cmd
import (
"fmt"
"os"
"github.com/kubicorn/kubicorn/apis/cluster"
"github.com/kubicorn/kubicorn/pkg"
"github.com/kubicorn/kubicorn/pkg/cli"
"github.com/kubicorn/kubicorn/pkg/logger"
"github.com/kubicorn/kubicorn/pkg/task"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
// DeleteCmd represents the delete command
func DeleteCmd() *cobra.Command {
var do = &cli.DeleteOptions{}
var deleteCmd = &cobra.Command{
Use: "delete <NAME>",
Short: "Delete a Kubernetes cluster",
Long: `Use this command to delete cloud resources.
This command will attempt to build the resource graph based on an API model.
Once the graph is built, the delete will attempt to delete the resources from the cloud.
After the delete is complete, the state store will be left in tact and could potentially be applied later.
To delete the resource AND the API model in the state store, use --purge.`,
Run: func(cmd *cobra.Command, args []string) {
switch len(args) {
case 0:
do.Name = viper.GetString(keyKubicornName)
case 1:
do.Name = args[0]
default:
logger.Critical("Too many arguments.")
os.Exit(1)
}
if err := runDelete(do); err != nil {
logger.Critical(err.Error())
os.Exit(1)
}
},
}
fs := deleteCmd.Flags()
bindCommonStateStoreFlags(&do.StateStoreOptions, fs)
bindCommonAwsFlags(&do.AwsOptions, fs)
fs.StringVar(&do.AwsProfile, keyAwsProfile, viper.GetString(keyAwsProfile), descAwsProfile)
fs.StringVar(&do.GitRemote, keyGitConfig, viper.GetString(keyGitConfig), descGitConfig)
fs.BoolVarP(&do.Purge, keyPurge, "p", viper.GetBool(keyPurge), descPurge)
return deleteCmd
}
func runDelete(options *cli.DeleteOptions) error {
// Ensure we have a name
name := options.Name
if name == "" {
return errors.New("Empty name. Must specify the name of the cluster to delete")
}
// Expand state store path
options.StateStorePath = cli.ExpandPath(options.StateStorePath)
// Register state store and check if it exists
stateStore, err := options.NewStateStore()
if err != nil {
return err
} else if !stateStore.Exists() {
logger.Info("Cluster [%s] does not exist", name)
return nil
}
expectedCluster, err := stateStore.GetCluster()
if err != nil {
return fmt.Errorf("Unable to get cluster [%s]: %v", name, err)
}
runtimeParams := &pkg.RuntimeParameters{}
if len(options.AwsProfile) > 0 {
runtimeParams.AwsProfile = options.AwsProfile
}
reconciler, err := pkg.GetReconciler(expectedCluster, runtimeParams)
if err != nil {
return fmt.Errorf("Unable to get cluster reconciler: %v", err)
}
var deleteCluster *cluster.Cluster
var deleteClusterTask = func() error {
deleteCluster, err = reconciler.Destroy()
return err
}
err = task.RunAnnotated(deleteClusterTask, fmt.Sprintf("\nDestroying resources for cluster [%s]:\n", options.Name), "")
if err != nil {
return fmt.Errorf("Unable to destroy resources for cluster [%s]: %v", options.Name, err)
}
if err = stateStore.Commit(deleteCluster); err != nil {
return fmt.Errorf("Unable to save state store: %v", err)
}
if options.Purge {
err := stateStore.Destroy()
if err != nil {
return fmt.Errorf("Unable to remove state store for cluster [%s]: %v", options.Name, err)
}
}
return nil
}