Skip to content

Commit 8a04d8d

Browse files
committed
fix: convert to v1 cluster bug (#588)
Co-authored-by: wangyelei <wangyelei@users.noreply.github.com> (cherry picked from commit 92ba3d6)
1 parent d05b1c0 commit 8a04d8d

File tree

3 files changed

+242
-124
lines changed

3 files changed

+242
-124
lines changed

pkg/cmd/addon/addon.go

Lines changed: 3 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -29,41 +29,31 @@ import (
2929
"strconv"
3030
"strings"
3131

32-
kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
32+
extensionsv1alpha1 "github.com/apecloud/kubeblocks/apis/extensions/v1alpha1"
33+
"github.com/apecloud/kubeblocks/pkg/constant"
34+
viper "github.com/apecloud/kubeblocks/pkg/viperx"
3335
"github.com/jedib0t/go-pretty/v6/table"
3436
"github.com/spf13/cobra"
3537
"github.com/spf13/pflag"
36-
helmaction "helm.sh/helm/v3/pkg/action"
37-
"helm.sh/helm/v3/pkg/chart/loader"
38-
"helm.sh/helm/v3/pkg/releaseutil"
3938
corev1 "k8s.io/api/core/v1"
40-
apierrors "k8s.io/apimachinery/pkg/api/errors"
4139
"k8s.io/apimachinery/pkg/api/resource"
4240
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4341
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
4442
"k8s.io/apimachinery/pkg/runtime"
45-
"k8s.io/apimachinery/pkg/runtime/schema"
4643
"k8s.io/cli-runtime/pkg/genericiooptions"
4744
discoverycli "k8s.io/client-go/discovery"
4845
"k8s.io/client-go/dynamic"
4946
"k8s.io/client-go/kubernetes"
5047
cmdutil "k8s.io/kubectl/pkg/cmd/util"
5148
"k8s.io/kubectl/pkg/util/templates"
5249
"k8s.io/utils/strings/slices"
53-
"sigs.k8s.io/yaml"
54-
55-
extensionsv1alpha1 "github.com/apecloud/kubeblocks/apis/extensions/v1alpha1"
56-
"github.com/apecloud/kubeblocks/pkg/constant"
57-
viper "github.com/apecloud/kubeblocks/pkg/viperx"
5850

5951
"github.com/apecloud/kbcli/pkg/action"
60-
"github.com/apecloud/kbcli/pkg/cluster"
6152
clusterCmd "github.com/apecloud/kbcli/pkg/cmd/cluster"
6253
"github.com/apecloud/kbcli/pkg/cmd/plugin"
6354
"github.com/apecloud/kbcli/pkg/printer"
6455
"github.com/apecloud/kbcli/pkg/types"
6556
"github.com/apecloud/kbcli/pkg/util"
66-
"github.com/apecloud/kbcli/pkg/util/helm"
6757
)
6858

6959
type addonEnableFlags struct {
@@ -236,7 +226,6 @@ func newEnableCmd(f cmdutil.Factory, streams genericiooptions.IOStreams) *cobra.
236226
util.CheckErr(o.validate())
237227
util.CheckErr(o.complete(o, cmd, []string{name}))
238228
util.CheckErr(o.CmdComplete(cmd))
239-
util.CheckErr(o.process09ClusterDefAndComponentVersions())
240229
util.CheckErr(o.Run())
241230
if isEngineAddon(&o.addon) {
242231
util.CheckErr(clusterCmd.RegisterClusterChart(f, streams, "", name, getAddonVersion(&o.addon), types.ClusterChartsRepoURL))
@@ -1034,112 +1023,3 @@ func (o *addonCmdOpts) checkBeforeDisable() error {
10341023
}
10351024
return CheckAddonUsedByCluster(o.dynamic, o.Names, o.In)
10361025
}
1037-
1038-
func (o *addonCmdOpts) process09ClusterDefAndComponentVersions() error {
1039-
kbDeploys, err := util.GetKBDeploys(o.client, util.KubeblocksAppComponent, metav1.NamespaceAll)
1040-
if err != nil || len(kbDeploys) < 2 {
1041-
return err
1042-
}
1043-
if !strings.HasPrefix(o.addon.Spec.Version, "1.0") {
1044-
return nil
1045-
}
1046-
var newKBNamespace string
1047-
for _, v := range kbDeploys {
1048-
if strings.HasPrefix(v.Labels[constant.AppVersionLabelKey], "1.0") {
1049-
newKBNamespace = v.Namespace
1050-
break
1051-
}
1052-
}
1053-
// 1. get manifests from the helm repo
1054-
chartsDownloader, err := helm.NewDownloader(helm.NewConfig(newKBNamespace, "", "", false))
1055-
if err != nil {
1056-
return err
1057-
}
1058-
// DownloadTo can't specify the saved name, so download it to TempDir and rename it when copy
1059-
chartPath, _, err := chartsDownloader.DownloadTo(o.addon.Spec.Helm.ChartLocationURL, "", cluster.CliChartsCacheDir)
1060-
if err != nil {
1061-
return err
1062-
}
1063-
// 2. overwrite the spec of ClusterDefinition and ComponentVersion with the new version
1064-
actionCfg, err := helm.NewActionConfig(helm.NewConfig(newKBNamespace, "", "", false))
1065-
if err != nil {
1066-
return err
1067-
}
1068-
chart, err := loader.Load(chartPath)
1069-
if err != nil {
1070-
return err
1071-
}
1072-
renderer := helmaction.NewInstall(actionCfg)
1073-
renderer.ReleaseName = o.addon.Name + "for-upgrade"
1074-
renderer.Namespace = newKBNamespace
1075-
renderer.DryRun = true
1076-
renderer.Replace = true
1077-
renderer.ClientOnly = true
1078-
valuesMap := map[string]interface{}{}
1079-
if o.addon.Spec.Helm != nil {
1080-
for _, v := range o.addon.Spec.Helm.InstallValues.SetValues {
1081-
keyValues := strings.Split(v, "=")
1082-
if len(keyValues) != 2 {
1083-
return fmt.Errorf("invalid install value: %s", v)
1084-
}
1085-
valuesMap[keyValues[0]] = keyValues[1]
1086-
}
1087-
}
1088-
release, err := renderer.Run(chart, valuesMap)
1089-
if err != nil {
1090-
return err
1091-
}
1092-
1093-
updateObject := func(obj runtime.Object, gvr schema.GroupVersionResource) error {
1094-
unstructuredObj := obj.(*unstructured.Unstructured)
1095-
targetObj, err := o.dynamic.Resource(gvr).Namespace("").Get(context.TODO(), unstructuredObj.GetName(), metav1.GetOptions{})
1096-
if err != nil {
1097-
if apierrors.IsNotFound(err) {
1098-
if _, err = o.dynamic.Resource(gvr).Namespace("").Create(context.TODO(), unstructuredObj, metav1.CreateOptions{}); err != nil {
1099-
return err
1100-
}
1101-
return nil
1102-
}
1103-
return err
1104-
}
1105-
annotations := targetObj.GetAnnotations()
1106-
annotations[constant.CRDAPIVersionAnnotationKey] = kbappsv1.GroupVersion.String()
1107-
annotations["meta.helm.sh/release-name"] = "kb-addon-" + o.addon.Name
1108-
annotations["meta.helm.sh/release-namespace"] = newKBNamespace
1109-
targetObj.SetAnnotations(annotations)
1110-
targetObj.Object["spec"] = unstructuredObj.Object["spec"]
1111-
if _, err = o.dynamic.Resource(gvr).Namespace("").Update(context.TODO(), targetObj, metav1.UpdateOptions{}); err != nil {
1112-
return err
1113-
}
1114-
return nil
1115-
}
1116-
manifests := releaseutil.SplitManifests(release.Manifest)
1117-
for _, manifest := range manifests {
1118-
1119-
// convert yaml to json
1120-
jsonData, err := yaml.YAMLToJSON([]byte(manifest))
1121-
if err != nil {
1122-
return err
1123-
}
1124-
// check if jsonData is empty or null
1125-
if len(jsonData) == 0 || string(jsonData) == "null" {
1126-
continue
1127-
}
1128-
// get resource gvk
1129-
obj, gvk, err := unstructured.UnstructuredJSONScheme.Decode(jsonData, nil, nil)
1130-
if err != nil {
1131-
return err
1132-
}
1133-
switch gvk.Kind {
1134-
case types.KindClusterDef:
1135-
if err = updateObject(obj, types.ClusterDefGVR()); err != nil {
1136-
return err
1137-
}
1138-
case types.KindComponentVersion:
1139-
if err = updateObject(obj, types.ComponentVersionsGVR()); err != nil {
1140-
return err
1141-
}
1142-
}
1143-
}
1144-
return nil
1145-
}

pkg/cmd/addon/upgrade.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,30 @@ import (
2323
"context"
2424
"encoding/json"
2525
"fmt"
26+
"strings"
2627

2728
"github.com/Masterminds/semver/v3"
29+
kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
2830
extensionsv1alpha1 "github.com/apecloud/kubeblocks/apis/extensions/v1alpha1"
31+
"github.com/apecloud/kubeblocks/pkg/constant"
2932
"github.com/spf13/cobra"
33+
helmaction "helm.sh/helm/v3/pkg/action"
34+
"helm.sh/helm/v3/pkg/chart/loader"
35+
"helm.sh/helm/v3/pkg/releaseutil"
36+
apierrors "k8s.io/apimachinery/pkg/api/errors"
3037
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
38+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
39+
"k8s.io/apimachinery/pkg/runtime"
40+
"k8s.io/apimachinery/pkg/runtime/schema"
3141
ktypes "k8s.io/apimachinery/pkg/types"
3242
"k8s.io/cli-runtime/pkg/genericiooptions"
3343
cmdutil "k8s.io/kubectl/pkg/cmd/util"
3444
"k8s.io/kubectl/pkg/util/templates"
45+
"sigs.k8s.io/yaml"
3546

47+
"github.com/apecloud/kbcli/pkg/cluster"
3648
"github.com/apecloud/kbcli/pkg/printer"
49+
"github.com/apecloud/kbcli/pkg/util/helm"
3750

3851
"github.com/apecloud/kbcli/pkg/types"
3952
"github.com/apecloud/kbcli/pkg/util"
@@ -97,6 +110,7 @@ func newUpgradeCmd(f cmdutil.Factory, streams genericiooptions.IOStreams) *cobra
97110
o.name = args[0]
98111
util.CheckErr(o.Complete())
99112
util.CheckErr(o.Validate())
113+
util.CheckErr(o.process09ClusterDefAndComponentVersions())
100114
util.CheckErr(o.Run(f, streams))
101115
},
102116
}
@@ -171,3 +185,109 @@ func (o *upgradeOption) Run(f cmdutil.Factory, streams genericiooptions.IOStream
171185
}
172186
return err
173187
}
188+
189+
func (o *upgradeOption) process09ClusterDefAndComponentVersions() error {
190+
kbDeploys, err := util.GetKBDeploys(o.Client, util.KubeblocksAppComponent, metav1.NamespaceAll)
191+
if err != nil || len(kbDeploys) < 2 {
192+
return err
193+
}
194+
if !strings.HasPrefix(o.currentVersion, "0.9") {
195+
return nil
196+
}
197+
var newKBNamespace string
198+
for _, v := range kbDeploys {
199+
if strings.HasPrefix(v.Labels[constant.AppVersionLabelKey], "1.0") {
200+
newKBNamespace = v.Namespace
201+
break
202+
}
203+
}
204+
// 1. get manifests from the helm repo
205+
chartsDownloader, err := helm.NewDownloader(helm.NewConfig(newKBNamespace, "", "", false))
206+
if err != nil {
207+
return err
208+
}
209+
// DownloadTo can't specify the saved name, so download it to TempDir and rename it when copy
210+
chartPath, _, err := chartsDownloader.DownloadTo(o.addon.Spec.Helm.ChartLocationURL, "", cluster.CliChartsCacheDir)
211+
if err != nil {
212+
return err
213+
}
214+
// 2. overwrite the spec of ClusterDefinition and ComponentVersion with the new version
215+
actionCfg, err := helm.NewActionConfig(helm.NewConfig(newKBNamespace, "", "", false))
216+
if err != nil {
217+
return err
218+
}
219+
chart, err := loader.Load(chartPath)
220+
if err != nil {
221+
return err
222+
}
223+
renderer := helmaction.NewInstall(actionCfg)
224+
renderer.ReleaseName = o.addon.Name + "for-upgrade"
225+
renderer.Namespace = newKBNamespace
226+
renderer.DryRun = true
227+
renderer.Replace = true
228+
renderer.ClientOnly = true
229+
valuesMap := map[string]interface{}{}
230+
if o.addon.Spec.Helm != nil {
231+
for _, v := range o.addon.Spec.Helm.InstallValues.SetValues {
232+
keyValues := strings.Split(v, "=")
233+
if len(keyValues) != 2 {
234+
return fmt.Errorf("invalid install value: %s", v)
235+
}
236+
valuesMap[keyValues[0]] = keyValues[1]
237+
}
238+
}
239+
release, err := renderer.Run(chart, valuesMap)
240+
if err != nil {
241+
return err
242+
}
243+
244+
updateObject := func(obj runtime.Object, gvr schema.GroupVersionResource) error {
245+
unstructuredObj := obj.(*unstructured.Unstructured)
246+
targetObj, err := o.Dynamic.Resource(gvr).Namespace("").Get(context.TODO(), unstructuredObj.GetName(), metav1.GetOptions{})
247+
if err != nil {
248+
if apierrors.IsNotFound(err) {
249+
return nil
250+
}
251+
return err
252+
}
253+
annotations := targetObj.GetAnnotations()
254+
annotations[constant.CRDAPIVersionAnnotationKey] = kbappsv1.GroupVersion.String()
255+
annotations["meta.helm.sh/release-name"] = "kb-addon-" + o.addon.Name
256+
annotations["meta.helm.sh/release-namespace"] = newKBNamespace
257+
targetObj.SetAnnotations(annotations)
258+
targetObj.Object["spec"] = unstructuredObj.Object["spec"]
259+
if _, err = o.Dynamic.Resource(gvr).Namespace("").Update(context.TODO(), targetObj, metav1.UpdateOptions{}); err != nil {
260+
return err
261+
}
262+
return nil
263+
}
264+
manifests := releaseutil.SplitManifests(release.Manifest)
265+
for _, manifest := range manifests {
266+
267+
// convert yaml to json
268+
jsonData, err := yaml.YAMLToJSON([]byte(manifest))
269+
if err != nil {
270+
return err
271+
}
272+
// check if jsonData is empty or null
273+
if len(jsonData) == 0 || string(jsonData) == "null" {
274+
continue
275+
}
276+
// get resource gvk
277+
obj, gvk, err := unstructured.UnstructuredJSONScheme.Decode(jsonData, nil, nil)
278+
if err != nil {
279+
return err
280+
}
281+
switch gvk.Kind {
282+
case types.KindClusterDef:
283+
if err = updateObject(obj, types.ClusterDefGVR()); err != nil {
284+
return err
285+
}
286+
case types.KindComponentVersion:
287+
if err = updateObject(obj, types.ComponentVersionsGVR()); err != nil {
288+
return err
289+
}
290+
}
291+
}
292+
return nil
293+
}

0 commit comments

Comments
 (0)