mirror of
https://github.com/kubevela/kubevela.git
synced 2026-08-19 04:26:39 +00:00
Chore: remove dm (#6036)
Signed-off-by: Somefive <yd219913@alibaba-inc.com>
This commit is contained in:
@@ -54,7 +54,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/monitor/watcher"
|
||||
"github.com/oam-dev/kubevela/pkg/multicluster"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
pkgutil "github.com/oam-dev/kubevela/pkg/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/util"
|
||||
@@ -177,12 +176,6 @@ func run(ctx context.Context, s *options.CoreOptions) error {
|
||||
return err
|
||||
}
|
||||
|
||||
dm, err := discoverymapper.New(mgr.GetConfig())
|
||||
if err != nil {
|
||||
klog.ErrorS(err, "Failed to create CRD discovery client")
|
||||
return err
|
||||
}
|
||||
s.ControllerArgs.DiscoveryMapper = dm
|
||||
pd, err := packages.NewPackageDiscover(mgr.GetConfig())
|
||||
if err != nil {
|
||||
klog.Error(err, "Failed to create CRD discovery for CUE package client")
|
||||
|
||||
@@ -23,7 +23,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"k8s.io/klog/v2"
|
||||
"github.com/kubevela/pkg/util/singleton"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
@@ -91,13 +91,8 @@ func ComponentDef(ctx context.Context, c common.Args, opt Options) {
|
||||
CustomDocHeader: CustomComponentHeaderEN,
|
||||
}
|
||||
ref.Local = &docgen.FromLocal{Paths: ComponentDefDirs}
|
||||
ref.Client = singleton.KubeClient.Get()
|
||||
|
||||
dm, err := c.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
klog.ErrorS(err, "failed to get discovery mapper")
|
||||
return
|
||||
}
|
||||
ref.DiscoveryMapper = dm
|
||||
if opt.Path != "" {
|
||||
ref.I18N = &docgen.En
|
||||
if strings.Contains(opt.Location, "zh") || strings.Contains(opt.Location, "chinese") {
|
||||
|
||||
@@ -23,6 +23,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kubevela/pkg/util/singleton"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
"github.com/oam-dev/kubevela/references/docgen"
|
||||
@@ -89,6 +91,8 @@ func PolicyDef(ctx context.Context, c common.Args, opt Options) {
|
||||
CustomDocHeader: CustomPolicyHeaderEN,
|
||||
}
|
||||
ref.Local = &docgen.FromLocal{Paths: PolicyDefDirs}
|
||||
ref.Client = singleton.KubeClient.Get()
|
||||
|
||||
if opt.Path != "" {
|
||||
ref.I18N = &docgen.En
|
||||
if strings.Contains(opt.Location, "zh") || strings.Contains(opt.Location, "chinese") {
|
||||
|
||||
@@ -23,6 +23,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kubevela/pkg/util/singleton"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
"github.com/oam-dev/kubevela/references/docgen"
|
||||
@@ -88,9 +90,8 @@ func TraitDef(ctx context.Context, c common.Args, opt Options) {
|
||||
},
|
||||
CustomDocHeader: CustomTraitHeaderEN,
|
||||
}
|
||||
ref.Local = &docgen.FromLocal{
|
||||
Paths: TraitDefDirs,
|
||||
}
|
||||
ref.Local = &docgen.FromLocal{Paths: TraitDefDirs}
|
||||
ref.Client = singleton.KubeClient.Get()
|
||||
|
||||
if opt.Path != "" {
|
||||
ref.I18N = &docgen.En
|
||||
|
||||
@@ -23,6 +23,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kubevela/pkg/util/singleton"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
"github.com/oam-dev/kubevela/references/docgen"
|
||||
@@ -91,6 +93,7 @@ func WorkflowDef(ctx context.Context, c common.Args, opt Options) {
|
||||
CustomDocHeader: CustomWorkflowHeaderEN,
|
||||
}
|
||||
ref.Local = &docgen.FromLocal{Paths: opt.DefDirs}
|
||||
ref.Client = singleton.KubeClient.Get()
|
||||
|
||||
if opt.Path != "" {
|
||||
ref.I18N = &docgen.En
|
||||
|
||||
@@ -41,8 +41,6 @@ import (
|
||||
coreoam "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
|
||||
"github.com/kubevela/workflow/pkg/cue/packages"
|
||||
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
|
||||
@@ -50,7 +48,6 @@ var cfg *rest.Config
|
||||
var scheme *runtime.Scheme
|
||||
var k8sClient client.Client
|
||||
var testEnv *envtest.Environment
|
||||
var dm discoverymapper.DiscoveryMapper
|
||||
var pd *packages.PackageDiscover
|
||||
var testns string
|
||||
var dc *discovery.DiscoveryClient
|
||||
@@ -90,9 +87,6 @@ var _ = BeforeSuite(func() {
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dc).ShouldNot(BeNil())
|
||||
|
||||
dm, err = discoverymapper.New(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dm).ToNot(BeNil())
|
||||
pd, err = packages.NewPackageDiscover(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(pd).ToNot(BeNil())
|
||||
|
||||
@@ -37,13 +37,12 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/appfile"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
// NewLiveDiffOption creates a live-diff option
|
||||
func NewLiveDiffOption(c client.Client, cfg *rest.Config, dm discoverymapper.DiscoveryMapper, pd *packages.PackageDiscover, as []oam.Object) *LiveDiffOption {
|
||||
parser := appfile.NewApplicationParser(c, dm, pd)
|
||||
return &LiveDiffOption{DryRun: NewDryRunOption(c, cfg, dm, pd, as, false), Parser: parser}
|
||||
func NewLiveDiffOption(c client.Client, cfg *rest.Config, pd *packages.PackageDiscover, as []oam.Object) *LiveDiffOption {
|
||||
parser := appfile.NewApplicationParser(c, pd)
|
||||
return &LiveDiffOption{DryRun: NewDryRunOption(c, cfg, pd, as, false), Parser: parser}
|
||||
}
|
||||
|
||||
// ManifestKind enums the kind of OAM objects
|
||||
|
||||
@@ -153,8 +153,8 @@ var _ = Describe("Test Live-Diff", func() {
|
||||
|
||||
It("Test renderless diff", func() {
|
||||
liveDiffOpt := LiveDiffOption{
|
||||
DryRun: NewDryRunOption(k8sClient, cfg, dm, pd, nil, false),
|
||||
Parser: appfile.NewApplicationParser(k8sClient, dm, pd),
|
||||
DryRun: NewDryRunOption(k8sClient, cfg, pd, nil, false),
|
||||
Parser: appfile.NewApplicationParser(k8sClient, pd),
|
||||
}
|
||||
applyFile := func(filename string, ns string) {
|
||||
bs, err := os.ReadFile("./testdata/" + filename)
|
||||
|
||||
@@ -43,7 +43,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/appfile"
|
||||
"github.com/oam-dev/kubevela/pkg/cue/definition"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
oamutil "github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/pkg/policy/envbinding"
|
||||
"github.com/oam-dev/kubevela/pkg/utils"
|
||||
@@ -57,9 +56,9 @@ type DryRun interface {
|
||||
}
|
||||
|
||||
// NewDryRunOption creates a dry-run option
|
||||
func NewDryRunOption(c client.Client, cfg *rest.Config, dm discoverymapper.DiscoveryMapper, pd *packages.PackageDiscover, as []oam.Object, serverSideDryRun bool) *Option {
|
||||
parser := appfile.NewDryRunApplicationParser(c, dm, pd, as)
|
||||
return &Option{c, dm, pd, parser, parser.GenerateAppFileFromApp, cfg, as, serverSideDryRun}
|
||||
func NewDryRunOption(c client.Client, cfg *rest.Config, pd *packages.PackageDiscover, as []oam.Object, serverSideDryRun bool) *Option {
|
||||
parser := appfile.NewDryRunApplicationParser(c, pd, as)
|
||||
return &Option{c, pd, parser, parser.GenerateAppFileFromApp, cfg, as, serverSideDryRun}
|
||||
}
|
||||
|
||||
// GenerateAppFileFunc generate the app file model from an application
|
||||
@@ -68,7 +67,6 @@ type GenerateAppFileFunc func(ctx context.Context, app *v1beta1.Application) (*a
|
||||
// Option contains options to execute dry-run
|
||||
type Option struct {
|
||||
Client client.Client
|
||||
DiscoveryMapper discoverymapper.DiscoveryMapper
|
||||
PackageDiscover *packages.PackageDiscover
|
||||
Parser *appfile.Parser
|
||||
GenerateAppFile GenerateAppFileFunc
|
||||
@@ -225,7 +223,7 @@ func (d *Option) ExecuteDryRunWithPolicies(ctx context.Context, application *v1b
|
||||
} else {
|
||||
ctx = oamutil.SetNamespaceInCtx(ctx, app.Namespace)
|
||||
}
|
||||
parser := appfile.NewDryRunApplicationParser(d.Client, d.DiscoveryMapper, d.PackageDiscover, d.Auxiliaries)
|
||||
parser := appfile.NewDryRunApplicationParser(d.Client, d.PackageDiscover, d.Auxiliaries)
|
||||
af, err := parser.GenerateAppFileFromApp(ctx, app)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -47,7 +47,6 @@ import (
|
||||
coreoam "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/appfile"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
oamutil "github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -55,7 +54,6 @@ var cfg *rest.Config
|
||||
var scheme *runtime.Scheme
|
||||
var k8sClient client.Client
|
||||
var testEnv *envtest.Environment
|
||||
var dm discoverymapper.DiscoveryMapper
|
||||
var pd *packages.PackageDiscover
|
||||
var dryrunOpt *Option
|
||||
var diffOpt *LiveDiffOption
|
||||
@@ -87,9 +85,6 @@ var _ = BeforeSuite(func() {
|
||||
k8sClient, err = client.New(cfg, client.Options{Scheme: scheme})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(k8sClient).ToNot(BeNil())
|
||||
dm, err = discoverymapper.New(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dm).ToNot(BeNil())
|
||||
pd, err = packages.NewPackageDiscover(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(pd).ToNot(BeNil())
|
||||
@@ -118,8 +113,8 @@ var _ = BeforeSuite(func() {
|
||||
wfsd.SetNamespace(types.DefaultKubeVelaNS)
|
||||
Expect(k8sClient.Create(context.TODO(), &wfsd)).Should(BeNil())
|
||||
|
||||
dryrunOpt = NewDryRunOption(k8sClient, cfg, dm, pd, []oam.Object{cdMyWorker, tdMyIngress}, false)
|
||||
diffOpt = &LiveDiffOption{DryRun: dryrunOpt, Parser: appfile.NewApplicationParser(k8sClient, dm, pd)}
|
||||
dryrunOpt = NewDryRunOption(k8sClient, cfg, pd, []oam.Object{cdMyWorker, tdMyIngress}, false)
|
||||
diffOpt = &LiveDiffOption{DryRun: dryrunOpt, Parser: appfile.NewApplicationParser(k8sClient, pd)}
|
||||
})
|
||||
|
||||
var _ = AfterSuite(func() {
|
||||
|
||||
+13
-18
@@ -45,7 +45,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/features"
|
||||
"github.com/oam-dev/kubevela/pkg/monitor/metrics"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
policypkg "github.com/oam-dev/kubevela/pkg/policy"
|
||||
"github.com/oam-dev/kubevela/pkg/utils"
|
||||
@@ -54,36 +53,33 @@ import (
|
||||
)
|
||||
|
||||
// TemplateLoaderFn load template of a capability definition
|
||||
type TemplateLoaderFn func(context.Context, discoverymapper.DiscoveryMapper, client.Reader, string, types.CapType) (*Template, error)
|
||||
type TemplateLoaderFn func(context.Context, client.Client, string, types.CapType) (*Template, error)
|
||||
|
||||
// LoadTemplate load template of a capability definition
|
||||
func (fn TemplateLoaderFn) LoadTemplate(ctx context.Context, dm discoverymapper.DiscoveryMapper, c client.Reader, capName string, capType types.CapType) (*Template, error) {
|
||||
return fn(ctx, dm, c, capName, capType)
|
||||
func (fn TemplateLoaderFn) LoadTemplate(ctx context.Context, c client.Client, capName string, capType types.CapType) (*Template, error) {
|
||||
return fn(ctx, c, capName, capType)
|
||||
}
|
||||
|
||||
// Parser is an application parser
|
||||
type Parser struct {
|
||||
client client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
pd *packages.PackageDiscover
|
||||
tmplLoader TemplateLoaderFn
|
||||
}
|
||||
|
||||
// NewApplicationParser create appfile parser
|
||||
func NewApplicationParser(cli client.Client, dm discoverymapper.DiscoveryMapper, pd *packages.PackageDiscover) *Parser {
|
||||
func NewApplicationParser(cli client.Client, pd *packages.PackageDiscover) *Parser {
|
||||
return &Parser{
|
||||
client: cli,
|
||||
dm: dm,
|
||||
pd: pd,
|
||||
tmplLoader: LoadTemplate,
|
||||
}
|
||||
}
|
||||
|
||||
// NewDryRunApplicationParser create an appfile parser for DryRun
|
||||
func NewDryRunApplicationParser(cli client.Client, dm discoverymapper.DiscoveryMapper, pd *packages.PackageDiscover, defs []oam.Object) *Parser {
|
||||
func NewDryRunApplicationParser(cli client.Client, pd *packages.PackageDiscover, defs []oam.Object) *Parser {
|
||||
return &Parser{
|
||||
client: cli,
|
||||
dm: dm,
|
||||
pd: pd,
|
||||
tmplLoader: DryRunTemplateLoader(defs),
|
||||
}
|
||||
@@ -536,7 +532,7 @@ func (p *Parser) parseWorkflowStep(ctx context.Context, af *Appfile, workflowSte
|
||||
}
|
||||
|
||||
func (p *Parser) makeWorkload(ctx context.Context, name, typ string, capType types.CapType, props *runtime.RawExtension) (*Workload, error) {
|
||||
templ, err := p.tmplLoader.LoadTemplate(ctx, p.dm, p.client, typ, capType)
|
||||
templ, err := p.tmplLoader.LoadTemplate(ctx, p.client, typ, capType)
|
||||
if err != nil {
|
||||
return nil, errors.WithMessagef(err, "fetch component/policy type of %s", name)
|
||||
}
|
||||
@@ -544,7 +540,7 @@ func (p *Parser) makeWorkload(ctx context.Context, name, typ string, capType typ
|
||||
}
|
||||
|
||||
func (p *Parser) makeWorkloadFromRevision(name, typ string, capType types.CapType, props *runtime.RawExtension, appRev *v1beta1.ApplicationRevision) (*Workload, error) {
|
||||
templ, err := LoadTemplateFromRevision(typ, capType, appRev, p.dm)
|
||||
templ, err := LoadTemplateFromRevision(typ, capType, appRev, p.client.RESTMapper())
|
||||
if err != nil {
|
||||
return nil, errors.WithMessagef(err, "fetch component/policy type of %s from revision", name)
|
||||
}
|
||||
@@ -611,7 +607,7 @@ func (p *Parser) parseTraits(ctx context.Context, workload *Workload, comp commo
|
||||
|
||||
func (p *Parser) parseScopes(ctx context.Context, workload *Workload, comp common.ApplicationComponent) error {
|
||||
for scopeType, instanceName := range comp.Scopes {
|
||||
sd, gvk, err := GetScopeDefAndGVK(ctx, p.client, p.dm, scopeType)
|
||||
sd, gvk, err := GetScopeDefAndGVK(ctx, p.client, scopeType)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -709,7 +705,7 @@ func (p *Parser) ParseWorkloadFromRevisionAndClient(ctx context.Context, comp co
|
||||
for scopeType, instanceName := range comp.Scopes {
|
||||
sd, gvk, err := GetScopeDefAndGVKFromRevision(scopeType, appRev)
|
||||
if IsNotFoundInAppRevision(err) {
|
||||
sd, gvk, err = GetScopeDefAndGVK(ctx, p.client, p.dm, scopeType)
|
||||
sd, gvk, err = GetScopeDefAndGVK(ctx, p.client, scopeType)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -725,7 +721,7 @@ func (p *Parser) ParseWorkloadFromRevisionAndClient(ctx context.Context, comp co
|
||||
}
|
||||
|
||||
func (p *Parser) parseTrait(ctx context.Context, name string, properties map[string]interface{}) (*Trait, error) {
|
||||
templ, err := p.tmplLoader.LoadTemplate(ctx, p.dm, p.client, name, types.TypeTrait)
|
||||
templ, err := p.tmplLoader.LoadTemplate(ctx, p.client, name, types.TypeTrait)
|
||||
if kerrors.IsNotFound(err) {
|
||||
return nil, errors.Errorf("trait definition of %s not found", name)
|
||||
}
|
||||
@@ -736,7 +732,7 @@ func (p *Parser) parseTrait(ctx context.Context, name string, properties map[str
|
||||
}
|
||||
|
||||
func (p *Parser) parseTraitFromRevision(name string, properties map[string]interface{}, appRev *v1beta1.ApplicationRevision) (*Trait, error) {
|
||||
templ, err := LoadTemplateFromRevision(name, types.TypeTrait, appRev, p.dm)
|
||||
templ, err := LoadTemplateFromRevision(name, types.TypeTrait, appRev, p.client.RESTMapper())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -773,15 +769,14 @@ func (p *Parser) ValidateComponentNames(app *v1beta1.Application) (int, error) {
|
||||
}
|
||||
|
||||
// GetScopeDefAndGVK get grouped an API version of the given scope
|
||||
func GetScopeDefAndGVK(ctx context.Context, cli client.Reader, dm discoverymapper.DiscoveryMapper,
|
||||
name string) (*v1beta1.ScopeDefinition, metav1.GroupVersionKind, error) {
|
||||
func GetScopeDefAndGVK(ctx context.Context, cli client.Client, name string) (*v1beta1.ScopeDefinition, metav1.GroupVersionKind, error) {
|
||||
var gvk metav1.GroupVersionKind
|
||||
sd := new(v1beta1.ScopeDefinition)
|
||||
err := util.GetDefinition(ctx, cli, sd, name)
|
||||
if err != nil {
|
||||
return nil, gvk, err
|
||||
}
|
||||
gvk, err = util.GetGVKFromDefinition(dm, sd.Spec.Reference)
|
||||
gvk, err = util.GetGVKFromDefinition(cli.RESTMapper(), sd.Spec.Reference)
|
||||
if err != nil {
|
||||
return nil, gvk, err
|
||||
}
|
||||
|
||||
+13
-13
@@ -32,13 +32,13 @@ import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
"sigs.k8s.io/yaml"
|
||||
|
||||
workflowv1alpha1 "github.com/kubevela/workflow/api/v1alpha1"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/common"
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
@@ -266,21 +266,21 @@ var _ = Describe("Test application parser", func() {
|
||||
},
|
||||
}
|
||||
|
||||
appfile, err := NewApplicationParser(&tclient, dm, pd).GenerateAppFile(context.TODO(), &o)
|
||||
appfile, err := NewApplicationParser(&tclient, pd).GenerateAppFile(context.TODO(), &o)
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
Expect(equal(expectedExceptApp, appfile)).Should(BeTrue())
|
||||
|
||||
notfound := v1beta1.Application{}
|
||||
err = yaml.Unmarshal([]byte(appfileYaml2), ¬found)
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
_, err = NewApplicationParser(&tclient, dm, pd).GenerateAppFile(context.TODO(), ¬found)
|
||||
_, err = NewApplicationParser(&tclient, pd).GenerateAppFile(context.TODO(), ¬found)
|
||||
Expect(err).Should(HaveOccurred())
|
||||
|
||||
By("app with empty policy")
|
||||
emptyPolicy := v1beta1.Application{}
|
||||
err = yaml.Unmarshal([]byte(appfileYamlEmptyPolicy), &emptyPolicy)
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
_, err = NewApplicationParser(&tclient, dm, pd).GenerateAppFile(context.TODO(), &emptyPolicy)
|
||||
_, err = NewApplicationParser(&tclient, pd).GenerateAppFile(context.TODO(), &emptyPolicy)
|
||||
Expect(err).Should(HaveOccurred())
|
||||
Expect(err.Error()).Should(ContainSubstring("have empty properties"))
|
||||
})
|
||||
@@ -440,7 +440,7 @@ patch: spec: replicas: parameter.replicas
|
||||
|
||||
It("Test we can parse an application revision to an appFile 1", func() {
|
||||
|
||||
appfile, err := NewApplicationParser(&mockClient, dm, pd).GenerateAppFile(context.TODO(), &app)
|
||||
appfile, err := NewApplicationParser(&mockClient, pd).GenerateAppFile(context.TODO(), &app)
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
Expect(equal(expectedExceptAppfile, appfile)).Should(BeTrue())
|
||||
Expect(len(appfile.WorkflowSteps) > 0 &&
|
||||
@@ -470,7 +470,7 @@ patch: spec: replicas: parameter.replicas
|
||||
|
||||
It("Test we can parse an application revision to an appFile 2", func() {
|
||||
|
||||
appfile, err := NewApplicationParser(&mockClient, dm, pd).GenerateAppFile(context.TODO(), &app)
|
||||
appfile, err := NewApplicationParser(&mockClient, pd).GenerateAppFile(context.TODO(), &app)
|
||||
Expect(err).ShouldNot(HaveOccurred())
|
||||
Expect(equal(expectedExceptAppfile, appfile)).Should(BeTrue())
|
||||
Expect(len(appfile.WorkflowSteps) > 0 &&
|
||||
@@ -501,7 +501,7 @@ patch: spec: replicas: parameter.replicas
|
||||
|
||||
It("Test we can parse an application revision to an appFile 3", func() {
|
||||
|
||||
_, err := NewApplicationParser(&mockClient, dm, pd).GenerateAppFile(context.TODO(), &app)
|
||||
_, err := NewApplicationParser(&mockClient, pd).GenerateAppFile(context.TODO(), &app)
|
||||
Expect(err).Should(HaveOccurred())
|
||||
Expect(err.Error() == "failed to get workflow step definition apply-application-unknown: not found").Should(BeTrue())
|
||||
})
|
||||
@@ -557,7 +557,7 @@ func TestParser_parseTraits(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
mockTemplateLoaderFn: func(context.Context, discoverymapper.DiscoveryMapper, client.Reader, string, types.CapType) (*Template, error) {
|
||||
mockTemplateLoaderFn: func(context.Context, client.Client, string, types.CapType) (*Template, error) {
|
||||
return nil, fmt.Errorf("unsupported key not found")
|
||||
},
|
||||
wantErr: assert.Error,
|
||||
@@ -578,7 +578,7 @@ func TestParser_parseTraits(t *testing.T) {
|
||||
workload: &Workload{},
|
||||
},
|
||||
wantErr: assert.NoError,
|
||||
mockTemplateLoaderFn: func(ctx context.Context, mapper discoverymapper.DiscoveryMapper, reader client.Reader, s string, capType types.CapType) (*Template, error) {
|
||||
mockTemplateLoaderFn: func(ctx context.Context, reader client.Client, s string, capType types.CapType) (*Template, error) {
|
||||
return &Template{
|
||||
TemplateStr: "template",
|
||||
CapabilityCategory: "network",
|
||||
@@ -592,7 +592,7 @@ func TestParser_parseTraits(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
p := NewApplicationParser(nil, dm, pd)
|
||||
p := NewApplicationParser(nil, pd)
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
p.tmplLoader = tt.mockTemplateLoaderFn
|
||||
@@ -671,7 +671,7 @@ func TestParser_parseScopes(t *testing.T) {
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
p := NewApplicationParser(&test.MockClient{MockGet: tt.mockGetFunc}, dm, pd)
|
||||
p := NewApplicationParser(&test.MockClient{MockGet: tt.mockGetFunc}, pd)
|
||||
p.tmplLoader = tt.mockTemplateLoaderFn
|
||||
err := p.parseScopes(context.Background(), tt.args.workload, tt.args.comp)
|
||||
if !tt.wantErr(t, err, fmt.Sprintf("parseScopes(%v, %v)", tt.args.workload, tt.args.comp)) {
|
||||
@@ -773,7 +773,7 @@ func TestParser_parseTraitsFromRevision(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
p := NewApplicationParser(nil, dm, pd)
|
||||
p := NewApplicationParser(fake.NewClientBuilder().Build(), pd)
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
tt.wantErr(t, p.parseTraitsFromRevision(tt.args.comp, tt.args.appRev, tt.args.workload), fmt.Sprintf("parseTraitsFromRevision(%v, %v, %v)", tt.args.comp, tt.args.appRev, tt.args.workload))
|
||||
@@ -860,7 +860,7 @@ func TestParser_parseScopesFromRevision(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
p := NewApplicationParser(nil, dm, pd)
|
||||
p := NewApplicationParser(nil, pd)
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
tt.wantErr(t, p.parseScopesFromRevision(tt.args.comp, tt.args.appRev, tt.args.workload), fmt.Sprintf("parseScopesFromRevision(%v, %v, %v)", tt.args.comp, tt.args.appRev, tt.args.workload))
|
||||
|
||||
@@ -35,7 +35,6 @@ import (
|
||||
"github.com/kubevela/workflow/pkg/cue/packages"
|
||||
|
||||
coreoam "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
|
||||
@@ -43,7 +42,6 @@ var cfg *rest.Config
|
||||
var scheme *runtime.Scheme
|
||||
var k8sClient client.Client
|
||||
var testEnv *envtest.Environment
|
||||
var dm discoverymapper.DiscoveryMapper
|
||||
var pd *packages.PackageDiscover
|
||||
|
||||
func TestAppFile(t *testing.T) {
|
||||
@@ -73,9 +71,6 @@ var _ = BeforeSuite(func() {
|
||||
k8sClient, err = client.New(cfg, client.Options{Scheme: scheme})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(k8sClient).ToNot(BeNil())
|
||||
dm, err = discoverymapper.New(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dm).ToNot(BeNil())
|
||||
pd, err = packages.NewPackageDiscover(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(pd).ToNot(BeNil())
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
"github.com/kubevela/pkg/multicluster"
|
||||
"github.com/pkg/errors"
|
||||
kerrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
@@ -34,7 +35,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
oamutil "github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -70,7 +70,7 @@ type Template struct {
|
||||
// LoadTemplate gets the capability definition from cluster and resolve it.
|
||||
// It returns a helper struct, Template, which will be used for further
|
||||
// processing.
|
||||
func LoadTemplate(ctx context.Context, dm discoverymapper.DiscoveryMapper, cli client.Reader, capName string, capType types.CapType) (*Template, error) {
|
||||
func LoadTemplate(ctx context.Context, cli client.Client, capName string, capType types.CapType) (*Template, error) {
|
||||
ctx = multicluster.WithCluster(ctx, multicluster.Local)
|
||||
// Application Controller only loads template from ComponentDefinition and TraitDefinition
|
||||
switch capType {
|
||||
@@ -87,7 +87,7 @@ func LoadTemplate(ctx context.Context, dm discoverymapper.DiscoveryMapper, cli c
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
gvk, err := oamutil.GetGVKFromDefinition(dm, wd.Spec.Reference)
|
||||
gvk, err := oamutil.GetGVKFromDefinition(cli.RESTMapper(), wd.Spec.Reference)
|
||||
if err != nil {
|
||||
return nil, errors.WithMessagef(err, "get group version kind from component definition [%s]", capName)
|
||||
}
|
||||
@@ -150,7 +150,7 @@ func LoadTemplate(ctx context.Context, dm discoverymapper.DiscoveryMapper, cli c
|
||||
}
|
||||
|
||||
// LoadTemplateFromRevision will load Definition template from app revision
|
||||
func LoadTemplateFromRevision(capName string, capType types.CapType, apprev *v1beta1.ApplicationRevision, dm discoverymapper.DiscoveryMapper) (*Template, error) {
|
||||
func LoadTemplateFromRevision(capName string, capType types.CapType, apprev *v1beta1.ApplicationRevision, mapper meta.RESTMapper) (*Template, error) {
|
||||
if apprev == nil {
|
||||
return nil, errors.Errorf("fail to find template for %s as app revision is empty", capName)
|
||||
}
|
||||
@@ -167,7 +167,7 @@ func LoadTemplateFromRevision(capName string, capType types.CapType, apprev *v1b
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
gvk, err := oamutil.GetGVKFromDefinition(dm, wd.Spec.Reference)
|
||||
gvk, err := oamutil.GetGVKFromDefinition(mapper, wd.Spec.Reference)
|
||||
if err != nil {
|
||||
return nil, errors.WithMessagef(err, "Get group version kind from component definition [%s]", capName)
|
||||
}
|
||||
@@ -270,7 +270,7 @@ func verifyRevisionName(capName string, capType types.CapType, apprev *v1beta1.A
|
||||
// LoadTemplate, but load template from provided ones before loading from
|
||||
// cluster through LoadTemplate
|
||||
func DryRunTemplateLoader(defs []oam.Object) TemplateLoaderFn {
|
||||
return func(ctx context.Context, dm discoverymapper.DiscoveryMapper, r client.Reader, capName string, capType types.CapType) (*Template, error) {
|
||||
return func(ctx context.Context, r client.Client, capName string, capType types.CapType) (*Template, error) {
|
||||
// retrieve provided cap definitions
|
||||
for _, def := range defs {
|
||||
if unstructDef, ok := def.(*unstructured.Unstructured); ok {
|
||||
@@ -303,7 +303,7 @@ func DryRunTemplateLoader(defs []oam.Object) TemplateLoaderFn {
|
||||
}
|
||||
// not found in provided cap definitions
|
||||
// then try to retrieve from cluster
|
||||
tmpl, err := LoadTemplate(ctx, dm, r, capName, capType)
|
||||
tmpl, err := LoadTemplate(ctx, r, capName, capType)
|
||||
if err != nil {
|
||||
return nil, errors.WithMessagef(err, "cannot load template %q from cluster and provided ones", capName)
|
||||
}
|
||||
|
||||
@@ -113,9 +113,8 @@ spec:
|
||||
return nil
|
||||
},
|
||||
}
|
||||
tdm := mock.NewMockDiscoveryMapper()
|
||||
tdm.MockKindsFor = mock.NewMockKindsFor("Deployment", "v1")
|
||||
temp, err := LoadTemplate(context.TODO(), tdm, &tclient, "worker", types.TypeComponentDefinition)
|
||||
|
||||
temp, err := LoadTemplate(context.TODO(), &tclient, "worker", types.TypeComponentDefinition)
|
||||
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
@@ -209,9 +208,7 @@ spec:
|
||||
return nil
|
||||
},
|
||||
}
|
||||
tdm := mock.NewMockDiscoveryMapper()
|
||||
tdm.MockKindsFor = mock.NewMockKindsFor("Deployment", "v1")
|
||||
temp, err := LoadTemplate(context.TODO(), tdm, &tclient, "worker", types.TypeComponentDefinition)
|
||||
temp, err := LoadTemplate(context.TODO(), &tclient, "worker", types.TypeComponentDefinition)
|
||||
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
@@ -319,9 +316,7 @@ spec:
|
||||
},
|
||||
}
|
||||
|
||||
tdm := mock.NewMockDiscoveryMapper()
|
||||
tdm.MockKindsFor = mock.NewMockKindsFor("Deployment", "v1")
|
||||
temp, err := LoadTemplate(context.TODO(), tdm, &tclient, "ingress", types.TypeTrait)
|
||||
temp, err := LoadTemplate(context.TODO(), &tclient, "ingress", types.TypeTrait)
|
||||
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
@@ -482,7 +477,7 @@ spec:
|
||||
}
|
||||
|
||||
dryRunLoadTemplate := DryRunTemplateLoader([]oam.Object{unstrctCompDef, unstrctTraitDef})
|
||||
compTmpl, err := dryRunLoadTemplate(nil, nil, nil, "myworker", types.TypeComponentDefinition)
|
||||
compTmpl, err := dryRunLoadTemplate(nil, nil, "myworker", types.TypeComponentDefinition)
|
||||
if err != nil {
|
||||
t.Error("failed load template of component defintion", err)
|
||||
}
|
||||
@@ -490,7 +485,7 @@ spec:
|
||||
t.Fatal("failed load template of component defintion", diff)
|
||||
}
|
||||
|
||||
traitTmpl, err := dryRunLoadTemplate(nil, nil, nil, "myingress", types.TypeTrait)
|
||||
traitTmpl, err := dryRunLoadTemplate(nil, nil, "myingress", types.TypeTrait)
|
||||
if err != nil {
|
||||
t.Error("failed load template of component defintion", err)
|
||||
}
|
||||
|
||||
@@ -22,8 +22,6 @@ import (
|
||||
"github.com/spf13/pflag"
|
||||
|
||||
"github.com/kubevela/workflow/pkg/cue/packages"
|
||||
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
// ApplyOnceOnlyMode enumerates ApplyOnceOnly modes.
|
||||
@@ -67,8 +65,6 @@ type Args struct {
|
||||
// The webhook server will return a customized component revision for oam-runtime
|
||||
CustomRevisionHookURL string
|
||||
|
||||
// DiscoveryMapper used for CRD discovery in controller, a K8s client is contained in it.
|
||||
DiscoveryMapper discoverymapper.DiscoveryMapper
|
||||
// PackageDiscover used for CRD discovery in CUE packages, a K8s client is contained in it.
|
||||
PackageDiscover *packages.PackageDiscover
|
||||
|
||||
|
||||
@@ -61,7 +61,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/features"
|
||||
"github.com/oam-dev/kubevela/pkg/monitor/metrics"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
oamutil "github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/pkg/resourcekeeper"
|
||||
"github.com/oam-dev/kubevela/pkg/resourcetracker"
|
||||
@@ -86,7 +85,6 @@ var (
|
||||
// Reconciler reconciles an Application object
|
||||
type Reconciler struct {
|
||||
client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
pd *packages.PackageDiscover
|
||||
Scheme *runtime.Scheme
|
||||
Recorder event.Recorder
|
||||
@@ -143,7 +141,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
|
||||
}
|
||||
logCtx.AddTag("publish_version", app.GetAnnotations()[oam.AnnotationPublishVersion])
|
||||
|
||||
appParser := appfile.NewApplicationParser(r.Client, r.dm, r.pd)
|
||||
appParser := appfile.NewApplicationParser(r.Client, r.pd)
|
||||
handler, err := NewAppHandler(logCtx, r, app, appParser)
|
||||
if err != nil {
|
||||
return r.endWithNegativeCondition(logCtx, app, condition.ReconcileError(err), common.ApplicationStarting)
|
||||
@@ -595,7 +593,6 @@ func Setup(mgr ctrl.Manager, args core.Args) error {
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
Recorder: event.NewAPIRecorder(mgr.GetEventRecorderFor("Application")),
|
||||
dm: args.DiscoveryMapper,
|
||||
pd: args.PackageDiscover,
|
||||
options: parseOptions(args),
|
||||
}
|
||||
|
||||
@@ -42,7 +42,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/apis/standard.oam.dev/v1alpha1"
|
||||
"github.com/oam-dev/kubevela/pkg/appfile"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
|
||||
@@ -96,12 +95,10 @@ var _ = BeforeSuite(func() {
|
||||
k8sClient, err = client.New(cfg, client.Options{Scheme: testScheme})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(k8sClient).ToNot(BeNil())
|
||||
dm, err := discoverymapper.New(cfg)
|
||||
Expect(err).To(BeNil())
|
||||
pd, err := packages.NewPackageDiscover(cfg)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
appParser = appfile.NewApplicationParser(k8sClient, dm, pd)
|
||||
appParser = appfile.NewApplicationParser(k8sClient, pd)
|
||||
})
|
||||
|
||||
var _ = AfterSuite(func() {
|
||||
|
||||
@@ -127,7 +127,7 @@ func (h *AppHandler) GenerateApplicationSteps(ctx monitorContext.Context,
|
||||
Providers: handlerProviders,
|
||||
PackageDiscover: h.r.pd,
|
||||
ProcessCtx: pCtx,
|
||||
TemplateLoader: template.NewWorkflowStepTemplateRevisionLoader(appRev, h.r.dm),
|
||||
TemplateLoader: template.NewWorkflowStepTemplateRevisionLoader(appRev, h.r.Client.RESTMapper()),
|
||||
Client: h.r.Client,
|
||||
StepConvertor: map[string]func(step workflowv1alpha1.WorkflowStep) (workflowv1alpha1.WorkflowStep, error){
|
||||
wfTypes.WorkflowStepTypeApplyComponent: func(lstep workflowv1alpha1.WorkflowStep) (workflowv1alpha1.WorkflowStep, error) {
|
||||
|
||||
@@ -186,7 +186,7 @@ var _ = Describe("test generate revision ", func() {
|
||||
|
||||
It("Test application revision compare", func() {
|
||||
By("Apply the application")
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.dm, reconciler.pd)
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.pd)
|
||||
ctx = util.SetNamespaceInCtx(ctx, app.Namespace)
|
||||
generatedAppfile, err := appParser.GenerateAppFile(ctx, &app)
|
||||
Expect(err).Should(Succeed())
|
||||
@@ -209,7 +209,7 @@ var _ = Describe("test generate revision ", func() {
|
||||
|
||||
It("Test apply success for none rollout case", func() {
|
||||
By("Apply the application")
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.dm, reconciler.pd)
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.pd)
|
||||
ctx = util.SetNamespaceInCtx(ctx, app.Namespace)
|
||||
annoKey1 := "testKey1"
|
||||
app.SetAnnotations(map[string]string{annoKey1: "true"})
|
||||
@@ -433,7 +433,7 @@ var _ = Describe("test generate revision ", func() {
|
||||
|
||||
It("Test App with rollout template", func() {
|
||||
By("Apply the application")
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.dm, reconciler.pd)
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.pd)
|
||||
ctx = util.SetNamespaceInCtx(ctx, app.Namespace)
|
||||
// mark the app as rollout
|
||||
app.SetAnnotations(map[string]string{oam.AnnotationAppRollout: strconv.FormatBool(true)})
|
||||
@@ -555,7 +555,7 @@ var _ = Describe("test generate revision ", func() {
|
||||
|
||||
It("Test apply passes all label and annotation from app to appRevision", func() {
|
||||
By("Apply the application")
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.dm, reconciler.pd)
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.pd)
|
||||
ctx = util.SetNamespaceInCtx(ctx, app.Namespace)
|
||||
labelKey1 := "labelKey1"
|
||||
app.SetLabels(map[string]string{labelKey1: "true"})
|
||||
@@ -626,7 +626,7 @@ var _ = Describe("test generate revision ", func() {
|
||||
externalRevisionName1 := "specified-revision-v1"
|
||||
app.Spec.Components[0].ExternalRevision = externalRevisionName1
|
||||
Expect(k8sClient.Update(ctx, &app)).Should(SatisfyAny(BeNil(), &util.AlreadyExistMatcher{}))
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.dm, reconciler.pd)
|
||||
appParser := appfile.NewApplicationParser(reconciler.Client, reconciler.pd)
|
||||
ctx = util.SetNamespaceInCtx(ctx, app.Namespace)
|
||||
generatedAppfile, err := appParser.GenerateAppFile(ctx, &app)
|
||||
Expect(err).Should(Succeed())
|
||||
@@ -1046,7 +1046,7 @@ status: {}
|
||||
It("Test currentAppRevIsNew func", func() {
|
||||
By("Backport 1.2 version that WorkflowStepDefinitions are not patched to application revision")
|
||||
// generate appfile
|
||||
appfile, err := appfile.NewApplicationParser(reconciler.Client, reconciler.dm, reconciler.pd).GenerateAppFile(ctx, &app)
|
||||
appfile, err := appfile.NewApplicationParser(reconciler.Client, reconciler.pd).GenerateAppFile(ctx, &app)
|
||||
ctx = util.SetNamespaceInCtx(ctx, app.Namespace)
|
||||
Expect(err).To(Succeed())
|
||||
Expect(handler.PrepareCurrentAppRevision(ctx, appfile)).Should(Succeed())
|
||||
|
||||
@@ -55,7 +55,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/appfile"
|
||||
"github.com/oam-dev/kubevela/pkg/features"
|
||||
"github.com/oam-dev/kubevela/pkg/multicluster"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
|
||||
@@ -130,17 +129,14 @@ var _ = BeforeSuite(func() {
|
||||
k8sClient, err = client.New(cfg, client.Options{Scheme: testScheme})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(k8sClient).ToNot(BeNil())
|
||||
dm, err := discoverymapper.New(cfg)
|
||||
Expect(err).To(BeNil())
|
||||
pd, err := packages.NewPackageDiscover(cfg)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
appParser = appfile.NewApplicationParser(k8sClient, dm, pd)
|
||||
appParser = appfile.NewApplicationParser(k8sClient, pd)
|
||||
|
||||
reconciler = &Reconciler{
|
||||
Client: k8sClient,
|
||||
Scheme: testScheme,
|
||||
dm: dm,
|
||||
pd: pd,
|
||||
Recorder: event.NewAPIRecorder(recorder),
|
||||
}
|
||||
|
||||
+2
-5
@@ -48,7 +48,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/controller/common"
|
||||
core "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/apply"
|
||||
)
|
||||
@@ -98,7 +97,7 @@ func Setup(mgr ctrl.Manager, args core.Args) error {
|
||||
RevisionLimit: args.RevisionLimit,
|
||||
CustomRevisionHookURL: args.CustomRevisionHookURL,
|
||||
}).
|
||||
Complete(NewReconciler(mgr, args.DiscoveryMapper,
|
||||
Complete(NewReconciler(mgr,
|
||||
WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))),
|
||||
WithApplyOnceOnlyMode(args.ApplyMode),
|
||||
WithDependCheckWait(args.DependCheckWait)))
|
||||
@@ -183,13 +182,12 @@ func WithDependCheckWait(dependCheckWait time.Duration) ReconcilerOption {
|
||||
|
||||
// NewReconciler returns an OAMApplicationReconciler that reconciles ApplicationConfigurations
|
||||
// by rendering and instantiating their Components and Traits.
|
||||
func NewReconciler(m ctrl.Manager, dm discoverymapper.DiscoveryMapper, o ...ReconcilerOption) *OAMApplicationReconciler {
|
||||
func NewReconciler(m ctrl.Manager, o ...ReconcilerOption) *OAMApplicationReconciler {
|
||||
r := &OAMApplicationReconciler{
|
||||
client: m.GetClient(),
|
||||
scheme: m.GetScheme(),
|
||||
components: &components{
|
||||
client: m.GetClient(),
|
||||
dm: dm,
|
||||
params: ParameterResolveFn(resolve),
|
||||
workload: ResourceRenderFn(renderWorkload),
|
||||
trait: ResourceRenderFn(renderTrait),
|
||||
@@ -197,7 +195,6 @@ func NewReconciler(m ctrl.Manager, dm discoverymapper.DiscoveryMapper, o ...Reco
|
||||
workloads: &workloads{
|
||||
applicator: apply.NewAPIApplicator(m.GetClient()),
|
||||
rawClient: m.GetClient(),
|
||||
dm: dm,
|
||||
},
|
||||
gc: GarbageCollectorFn(eligible),
|
||||
record: event.NewNopRecorder(),
|
||||
|
||||
+1
-4
@@ -701,7 +701,7 @@ func TestReconciler(t *testing.T) {
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
r := NewReconciler(tc.args.m, nil, tc.args.o...)
|
||||
r := NewReconciler(tc.args.m, tc.args.o...)
|
||||
got, err := r.Reconcile(context.TODO(), reconcile.Request{})
|
||||
|
||||
if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" {
|
||||
@@ -1017,8 +1017,6 @@ func TestDependency(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
mapper := mock.NewMockDiscoveryMapper()
|
||||
|
||||
type args struct {
|
||||
components []v1alpha2.ApplicationConfigurationComponent
|
||||
wl *unstructured.Unstructured
|
||||
@@ -1577,7 +1575,6 @@ func TestDependency(t *testing.T) {
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
c := components{
|
||||
dm: mapper,
|
||||
client: &test.MockClient{
|
||||
MockGet: test.MockGetFn(func(ctx context.Context, key client.ObjectKey, obj client.Object) error {
|
||||
if obj.GetObjectKind().GroupVersionKind().Kind == "Workload" {
|
||||
|
||||
@@ -37,7 +37,6 @@ import (
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/apply"
|
||||
)
|
||||
@@ -97,7 +96,6 @@ func (fn WorkloadApplyFns) Finalize(ctx context.Context, ac *v1alpha2.Applicatio
|
||||
type workloads struct {
|
||||
applicator apply.Applicator
|
||||
rawClient client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
}
|
||||
|
||||
func (a *workloads) Apply(ctx context.Context, status []v1alpha2.WorkloadStatus, w []Workload,
|
||||
@@ -349,7 +347,7 @@ func findDereferencedScopes(statusScopes []v1alpha2.WorkloadScope, scopes []unst
|
||||
|
||||
func (a *workloads) applyScope(ctx context.Context, wl Workload, s unstructured.Unstructured, workloadRef corev1.ObjectReference) error {
|
||||
// get ScopeDefinition
|
||||
scopeDefinition, err := util.FetchScopeDefinition(ctx, a.rawClient, a.dm, &s)
|
||||
scopeDefinition, err := util.FetchScopeDefinition(ctx, a.rawClient, &s)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, errFmtGetScopeDefinition, s.GetAPIVersion(), s.GetKind(), s.GetName())
|
||||
}
|
||||
@@ -405,7 +403,7 @@ func (a *workloads) applyScopeRemoval(ctx context.Context, namespace string, wr
|
||||
return errors.Wrapf(err, errFmtApplyScope, s.Reference.APIVersion, s.Reference.Kind, s.Reference.Name)
|
||||
}
|
||||
|
||||
scopeDefinition, err := util.FetchScopeDefinition(ctx, a.rawClient, a.dm, &scopeObject)
|
||||
scopeDefinition, err := util.FetchScopeDefinition(ctx, a.rawClient, &scopeObject)
|
||||
if err != nil {
|
||||
if apierrors.IsNotFound(err) {
|
||||
// if the scope definition is deleted
|
||||
|
||||
@@ -36,7 +36,6 @@ import (
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/common"
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/mock"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/apply"
|
||||
)
|
||||
@@ -383,8 +382,7 @@ func TestApplyWorkloads(t *testing.T) {
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
mapper := mock.NewMockDiscoveryMapper()
|
||||
w := workloads{applicator: tc.applicator, rawClient: tc.rawClient, dm: mapper}
|
||||
w := workloads{applicator: tc.applicator, rawClient: tc.rawClient}
|
||||
err := w.Apply(context.TODO(), tc.args.ws, tc.args.w)
|
||||
|
||||
if diff := cmp.Diff(tc.want, err, test.EquateErrors()); diff != "" {
|
||||
@@ -529,8 +527,7 @@ func TestFinalizeWorkloadScopes(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.caseName, func(t *testing.T) {
|
||||
acTest := ac
|
||||
mapper := mock.NewMockDiscoveryMapper()
|
||||
w := workloads{applicator: tc.applicator, rawClient: tc.rawClient, dm: mapper}
|
||||
w := workloads{applicator: tc.applicator, rawClient: tc.rawClient}
|
||||
err := w.Finalize(ctx, &acTest)
|
||||
|
||||
if diff := cmp.Diff(tc.wantErr, err, test.EquateErrors()); diff != "" {
|
||||
|
||||
@@ -44,7 +44,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/controller/common"
|
||||
"github.com/oam-dev/kubevela/pkg/controller/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -91,8 +90,7 @@ var _ ComponentRenderer = &components{}
|
||||
|
||||
type components struct {
|
||||
// indicate that if this is generated by application
|
||||
client client.Reader
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
client client.Client
|
||||
params ParameterResolver
|
||||
workload ResourceRenderer
|
||||
trait ResourceRenderer
|
||||
@@ -313,7 +311,7 @@ func (r *components) renderTrait(ctx context.Context, ct v1alpha2.ComponentTrait
|
||||
if err != nil {
|
||||
return nil, nil, errors.Wrapf(err, errFmtRenderTrait, componentName)
|
||||
}
|
||||
traitDef, err := util.FetchTraitDefinition(ctx, r.client, r.dm, t)
|
||||
traitDef, err := util.FetchTraitDefinition(ctx, r.client, t)
|
||||
if err != nil {
|
||||
if !kerrors.IsNotFound(err) {
|
||||
return nil, nil, errors.Wrapf(err, errFmtGetTraitDefinition, t.GetAPIVersion(), t.GetKind(), t.GetName())
|
||||
|
||||
@@ -37,6 +37,7 @@ import (
|
||||
"k8s.io/apimachinery/pkg/util/intstr"
|
||||
"k8s.io/utils/pointer"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/common"
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
@@ -44,7 +45,6 @@ import (
|
||||
oamtype "github.com/oam-dev/kubevela/apis/types"
|
||||
helmapi "github.com/oam-dev/kubevela/pkg/appfile/helm/flux2apis"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/mock"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -118,7 +118,7 @@ func TestRender(t *testing.T) {
|
||||
errTrait := errors.New("errTrait")
|
||||
|
||||
type fields struct {
|
||||
client client.Reader
|
||||
client client.Client
|
||||
params ParameterResolver
|
||||
workload ResourceRenderer
|
||||
trait ResourceRenderer
|
||||
@@ -866,8 +866,7 @@ func TestRender(t *testing.T) {
|
||||
}
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
r := &components{tc.fields.client, mock.NewMockDiscoveryMapper(), tc.fields.params,
|
||||
tc.fields.workload, tc.fields.trait}
|
||||
r := &components{tc.fields.client, tc.fields.params, tc.fields.workload, tc.fields.trait}
|
||||
needTemplating := tc.args.ac.Status.RollingStatus != oamtype.RollingTemplated
|
||||
_, isRolling := tc.args.ac.GetAnnotations()[oam.AnnotationAppRollout]
|
||||
got, _, err := r.Render(context.Background(), tc.args.ac)
|
||||
@@ -931,7 +930,7 @@ func TestRender(t *testing.T) {
|
||||
|
||||
func TestRenderComponent(t *testing.T) {
|
||||
type field struct {
|
||||
client client.Reader
|
||||
client client.Client
|
||||
workload ResourceRenderer
|
||||
trait ResourceRenderer
|
||||
}
|
||||
@@ -1184,8 +1183,7 @@ func TestRenderComponent(t *testing.T) {
|
||||
}
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
r := &components{tc.fields.client, mock.NewMockDiscoveryMapper(), mockParams,
|
||||
tc.fields.workload, tc.fields.trait}
|
||||
r := &components{tc.fields.client, mockParams, tc.fields.workload, tc.fields.trait}
|
||||
got, err := r.renderComponent(ctx, tc.args.ac.Spec.Components[0], tc.args.ac, tc.args.isControlledByApp,
|
||||
tc.args.isCompChanged, tc.args.isRollingTemplate, tc.args.dag)
|
||||
if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" {
|
||||
@@ -1498,7 +1496,7 @@ func TestRenderTraitWithoutMetadataName(t *testing.T) {
|
||||
ref := metav1.NewControllerRef(ac, v1alpha2.ApplicationConfigurationGroupVersionKind)
|
||||
|
||||
type fields struct {
|
||||
client client.Reader
|
||||
client client.Client
|
||||
params ParameterResolver
|
||||
workload ResourceRenderer
|
||||
trait ResourceRenderer
|
||||
@@ -1560,8 +1558,7 @@ func TestRenderTraitWithoutMetadataName(t *testing.T) {
|
||||
}
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
r := &components{tc.fields.client, mock.NewMockDiscoveryMapper(), tc.fields.params,
|
||||
tc.fields.workload, tc.fields.trait}
|
||||
r := &components{tc.fields.client, tc.fields.params, tc.fields.workload, tc.fields.trait}
|
||||
got, _, _ := r.Render(context.Background(), tc.args.ac)
|
||||
if len(got) == 0 || len(got[0].Traits) == 0 || got[0].Traits[0].Object.GetName() != util.GenTraitName(componentName, ac.Spec.Components[0].Traits[0].DeepCopy(), "") {
|
||||
t.Errorf("\n%s\nr.Render(...): -want error, +got error:\n%s\n", tc.reason, "Trait name is NOT "+
|
||||
@@ -1600,8 +1597,7 @@ func TestGetDefinitionName(t *testing.T) {
|
||||
}
|
||||
for name, ti := range tests {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
m := mock.NewMockDiscoveryMapper()
|
||||
m.MockRESTMapping = mock.NewMockRESTMapping(ti.resource)
|
||||
m := fake.NewClientBuilder().Build().RESTMapper()
|
||||
got, err := util.GetDefinitionName(m, ti.u, "")
|
||||
assert.NoError(t, err)
|
||||
if got != ti.exp {
|
||||
|
||||
@@ -46,7 +46,6 @@ import (
|
||||
core "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/common"
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
@@ -167,12 +166,9 @@ var _ = BeforeSuite(func() {
|
||||
Expect(k8sClient.Create(context.Background(), &crd)).Should(SatisfyAny(BeNil(), &util.AlreadyExistMatcher{}))
|
||||
By("Created a crd for appconfig dependency test")
|
||||
|
||||
dm, err := discoverymapper.New(cfg)
|
||||
Expect(err).Should(BeNil())
|
||||
|
||||
var mapping *meta.RESTMapping
|
||||
Eventually(func() error {
|
||||
mapping, err = dm.RESTMapping(schema.GroupKind{
|
||||
mapping, err = k8sClient.RESTMapper().RESTMapping(schema.GroupKind{
|
||||
Group: "example.com",
|
||||
Kind: "Foo",
|
||||
}, "v1")
|
||||
@@ -180,7 +176,7 @@ var _ = BeforeSuite(func() {
|
||||
}, time.Second*30, time.Millisecond*500).Should(BeNil())
|
||||
Expect(mapping.Resource.Resource).Should(Equal("foo"))
|
||||
|
||||
reconciler = NewReconciler(mgr, dm)
|
||||
reconciler = NewReconciler(mgr)
|
||||
componentHandler = &ComponentHandler{Client: k8sClient, RevisionLimit: 100}
|
||||
|
||||
By("Creating workload definition and trait definition")
|
||||
|
||||
-3
@@ -37,7 +37,6 @@ import (
|
||||
oamctrl "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
coredef "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core"
|
||||
"github.com/oam-dev/kubevela/pkg/controller/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/version"
|
||||
)
|
||||
@@ -45,7 +44,6 @@ import (
|
||||
// Reconciler reconciles a ComponentDefinition object
|
||||
type Reconciler struct {
|
||||
client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
Scheme *runtime.Scheme
|
||||
record event.Recorder
|
||||
options
|
||||
@@ -144,7 +142,6 @@ func Setup(mgr ctrl.Manager, args oamctrl.Args) error {
|
||||
r := Reconciler{
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
dm: args.DiscoveryMapper,
|
||||
options: parseOptions(args),
|
||||
}
|
||||
return r.SetupWithManager(mgr)
|
||||
|
||||
-6
@@ -34,7 +34,6 @@ import (
|
||||
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||
|
||||
oamCore "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
var cfg *rest.Config
|
||||
@@ -81,15 +80,10 @@ var _ = BeforeSuite(func() {
|
||||
Port: 48081,
|
||||
})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
dm, err := discoverymapper.New(mgr.GetConfig())
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
_, err = dm.Refresh()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
r = Reconciler{
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
dm: dm,
|
||||
options: options{
|
||||
defRevLimit: defRevisionLimit,
|
||||
},
|
||||
|
||||
-3
@@ -37,7 +37,6 @@ import (
|
||||
oamctrl "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
coredef "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core"
|
||||
"github.com/oam-dev/kubevela/pkg/controller/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/version"
|
||||
)
|
||||
@@ -45,7 +44,6 @@ import (
|
||||
// Reconciler reconciles a PolicyDefinition object
|
||||
type Reconciler struct {
|
||||
client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
Scheme *runtime.Scheme
|
||||
record event.Recorder
|
||||
defRevLimit int
|
||||
@@ -149,7 +147,6 @@ func Setup(mgr ctrl.Manager, args oamctrl.Args) error {
|
||||
r := Reconciler{
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
dm: args.DiscoveryMapper,
|
||||
defRevLimit: args.DefRevisionLimit,
|
||||
concurrentReconciles: args.ConcurrentReconciles,
|
||||
ignoreDefNoCtrlReq: args.IgnoreDefinitionWithoutControllerRequirement,
|
||||
|
||||
@@ -35,7 +35,6 @@ import (
|
||||
"sigs.k8s.io/controller-runtime/pkg/reconcile"
|
||||
|
||||
oamCore "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
var cfg *rest.Config
|
||||
@@ -82,15 +81,9 @@ var _ = BeforeSuite(func() {
|
||||
})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
dm, err := discoverymapper.New(mgr.GetConfig())
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
_, err = dm.Refresh()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
r = Reconciler{
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
dm: dm,
|
||||
defRevLimit: defRevisionLimit,
|
||||
}
|
||||
Expect(r.SetupWithManager(mgr)).ToNot(HaveOccurred())
|
||||
|
||||
+1
-4
@@ -49,7 +49,6 @@ import (
|
||||
controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/multicluster"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/policy/envbinding"
|
||||
)
|
||||
|
||||
@@ -85,7 +84,6 @@ type AppInfo struct {
|
||||
func Setup(mgr ctrl.Manager, args controller.Args) error {
|
||||
name := "oam/" + strings.ToLower(v1alpha2.HealthScopeGroupKind)
|
||||
r := NewReconciler(mgr, WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))))
|
||||
r.dm = args.DiscoveryMapper
|
||||
r.pd = args.PackageDiscover
|
||||
return ctrl.NewControllerManagedBy(mgr).
|
||||
Named(name).
|
||||
@@ -96,7 +94,6 @@ func Setup(mgr ctrl.Manager, args controller.Args) error {
|
||||
// A Reconciler reconciles OAM Scopes by keeping track of the health status of components.
|
||||
type Reconciler struct {
|
||||
client client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
pd *packages.PackageDiscover
|
||||
record event.Recorder
|
||||
// traitChecker represents checker fetching health condition from HealthCheckTrait
|
||||
@@ -479,7 +476,7 @@ func (r *Reconciler) patchHealthStatusToApplications(ctx context.Context, appHea
|
||||
}
|
||||
|
||||
func (r *Reconciler) createAppfile(ctx context.Context, appName, ns, envName string) (*af.Appfile, error) {
|
||||
appParser := af.NewApplicationParser(r.client, r.dm, r.pd)
|
||||
appParser := af.NewApplicationParser(r.client, r.pd)
|
||||
if len(envName) != 0 {
|
||||
app := &v1beta1.Application{}
|
||||
if err := r.client.Get(ctx, types.NamespacedName{Namespace: ns, Name: appName}, app); err != nil {
|
||||
|
||||
-3
@@ -37,7 +37,6 @@ import (
|
||||
oamctrl "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
coredef "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core"
|
||||
"github.com/oam-dev/kubevela/pkg/controller/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/version"
|
||||
)
|
||||
@@ -45,7 +44,6 @@ import (
|
||||
// Reconciler reconciles a TraitDefinition object
|
||||
type Reconciler struct {
|
||||
client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
Scheme *runtime.Scheme
|
||||
record event.Recorder
|
||||
options
|
||||
@@ -151,7 +149,6 @@ func Setup(mgr ctrl.Manager, args oamctrl.Args) error {
|
||||
r := Reconciler{
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
dm: args.DiscoveryMapper,
|
||||
options: parseOptions(args),
|
||||
}
|
||||
return r.SetupWithManager(mgr)
|
||||
|
||||
-7
@@ -34,7 +34,6 @@ import (
|
||||
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||
|
||||
oamCore "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
var cfg *rest.Config
|
||||
@@ -81,15 +80,9 @@ var _ = BeforeSuite(func() {
|
||||
})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
dm, err := discoverymapper.New(mgr.GetConfig())
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
_, err = dm.Refresh()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
r = Reconciler{
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
dm: dm,
|
||||
options: options{
|
||||
defRevLimit: defRevisionLimit,
|
||||
},
|
||||
|
||||
-7
@@ -34,7 +34,6 @@ import (
|
||||
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||
|
||||
oamCore "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
var cfg *rest.Config
|
||||
@@ -81,15 +80,9 @@ var _ = BeforeSuite(func() {
|
||||
})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
dm, err := discoverymapper.New(mgr.GetConfig())
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
_, err = dm.Refresh()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
r = Reconciler{
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
dm: dm,
|
||||
options: options{
|
||||
defRevLimit: defRevisionLimit,
|
||||
},
|
||||
|
||||
-3
@@ -37,7 +37,6 @@ import (
|
||||
oamctrl "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
coredef "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/core"
|
||||
"github.com/oam-dev/kubevela/pkg/controller/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/version"
|
||||
)
|
||||
@@ -45,7 +44,6 @@ import (
|
||||
// Reconciler reconciles a WorkflowStepDefinition object
|
||||
type Reconciler struct {
|
||||
client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
Scheme *runtime.Scheme
|
||||
record event.Recorder
|
||||
options
|
||||
@@ -151,7 +149,6 @@ func Setup(mgr ctrl.Manager, args oamctrl.Args) error {
|
||||
r := Reconciler{
|
||||
Client: mgr.GetClient(),
|
||||
Scheme: mgr.GetScheme(),
|
||||
dm: args.DiscoveryMapper,
|
||||
options: parseOptions(args),
|
||||
}
|
||||
return r.SetupWithManager(mgr)
|
||||
|
||||
@@ -49,7 +49,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/pkg/controller/common"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -259,8 +258,7 @@ func ComputeSpecHash(spec interface{}) (string, error) {
|
||||
|
||||
// RefreshPackageDiscover help refresh package discover
|
||||
// Deprecated: The function RefreshKubePackagesFromCluster affects performance and the code has been commented a long time.
|
||||
func RefreshPackageDiscover(ctx context.Context, k8sClient client.Client, dm discoverymapper.DiscoveryMapper,
|
||||
pd *packages.PackageDiscover, definition runtime.Object) error {
|
||||
func RefreshPackageDiscover(ctx context.Context, k8sClient client.Client, pd *packages.PackageDiscover, definition runtime.Object) error {
|
||||
var gvk metav1.GroupVersionKind
|
||||
var err error
|
||||
switch def := definition.(type) {
|
||||
@@ -271,7 +269,7 @@ func RefreshPackageDiscover(ctx context.Context, k8sClient client.Client, dm dis
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gvk, err = util.GetGVKFromDefinition(dm, workloadDef.Spec.Reference)
|
||||
gvk, err = util.GetGVKFromDefinition(k8sClient.RESTMapper(), workloadDef.Spec.Reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -287,17 +285,17 @@ func RefreshPackageDiscover(ctx context.Context, k8sClient client.Client, dm dis
|
||||
}
|
||||
}
|
||||
case *v1beta1.TraitDefinition:
|
||||
gvk, err = util.GetGVKFromDefinition(dm, def.Spec.Reference)
|
||||
gvk, err = util.GetGVKFromDefinition(k8sClient.RESTMapper(), def.Spec.Reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case *v1beta1.PolicyDefinition:
|
||||
gvk, err = util.GetGVKFromDefinition(dm, def.Spec.Reference)
|
||||
gvk, err = util.GetGVKFromDefinition(k8sClient.RESTMapper(), def.Spec.Reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case *v1beta1.WorkflowStepDefinition:
|
||||
gvk, err = util.GetGVKFromDefinition(dm, def.Spec.Reference)
|
||||
gvk, err = util.GetGVKFromDefinition(k8sClient.RESTMapper(), def.Spec.Reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
/*
|
||||
Copyright 2021 The KubeVela 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 discoverymapper
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/client-go/discovery"
|
||||
"k8s.io/client-go/rest"
|
||||
"k8s.io/client-go/restmapper"
|
||||
)
|
||||
|
||||
// DiscoveryMapper is a interface for refresh and discovery resources from GVK.
|
||||
type DiscoveryMapper interface {
|
||||
GetMapper() (meta.RESTMapper, error)
|
||||
Refresh() (meta.RESTMapper, error)
|
||||
RESTMapping(gk schema.GroupKind, version ...string) (*meta.RESTMapping, error)
|
||||
KindsFor(input schema.GroupVersionResource) ([]schema.GroupVersionKind, error)
|
||||
ResourcesFor(input schema.GroupVersionKind) (schema.GroupVersionResource, error)
|
||||
}
|
||||
|
||||
var _ DiscoveryMapper = &DefaultDiscoveryMapper{}
|
||||
|
||||
// DefaultDiscoveryMapper is a K8s resource mapper for discovery, it will cache the result
|
||||
type DefaultDiscoveryMapper struct {
|
||||
dc *discovery.DiscoveryClient
|
||||
mapper meta.RESTMapper
|
||||
mutex sync.RWMutex
|
||||
}
|
||||
|
||||
// New will create a new DefaultDiscoveryMapper by giving a K8s rest config
|
||||
func New(c *rest.Config) (DiscoveryMapper, error) {
|
||||
dc, err := discovery.NewDiscoveryClientForConfig(c)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &DefaultDiscoveryMapper{
|
||||
dc: dc,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// GetMapper will get the cached restmapper, if nil, it will create one by refresh
|
||||
// Prefer lazy discovery, because resources created after refresh can not be found
|
||||
func (d *DefaultDiscoveryMapper) GetMapper() (meta.RESTMapper, error) {
|
||||
d.mutex.RLock()
|
||||
mapper := d.mapper
|
||||
d.mutex.RUnlock()
|
||||
|
||||
if mapper == nil {
|
||||
return d.Refresh()
|
||||
}
|
||||
return mapper, nil
|
||||
}
|
||||
|
||||
// Refresh will re-create the mapper by getting the new resource from K8s API by using discovery client
|
||||
func (d *DefaultDiscoveryMapper) Refresh() (meta.RESTMapper, error) {
|
||||
gr, err := restmapper.GetAPIGroupResources(d.dc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
d.mutex.Lock()
|
||||
defer d.mutex.Unlock()
|
||||
d.mapper = restmapper.NewDiscoveryRESTMapper(gr)
|
||||
return d.mapper, nil
|
||||
}
|
||||
|
||||
// RESTMapping will mapping resources from GVK, if not found, it will refresh from APIServer and try once again
|
||||
func (d *DefaultDiscoveryMapper) RESTMapping(gk schema.GroupKind, version ...string) (*meta.RESTMapping, error) {
|
||||
mapper, err := d.GetMapper()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mapping, err := mapper.RESTMapping(gk, version...)
|
||||
if meta.IsNoMatchError(err) {
|
||||
// if no kind match err, refresh and try once more.
|
||||
mapper, err = d.Refresh()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mapping, err = mapper.RESTMapping(gk, version...)
|
||||
}
|
||||
return mapping, err
|
||||
}
|
||||
|
||||
// KindsFor will get kinds from GroupVersionResource, if version not set, all resources matched will be returned.
|
||||
func (d *DefaultDiscoveryMapper) KindsFor(input schema.GroupVersionResource) ([]schema.GroupVersionKind, error) {
|
||||
mapper, err := d.GetMapper()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mapping, err := mapper.KindsFor(input)
|
||||
if meta.IsNoMatchError(err) {
|
||||
// if no kind match err, refresh and try once more.
|
||||
mapper, err = d.Refresh()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mapping, err = mapper.KindsFor(input)
|
||||
}
|
||||
return mapping, err
|
||||
}
|
||||
|
||||
// ResourcesFor will get a resource from GroupVersionKind
|
||||
func (d *DefaultDiscoveryMapper) ResourcesFor(input schema.GroupVersionKind) (schema.GroupVersionResource, error) {
|
||||
var gvr schema.GroupVersionResource
|
||||
mapping, err := d.RESTMapping(input.GroupKind(), input.Version)
|
||||
if err != nil {
|
||||
return gvr, err
|
||||
}
|
||||
gvr = mapping.Resource
|
||||
return gvr, nil
|
||||
}
|
||||
|
||||
// IsNamespacedScope discover the resources supported by API server and check
|
||||
// whether a resource is namespaced-scope.
|
||||
func IsNamespacedScope(dm DiscoveryMapper, gk schema.GroupKind) (bool, error) {
|
||||
restMapping, err := dm.RESTMapping(gk)
|
||||
if err != nil {
|
||||
return false, errors.WithMessage(err, "cannot check resource scope")
|
||||
}
|
||||
isNamespaced := restMapping.Scope.Name() == meta.RESTScopeNameNamespace
|
||||
return isNamespaced, nil
|
||||
}
|
||||
@@ -1,331 +0,0 @@
|
||||
/*
|
||||
Copyright 2021 The KubeVela 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 discoverymapper
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
|
||||
crdv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/client-go/rest"
|
||||
"k8s.io/utils/pointer"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
|
||||
// These tests use Ginkgo (BDD-style Go testing framework). Refer to
|
||||
// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
|
||||
|
||||
var cfg *rest.Config
|
||||
var k8sClient client.Client
|
||||
var testEnv *envtest.Environment
|
||||
var scheme = runtime.NewScheme()
|
||||
|
||||
func TestMapper(t *testing.T) {
|
||||
RegisterFailHandler(Fail)
|
||||
|
||||
RunSpecs(t, "Test Mapper Suite")
|
||||
}
|
||||
|
||||
var _ = BeforeSuite(func() {
|
||||
By("Bootstrapping test environment")
|
||||
testEnv = &envtest.Environment{
|
||||
UseExistingCluster: pointer.Bool(false),
|
||||
ControlPlaneStartTimeout: time.Minute,
|
||||
ControlPlaneStopTimeout: time.Minute,
|
||||
}
|
||||
var err error
|
||||
cfg, err = testEnv.Start()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(cfg).ToNot(BeNil())
|
||||
|
||||
Expect(crdv1.AddToScheme(scheme)).Should(BeNil())
|
||||
// +kubebuilder:scaffold:scheme
|
||||
By("Create the k8s client")
|
||||
k8sClient, err = client.New(cfg, client.Options{Scheme: scheme})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(k8sClient).ToNot(BeNil())
|
||||
})
|
||||
|
||||
var _ = AfterSuite(func() {
|
||||
By("Tearing down the test environment")
|
||||
err := testEnv.Stop()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
})
|
||||
|
||||
var _ = Describe("Mapper discovery resources", func() {
|
||||
|
||||
It("discovery built-in k8s resource", func() {
|
||||
dism, err := New(cfg)
|
||||
Expect(err).Should(BeNil())
|
||||
mapper, err := dism.GetMapper()
|
||||
Expect(err).Should(BeNil())
|
||||
mapping, err := mapper.RESTMapping(schema.GroupKind{Group: "apps", Kind: "Deployment"}, "v1")
|
||||
Expect(err).Should(BeNil())
|
||||
Expect(mapping.Resource).Should(Equal(schema.GroupVersionResource{
|
||||
Group: "apps",
|
||||
Version: "v1",
|
||||
Resource: "deployments",
|
||||
}))
|
||||
})
|
||||
|
||||
It("discovery CRD", func() {
|
||||
|
||||
By("Check built-in resource")
|
||||
dism, err := New(cfg)
|
||||
Expect(err).Should(BeNil())
|
||||
mapper, err := dism.GetMapper()
|
||||
Expect(err).Should(BeNil())
|
||||
var mapping *meta.RESTMapping
|
||||
mapping, err = mapper.RESTMapping(schema.GroupKind{Group: "", Kind: "Pod"}, "v1")
|
||||
Expect(err).Should(BeNil())
|
||||
Expect(mapping.Resource).Should(Equal(schema.GroupVersionResource{
|
||||
Group: "",
|
||||
Version: "v1",
|
||||
Resource: "pods",
|
||||
}))
|
||||
|
||||
By("CRD should be discovered after refresh")
|
||||
crd := crdv1.CustomResourceDefinition{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "foos.example.com",
|
||||
Labels: map[string]string{"crd": "dependency"},
|
||||
},
|
||||
Spec: crdv1.CustomResourceDefinitionSpec{
|
||||
Group: "example.com",
|
||||
Names: crdv1.CustomResourceDefinitionNames{
|
||||
Kind: "Foo",
|
||||
Plural: "foos",
|
||||
},
|
||||
Versions: []crdv1.CustomResourceDefinitionVersion{{
|
||||
Name: "v1",
|
||||
Served: true,
|
||||
Storage: true,
|
||||
Schema: &crdv1.CustomResourceValidation{
|
||||
OpenAPIV3Schema: &crdv1.JSONSchemaProps{
|
||||
Type: "object",
|
||||
}},
|
||||
}, {
|
||||
Name: "v1beta1",
|
||||
Served: true,
|
||||
Schema: &crdv1.CustomResourceValidation{
|
||||
OpenAPIV3Schema: &crdv1.JSONSchemaProps{
|
||||
Type: "object",
|
||||
}},
|
||||
}},
|
||||
Scope: crdv1.NamespaceScoped,
|
||||
},
|
||||
}
|
||||
Expect(k8sClient.Create(context.Background(), &crd)).Should(BeNil())
|
||||
updatedCrdObj := crdv1.CustomResourceDefinition{}
|
||||
Eventually(func() bool {
|
||||
if err := k8sClient.Get(context.Background(),
|
||||
client.ObjectKey{Name: "foos.example.com"}, &updatedCrdObj); err != nil {
|
||||
return false
|
||||
}
|
||||
return len(updatedCrdObj.Spec.Versions) == 2
|
||||
}, 3*time.Second, time.Second).Should(BeTrue())
|
||||
|
||||
Eventually(func() error {
|
||||
mapping, err = dism.RESTMapping(schema.GroupKind{Group: "example.com", Kind: "Foo"}, "v1")
|
||||
return err
|
||||
}, time.Second*2, time.Millisecond*300).Should(BeNil())
|
||||
Expect(mapping.Resource).Should(Equal(schema.GroupVersionResource{
|
||||
Group: "example.com",
|
||||
Version: "v1",
|
||||
Resource: "foos",
|
||||
}))
|
||||
|
||||
var kinds []schema.GroupVersionKind
|
||||
Eventually(func() []schema.GroupVersionKind {
|
||||
kinds, _ = dism.KindsFor(schema.GroupVersionResource{Group: "example.com", Version: "", Resource: "foos"})
|
||||
return kinds
|
||||
}, time.Second*60, time.Second*3).Should(Equal([]schema.GroupVersionKind{
|
||||
{Group: "example.com", Version: "v1", Kind: "Foo"},
|
||||
{Group: "example.com", Version: "v1beta1", Kind: "Foo"},
|
||||
}))
|
||||
kinds, err = dism.KindsFor(schema.GroupVersionResource{Group: "example.com", Version: "v1", Resource: "foos"})
|
||||
Expect(err).Should(BeNil())
|
||||
Expect(kinds).Should(Equal([]schema.GroupVersionKind{{Group: "example.com", Version: "v1", Kind: "Foo"}}))
|
||||
})
|
||||
|
||||
It("get GVK from k8s resource", func() {
|
||||
dism, err := New(cfg)
|
||||
Expect(err).Should(BeNil())
|
||||
|
||||
By("Test Pod")
|
||||
podAPIVersion, podKind := "v1", "Pod"
|
||||
podGV, err := schema.ParseGroupVersion(podAPIVersion)
|
||||
Expect(err).Should(BeNil())
|
||||
podGVR, err := dism.ResourcesFor(podGV.WithKind(podKind))
|
||||
Expect(err).Should(BeNil())
|
||||
Expect(podGVR).Should(Equal(schema.GroupVersionResource{
|
||||
Version: "v1",
|
||||
Resource: "pods",
|
||||
}))
|
||||
|
||||
By("Test Deployment")
|
||||
deploymentAPIVersion, deploymentKind := "apps/v1", "Deployment"
|
||||
deploymentGV, err := schema.ParseGroupVersion(deploymentAPIVersion)
|
||||
Expect(err).Should(BeNil())
|
||||
deploymentGVR, err := dism.ResourcesFor(deploymentGV.WithKind(deploymentKind))
|
||||
Expect(err).Should(BeNil())
|
||||
Expect(deploymentGVR).Should(Equal(schema.GroupVersionResource{
|
||||
Group: "apps",
|
||||
Version: "v1",
|
||||
Resource: "deployments",
|
||||
}))
|
||||
|
||||
By("Test CronJob")
|
||||
cronJobAPIVersion, cronJobKind := "batch/v1", "Job"
|
||||
cronJobGV, err := schema.ParseGroupVersion(cronJobAPIVersion)
|
||||
Expect(err).Should(BeNil())
|
||||
cronJobGVR, err := dism.ResourcesFor(cronJobGV.WithKind(cronJobKind))
|
||||
Expect(err).Should(BeNil())
|
||||
Expect(cronJobGVR).Should(Equal(schema.GroupVersionResource{
|
||||
Group: "batch",
|
||||
Version: "v1",
|
||||
Resource: "jobs",
|
||||
}))
|
||||
|
||||
By("Test Invalid GVK")
|
||||
apiVersion, kind := "apps/v1", "Job"
|
||||
gv, err := schema.ParseGroupVersion(apiVersion)
|
||||
Expect(err).Should(BeNil())
|
||||
_, err = dism.ResourcesFor(gv.WithKind(kind))
|
||||
Expect(err).Should(HaveOccurred())
|
||||
})
|
||||
|
||||
It("check API resource scope", func() {
|
||||
dism, err := New(cfg)
|
||||
Expect(err).Should(BeNil())
|
||||
|
||||
var (
|
||||
clusterCRKind = "ImClusterScope"
|
||||
namespaceCRKind = "ImNamespaceScope"
|
||||
)
|
||||
|
||||
By("Register a cluster-scoped CRD")
|
||||
clusterScopeCRD := crdv1.CustomResourceDefinition{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "imclusterscopes.example.com",
|
||||
},
|
||||
Spec: crdv1.CustomResourceDefinitionSpec{
|
||||
Scope: crdv1.ClusterScoped,
|
||||
Group: "example.com",
|
||||
Names: crdv1.CustomResourceDefinitionNames{
|
||||
Kind: clusterCRKind,
|
||||
Plural: "imclusterscopes",
|
||||
},
|
||||
Versions: []crdv1.CustomResourceDefinitionVersion{{
|
||||
Name: "v1",
|
||||
Served: true,
|
||||
Storage: true,
|
||||
Schema: &crdv1.CustomResourceValidation{
|
||||
OpenAPIV3Schema: &crdv1.JSONSchemaProps{
|
||||
Type: "object",
|
||||
}},
|
||||
}},
|
||||
},
|
||||
}
|
||||
Expect(k8sClient.Create(context.Background(), &clusterScopeCRD)).Should(BeNil())
|
||||
|
||||
By("Register a namespace-scoped CRD")
|
||||
namespaceScopeCRD := crdv1.CustomResourceDefinition{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "imnamespacescopes.example.com",
|
||||
},
|
||||
Spec: crdv1.CustomResourceDefinitionSpec{
|
||||
Scope: crdv1.NamespaceScoped,
|
||||
Group: "example.com",
|
||||
Names: crdv1.CustomResourceDefinitionNames{
|
||||
Kind: namespaceCRKind,
|
||||
Plural: "imnamespacescopes",
|
||||
},
|
||||
Versions: []crdv1.CustomResourceDefinitionVersion{{
|
||||
Name: "v1",
|
||||
Served: true,
|
||||
Storage: true,
|
||||
Schema: &crdv1.CustomResourceValidation{
|
||||
OpenAPIV3Schema: &crdv1.JSONSchemaProps{
|
||||
Type: "object",
|
||||
}},
|
||||
}},
|
||||
},
|
||||
}
|
||||
Expect(k8sClient.Create(context.Background(), &namespaceScopeCRD)).Should(BeNil())
|
||||
|
||||
By("Verify checking built-in cluster-scoped resource")
|
||||
clusterBuiltInRsc := schema.GroupKind{
|
||||
Group: "",
|
||||
Kind: "PersistentVolume",
|
||||
}
|
||||
isNamespaced, err := IsNamespacedScope(dism, clusterBuiltInRsc)
|
||||
Expect(err).Should(BeNil())
|
||||
Expect(isNamespaced).Should(BeFalse())
|
||||
|
||||
By("Verify checking built-in namespace-scoped resource")
|
||||
namespaceBuiltInRsc := schema.GroupKind{
|
||||
Group: "apps",
|
||||
Kind: "Deployment",
|
||||
}
|
||||
isNamespaced, err = IsNamespacedScope(dism, namespaceBuiltInRsc)
|
||||
Expect(err).Should(BeNil())
|
||||
Expect(isNamespaced).Should(BeTrue())
|
||||
|
||||
By("Verify checking cluster-scoped custom resource")
|
||||
clusterCR := schema.GroupKind{
|
||||
Group: "example.com",
|
||||
Kind: clusterCRKind,
|
||||
}
|
||||
By("Wait for refreshing DiscoveryMapper")
|
||||
Eventually(func() error {
|
||||
isNamespaced, err = IsNamespacedScope(dism, clusterCR)
|
||||
return err
|
||||
}, time.Second*2, time.Millisecond*300).Should(BeNil())
|
||||
Expect(isNamespaced).Should(BeFalse())
|
||||
|
||||
By("Verify checking namespace-scoped custom resource")
|
||||
namespaceCR := schema.GroupKind{
|
||||
Group: "example.com",
|
||||
Kind: namespaceCRKind,
|
||||
}
|
||||
By("Wait for refreshing DiscoveryMapper")
|
||||
Eventually(func() error {
|
||||
isNamespaced, err = IsNamespacedScope(dism, namespaceCR)
|
||||
return err
|
||||
}, time.Second*2, time.Millisecond*300).Should(BeNil())
|
||||
Expect(isNamespaced).Should(BeTrue())
|
||||
|
||||
By("Cannot check an unknown resource")
|
||||
unknownCR := schema.GroupKind{
|
||||
Group: "unknow.com",
|
||||
Kind: "Unknown",
|
||||
}
|
||||
_, err = IsNamespacedScope(dism, unknownCR)
|
||||
Expect(err).ShouldNot(BeNil())
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
Copyright 2023 The KubeVela 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 mock
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
)
|
||||
|
||||
// NewClient new client with given mappings
|
||||
func NewClient(c client.Client, mappings map[schema.GroupVersionResource][]schema.GroupVersionKind) client.Client {
|
||||
if c == nil {
|
||||
c = fake.NewClientBuilder().Build()
|
||||
}
|
||||
return &Client{Client: c, mappings: mappings}
|
||||
}
|
||||
|
||||
// Client fake client
|
||||
type Client struct {
|
||||
client.Client
|
||||
mappings map[schema.GroupVersionResource][]schema.GroupVersionKind
|
||||
}
|
||||
|
||||
// RESTMapper override default mapper
|
||||
func (in *Client) RESTMapper() meta.RESTMapper {
|
||||
mapper := in.Client.RESTMapper()
|
||||
if mapper == nil {
|
||||
mapper = fake.NewClientBuilder().Build().RESTMapper()
|
||||
}
|
||||
return &RESTMapper{RESTMapper: mapper, mappings: in.mappings}
|
||||
}
|
||||
|
||||
// RESTMapper test mapper
|
||||
type RESTMapper struct {
|
||||
meta.RESTMapper
|
||||
mappings map[schema.GroupVersionResource][]schema.GroupVersionKind
|
||||
}
|
||||
|
||||
// KindsFor get kinds
|
||||
func (in *RESTMapper) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) {
|
||||
if gvks, found := in.mappings[resource]; found {
|
||||
return gvks, nil
|
||||
}
|
||||
return in.RESTMapper.KindsFor(resource)
|
||||
}
|
||||
|
||||
// RESTMapping get mapping
|
||||
func (in *RESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) {
|
||||
version := "v1"
|
||||
if len(versions) > 0 {
|
||||
version = versions[0]
|
||||
}
|
||||
return &meta.RESTMapping{
|
||||
Resource: schema.GroupVersionResource{Group: gk.Group, Version: versions[0], Resource: strings.ToLower(gk.Kind) + "s"},
|
||||
GroupVersionKind: gk.WithVersion(version),
|
||||
Scope: scope(meta.RESTScopeNameNamespace),
|
||||
}, nil
|
||||
}
|
||||
|
||||
type scope meta.RESTScopeName
|
||||
|
||||
func (in scope) Name() meta.RESTScopeName {
|
||||
return meta.RESTScopeName(in)
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
Copyright 2021 The KubeVela 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 mock
|
||||
|
||||
import (
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
)
|
||||
|
||||
var _ discoverymapper.DiscoveryMapper = &DiscoveryMapper{}
|
||||
|
||||
// GetMapper is func type for mock convenience
|
||||
type GetMapper func() (meta.RESTMapper, error)
|
||||
|
||||
// Refresh is func type for mock convenience
|
||||
type Refresh func() (meta.RESTMapper, error)
|
||||
|
||||
// RESTMapping is func type for mock convenience
|
||||
type RESTMapping func(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error)
|
||||
|
||||
// KindsFor is func type for mock convenience
|
||||
type KindsFor func(input schema.GroupVersionResource) ([]schema.GroupVersionKind, error)
|
||||
|
||||
// ResourcesFor is func type for mock convenience
|
||||
type ResourcesFor func(input schema.GroupVersionKind) (schema.GroupVersionResource, error)
|
||||
|
||||
// NewMockDiscoveryMapper for unit test only
|
||||
func NewMockDiscoveryMapper() *DiscoveryMapper {
|
||||
return &DiscoveryMapper{
|
||||
MockRESTMapping: NewMockRESTMapping(""),
|
||||
MockKindsFor: NewMockKindsFor(""),
|
||||
}
|
||||
}
|
||||
|
||||
// NewMockRESTMapping for unit test only
|
||||
func NewMockRESTMapping(resource string) RESTMapping {
|
||||
return func(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) {
|
||||
return &meta.RESTMapping{Resource: schema.GroupVersionResource{Resource: resource, Version: versions[0], Group: gk.Group}}, nil
|
||||
}
|
||||
}
|
||||
|
||||
// NewMockKindsFor for unit test only
|
||||
func NewMockKindsFor(kind string, version ...string) KindsFor {
|
||||
return func(input schema.GroupVersionResource) ([]schema.GroupVersionKind, error) {
|
||||
if len(kind) <= 1 {
|
||||
return []schema.GroupVersionKind{{Version: input.Version, Group: input.Group, Kind: kind}}, nil
|
||||
}
|
||||
var ss []schema.GroupVersionKind
|
||||
for _, v := range version {
|
||||
gvk := schema.GroupVersionKind{Version: v, Group: input.Group, Kind: kind}
|
||||
if input.Version != "" && input.Version == v {
|
||||
return []schema.GroupVersionKind{gvk}, nil
|
||||
}
|
||||
ss = append(ss, gvk)
|
||||
}
|
||||
return ss, nil
|
||||
}
|
||||
}
|
||||
|
||||
// DiscoveryMapper for unit test only, use GetMapper and refresh will panic
|
||||
type DiscoveryMapper struct {
|
||||
MockGetMapper GetMapper
|
||||
MockRefresh Refresh
|
||||
MockRESTMapping RESTMapping
|
||||
MockKindsFor KindsFor
|
||||
MockResourcesFor ResourcesFor
|
||||
}
|
||||
|
||||
// GetMapper for mock
|
||||
func (m *DiscoveryMapper) GetMapper() (meta.RESTMapper, error) {
|
||||
return m.MockGetMapper()
|
||||
}
|
||||
|
||||
// Refresh for mock
|
||||
func (m *DiscoveryMapper) Refresh() (meta.RESTMapper, error) {
|
||||
return m.MockRefresh()
|
||||
}
|
||||
|
||||
// RESTMapping for mock
|
||||
func (m *DiscoveryMapper) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) {
|
||||
return m.MockRESTMapping(gk, versions...)
|
||||
}
|
||||
|
||||
// KindsFor for mock
|
||||
func (m *DiscoveryMapper) KindsFor(input schema.GroupVersionResource) ([]schema.GroupVersionKind, error) {
|
||||
return m.MockKindsFor(input)
|
||||
}
|
||||
|
||||
// ResourcesFor for mock
|
||||
func (m *DiscoveryMapper) ResourcesFor(input schema.GroupVersionKind) (schema.GroupVersionResource, error) {
|
||||
var gvr schema.GroupVersionResource
|
||||
mapping, err := m.RESTMapping(input.GroupKind(), input.Version)
|
||||
if err != nil {
|
||||
return gvr, err
|
||||
}
|
||||
gvr = mapping.Resource
|
||||
return gvr, nil
|
||||
}
|
||||
+16
-20
@@ -48,7 +48,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
types2 "github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -228,11 +227,10 @@ func GetDummyWorkloadDefinition(u *unstructured.Unstructured) *v1alpha2.Workload
|
||||
}
|
||||
|
||||
// FetchScopeDefinition fetch corresponding scopeDefinition given a scope
|
||||
func FetchScopeDefinition(ctx context.Context, r client.Reader, dm discoverymapper.DiscoveryMapper,
|
||||
scope *unstructured.Unstructured) (*v1alpha2.ScopeDefinition, error) {
|
||||
func FetchScopeDefinition(ctx context.Context, r client.Client, scope *unstructured.Unstructured) (*v1alpha2.ScopeDefinition, error) {
|
||||
// The name of the scopeDefinition CR is the CRD name of the scope
|
||||
// TODO(wonderflow): we haven't support scope definition label type yet.
|
||||
spName, err := GetDefinitionName(dm, scope, "")
|
||||
spName, err := GetDefinitionName(r.RESTMapper(), scope, "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -244,10 +242,9 @@ func FetchScopeDefinition(ctx context.Context, r client.Reader, dm discoverymapp
|
||||
}
|
||||
|
||||
// FetchTraitDefinition fetch corresponding traitDefinition given a trait
|
||||
func FetchTraitDefinition(ctx context.Context, r client.Reader, dm discoverymapper.DiscoveryMapper,
|
||||
trait *unstructured.Unstructured) (*v1alpha2.TraitDefinition, error) {
|
||||
func FetchTraitDefinition(ctx context.Context, r client.Client, trait *unstructured.Unstructured) (*v1alpha2.TraitDefinition, error) {
|
||||
// The name of the traitDefinition CR is the CRD name of the trait
|
||||
trName, err := GetDefinitionName(dm, trait, oam.TraitTypeLabel)
|
||||
trName, err := GetDefinitionName(r.RESTMapper(), trait, oam.TraitTypeLabel)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -259,10 +256,9 @@ func FetchTraitDefinition(ctx context.Context, r client.Reader, dm discoverymapp
|
||||
}
|
||||
|
||||
// FetchWorkloadDefinition fetch corresponding workloadDefinition given a workload
|
||||
func FetchWorkloadDefinition(ctx context.Context, r client.Reader, dm discoverymapper.DiscoveryMapper,
|
||||
workload *unstructured.Unstructured) (*v1alpha2.WorkloadDefinition, error) {
|
||||
func FetchWorkloadDefinition(ctx context.Context, r client.Client, workload *unstructured.Unstructured) (*v1alpha2.WorkloadDefinition, error) {
|
||||
// The name of the workloadDefinition CR is the CRD name of the component
|
||||
wldName, err := GetDefinitionName(dm, workload, oam.WorkloadTypeLabel)
|
||||
wldName, err := GetDefinitionName(r.RESTMapper(), workload, oam.WorkloadTypeLabel)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -394,12 +390,11 @@ func checkRequestNamespaceError(err error) bool {
|
||||
}
|
||||
|
||||
// FetchWorkloadChildResources fetch corresponding child resources given a workload
|
||||
func FetchWorkloadChildResources(ctx context.Context, r client.Reader,
|
||||
dm discoverymapper.DiscoveryMapper, workload *unstructured.Unstructured) ([]*unstructured.Unstructured, error) {
|
||||
func FetchWorkloadChildResources(ctx context.Context, r client.Client, workload *unstructured.Unstructured) ([]*unstructured.Unstructured, error) {
|
||||
// Fetch the corresponding workloadDefinition CR
|
||||
workloadDefinition, err := FetchWorkloadDefinition(ctx, r, dm, workload)
|
||||
workloadDefinition, err := FetchWorkloadDefinition(ctx, r, workload)
|
||||
if err != nil {
|
||||
// No definition will won't block app from running
|
||||
// No definition won't block app from running
|
||||
if apierrors.IsNotFound(err) {
|
||||
return nil, nil
|
||||
}
|
||||
@@ -549,7 +544,7 @@ func RemoveAnnotations(o labelAnnotationObject, removeKeys []string) {
|
||||
// the format of the definition of a resource is <kind plurals>.<group>
|
||||
// Now the definition name of a resource could also be defined as `definition.oam.dev/name` in `metadata.annotations`
|
||||
// typeLabel specified which Definition it is, if specified, will directly get definition from label.
|
||||
func GetDefinitionName(dm discoverymapper.DiscoveryMapper, u *unstructured.Unstructured, typeLabel string) (string, error) {
|
||||
func GetDefinitionName(mapper meta.RESTMapper, u *unstructured.Unstructured, typeLabel string) (string, error) {
|
||||
if typeLabel != "" {
|
||||
if labels := u.GetLabels(); labels != nil {
|
||||
if definitionName, ok := labels[typeLabel]; ok {
|
||||
@@ -561,7 +556,7 @@ func GetDefinitionName(dm discoverymapper.DiscoveryMapper, u *unstructured.Unstr
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
mapping, err := dm.RESTMapping(schema.GroupKind{Group: groupVersion.Group, Kind: u.GetKind()}, groupVersion.Version)
|
||||
mapping, err := mapper.RESTMapping(schema.GroupKind{Group: groupVersion.Group, Kind: u.GetKind()}, groupVersion.Version)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@@ -569,7 +564,7 @@ func GetDefinitionName(dm discoverymapper.DiscoveryMapper, u *unstructured.Unstr
|
||||
}
|
||||
|
||||
// GetGVKFromDefinition help get Group Version Kind from DefinitionReference
|
||||
func GetGVKFromDefinition(dm discoverymapper.DiscoveryMapper, definitionRef common.DefinitionReference) (metav1.GroupVersionKind, error) {
|
||||
func GetGVKFromDefinition(mapper meta.RESTMapper, definitionRef common.DefinitionReference) (metav1.GroupVersionKind, error) {
|
||||
// if given definitionRef is empty or it's a dummy definition, return an empty GVK
|
||||
// NOTE currently, only TraitDefinition is allowed to omit definitionRef conditionally.
|
||||
if len(definitionRef.Name) < 1 || definitionRef.Name == Dummy {
|
||||
@@ -578,7 +573,7 @@ func GetGVKFromDefinition(dm discoverymapper.DiscoveryMapper, definitionRef comm
|
||||
var gvk metav1.GroupVersionKind
|
||||
groupResource := schema.ParseGroupResource(definitionRef.Name)
|
||||
gvr := schema.GroupVersionResource{Group: groupResource.Group, Resource: groupResource.Resource, Version: definitionRef.Version}
|
||||
kinds, err := dm.KindsFor(gvr)
|
||||
kinds, err := mapper.KindsFor(gvr)
|
||||
if err != nil {
|
||||
return gvk, err
|
||||
}
|
||||
@@ -595,17 +590,18 @@ func GetGVKFromDefinition(dm discoverymapper.DiscoveryMapper, definitionRef comm
|
||||
}
|
||||
|
||||
// ConvertWorkloadGVK2Definition help convert a GVK to DefinitionReference
|
||||
func ConvertWorkloadGVK2Definition(dm discoverymapper.DiscoveryMapper, def common.WorkloadGVK) (common.DefinitionReference, error) {
|
||||
func ConvertWorkloadGVK2Definition(mapper meta.RESTMapper, def common.WorkloadGVK) (common.DefinitionReference, error) {
|
||||
var reference common.DefinitionReference
|
||||
gv, err := schema.ParseGroupVersion(def.APIVersion)
|
||||
if err != nil {
|
||||
return reference, err
|
||||
}
|
||||
gvk := gv.WithKind(def.Kind)
|
||||
gvr, err := dm.ResourcesFor(gvk)
|
||||
mappings, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version)
|
||||
if err != nil {
|
||||
return reference, err
|
||||
}
|
||||
gvr := mappings.Resource
|
||||
reference.Version = gvr.Version
|
||||
reference.Name = gvr.GroupResource().String()
|
||||
return reference, nil
|
||||
|
||||
+12
-14
@@ -264,10 +264,10 @@ func TestScopeRelatedUtils(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for name, tc := range cases {
|
||||
tclient := test.MockClient{
|
||||
tclient := mock.NewClient(&test.MockClient{
|
||||
MockGet: test.NewMockGetFn(nil, tc.fields.getFunc),
|
||||
}
|
||||
got, err := util.FetchScopeDefinition(ctx, &tclient, mock.NewMockDiscoveryMapper(), unstructuredScope)
|
||||
}, nil)
|
||||
got, err := util.FetchScopeDefinition(ctx, tclient, unstructuredScope)
|
||||
t.Log(fmt.Sprint("Running test: ", name))
|
||||
assert.Equal(t, tc.want.err, err)
|
||||
assert.Equal(t, tc.want.spd, got)
|
||||
@@ -367,10 +367,10 @@ func TestUtils(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for name, tc := range cases {
|
||||
tclient := test.MockClient{
|
||||
tclient := mock.NewClient(&test.MockClient{
|
||||
MockGet: test.NewMockGetFn(nil, tc.fields.getFunc),
|
||||
}
|
||||
got, err := util.FetchWorkloadDefinition(ctx, &tclient, mock.NewMockDiscoveryMapper(), unstructuredWorkload)
|
||||
}, nil)
|
||||
got, err := util.FetchWorkloadDefinition(ctx, tclient, unstructuredWorkload)
|
||||
t.Log(fmt.Sprint("Running test: ", name))
|
||||
|
||||
assert.Equal(t, tc.want.err, err)
|
||||
@@ -429,8 +429,7 @@ func TestUnstructured(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for name, ti := range tests {
|
||||
mapper := mock.NewMockDiscoveryMapper()
|
||||
mapper.MockRESTMapping = mock.NewMockRESTMapping(ti.resource)
|
||||
mapper := mock.NewClient(nil, nil).RESTMapper()
|
||||
got, err := util.GetDefinitionName(mapper, ti.u, ti.typeLabel)
|
||||
assert.NoError(t, err)
|
||||
t.Log(fmt.Sprint("Running test: ", name))
|
||||
@@ -439,8 +438,10 @@ func TestUnstructured(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetGVKFromDef(t *testing.T) {
|
||||
mapper := mock.NewMockDiscoveryMapper()
|
||||
mapper.MockKindsFor = mock.NewMockKindsFor("Abc", "v1", "v2")
|
||||
mapper := mock.NewClient(nil, map[schema.GroupVersionResource][]schema.GroupVersionKind{
|
||||
schema.GroupVersionResource{Group: "example.com", Resource: "abcs"}: {{Group: "example.com", Version: "v1", Kind: "Abc"}},
|
||||
schema.GroupVersionResource{Group: "example.com", Resource: "abcs", Version: "v2"}: {{Group: "example.com", Version: "v2", Kind: "Abc"}},
|
||||
}).RESTMapper()
|
||||
gvk, err := util.GetGVKFromDefinition(mapper, common.DefinitionReference{Name: "abcs.example.com"})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, metav1.GroupVersionKind{
|
||||
@@ -475,9 +476,7 @@ func TestGetGVKFromDef(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestConvertWorkloadGVK2Def(t *testing.T) {
|
||||
mapper := mock.NewMockDiscoveryMapper()
|
||||
|
||||
mapper.MockRESTMapping = mock.NewMockRESTMapping("clonesets")
|
||||
mapper := mock.NewClient(nil, map[schema.GroupVersionResource][]schema.GroupVersionKind{}).RESTMapper()
|
||||
ref, err := util.ConvertWorkloadGVK2Definition(mapper, common.WorkloadGVK{APIVersion: "apps.kruise.io/v1alpha1",
|
||||
Kind: "CloneSet"})
|
||||
assert.NoError(t, err)
|
||||
@@ -486,7 +485,6 @@ func TestConvertWorkloadGVK2Def(t *testing.T) {
|
||||
Version: "v1alpha1",
|
||||
}, ref)
|
||||
|
||||
mapper.MockRESTMapping = mock.NewMockRESTMapping("deployments")
|
||||
ref, err = util.ConvertWorkloadGVK2Definition(mapper, common.WorkloadGVK{APIVersion: "apps/v1",
|
||||
Kind: "Deployment"})
|
||||
assert.NoError(t, err)
|
||||
|
||||
@@ -46,7 +46,6 @@ import (
|
||||
"github.com/kubevela/workflow/pkg/cue/packages"
|
||||
|
||||
coreoam "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
|
||||
@@ -54,7 +53,6 @@ var cfg *rest.Config
|
||||
var scheme *runtime.Scheme
|
||||
var k8sClient client.Client
|
||||
var testEnv *envtest.Environment
|
||||
var dm discoverymapper.DiscoveryMapper
|
||||
var pd *packages.PackageDiscover
|
||||
var testns string
|
||||
var dc *discovery.DiscoveryClient
|
||||
@@ -95,9 +93,6 @@ var _ = BeforeSuite(func() {
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dc).ShouldNot(BeNil())
|
||||
|
||||
dm, err = discoverymapper.New(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dm).ToNot(BeNil())
|
||||
pd, err = packages.NewPackageDiscover(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(pd).ToNot(BeNil())
|
||||
|
||||
@@ -34,7 +34,6 @@ import (
|
||||
"github.com/kubevela/workflow/pkg/cue/packages"
|
||||
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
// Args is args for controller-runtime client
|
||||
@@ -43,7 +42,6 @@ type Args struct {
|
||||
rawConfig *api.Config
|
||||
Schema *runtime.Scheme
|
||||
client client.Client
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
pd *packages.PackageDiscover
|
||||
dc *discovery.DiscoveryClient
|
||||
}
|
||||
@@ -145,24 +143,6 @@ func (a *Args) GetFakeClient(defs []oam.Object) (client.Client, error) {
|
||||
return fake.NewClientBuilder().WithObjects(objs...).WithScheme(a.Schema).Build(), nil
|
||||
}
|
||||
|
||||
// GetDiscoveryMapper get discoveryMapper client if exist, create if not exist.
|
||||
func (a *Args) GetDiscoveryMapper() (discoverymapper.DiscoveryMapper, error) {
|
||||
if a.config == nil {
|
||||
if err := a.SetConfig(nil); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if a.dm != nil {
|
||||
return a.dm, nil
|
||||
}
|
||||
dm, err := discoverymapper.New(a.config)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create CRD discovery client %w", err)
|
||||
}
|
||||
a.dm = dm
|
||||
return dm, nil
|
||||
}
|
||||
|
||||
// GetPackageDiscover get PackageDiscover client if exist, create if not exist.
|
||||
func (a *Args) GetPackageDiscover() (*packages.PackageDiscover, error) {
|
||||
if a.config == nil {
|
||||
|
||||
@@ -33,7 +33,6 @@ import (
|
||||
|
||||
"github.com/kubevela/workflow/pkg/cue/packages"
|
||||
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
)
|
||||
|
||||
@@ -69,12 +68,10 @@ var _ = BeforeSuite(func() {
|
||||
Expect(k8sClient).ToNot(BeNil())
|
||||
By("new kube client success")
|
||||
|
||||
dm, err := discoverymapper.New(cfg)
|
||||
Expect(err).To(BeNil())
|
||||
pd, err := packages.NewPackageDiscover(cfg)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
viewHandler = NewViewHandler(k8sClient, cfg, dm, pd)
|
||||
viewHandler = NewViewHandler(k8sClient, cfg, pd)
|
||||
ctx := context.Background()
|
||||
|
||||
ns := corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "vela-system"}}
|
||||
|
||||
+1
-4
@@ -46,7 +46,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/cue/process"
|
||||
"github.com/oam-dev/kubevela/pkg/multicluster"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
oamutil "github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/pkg/stdlib"
|
||||
"github.com/oam-dev/kubevela/pkg/utils"
|
||||
@@ -74,17 +73,15 @@ type ViewHandler struct {
|
||||
cli client.Client
|
||||
cfg *rest.Config
|
||||
viewTask workflowv1alpha1.WorkflowStep
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
pd *packages.PackageDiscover
|
||||
namespace string
|
||||
}
|
||||
|
||||
// NewViewHandler new view handler
|
||||
func NewViewHandler(cli client.Client, cfg *rest.Config, dm discoverymapper.DiscoveryMapper, pd *packages.PackageDiscover) *ViewHandler {
|
||||
func NewViewHandler(cli client.Client, cfg *rest.Config, pd *packages.PackageDiscover) *ViewHandler {
|
||||
return &ViewHandler{
|
||||
cli: cli,
|
||||
cfg: cfg,
|
||||
dm: dm,
|
||||
pd: pd,
|
||||
namespace: qlNs,
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ func Register(mgr manager.Manager, args controller.Args) {
|
||||
case "all":
|
||||
application.RegisterValidatingHandler(mgr, args)
|
||||
componentdefinition.RegisterMutatingHandler(mgr, args)
|
||||
componentdefinition.RegisterValidatingHandler(mgr, args)
|
||||
componentdefinition.RegisterValidatingHandler(mgr)
|
||||
traitdefinition.RegisterValidatingHandler(mgr, args)
|
||||
applicationconfiguration.RegisterMutatingHandler(mgr)
|
||||
applicationconfiguration.RegisterValidatingHandler(mgr, args)
|
||||
@@ -43,13 +43,13 @@ func Register(mgr manager.Manager, args controller.Args) {
|
||||
case "minimal":
|
||||
application.RegisterValidatingHandler(mgr, args)
|
||||
componentdefinition.RegisterMutatingHandler(mgr, args)
|
||||
componentdefinition.RegisterValidatingHandler(mgr, args)
|
||||
componentdefinition.RegisterValidatingHandler(mgr)
|
||||
traitdefinition.RegisterValidatingHandler(mgr, args)
|
||||
case "v0.3":
|
||||
application.RegisterValidatingHandler(mgr, args)
|
||||
application.RegisterMutatingHandler(mgr)
|
||||
componentdefinition.RegisterMutatingHandler(mgr, args)
|
||||
componentdefinition.RegisterValidatingHandler(mgr, args)
|
||||
componentdefinition.RegisterValidatingHandler(mgr)
|
||||
traitdefinition.RegisterValidatingHandler(mgr, args)
|
||||
case "v0.2":
|
||||
applicationconfiguration.RegisterMutatingHandler(mgr)
|
||||
|
||||
@@ -42,7 +42,6 @@ import (
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
|
||||
@@ -54,7 +53,6 @@ var k8sClient client.Client
|
||||
var testEnv *envtest.Environment
|
||||
var testScheme = runtime.NewScheme()
|
||||
var decoder *admission.Decoder
|
||||
var dm discoverymapper.DiscoveryMapper
|
||||
var pd *packages.PackageDiscover
|
||||
var ctx = context.Background()
|
||||
var handler *ValidatingHandler
|
||||
@@ -100,18 +98,11 @@ var _ = BeforeSuite(func() {
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(k8sClient).ToNot(BeNil())
|
||||
|
||||
dm, err = discoverymapper.New(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dm).ToNot(BeNil())
|
||||
|
||||
pd, err = packages.NewPackageDiscover(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(pd).ToNot(BeNil())
|
||||
|
||||
handler = &ValidatingHandler{
|
||||
dm: dm,
|
||||
pd: pd,
|
||||
}
|
||||
handler = &ValidatingHandler{pd: pd}
|
||||
|
||||
decoder, err = admission.NewDecoder(testScheme)
|
||||
Expect(err).Should(BeNil())
|
||||
|
||||
@@ -33,7 +33,6 @@ import (
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -41,7 +40,6 @@ var _ admission.Handler = &ValidatingHandler{}
|
||||
|
||||
// ValidatingHandler handles application
|
||||
type ValidatingHandler struct {
|
||||
dm discoverymapper.DiscoveryMapper
|
||||
pd *packages.PackageDiscover
|
||||
Client client.Client
|
||||
// Decoder decodes objects
|
||||
@@ -120,5 +118,5 @@ func (h *ValidatingHandler) Handle(ctx context.Context, req admission.Request) a
|
||||
// RegisterValidatingHandler will register application validate handler to the webhook
|
||||
func RegisterValidatingHandler(mgr manager.Manager, args controller.Args) {
|
||||
server := mgr.GetWebhookServer()
|
||||
server.Register("/validating-core-oam-dev-v1beta1-applications", &webhook.Admission{Handler: &ValidatingHandler{dm: args.DiscoveryMapper, pd: args.PackageDiscover}})
|
||||
server.Register("/validating-core-oam-dev-v1beta1-applications", &webhook.Admission{Handler: &ValidatingHandler{pd: args.PackageDiscover}})
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ func (h *ValidatingHandler) ValidateComponents(ctx context.Context, app *v1beta1
|
||||
var componentErrs field.ErrorList
|
||||
// try to generate an app file
|
||||
cli := &appRevBypassCacheClient{Client: h.Client}
|
||||
appParser := appfile.NewApplicationParser(cli, h.dm, h.pd)
|
||||
appParser := appfile.NewApplicationParser(cli, h.pd)
|
||||
|
||||
af, err := appParser.GenerateAppFile(ctx, app)
|
||||
if err != nil {
|
||||
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
|
||||
"github.com/crossplane/crossplane-runtime/pkg/test"
|
||||
admissionv1 "k8s.io/api/admission/v1"
|
||||
@@ -37,7 +38,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/common"
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/mock"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -207,8 +207,7 @@ var _ = Describe("ApplicationConfiguration Admission controller Test", func() {
|
||||
})
|
||||
|
||||
It("Test validating handler", func() {
|
||||
mapper := mock.NewMockDiscoveryMapper()
|
||||
var handler admission.Handler = &ValidatingHandler{Mapper: mapper}
|
||||
var handler admission.Handler = &ValidatingHandler{Client: fake.NewClientBuilder().Build()}
|
||||
decoderInjector := handler.(admission.DecoderInjector)
|
||||
decoderInjector.InjectDecoder(decoder)
|
||||
|
||||
@@ -337,7 +336,6 @@ var _ = Describe("ApplicationConfiguration Admission controller Test", func() {
|
||||
|
||||
By("reject the request for validation fails")
|
||||
var rejectHandler admission.Handler = &ValidatingHandler{
|
||||
Mapper: mapper,
|
||||
Validators: []AppConfigValidator{
|
||||
AppConfigValidateFunc(func(c context.Context, vac ValidatingAppConfig) []error {
|
||||
return []error{fmt.Errorf("validation fails")}
|
||||
|
||||
@@ -29,7 +29,6 @@ import (
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -70,8 +69,7 @@ type ValidatingTrait struct {
|
||||
}
|
||||
|
||||
// PrepareForValidation prepares data for validations to avoiding repetitive GET/unmarshal operations
|
||||
func (v *ValidatingAppConfig) PrepareForValidation(ctx context.Context, c client.Reader,
|
||||
dm discoverymapper.DiscoveryMapper, ac *v1alpha2.ApplicationConfiguration) error {
|
||||
func (v *ValidatingAppConfig) PrepareForValidation(ctx context.Context, c client.Client, ac *v1alpha2.ApplicationConfiguration) error {
|
||||
v.appConfig = *ac
|
||||
v.validatingComps = make([]ValidatingComponent, 0, len(ac.Spec.Components))
|
||||
for _, acc := range ac.Spec.Components {
|
||||
@@ -108,7 +106,7 @@ func (v *ValidatingAppConfig) PrepareForValidation(ctx context.Context, c client
|
||||
tmp.workloadContent = wl
|
||||
|
||||
// get workload definition
|
||||
wlDef, err := util.FetchWorkloadDefinition(ctx, c, dm, &wl)
|
||||
wlDef, err := util.FetchWorkloadDefinition(ctx, c, &wl)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, errFmtGetWorkloadDefinition, tmp.compName)
|
||||
}
|
||||
@@ -129,7 +127,7 @@ func (v *ValidatingAppConfig) PrepareForValidation(ctx context.Context, c client
|
||||
}
|
||||
|
||||
// get trait definition
|
||||
tDef, err := util.FetchTraitDefinition(ctx, c, dm, &tContent)
|
||||
tDef, err := util.FetchTraitDefinition(ctx, c, &tContent)
|
||||
if err != nil {
|
||||
if !k8serrors.IsNotFound(err) {
|
||||
return errors.Wrapf(err, errFmtGetTraitDefinition, tmp.compName)
|
||||
|
||||
@@ -36,7 +36,6 @@ import (
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -75,7 +74,6 @@ func (fn AppConfigValidateFunc) Validate(ctx context.Context, v ValidatingAppCon
|
||||
// ValidatingHandler handles CloneSet
|
||||
type ValidatingHandler struct {
|
||||
Client client.Client
|
||||
Mapper discoverymapper.DiscoveryMapper
|
||||
|
||||
// Decoder decodes objects
|
||||
Decoder *admission.Decoder
|
||||
@@ -138,7 +136,7 @@ func (h *ValidatingHandler) ValidateCreate(ctx context.Context, obj *v1alpha2.Ap
|
||||
var componentErrs field.ErrorList
|
||||
vAppConfig := &ValidatingAppConfig{}
|
||||
ctx = util.SetNamespaceInCtx(ctx, obj.Namespace)
|
||||
if err := vAppConfig.PrepareForValidation(ctx, h.Client, h.Mapper, obj); err != nil {
|
||||
if err := vAppConfig.PrepareForValidation(ctx, h.Client, obj); err != nil {
|
||||
klog.InfoS("failed to prepare information before validation ", " name: ", obj.Name, " errMsg: ", err.Error())
|
||||
componentErrs = append(componentErrs, field.Invalid(field.NewPath("spec"), obj.Spec,
|
||||
fmt.Sprintf("failed to prepare information before validation, err = %s", err.Error())))
|
||||
@@ -326,7 +324,6 @@ func (h *ValidatingHandler) InjectDecoder(d *admission.Decoder) error {
|
||||
func RegisterValidatingHandler(mgr manager.Manager, args controller.Args) {
|
||||
server := mgr.GetWebhookServer()
|
||||
server.Register("/validating-core-oam-dev-v1alpha2-applicationconfigurations", &webhook.Admission{Handler: &ValidatingHandler{
|
||||
Mapper: args.DiscoveryMapper,
|
||||
Validators: []AppConfigValidator{
|
||||
AppConfigValidateFunc(ValidateRevisionNameFn),
|
||||
AppConfigValidateFunc(ValidateWorkloadNameForVersioningFn),
|
||||
|
||||
@@ -20,15 +20,15 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/crossplane/crossplane-runtime/pkg/test"
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
|
||||
"github.com/crossplane/crossplane-runtime/pkg/test"
|
||||
admissionv1 "k8s.io/api/admission/v1"
|
||||
crdv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
utilpointer "k8s.io/utils/pointer"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
@@ -193,11 +193,10 @@ var _ = Describe("Component Admission controller Test", func() {
|
||||
By(fmt.Sprintf("start test : %s", testCase))
|
||||
component.Spec.Workload = runtime.RawExtension{Raw: util.JSONMarshal(test.workload)}
|
||||
injc := handler.(inject.Client)
|
||||
injc.InjectClient(test.client)
|
||||
injc.InjectClient(mock.NewClient(test.client, map[schema.GroupVersionResource][]schema.GroupVersionKind{
|
||||
schema.GroupVersionResource{Group: "example.com", Resource: "foos"}: {{Group: "example.com", Version: "v1", Kind: "Foo"}},
|
||||
}))
|
||||
mutatingHandler := handler.(*MutatingHandler)
|
||||
dm := mock.NewMockDiscoveryMapper()
|
||||
dm.MockKindsFor = mock.NewMockKindsFor("Foo", "v1")
|
||||
mutatingHandler.Mapper = dm
|
||||
err := mutatingHandler.Mutate(context.Background(), &component)
|
||||
if len(test.errMsg) == 0 {
|
||||
Expect(err).Should(BeNil())
|
||||
|
||||
@@ -35,7 +35,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
|
||||
controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
@@ -47,7 +46,6 @@ const (
|
||||
// MutatingHandler handles Component
|
||||
type MutatingHandler struct {
|
||||
Client client.Client
|
||||
Mapper discoverymapper.DiscoveryMapper
|
||||
|
||||
// Decoder decodes objects
|
||||
Decoder *admission.Decoder
|
||||
@@ -100,7 +98,7 @@ func (h *MutatingHandler) Mutate(ctx context.Context, obj *v1alpha2.Component) e
|
||||
if err := h.Client.Get(ctx, types.NamespacedName{Name: workloadType}, workloadDefinition); err != nil {
|
||||
return err
|
||||
}
|
||||
gvk, err := util.GetGVKFromDefinition(h.Mapper, workloadDefinition.Spec.Reference)
|
||||
gvk, err := util.GetGVKFromDefinition(h.Client.RESTMapper(), workloadDefinition.Spec.Reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -151,5 +149,5 @@ func (h *MutatingHandler) InjectDecoder(d *admission.Decoder) error {
|
||||
// RegisterMutatingHandler will register component mutation handler to the webhook
|
||||
func RegisterMutatingHandler(mgr manager.Manager, args controller.Args) {
|
||||
server := mgr.GetWebhookServer()
|
||||
server.Register("/mutating-core-oam-dev-v1alpha2-components", &webhook.Admission{Handler: &MutatingHandler{Mapper: args.DiscoveryMapper}})
|
||||
server.Register("/mutating-core-oam-dev-v1alpha2-components", &webhook.Admission{Handler: &MutatingHandler{}})
|
||||
}
|
||||
|
||||
@@ -34,13 +34,11 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
// MutatingHandler handles ComponentDefinition
|
||||
type MutatingHandler struct {
|
||||
Mapper discoverymapper.DiscoveryMapper
|
||||
Client client.Client
|
||||
// Decoder decodes objects
|
||||
Decoder *admission.Decoder
|
||||
@@ -89,7 +87,7 @@ func (h *MutatingHandler) Mutate(obj *v1beta1.ComponentDefinition) error {
|
||||
|
||||
if obj.Spec.Workload.Definition != (common.WorkloadGVK{}) {
|
||||
// If only Definition field exists, fill Type field according to Definition.
|
||||
defRef, err := util.ConvertWorkloadGVK2Definition(h.Mapper, obj.Spec.Workload.Definition)
|
||||
defRef, err := util.ConvertWorkloadGVK2Definition(h.Client.RESTMapper(), obj.Spec.Workload.Definition)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -146,6 +144,6 @@ func (h *MutatingHandler) InjectClient(c client.Client) error {
|
||||
func RegisterMutatingHandler(mgr manager.Manager, args controller.Args) {
|
||||
server := mgr.GetWebhookServer()
|
||||
server.Register("/mutating-core-oam-dev-v1beta1-componentdefinitions", &webhook.Admission{
|
||||
Handler: &MutatingHandler{Mapper: args.DiscoveryMapper, AutoGenWorkloadDef: args.AutoGenWorkloadDefinition},
|
||||
Handler: &MutatingHandler{AutoGenWorkloadDef: args.AutoGenWorkloadDefinition},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
"net/http"
|
||||
|
||||
admissionv1 "k8s.io/api/admission/v1"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/manager"
|
||||
"sigs.k8s.io/controller-runtime/pkg/runtime/inject"
|
||||
@@ -30,9 +31,7 @@ import (
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/common"
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
webhookutils "github.com/oam-dev/kubevela/pkg/webhook/utils"
|
||||
)
|
||||
@@ -41,8 +40,6 @@ var componentDefGVR = v1beta1.SchemeGroupVersion.WithResource("componentdefiniti
|
||||
|
||||
// ValidatingHandler handles validation of component definition
|
||||
type ValidatingHandler struct {
|
||||
Mapper discoverymapper.DiscoveryMapper
|
||||
|
||||
// Decoder decodes object
|
||||
Decoder *admission.Decoder
|
||||
Client client.Client
|
||||
@@ -73,7 +70,7 @@ func (h *ValidatingHandler) Handle(ctx context.Context, req admission.Request) a
|
||||
if err != nil {
|
||||
return admission.Errored(http.StatusBadRequest, err)
|
||||
}
|
||||
err = ValidateWorkload(h.Mapper, obj)
|
||||
err = ValidateWorkload(h.Client.RESTMapper(), obj)
|
||||
if err != nil {
|
||||
return admission.Denied(err.Error())
|
||||
}
|
||||
@@ -99,15 +96,13 @@ func (h *ValidatingHandler) InjectDecoder(d *admission.Decoder) error {
|
||||
}
|
||||
|
||||
// RegisterValidatingHandler will register ComponentDefinition validation to webhook
|
||||
func RegisterValidatingHandler(mgr manager.Manager, args controller.Args) {
|
||||
func RegisterValidatingHandler(mgr manager.Manager) {
|
||||
server := mgr.GetWebhookServer()
|
||||
server.Register("/validating-core-oam-dev-v1beta1-componentdefinitions", &webhook.Admission{Handler: &ValidatingHandler{
|
||||
Mapper: args.DiscoveryMapper,
|
||||
}})
|
||||
server.Register("/validating-core-oam-dev-v1beta1-componentdefinitions", &webhook.Admission{Handler: &ValidatingHandler{}})
|
||||
}
|
||||
|
||||
// ValidateWorkload validates whether the Workload field is valid
|
||||
func ValidateWorkload(dm discoverymapper.DiscoveryMapper, cd *v1beta1.ComponentDefinition) error {
|
||||
func ValidateWorkload(mapper meta.RESTMapper, cd *v1beta1.ComponentDefinition) error {
|
||||
|
||||
// If the Type and Definition are all empty, it will be rejected.
|
||||
if cd.Spec.Workload.Type == "" && cd.Spec.Workload.Definition == (common.WorkloadGVK{}) {
|
||||
@@ -116,7 +111,7 @@ func ValidateWorkload(dm discoverymapper.DiscoveryMapper, cd *v1beta1.ComponentD
|
||||
|
||||
// if Type and Definitiondon‘t point to the same workloaddefinition, it will be rejected.
|
||||
if cd.Spec.Workload.Type != "" && cd.Spec.Workload.Definition != (common.WorkloadGVK{}) {
|
||||
defRef, err := util.ConvertWorkloadGVK2Definition(dm, cd.Spec.Workload.Definition)
|
||||
defRef, err := util.ConvertWorkloadGVK2Definition(mapper, cd.Spec.Workload.Definition)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -31,13 +31,13 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/client-go/kubernetes/scheme"
|
||||
"k8s.io/client-go/rest"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
|
||||
|
||||
core "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"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/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
var handler ValidatingHandler
|
||||
@@ -92,13 +92,13 @@ var _ = AfterSuite(func() {
|
||||
|
||||
var _ = Describe("Test ComponentDefinition validating handler", func() {
|
||||
BeforeEach(func() {
|
||||
dm, err := discoverymapper.New(cfg)
|
||||
cli, err := client.New(cfg, client.Options{})
|
||||
Expect(err).Should(BeNil())
|
||||
reqResource = metav1.GroupVersionResource{
|
||||
Group: v1beta1.Group,
|
||||
Version: v1beta1.Version,
|
||||
Resource: "componentdefinitions"}
|
||||
handler = ValidatingHandler{Mapper: dm}
|
||||
handler = ValidatingHandler{Client: cli}
|
||||
handler.InjectDecoder(decoder)
|
||||
})
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/appfile"
|
||||
controller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
webhookutils "github.com/oam-dev/kubevela/pkg/webhook/utils"
|
||||
)
|
||||
|
||||
@@ -49,7 +48,6 @@ var traitDefGVR = v1beta1.SchemeGroupVersion.WithResource("traitdefinitions")
|
||||
// ValidatingHandler handles validation of trait definition
|
||||
type ValidatingHandler struct {
|
||||
Client client.Client
|
||||
Mapper discoverymapper.DiscoveryMapper
|
||||
|
||||
// Decoder decodes object
|
||||
Decoder *admission.Decoder
|
||||
@@ -124,7 +122,6 @@ func (h *ValidatingHandler) InjectDecoder(d *admission.Decoder) error {
|
||||
func RegisterValidatingHandler(mgr manager.Manager, args controller.Args) {
|
||||
server := mgr.GetWebhookServer()
|
||||
server.Register("/validating-core-oam-dev-v1alpha2-traitdefinitions", &webhook.Admission{Handler: &ValidatingHandler{
|
||||
Mapper: args.DiscoveryMapper,
|
||||
Validators: []TraitDefValidator{
|
||||
TraitDefValidatorFn(ValidateDefinitionReference),
|
||||
// add more validators here
|
||||
|
||||
@@ -442,7 +442,7 @@ func (wo appWorkflowStepOperator) Restart(ctx context.Context, step string) erro
|
||||
return err
|
||||
}
|
||||
}
|
||||
appParser := appfile.NewApplicationParser(wo.cli, nil, nil)
|
||||
appParser := appfile.NewApplicationParser(wo.cli, nil)
|
||||
appFile, err := appParser.GenerateAppFile(ctx, app)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to parse appfile: %w", err)
|
||||
|
||||
@@ -45,7 +45,6 @@ import (
|
||||
"github.com/kubevela/workflow/pkg/cue/packages"
|
||||
|
||||
coreoam "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
// +kubebuilder:scaffold:imports
|
||||
)
|
||||
|
||||
@@ -53,7 +52,6 @@ var cfg *rest.Config
|
||||
var scheme *runtime.Scheme
|
||||
var k8sClient client.Client
|
||||
var testEnv *envtest.Environment
|
||||
var dm discoverymapper.DiscoveryMapper
|
||||
var pd *packages.PackageDiscover
|
||||
var testns string
|
||||
var dc *discovery.DiscoveryClient
|
||||
@@ -94,9 +92,6 @@ var _ = BeforeSuite(func() {
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dc).ShouldNot(BeNil())
|
||||
|
||||
dm, err = discoverymapper.New(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(dm).ToNot(BeNil())
|
||||
pd, err = packages.NewPackageDiscover(cfg)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(pd).ToNot(BeNil())
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
|
||||
"github.com/pkg/errors"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
"github.com/kubevela/workflow/pkg/tasks/template"
|
||||
@@ -31,7 +32,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/appfile"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -79,19 +79,19 @@ func (loader *WorkflowStepLoader) LoadTemplate(ctx context.Context, name string)
|
||||
}
|
||||
|
||||
// NewWorkflowStepTemplateLoader create a task template loader.
|
||||
func NewWorkflowStepTemplateLoader(client client.Client, dm discoverymapper.DiscoveryMapper) template.Loader {
|
||||
func NewWorkflowStepTemplateLoader(client client.Client) template.Loader {
|
||||
return &WorkflowStepLoader{
|
||||
loadCapabilityDefinition: func(ctx context.Context, capName string) (*appfile.Template, error) {
|
||||
return appfile.LoadTemplate(ctx, dm, client, capName, types.TypeWorkflowStep)
|
||||
return appfile.LoadTemplate(ctx, client, capName, types.TypeWorkflowStep)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewWorkflowStepTemplateRevisionLoader create a task template loader from ApplicationRevision.
|
||||
func NewWorkflowStepTemplateRevisionLoader(rev *v1beta1.ApplicationRevision, dm discoverymapper.DiscoveryMapper) template.Loader {
|
||||
func NewWorkflowStepTemplateRevisionLoader(rev *v1beta1.ApplicationRevision, mapper meta.RESTMapper) template.Loader {
|
||||
return &WorkflowStepLoader{
|
||||
loadCapabilityDefinition: func(ctx context.Context, capName string) (*appfile.Template, error) {
|
||||
return appfile.LoadTemplateFromRevision(capName, types.TypeWorkflowStep, rev, dm)
|
||||
return appfile.LoadTemplateFromRevision(capName, types.TypeWorkflowStep, rev, mapper)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ import (
|
||||
"sigs.k8s.io/yaml"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/mock"
|
||||
)
|
||||
|
||||
func TestLoad(t *testing.T) {
|
||||
@@ -50,8 +49,7 @@ func TestLoad(t *testing.T) {
|
||||
return nil
|
||||
},
|
||||
}
|
||||
tdm := mock.NewMockDiscoveryMapper()
|
||||
loader := NewWorkflowStepTemplateLoader(cli, tdm)
|
||||
loader := NewWorkflowStepTemplateLoader(cli)
|
||||
|
||||
tmpl, err := loader.LoadTemplate(context.Background(), "builtin-apply-component")
|
||||
assert.NilError(t, err)
|
||||
|
||||
@@ -48,10 +48,6 @@ const (
|
||||
|
||||
// ApplyTerraform deploys addon resources
|
||||
func ApplyTerraform(app *v1beta1.Application, k8sClient client.Client, ioStream util.IOStreams, namespace string, args common.Args) ([]commontypes.ApplicationComponent, error) {
|
||||
dm, err := args.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pd, err := args.GetPackageDiscover()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -60,7 +56,7 @@ func ApplyTerraform(app *v1beta1.Application, k8sClient client.Client, ioStream
|
||||
// TODO(zzxwill) Need to check whether authentication credentials of a specific cloud provider are exported as environment variables, like `ALICLOUD_ACCESS_KEY`
|
||||
var nativeVelaComponents []commontypes.ApplicationComponent
|
||||
// parse template
|
||||
appParser := appfile.NewApplicationParser(k8sClient, dm, pd)
|
||||
appParser := appfile.NewApplicationParser(k8sClient, pd)
|
||||
|
||||
ctx := util2.SetNamespaceInCtx(context.Background(), namespace)
|
||||
appFile, err := appParser.GenerateAppFile(ctx, app)
|
||||
|
||||
@@ -221,10 +221,6 @@ func PrintInstalledCompDef(c common2.Args, io cmdutil.IOStreams, filter filterFu
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "get component definition list error")
|
||||
}
|
||||
dm, err := (&common2.Args{}).GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "get discovery mapper error")
|
||||
}
|
||||
|
||||
table := newUITable()
|
||||
table.AddRow("NAME", "DEFINITION", "DESCRIPTION")
|
||||
@@ -235,7 +231,7 @@ func PrintInstalledCompDef(c common2.Args, io cmdutil.IOStreams, filter filterFu
|
||||
io.Infof("error encoding definition: %s\n", cd.Name)
|
||||
continue
|
||||
}
|
||||
capa, err := ParseCapability(dm, data)
|
||||
capa, err := ParseCapability(clt.RESTMapper(), data)
|
||||
if err != nil {
|
||||
io.Errorf("error parsing capability: %s\n", cd.Name)
|
||||
continue
|
||||
|
||||
@@ -43,7 +43,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/appfile/dryrun"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
cmdutil "github.com/oam-dev/kubevela/pkg/utils/util"
|
||||
)
|
||||
@@ -120,11 +119,7 @@ func (d *debugOpts) debugApplication(ctx context.Context, wargs *WorkflowArgs, c
|
||||
return d.debugWorkflow(ctx, wargs, cli, pd, ioStreams)
|
||||
}
|
||||
|
||||
dm, err := discoverymapper.New(config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dryRunOpt := dryrun.NewDryRunOption(cli, config, dm, pd, []oam.Object{}, false)
|
||||
dryRunOpt := dryrun.NewDryRunOption(cli, config, pd, []oam.Object{}, false)
|
||||
comps, _, err := dryRunOpt.ExecuteDryRun(ctx, app)
|
||||
if err != nil {
|
||||
ioStreams.Info(color.RedString("%s%s", emojiFail, err.Error()))
|
||||
|
||||
@@ -42,7 +42,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/appfile/dryrun"
|
||||
pkgdef "github.com/oam-dev/kubevela/pkg/definition"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
oamutil "github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/pkg/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
@@ -158,12 +157,8 @@ func DryRunApplication(cmdOption *DryRunCmdOptions, c common.Args, namespace str
|
||||
if err != nil {
|
||||
return buff, err
|
||||
}
|
||||
dm, err := discoverymapper.New(config)
|
||||
if err != nil {
|
||||
return buff, err
|
||||
}
|
||||
|
||||
dryRunOpt := dryrun.NewDryRunOption(newClient, config, dm, pd, objs, false)
|
||||
dryRunOpt := dryrun.NewDryRunOption(newClient, config, pd, objs, false)
|
||||
ctx := oamutil.SetNamespaceInCtx(context.Background(), namespace)
|
||||
|
||||
// Perform validation only if not in offline mode
|
||||
|
||||
@@ -30,7 +30,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/appfile/dryrun"
|
||||
"github.com/oam-dev/kubevela/pkg/oam"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
cmdutil "github.com/oam-dev/kubevela/pkg/utils/util"
|
||||
)
|
||||
@@ -117,11 +116,7 @@ func LiveDiffApplication(cmdOption *LiveDiffCmdOptions, c common.Args) (bytes.Bu
|
||||
if err != nil {
|
||||
return buff, err
|
||||
}
|
||||
dm, err := discoverymapper.New(config)
|
||||
if err != nil {
|
||||
return buff, err
|
||||
}
|
||||
liveDiffOption := dryrun.NewLiveDiffOption(newClient, config, dm, pd, objs)
|
||||
liveDiffOption := dryrun.NewLiveDiffOption(newClient, config, pd, objs)
|
||||
if cmdOption.ApplicationFile == "" {
|
||||
return cmdOption.renderlessDiff(newClient, liveDiffOption)
|
||||
}
|
||||
|
||||
@@ -33,11 +33,11 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
"golang.org/x/oauth2"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"sigs.k8s.io/yaml"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/system"
|
||||
cmdutil "github.com/oam-dev/kubevela/pkg/utils/util"
|
||||
@@ -582,11 +582,11 @@ func (l LocalRegistry) ListCaps() ([]types.Capability, error) {
|
||||
}
|
||||
|
||||
func (item RegistryFile) toCapability() (types.Capability, error) {
|
||||
dm, err := (&common.Args{}).GetDiscoveryMapper()
|
||||
cli, err := (&common.Args{}).GetClient()
|
||||
if err != nil {
|
||||
return types.Capability{}, err
|
||||
}
|
||||
capability, err := ParseCapability(dm, item.data)
|
||||
capability, err := ParseCapability(cli.RESTMapper(), item.data)
|
||||
if err != nil {
|
||||
return types.Capability{}, err
|
||||
}
|
||||
@@ -736,7 +736,7 @@ func StoreRepos(registries []apis.RegistryConfig) error {
|
||||
}
|
||||
|
||||
// ParseCapability will convert config from remote center to capability
|
||||
func ParseCapability(mapper discoverymapper.DiscoveryMapper, data []byte) (types.Capability, error) {
|
||||
func ParseCapability(mapper meta.RESTMapper, data []byte) (types.Capability, error) {
|
||||
var obj = unstructured.Unstructured{Object: make(map[string]interface{})}
|
||||
err := yaml.Unmarshal(data, &obj.Object)
|
||||
if err != nil {
|
||||
|
||||
@@ -134,11 +134,6 @@ func getRevision(ctx context.Context, c common.Args, format string, out io.Write
|
||||
return err
|
||||
}
|
||||
|
||||
dm, err := c.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pd, err := c.GetPackageDiscover()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -154,7 +149,7 @@ func getRevision(ctx context.Context, c common.Args, format string, out io.Write
|
||||
return fmt.Errorf(fmt.Sprintf("Unable to get application revision %s in namespace %s", name, namespace))
|
||||
}
|
||||
|
||||
queryValue, err := velaql.NewViewHandler(cli, kubeConfig, dm, pd).QueryView(ctx, query)
|
||||
queryValue, err := velaql.NewViewHandler(cli, kubeConfig, pd).QueryView(ctx, query)
|
||||
if err != nil {
|
||||
klog.Errorf("fail to query the view %s", err.Error())
|
||||
return fmt.Errorf(fmt.Sprintf("Unable to get application revision %s in namespace %s", name, namespace))
|
||||
|
||||
@@ -207,16 +207,11 @@ func startReferenceDocsSite(ctx context.Context, ns string, c common.Args, ioStr
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dm, err := c.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ref := &docgen.MarkdownReference{
|
||||
ParseReference: docgen.ParseReference{
|
||||
Client: cli,
|
||||
I18N: &docgen.En,
|
||||
},
|
||||
DiscoveryMapper: dm,
|
||||
}
|
||||
|
||||
if err := ref.CreateMarkdown(ctx, capabilities, docsPath, true, pd); err != nil {
|
||||
@@ -476,10 +471,6 @@ func ShowReferenceMarkdown(ctx context.Context, c common.Args, ioStreams cmdutil
|
||||
return err
|
||||
}
|
||||
ref.ParseReference = paserRef
|
||||
ref.DiscoveryMapper, err = c.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := ref.GenerateReferenceDocs(ctx, c, outputPath); err != nil {
|
||||
return errors.Wrap(err, "failed to generate reference docs")
|
||||
}
|
||||
|
||||
@@ -48,7 +48,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
pkgappfile "github.com/oam-dev/kubevela/pkg/appfile"
|
||||
"github.com/oam-dev/kubevela/pkg/multicluster"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/policy"
|
||||
"github.com/oam-dev/kubevela/pkg/resourcetracker"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
@@ -485,10 +484,6 @@ func printApplicationTree(c common.Args, cmd *cobra.Command, appName string, app
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dm, err := discoverymapper.New(config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app, err := loadRemoteApplication(cli, appNs, appName)
|
||||
if err != nil {
|
||||
@@ -506,7 +501,7 @@ func printApplicationTree(c common.Args, cmd *cobra.Command, appName string, app
|
||||
}
|
||||
|
||||
var placements []v1alpha1.PlacementDecision
|
||||
af, err := pkgappfile.NewApplicationParser(cli, dm, pd).GenerateAppFile(context.Background(), app)
|
||||
af, err := pkgappfile.NewApplicationParser(cli, pd).GenerateAppFile(context.Background(), app)
|
||||
if err == nil {
|
||||
placements, _ = policy.GetPlacementsFromTopologyPolicies(context.Background(), cli, app.GetNamespace(), af.Policies, true)
|
||||
}
|
||||
|
||||
@@ -198,12 +198,8 @@ func InstallTraitByNameFromRegistry(args common2.Args, ioStream cmdutil.IOStream
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mapper, err := args.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = common.InstallTraitDefinition(k8sClient, mapper, data, ioStream, &capObj)
|
||||
err = common.InstallTraitDefinition(k8sClient, data, ioStream, &capObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -222,10 +218,6 @@ func PrintInstalledTraitDef(c common2.Args, io cmdutil.IOStreams, filter filterF
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "get trait definition list error")
|
||||
}
|
||||
dm, err := (&common2.Args{}).GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "get discovery mapper error")
|
||||
}
|
||||
|
||||
table := newUITable()
|
||||
table.AddRow("NAME", "APPLIES-TO")
|
||||
@@ -237,7 +229,7 @@ func PrintInstalledTraitDef(c common2.Args, io cmdutil.IOStreams, filter filterF
|
||||
io.Infof("error encoding definition: %s\n", td.Name)
|
||||
continue
|
||||
}
|
||||
capa, err := ParseCapability(dm, data)
|
||||
capa, err := ParseCapability(clt.RESTMapper(), data)
|
||||
if err != nil {
|
||||
io.Errorf("error parsing capability: %s (message: %s)\n", td.Name, err.Error())
|
||||
continue
|
||||
|
||||
@@ -355,10 +355,6 @@ func setFilterParams(f Filter, params map[string]string) {
|
||||
|
||||
// QueryValue get queryValue from velaQL
|
||||
func QueryValue(ctx context.Context, velaC common.Args, queryView *velaql.QueryView) (*value.Value, error) {
|
||||
dm, err := velaC.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pd, err := velaC.GetPackageDiscover()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -371,7 +367,7 @@ func QueryValue(ctx context.Context, velaC common.Args, queryView *velaql.QueryV
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
queryValue, err := velaql.NewViewHandler(client, config, dm, pd).QueryView(ctx, *queryView)
|
||||
queryValue, err := velaql.NewViewHandler(client, config, pd).QueryView(ctx, *queryView)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ import (
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
cmdutil "github.com/oam-dev/kubevela/pkg/utils/util"
|
||||
)
|
||||
@@ -60,7 +59,7 @@ func InstallComponentDefinition(client client.Client, componentData []byte, ioSt
|
||||
}
|
||||
|
||||
// InstallTraitDefinition will add a trait into K8s cluster and install it's controller
|
||||
func InstallTraitDefinition(client client.Client, mapper discoverymapper.DiscoveryMapper, traitdata []byte, ioStreams cmdutil.IOStreams, cap *types.Capability) error {
|
||||
func InstallTraitDefinition(client client.Client, traitdata []byte, ioStreams cmdutil.IOStreams, cap *types.Capability) error {
|
||||
var td v1beta1.TraitDefinition
|
||||
var err error
|
||||
if err = yaml.Unmarshal(traitdata, &td); err != nil {
|
||||
@@ -68,7 +67,7 @@ func InstallTraitDefinition(client client.Client, mapper discoverymapper.Discove
|
||||
}
|
||||
td.Namespace = types.DefaultKubeVelaNS
|
||||
ioStreams.Info("Installing trait " + td.Name)
|
||||
gvk, err := util.GetGVKFromDefinition(mapper, td.Spec.Reference)
|
||||
gvk, err := util.GetGVKFromDefinition(client.RESTMapper(), td.Spec.Reference)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
|
||||
"github.com/pkg/errors"
|
||||
kerrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
@@ -37,7 +38,6 @@ import (
|
||||
"github.com/oam-dev/kubevela/pkg/appfile"
|
||||
"github.com/oam-dev/kubevela/pkg/cue"
|
||||
"github.com/oam-dev/kubevela/pkg/definition"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
"github.com/oam-dev/kubevela/pkg/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
@@ -155,16 +155,11 @@ func GetComponentsFromClusterWithValidateOption(ctx context.Context, namespace s
|
||||
|
||||
var templateErrors []error
|
||||
for _, cd := range componentsDefs.Items {
|
||||
dm, err := c.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
defRef := commontypes.DefinitionReference{
|
||||
Name: cd.Spec.Workload.Type,
|
||||
}
|
||||
if cd.Spec.Workload.Type != types.AutoDetectWorkloadDefinition {
|
||||
defRef, err = util.ConvertWorkloadGVK2Definition(dm, cd.Spec.Workload.Definition)
|
||||
defRef, err = util.ConvertWorkloadGVK2Definition(newClient.RESTMapper(), cd.Spec.Workload.Definition)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
@@ -176,7 +171,7 @@ func GetComponentsFromClusterWithValidateOption(ctx context.Context, namespace s
|
||||
continue
|
||||
}
|
||||
if validateFlag && defRef.Name != types.AutoDetectWorkloadDefinition {
|
||||
if err = validateCapabilities(tmp, dm, cd.Name, defRef); err != nil {
|
||||
if err = validateCapabilities(tmp, newClient.RESTMapper(), cd.Name, defRef); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
@@ -196,14 +191,6 @@ func GetTraitsFromClusterWithValidateOption(ctx context.Context, namespace strin
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
config, err := c.GetConfig()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
dm, err := discoverymapper.New(config)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
var templates []types.Capability
|
||||
var traitDefs v1beta1.TraitDefinitionList
|
||||
err = newClient.List(ctx, &traitDefs, &client.ListOptions{Namespace: namespace, LabelSelector: selector})
|
||||
@@ -227,7 +214,7 @@ func GetTraitsFromClusterWithValidateOption(ctx context.Context, namespace strin
|
||||
}
|
||||
tmp.Namespace = namespace
|
||||
if validateFlag {
|
||||
if err = validateCapabilities(tmp, dm, td.Name, td.Spec.Reference); err != nil {
|
||||
if err = validateCapabilities(tmp, newClient.RESTMapper(), td.Name, td.Spec.Reference); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
@@ -298,9 +285,9 @@ func GetPolicies(ctx context.Context, namespace string, c common.Args) ([]types.
|
||||
}
|
||||
|
||||
// validateCapabilities validates whether GVK are successfully retrieved.
|
||||
func validateCapabilities(tmp *types.Capability, dm discoverymapper.DiscoveryMapper, definitionName string, reference commontypes.DefinitionReference) error {
|
||||
func validateCapabilities(tmp *types.Capability, mapper meta.RESTMapper, definitionName string, reference commontypes.DefinitionReference) error {
|
||||
var err error
|
||||
gvk, err := util.GetGVKFromDefinition(dm, reference)
|
||||
gvk, err := util.GetGVKFromDefinition(mapper, reference)
|
||||
if err != nil {
|
||||
errMsg := err.Error()
|
||||
var substr = "no matches for "
|
||||
@@ -451,11 +438,7 @@ func GetCapabilityByName(ctx context.Context, c common.Args, capabilityName stri
|
||||
if componentDef.Spec.Workload.Type == types.AutoDetectWorkloadDefinition {
|
||||
refName = types.AutoDetectWorkloadDefinition
|
||||
} else {
|
||||
dm, err := c.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ref, err := util.ConvertWorkloadGVK2Definition(dm, componentDef.Spec.Workload.Definition)
|
||||
ref, err := util.ConvertWorkloadGVK2Definition(newClient.RESTMapper(), componentDef.Spec.Workload.Definition)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -548,11 +531,7 @@ func GetCapabilityFromDefinitionRevision(ctx context.Context, c common.Args, pd
|
||||
if componentDef.Spec.Workload.Type == types.AutoDetectWorkloadDefinition {
|
||||
refName = types.AutoDetectWorkloadDefinition
|
||||
} else {
|
||||
dm, err := c.GetDiscoveryMapper()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ref, err := util.ConvertWorkloadGVK2Definition(dm, componentDef.Spec.Workload.Definition)
|
||||
ref, err := util.ConvertWorkloadGVK2Definition(k8sClient.RESTMapper(), componentDef.Spec.Workload.Definition)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package docgen
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
|
||||
@@ -26,12 +27,11 @@ import (
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/util"
|
||||
)
|
||||
|
||||
// ParseCapabilityFromUnstructured will convert Unstructured to Capability
|
||||
func ParseCapabilityFromUnstructured(mapper discoverymapper.DiscoveryMapper, pd *packages.PackageDiscover, obj unstructured.Unstructured) (types.Capability, error) {
|
||||
func ParseCapabilityFromUnstructured(mapper meta.RESTMapper, pd *packages.PackageDiscover, obj unstructured.Unstructured) (types.Capability, error) {
|
||||
var err error
|
||||
switch obj.GetKind() {
|
||||
case "ComponentDefinition":
|
||||
|
||||
@@ -32,7 +32,6 @@ import (
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/cue"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
)
|
||||
|
||||
@@ -45,7 +44,6 @@ type MarkdownReference struct {
|
||||
AllInOne bool
|
||||
ForceExample bool
|
||||
CustomDocHeader string
|
||||
DiscoveryMapper discoverymapper.DiscoveryMapper
|
||||
ParseReference
|
||||
}
|
||||
|
||||
@@ -173,7 +171,7 @@ func (ref *MarkdownReference) GenerateMarkdownForCap(ctx context.Context, c type
|
||||
}
|
||||
if c.Type == types.TypeComponentDefinition {
|
||||
var warnErr error
|
||||
baseDoc, warnErr = GetBaseResourceKinds(c.CueTemplate, pd, ref.DiscoveryMapper)
|
||||
baseDoc, warnErr = GetBaseResourceKinds(c.CueTemplate, pd, ref.Client.RESTMapper())
|
||||
if warnErr != nil {
|
||||
klog.Warningf("failed to get base resource kinds for %s: %v", c.Name, warnErr)
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import (
|
||||
"github.com/crossplane/crossplane-runtime/pkg/test"
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
|
||||
"github.com/oam-dev/kubevela/apis/types"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
@@ -42,7 +43,7 @@ func TestCreateMarkdownForCUE(t *testing.T) {
|
||||
|
||||
time.Sleep(time.Millisecond)
|
||||
|
||||
mr := MarkdownReference{}
|
||||
mr := MarkdownReference{ParseReference: ParseReference{Client: fake.NewClientBuilder().Build()}}
|
||||
mr.Local = &FromLocal{Paths: []string{"./testdata/testdef.cue"}}
|
||||
capp, err := ParseLocalFile(mr.Local.Paths[0], common.Args{})
|
||||
assert.NoError(t, err)
|
||||
|
||||
@@ -34,10 +34,12 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
"github.com/rogpeppe/go-internal/modfile"
|
||||
v1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/klog/v2"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
"sigs.k8s.io/yaml"
|
||||
|
||||
"github.com/kubevela/workflow/pkg/cue/model/value"
|
||||
@@ -49,7 +51,6 @@ import (
|
||||
velacue "github.com/oam-dev/kubevela/pkg/cue"
|
||||
velaprocess "github.com/oam-dev/kubevela/pkg/cue/process"
|
||||
pkgdef "github.com/oam-dev/kubevela/pkg/definition"
|
||||
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
|
||||
pkgUtils "github.com/oam-dev/kubevela/pkg/utils"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/common"
|
||||
"github.com/oam-dev/kubevela/pkg/utils/terraform"
|
||||
@@ -687,9 +688,13 @@ func ParseLocalFile(localFilePath string, c common.Args) (*types.Capability, err
|
||||
if err != nil {
|
||||
klog.Warning("fail to build package discover, use local info instead", err)
|
||||
}
|
||||
mapper, err := c.GetDiscoveryMapper()
|
||||
cli, err := c.GetClient()
|
||||
if err != nil {
|
||||
klog.Warning("fail to build discover mapper, use local info instead", err)
|
||||
klog.Warning("fail to build client, use local info instead", err)
|
||||
}
|
||||
mapper := fake.NewClientBuilder().Build().RESTMapper()
|
||||
if cli != nil {
|
||||
mapper = cli.RESTMapper()
|
||||
}
|
||||
lcap, err := ParseCapabilityFromUnstructured(mapper, pd, def.Unstructured)
|
||||
if err != nil {
|
||||
@@ -748,7 +753,7 @@ func WalkParameterSchema(parameters *openapi3.Schema, name string, depth int) {
|
||||
}
|
||||
|
||||
// GetBaseResourceKinds helps get resource.group string of components' base resource
|
||||
func GetBaseResourceKinds(cueStr string, pd *packages.PackageDiscover, dm discoverymapper.DiscoveryMapper) (string, error) {
|
||||
func GetBaseResourceKinds(cueStr string, pd *packages.PackageDiscover, mapper meta.RESTMapper) (string, error) {
|
||||
t, err := value.NewValue(cueStr+velacue.BaseTemplate, pd, "")
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "failed to parse base template")
|
||||
@@ -769,11 +774,8 @@ func GetBaseResourceKinds(cueStr string, pd *packages.PackageDiscover, dm discov
|
||||
if len(GroupAndVersion) == 1 {
|
||||
GroupAndVersion = append([]string{""}, GroupAndVersion...)
|
||||
}
|
||||
gvr, err := dm.ResourcesFor(schema.GroupVersionKind{
|
||||
Group: GroupAndVersion[0],
|
||||
Version: GroupAndVersion[1],
|
||||
Kind: kind,
|
||||
})
|
||||
mapping, err := mapper.RESTMapping(schema.GroupKind{Group: GroupAndVersion[0], Kind: kind}, GroupAndVersion[1])
|
||||
gvr := mapping.Resource
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user