Chore: remove dm (#6036)

Signed-off-by: Somefive <yd219913@alibaba-inc.com>
This commit is contained in:
Somefive
2023-05-25 13:54:35 +08:00
committed by GitHub
parent 4d81ba8909
commit ef4bb07fb3
82 changed files with 287 additions and 1053 deletions
-7
View File
@@ -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")
+2 -7
View File
@@ -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") {
+4
View File
@@ -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") {
+4 -3
View File
@@ -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
+3
View File
@@ -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
-6
View File
@@ -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())
+3 -4
View File
@@ -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
+2 -2
View File
@@ -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)
+4 -6
View File
@@ -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
+2 -7
View File
@@ -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
View File
@@ -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
View File
@@ -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), &notfound)
Expect(err).ShouldNot(HaveOccurred())
_, err = NewApplicationParser(&tclient, dm, pd).GenerateAppFile(context.TODO(), &notfound)
_, err = NewApplicationParser(&tclient, pd).GenerateAppFile(context.TODO(), &notfound)
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))
-5
View File
@@ -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())
+7 -7
View File
@@ -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)
}
+6 -11
View File
@@ -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),
}
@@ -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(),
@@ -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")
@@ -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)
@@ -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,
},
@@ -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())
@@ -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 {
@@ -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)
@@ -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,
},
@@ -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,
},
@@ -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)
+5 -7
View File
@@ -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
}
-141
View File
@@ -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
}
-331
View File
@@ -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())
})
})
+82
View File
@@ -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)
}
-114
View File
@@ -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
View File
@@ -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
View File
@@ -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)
-5
View File
@@ -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())
-20
View File
@@ -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 {
+1 -4
View File
@@ -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
View File
@@ -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,
}
+3 -3
View File
@@ -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 Definitiondont 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
+1 -1
View File
@@ -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)
-5
View File
@@ -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())
+5 -5
View File
@@ -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)
},
}
}
+1 -3
View File
@@ -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)
+1 -5
View File
@@ -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)
+1 -5
View File
@@ -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
+1 -6
View File
@@ -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()))
+1 -6
View File
@@ -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
+1 -6
View File
@@ -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)
}
+4 -4
View File
@@ -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 {
+1 -6
View File
@@ -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))
-9
View File
@@ -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")
}
+1 -6
View File
@@ -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)
}
+2 -10
View File
@@ -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
+1 -5
View File
@@ -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
}
+2 -3
View File
@@ -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
}
+8 -29
View File
@@ -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
}
+2 -2
View File
@@ -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":
+1 -3
View File
@@ -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)
}
+2 -1
View File
@@ -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)
+11 -9
View File
@@ -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
}