From 02bb9a1dc1a8d5aa65d09a5ef33b7e2285f3383e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E5=85=83?= Date: Wed, 30 Dec 2020 14:19:45 +0800 Subject: [PATCH] refine error message: trait definition not found --- .../application/application_controller.go | 2 +- .../v1alpha2/application/parser/service.go | 18 +++-- .../application/parser/service_test.go | 2 +- .../v1alpha2/application/template/template.go | 65 +++++++++---------- .../application/template/template_test.go | 8 +-- .../application/validating_handler.go | 2 +- 6 files changed, 44 insertions(+), 53 deletions(-) diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/application_controller.go b/pkg/controller/core.oam.dev/v1alpha2/application/application_controller.go index cd3f1be3b..a9eea06bb 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/application_controller.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/application_controller.go @@ -74,7 +74,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (result ctrl.Result, gerr error applog.Info("parse template") // parse template - appParser := parser.NewParser(template.GetHanler(fclient.NewDefinitionClient(r.Client))) + appParser := parser.NewParser(template.GetHandler(fclient.NewDefinitionClient(r.Client))) appfile, err := appParser.Parse(app.Name, app) diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/parser/service.go b/pkg/controller/core.oam.dev/v1alpha2/application/parser/service.go index 088bf36ad..3e107ed05 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/parser/service.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/parser/service.go @@ -8,6 +8,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" + "github.com/oam-dev/kubevela/apis/types" "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/application/template" "github.com/oam-dev/kubevela/pkg/dsl/definition" "github.com/oam-dev/kubevela/pkg/dsl/process" @@ -183,13 +184,10 @@ func (pser *Parser) parseWorkload(comp v1alpha2.ApplicationComponent) (*Workload workload.traits = []*Trait{} workload.name = comp.Name workload.typ = comp.WorkloadType - templ, kind, err := pser.templ(workload.typ) + templ, err := pser.templ(workload.typ, types.TypeWorkload) if err != nil && !kerrors.IsNotFound(err) { return nil, errors.WithMessagef(err, "fetch type of %s", comp.Name) } - if kind != template.WorkloadKind { - return nil, errors.Errorf("%s type (%s) invalid", comp.Name, workload.typ) - } workload.template = templ settings, err := DecodeJSONMarshaler(comp.Settings) if err != nil { @@ -214,14 +212,14 @@ func (pser *Parser) parseWorkload(comp v1alpha2.ApplicationComponent) (*Workload } func (pser *Parser) parseTrait(name string, properties map[string]interface{}) (*Trait, error) { - - templ, kind, err := pser.templ(name) - if err != nil && !kerrors.IsNotFound(err) { + templ, err := pser.templ(name, types.TypeTrait) + if kerrors.IsNotFound(err) { + return nil, errors.Errorf("trait definition of %s not found", name) + } + if err != nil { return nil, err } - if kind != template.TraitKind { - return nil, errors.Errorf("kind of %s is not trait", name) - } + trait := new(Trait) trait.template = templ trait.name = name diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/parser/service_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/parser/service_test.go index 672ff370d..c06bcb59c 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/parser/service_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/parser/service_test.go @@ -116,7 +116,7 @@ spec: o := v1alpha2.Application{} yaml.Unmarshal([]byte(appfileYaml), &o) - appfile, err := NewParser(template.GetHanler(mock)).Parse("test", &o) + appfile, err := NewParser(template.GetHandler(mock)).Parse("test", &o) if err != nil { t.Error(err) return diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/template/template.go b/pkg/controller/core.oam.dev/v1alpha2/application/template/template.go index ee82a85b9..73d3c3b43 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/template/template.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/template/template.go @@ -4,6 +4,8 @@ import ( "encoding/json" "fmt" + "github.com/oam-dev/kubevela/apis/types" + "github.com/pkg/errors" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -14,8 +16,8 @@ type manager struct { defclient.DefinitionClient } -// GetHanler get template handler -func GetHanler(cli defclient.DefinitionClient) Handler { +// GetHandler get template handler +func GetHandler(cli defclient.DefinitionClient) Handler { m := &manager{ DefinitionClient: cli, } @@ -23,51 +25,46 @@ func GetHanler(cli defclient.DefinitionClient) Handler { } // Handler is template handler type -type Handler func(key string) (string, Kind, error) +type Handler func(key string, kind types.CapType) (string, error) // Kind is template kind -type Kind uint16 - -const ( - // WorkloadKind ... - WorkloadKind Kind = (1 << iota) - // TraitKind ... - TraitKind - // Unkownkind ... - Unkownkind -) +type Kind = types.CapType // LoadTemplate Get template according to key -func (m *manager) LoadTemplate(key string) (string, Kind, error) { - wd, err := m.GetWorkloadDefinition(key) - if err != nil && !kerrors.IsNotFound(err) { - return "", Unkownkind, errors.WithMessagef(err, "LoadTemplate [%s] ", key) - } - if wd != nil { +func (m *manager) LoadTemplate(key string, kd types.CapType) (string, error) { + switch kd { + case types.TypeWorkload: + wd, err := m.GetWorkloadDefinition(key) + if err != nil { + return "", errors.WithMessagef(err, "LoadTemplate [%s] ", key) + } jsonRaw, err := getTemplate(wd.Spec.Extension.Raw) if err != nil { - return "", Unkownkind, errors.WithMessagef(err, "LoadTemplate [%s] ", key) + return "", errors.WithMessagef(err, "LoadTemplate [%s] ", key) } - if jsonRaw != "" { - return jsonRaw, WorkloadKind, nil + if jsonRaw == "" { + return "", errors.New("no template found in definition") + } + return jsonRaw, nil + + case types.TypeTrait: + td, err := m.GetTraitDefition(key) + if err != nil && !kerrors.IsNotFound(err) { + return "", errors.WithMessagef(err, "LoadTemplate [%s] ", key) } - } - td, err := m.GetTraitDefition(key) - if err != nil && !kerrors.IsNotFound(err) { - return "", Unkownkind, errors.WithMessagef(err, "LoadTemplate [%s] ", key) - } - if td != nil { jsonRaw, err := getTemplate(td.Spec.Extension.Raw) if err != nil { - return "", Unkownkind, errors.WithMessagef(err, "LoadTemplate [%s] ", key) + return "", errors.WithMessagef(err, "LoadTemplate [%s] ", key) } - - if jsonRaw != "" { - return jsonRaw, TraitKind, nil + if jsonRaw == "" { + return "", errors.New("no template found in definition") } - + return jsonRaw, nil + case types.TypeScope: + // TODO: add scope template support } - return "", Unkownkind, nil + + return "", fmt.Errorf("kind(%s) of %s not supported", kd, key) } func getTemplate(raw []byte) (string, error) { diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/template/template_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/template/template_test.go index a9b654e5f..d8d4c7e68 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/template/template_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/template/template_test.go @@ -5,6 +5,7 @@ import ( "cuelang.org/go/cue" + "github.com/oam-dev/kubevela/apis/types" "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2/application/defclient" ) @@ -78,16 +79,11 @@ spec: m := manager{ mock, } - temp, kind, err := m.LoadTemplate("worker") + temp, err := m.LoadTemplate("worker", types.TypeWorkload) if err != nil { t.Error(err) return } - if kind != WorkloadKind { - t.Errorf("template.LoadTemplate kind invalid") - return - } - var r cue.Runtime inst, err := r.Compile("-", temp) if err != nil { diff --git a/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go b/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go index 8dab58fa5..cfea8b925 100644 --- a/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go +++ b/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go @@ -59,7 +59,7 @@ func (h *ValidatingHandler) Handle(ctx context.Context, req admission.Request) a } // try render to validate - appParser := parser.NewParser(template.GetHanler(fclient.NewDefinitionClient(h.Client))) + appParser := parser.NewParser(template.GetHandler(fclient.NewDefinitionClient(h.Client))) if _, err := appParser.Parse(app.Name, app); err != nil { return admission.Denied(err.Error()) }