Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: remove all addons when uninstall KubeBlocks #193

Merged
merged 1 commit into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 22 additions & 17 deletions pkg/cmd/kubeblocks/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ import (
"k8s.io/kubectl/pkg/util/templates"

extensionsv1alpha1 "github.com/apecloud/kubeblocks/apis/extensions/v1alpha1"
viperx "github.com/apecloud/kubeblocks/pkg/viperx"
"github.com/apecloud/kubeblocks/pkg/viperx"

"github.com/apecloud/kbcli/pkg/spinner"
"github.com/apecloud/kbcli/pkg/types"
Expand Down Expand Up @@ -275,11 +275,15 @@ func (o *InstallOptions) CompleteInstallOptions() error {
func (o *InstallOptions) Install() error {
var err error
// create or update crds
s := spinner.New(o.Out, spinnerMsg("Create CRDs"))
defer s.Fail()
if err = createOrUpdateCRDS(o.Dynamic, o.Version); err != nil {
return fmt.Errorf("install crds failed: %s", err.Error())
}
s.Success()

// add helm repo
s := spinner.New(o.Out, spinnerMsg("Add and update repo "+types.KubeBlocksRepoName))
s = spinner.New(o.Out, spinnerMsg("Add and update repo "+types.KubeBlocksRepoName))
defer s.Fail()
// Add repo, if exists, will update it
if err = helm.AddRepo(newHelmRepoEntry()); err != nil {
Expand Down Expand Up @@ -403,21 +407,22 @@ func (o *InstallOptions) waitAddonsEnabled() error {
}
)
// wait all addons to be enabled, or timeout
if err = wait.PollImmediate(5*time.Second, o.Timeout, func() (bool, error) {
if err = fetchAddons(); err != nil || len(addons) == 0 {
return false, err
}
status := checkAddons(maps.Values(addons), true)
msg = suffixMsg(fmt.Sprintf("%s\n %s", header, status.outputMsg))
s.SetMessage(msg)
if status.allEnabled {
spinnerDone()
return true, nil
} else if status.hasFailed {
return false, failedErr
}
return false, nil
}); err != nil {
if err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second,
o.Timeout, true, func(_ context.Context) (bool, error) {
if err = fetchAddons(); err != nil || len(addons) == 0 {
return false, err
}
status := checkAddons(maps.Values(addons), true)
msg = suffixMsg(fmt.Sprintf("%s\n %s", header, status.outputMsg))
s.SetMessage(msg)
if status.allEnabled {
spinnerDone()
return true, nil
} else if status.hasFailed {
return false, failedErr
}
return false, nil
}); err != nil {
spinnerDone()
printAddonMsg(o.Out, maps.Values(addons), true)
return err
Expand Down
37 changes: 18 additions & 19 deletions pkg/cmd/kubeblocks/uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -231,9 +231,7 @@ func (o *UninstallOptions) uninstallAddons() error {

addons := make(map[string]*extensionsv1alpha1.Addon)
processAddons := func(uninstall bool) error {
objects, err := o.Dynamic.Resource(types.AddonGVR()).List(context.TODO(), metav1.ListOptions{
LabelSelector: buildKubeBlocksSelectorLabels(),
})
objects, err := o.Dynamic.Resource(types.AddonGVR()).List(context.TODO(), metav1.ListOptions{})
if err != nil && !apierrors.IsNotFound(err) {
klog.V(1).Infof("Failed to get KubeBlocks addons %s", err.Error())
allErrs = append(allErrs, err)
Expand Down Expand Up @@ -303,22 +301,23 @@ func (o *UninstallOptions) uninstallAddons() error {

// check if all addons are disabled, if so, then we will stop checking addons
// status otherwise, we will wait for a while and check again
if err = wait.PollImmediate(5*time.Second, o.Timeout, func() (bool, error) {
// we only check addons status, do not try to uninstall addons again
if err = processAddons(false); err != nil {
return false, err
}
status := checkAddons(maps.Values(addons), false)
msg = suffixMsg(fmt.Sprintf("%s\n %s", header, status.outputMsg))
s.SetMessage(msg)
if status.allDisabled {
spinnerDone()
return true, nil
} else if status.hasFailed {
return false, errors.New("some addons are failed to disabled")
}
return false, nil
}); err != nil {
if err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second,
o.Timeout, true, func(_ context.Context) (bool, error) {
// we only check addons status, do not try to uninstall addons again
if err = processAddons(false); err != nil {
return false, err
}
status := checkAddons(maps.Values(addons), false)
msg = suffixMsg(fmt.Sprintf("%s\n %s", header, status.outputMsg))
s.SetMessage(msg)
if status.allDisabled {
spinnerDone()
return true, nil
} else if status.hasFailed {
return false, errors.New("some addons are failed to disabled")
}
return false, nil
}); err != nil {
spinnerDone()
printAddonMsg(o.Out, maps.Values(addons), false)
allErrs = append(allErrs, err)
Expand Down
5 changes: 5 additions & 0 deletions pkg/cmd/kubeblocks/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,10 +185,15 @@ func (o *InstallOptions) Upgrade() error {

msg = "to " + o.Version
}

// create or update crds
s = spinner.New(o.Out, spinnerMsg("Upgrade CRDs"))
defer s.Fail()
if err = createOrUpdateCRDS(o.Dynamic, o.Version); err != nil {
return fmt.Errorf("upgrade crds failed: %s", err.Error())
}
s.Success()

s = spinner.New(o.Out, spinnerMsg("Upgrading KubeBlocks "+msg))
defer s.Fail()
// upgrade KubeBlocks chart
Expand Down
12 changes: 7 additions & 5 deletions pkg/cmd/kubeblocks/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import (
"strings"

"github.com/Masterminds/semver/v3"
extensionsv1alpha1 "github.com/apecloud/kubeblocks/apis/extensions/v1alpha1"
"github.com/apecloud/kubeblocks/pkg/constant"
"github.com/jedib0t/go-pretty/v6/table"
"github.com/pkg/errors"
"golang.org/x/exp/slices"
Expand All @@ -38,9 +40,7 @@ import (
"k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"

extensionsv1alpha1 "github.com/apecloud/kubeblocks/apis/extensions/v1alpha1"
"github.com/apecloud/kubeblocks/pkg/constant"
"k8s.io/klog/v2"

"github.com/apecloud/kbcli/pkg/printer"
"github.com/apecloud/kbcli/pkg/types"
Expand Down Expand Up @@ -122,7 +122,7 @@ func getHelmChartVersions(chart string) ([]*semver.Version, error) {
//
// KubeBlocks resources are labeled with "app.kubernetes.io/instance=types.KubeBlocksChartName",
// and most addon resources are labeled with "app.kubernetes.io/instance=<addon-prefix>-addon.Name",
// but some addon resources are labeled with "release=<addon-prefix>-addon.Name".
// but some labeled with "release=<addon-prefix>-addon.Name".
func buildResourceLabelSelectors(addons []*extensionsv1alpha1.Addon) []string {
var (
selectors []string
Expand Down Expand Up @@ -295,7 +295,7 @@ func createOrUpdateCRDS(dynamic dynamic.Interface, kbVersion string) error {
if resp.StatusCode == http.StatusNotFound {
return nil
} else if resp.StatusCode != http.StatusOK {
return fmt.Errorf("can not download %s", crdsURL)
return fmt.Errorf("failed to download CRDs from %s", crdsURL)
}
defer resp.Body.Close()
d := yaml.NewYAMLToJSONDecoder(resp.Body)
Expand All @@ -314,11 +314,13 @@ func createOrUpdateCRDS(dynamic dynamic.Interface, kbVersion string) error {
for _, obj := range objs {
if structObj, err := dynamic.Resource(types.CustomResourceDefinitionGVR()).Get(ctx, obj.GetName(), metav1.GetOptions{}); err != nil {
// create crd
klog.V(1).Infof("create CRD %s", obj.GetName())
if _, err = dynamic.Resource(types.CustomResourceDefinitionGVR()).Create(ctx, &obj, metav1.CreateOptions{}); err != nil {
return err
}
} else {
// update crd
klog.V(1).Infof("update CRD %s", obj.GetName())
obj.SetResourceVersion(structObj.GetResourceVersion())
if _, err = dynamic.Resource(types.CustomResourceDefinitionGVR()).Update(ctx, &obj, metav1.UpdateOptions{}); err != nil {
return err
Expand Down