From 58293dcf20cc2612a466df3078bd921c088cf368 Mon Sep 17 00:00:00 2001 From: qiaozp <47812250+chivalryq@users.noreply.github.com> Date: Mon, 22 Nov 2021 17:12:55 +0800 Subject: [PATCH] Feat: check addon dependencies when enable (#2741) --- pkg/addon/addon.go | 30 ++++++++++++++++++------- pkg/apiserver/rest/usecase/addon.go | 4 ++++ pkg/apiserver/rest/utils/bcode/addon.go | 3 +++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/pkg/addon/addon.go b/pkg/addon/addon.go index c21abe4d3..8efb24c73 100644 --- a/pkg/addon/addon.go +++ b/pkg/addon/addon.go @@ -13,17 +13,9 @@ import ( v1 "k8s.io/api/core/v1" - "sigs.k8s.io/yaml" - "cuelang.org/go/cue" cueyaml "cuelang.org/go/encoding/yaml" "github.com/google/go-github/v32/github" - "github.com/pkg/errors" - "golang.org/x/oauth2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - k8syaml "k8s.io/apimachinery/pkg/runtime/serializer/yaml" - common2 "github.com/oam-dev/kubevela/apis/core.oam.dev/common" "github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1" "github.com/oam-dev/kubevela/apis/types" @@ -34,6 +26,13 @@ import ( "github.com/oam-dev/kubevela/pkg/oam/util" "github.com/oam-dev/kubevela/pkg/utils" "github.com/oam-dev/kubevela/pkg/utils/common" + "github.com/pkg/errors" + "golang.org/x/oauth2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + k8syaml "k8s.io/apimachinery/pkg/runtime/serializer/yaml" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/yaml" ) const ( @@ -635,3 +634,18 @@ func RenderArgsSecret(addon *types.Addon, args map[string]string) *v1.Secret { func Convert2SecName(name string) string { return addonSecPrefix + name } + +// CheckDependencies checks if addon's dependent addons is enabled +func CheckDependencies(ctx context.Context, clt client.Client, addon *types.Addon) bool { + var app v1beta1.Application + for _, dep := range addon.Dependencies { + err := clt.Get(ctx, client.ObjectKey{ + Namespace: types.DefaultKubeVelaNS, + Name: Convert2AppName(dep.Name), + }, &app) + if err != nil { + return false + } + } + return true +} diff --git a/pkg/apiserver/rest/usecase/addon.go b/pkg/apiserver/rest/usecase/addon.go index 5a1cb1e9d..6f92adf5a 100644 --- a/pkg/apiserver/rest/usecase/addon.go +++ b/pkg/apiserver/rest/usecase/addon.go @@ -337,6 +337,10 @@ func (u *addonUsecaseImpl) EnableAddon(ctx context.Context, name string, args ap continue } + if !pkgaddon.CheckDependencies(ctx, u.kubeClient, addon) { + return bcode.ErrAddonDependencyNotSatisfy + } + app, defs, err := pkgaddon.RenderApplication(addon, args.Args) if err != nil { return bcode.ErrAddonRender diff --git a/pkg/apiserver/rest/utils/bcode/addon.go b/pkg/apiserver/rest/utils/bcode/addon.go index 2e7566a10..1d8fe3153 100644 --- a/pkg/apiserver/rest/utils/bcode/addon.go +++ b/pkg/apiserver/rest/utils/bcode/addon.go @@ -58,6 +58,9 @@ var ( // ErrAddonSecretGet means fail to get addon argument secret ErrAddonSecretGet = NewBcode(500, 50016, "fail to get addon argument secret") + + // ErrAddonDependencyNotSatisfy means addon's dependencies is not enabled + ErrAddonDependencyNotSatisfy = NewBcode(500, 50017, "addon's dependencies is not enabled") ) // isGithubRateLimit check if error is github rate limit