/
migrate2to3.go
170 lines (134 loc) · 6.87 KB
/
migrate2to3.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package helm
import (
"context"
"fmt"
"os"
"github.com/spf13/cobra"
helm_v3 "helm.sh/helm/v3/cmd/helm"
"helm.sh/helm/v3/pkg/action"
"github.com/werf/kubedog/pkg/kube"
"github.com/werf/logboek"
"github.com/werf/werf/cmd/werf/common"
"github.com/werf/werf/pkg/deploy/helm"
"github.com/werf/werf/pkg/deploy/helm/maintenance_helper"
"github.com/werf/werf/pkg/werf"
)
var migrate2To3CommonCmdData common.CmdData
var migrate2ToCmdData struct {
Release string
TargetRelease string
TargetNamespace string
Helm2ReleaseStorageNamespace string
Helm2ReleaseStorageType string
}
func setupHelm2ReleaseStorageNamespace(cmd *cobra.Command) {
defaultValues := []string{
os.Getenv("WERF_HELM2_RELEASE_STORAGE_NAMESPACE"),
os.Getenv("WERF_HELM_RELEASE_STORAGE_NAMESPACE"),
os.Getenv("TILLER_NAMESPACE"),
}
var defaultValue string
for _, value := range defaultValues {
if value != "" {
defaultValue = value
break
}
}
cmd.Flags().StringVarP(&migrate2ToCmdData.Helm2ReleaseStorageNamespace, "helm2-release-storage-namespace", "", defaultValue, fmt.Sprintf("Helm 2 release storage namespace (same as --tiller-namespace for regular helm 2, defaults to $WERF_HELM2_RELEASE_STORAGE_NAMESPACE, or $WERF_HELM_RELEASE_STORAGE_NAMESPACE, or $TILLER_NAMESPACE, or \"kube-system\")"))
}
func setupHelm2ReleaseStorageType(cmd *cobra.Command) {
defaultValues := []string{
os.Getenv("WERF_HELM2_RELEASE_STORAGE_TYPE"),
os.Getenv("WERF_HELM_RELEASE_STORAGE_TYPE"),
}
var defaultValue string
for _, value := range defaultValues {
if value != "" {
defaultValue = value
break
}
}
cmd.Flags().StringVarP(&migrate2ToCmdData.Helm2ReleaseStorageType, "helm2-release-storage-type", "", defaultValue, fmt.Sprintf("Helm w storage driver to use. One of %[1]q or %[2]q, defaults to $WERF_HELM2_RELEASE_STORAGE_TYPE, or $WERF_HELM_RELEASE_STORAGE_TYPE, or %[1]q)", "configmap", "secret"))
}
func NewMigrate2To3Cmd() *cobra.Command {
cmd := &cobra.Command{
Use: "migrate2to3",
DisableFlagsInUseLine: true,
Short: "Start a migration of your existing helm 2 release to helm 3",
RunE: func(cmd *cobra.Command, args []string) error {
if err := common.ProcessLogOptions(&migrate2To3CommonCmdData); err != nil {
common.PrintHelp(cmd)
return err
}
return runMigrate2To3(common.GetContext())
},
}
common.SetupTmpDir(&migrate2To3CommonCmdData, cmd, common.SetupTmpDirOptions{})
common.SetupHomeDir(&migrate2To3CommonCmdData, cmd, common.SetupHomeDirOptions{})
common.SetupKubeConfig(&migrate2To3CommonCmdData, cmd)
common.SetupKubeConfigBase64(&migrate2To3CommonCmdData, cmd)
common.SetupKubeContext(&migrate2To3CommonCmdData, cmd)
common.SetupInsecureHelmDependencies(&migrate2To3CommonCmdData, cmd)
common.SetupLogOptions(&migrate2To3CommonCmdData, cmd)
cmd.Flags().StringVarP(&migrate2ToCmdData.Release, "release", "", os.Getenv("WERF_RELEASE"), "Existing helm 2 release name which should be migrated to helm 3 (default $WERF_RELEASE). Option also sets target name for a new helm 3 release, use --target-release option (or $WERF_TARGET_RELEASE) to specify a different helm 3 release name.")
cmd.Flags().StringVarP(&migrate2ToCmdData.TargetRelease, "target-release", "", os.Getenv("WERF_TARGET_RELEASE"), "Target helm 3 release name (optional, default $WERF_TARGET_RELEASE, or the value of --release option, or $WERF_RELEASE)")
cmd.Flags().StringVarP(&migrate2ToCmdData.TargetNamespace, "target-namespace", "", os.Getenv("WERF_NAMESPACE"), "Target kubernetes namespace for a new helm 3 release (default $WERF_NAMESPACE)")
setupHelm2ReleaseStorageNamespace(cmd)
setupHelm2ReleaseStorageType(cmd)
return cmd
}
func runMigrate2To3(ctx context.Context) error {
if err := werf.Init(*migrate2To3CommonCmdData.TmpDir, *migrate2To3CommonCmdData.HomeDir); err != nil {
return fmt.Errorf("initialization error: %s", err)
}
common.SetupOndemandKubeInitializer(*migrate2To3CommonCmdData.KubeContext, *migrate2To3CommonCmdData.KubeConfig, *migrate2To3CommonCmdData.KubeConfigBase64, *migrate2To3CommonCmdData.KubeConfigPathMergeList)
if err := common.GetOndemandKubeInitializer().Init(ctx); err != nil {
return err
}
existingReleaseName := migrate2ToCmdData.Release
if existingReleaseName == "" {
return fmt.Errorf("--release (or WERF_RELEASE env var) required! This option specifies existing helm 2 release name which should be migrated to helm 3, option also sets target name for a new helm 3 release, use --target-release option (or $WERF_TARGET_RELEASE) to specify a different helm 3 release name.")
}
targetReleaseName := migrate2ToCmdData.TargetRelease
if targetReleaseName == "" {
targetReleaseName = existingReleaseName
}
targetNamespace := migrate2ToCmdData.TargetNamespace
if targetNamespace == "" {
return fmt.Errorf("--target-namespace (or WERF_TARGET_NAMESPACE env var) required! Please specify target namespace for a new helm 3 release explicitly (specify \"default\" for the default namespace).")
}
kubeConfigOptions := kube.KubeConfigOptions{
Context: *migrate2To3CommonCmdData.KubeContext,
ConfigPath: *migrate2To3CommonCmdData.KubeConfig,
ConfigDataBase64: *migrate2To3CommonCmdData.KubeConfigBase64,
ConfigPathMergeList: *migrate2To3CommonCmdData.KubeConfigPathMergeList,
}
helmRegistryClientHandler, err := common.NewHelmRegistryClientHandle(ctx, &migrate2To3CommonCmdData)
if err != nil {
return fmt.Errorf("unable to create helm registry client: %s", err)
}
actionConfig := new(action.Configuration)
if err := helm.InitActionConfig(ctx, common.GetOndemandKubeInitializer(), targetNamespace, helm_v3.Settings, helmRegistryClientHandler, actionConfig, helm.InitActionConfigOptions{KubeConfigOptions: kubeConfigOptions}); err != nil {
return err
}
maintenanceOpts := maintenance_helper.MaintenanceHelperOptions{
Helm2ReleaseStorageNamespace: migrate2ToCmdData.Helm2ReleaseStorageNamespace,
Helm2ReleaseStorageType: migrate2ToCmdData.Helm2ReleaseStorageType,
KubeConfigOptions: kubeConfigOptions,
}
maintenanceHelper := maintenance_helper.NewMaintenanceHelper(actionConfig, maintenanceOpts)
if available, err := maintenanceHelper.CheckHelm2StorageAvailable(ctx); err != nil {
return err
} else if !available {
return fmt.Errorf("helm 2 release storage is not available")
}
logboek.Context(ctx).Default().LogFDetails(" + Helm 2 release storage is available\n")
if err := maintenance_helper.Migrate2To3(ctx, existingReleaseName, targetReleaseName, targetNamespace, maintenanceHelper); err != nil {
return err
}
logboek.Context(ctx).Default().LogOptionalLn()
logboek.Context(ctx).Default().LogFDetails(`Migration to werf v1.2 is almost done, please run "werf converge" command to bring resources to the state which is described in the repository .helm/templates directory.
Make sure "werf converge" command uses release name %q and namespace %q!
`, targetReleaseName, targetNamespace)
return nil
}