From 762939968376271fcae13009a0a5f70260d6c7b2 Mon Sep 17 00:00:00 2001 From: roy wang Date: Fri, 29 Jan 2021 11:00:37 +0900 Subject: [PATCH] allow traitDefinition to omit definitionRef Signed-off-by: roy wang --- e2e/capability/capability_test.go | 15 ++++++++ pkg/oam/util/helper.go | 5 +++ pkg/oam/util/helper_test.go | 16 ++++++++ pkg/plugins/testdata/ingressDef.yaml | 57 ++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 pkg/plugins/testdata/ingressDef.yaml diff --git a/e2e/capability/capability_test.go b/e2e/capability/capability_test.go index 3d30e2098..2196c19f7 100644 --- a/e2e/capability/capability_test.go +++ b/e2e/capability/capability_test.go @@ -26,6 +26,11 @@ var ( Name: "routes.test", Type: types.TypeTrait, } + + ingressCapability = types.Capability{ + Name: "ingress.test", + Type: types.TypeTrait, + } ) // TODO: chagne this into a mock UT to avoid remote call. @@ -63,6 +68,16 @@ var _ = ginkgo.Describe("Capability", func() { gomega.Expect(output).To(gomega.ContainSubstring(expectedSubStr2)) }) + ginkgo.It("install a trait without definition reference to cluster", func() { + cli := fmt.Sprintf("vela cap add %s/%s", capabilityCenterBasic.Name, ingressCapability.Name) + output, err := e2e.Exec(cli) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + expectedSubStr1 := fmt.Sprintf("Installing %s capability", ingressCapability.Type) + expectedSubStr2 := fmt.Sprintf("Successfully installed capability %s from %s", ingressCapability.Name, capabilityCenterBasic.Name) + gomega.Expect(output).To(gomega.ContainSubstring(expectedSubStr1)) + gomega.Expect(output).To(gomega.ContainSubstring(expectedSubStr2)) + }) + ginkgo.It("list all capabilities", func() { cli := fmt.Sprintf("vela cap ls %s", capabilityCenterBasic.Name) output, err := e2e.Exec(cli) diff --git a/pkg/oam/util/helper.go b/pkg/oam/util/helper.go index da37206b0..5d50c3a7e 100644 --- a/pkg/oam/util/helper.go +++ b/pkg/oam/util/helper.go @@ -334,6 +334,11 @@ func GetDefinitionName(dm discoverymapper.DiscoveryMapper, u *unstructured.Unstr // GetGVKFromDefinition help get Group Version Kind from DefinitionReference func GetGVKFromDefinition(dm discoverymapper.DiscoveryMapper, definitionRef v1alpha2.DefinitionReference) (schema.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 { + return schema.EmptyObjectKind.GroupVersionKind(), nil + } var gvk schema.GroupVersionKind groupResource := schema.ParseGroupResource(definitionRef.Name) gvr := schema.GroupVersionResource{Group: groupResource.Group, Resource: groupResource.Resource, Version: definitionRef.Version} diff --git a/pkg/oam/util/helper_test.go b/pkg/oam/util/helper_test.go index 5bf6da5a6..6621a48cf 100644 --- a/pkg/oam/util/helper_test.go +++ b/pkg/oam/util/helper_test.go @@ -792,6 +792,22 @@ func TestGetGVKFromDef(t *testing.T) { Version: "v2", Kind: "Abc", }, gvk) + + gvk, err = util.GetGVKFromDefinition(mapper, v1alpha2.DefinitionReference{}) + assert.NoError(t, err) + assert.Equal(t, schema.GroupVersionKind{ + Group: "", + Version: "", + Kind: "", + }, gvk) + + gvk, err = util.GetGVKFromDefinition(mapper, v1alpha2.DefinitionReference{Name: "dummy"}) + assert.NoError(t, err) + assert.Equal(t, schema.GroupVersionKind{ + Group: "", + Version: "", + Kind: "", + }, gvk) } func TestGenTraitName(t *testing.T) { diff --git a/pkg/plugins/testdata/ingressDef.yaml b/pkg/plugins/testdata/ingressDef.yaml new file mode 100644 index 000000000..ca6695069 --- /dev/null +++ b/pkg/plugins/testdata/ingressDef.yaml @@ -0,0 +1,57 @@ +apiVersion: core.oam.dev/v1alpha2 +kind: TraitDefinition +metadata: + name: ingress.test +spec: + appliesToWorkloads: + - webservice + - worker + extension: + template: | + parameter: { + domain: string + http: [string]: int + } + + // trait template can have multiple outputs in one trait + outputs: service: { + apiVersion: "v1" + kind: "Service" + metadata: + name: context.name + spec: { + selector: + "app.oam.dev/component": context.name + ports: [ + for k, v in parameter.http { + port: v + targetPort: v + }, + ] + } + } + + outputs: ingress: { + apiVersion: "networking.k8s.io/v1beta1" + kind: "Ingress" + metadata: + name: context.name + spec: { + rules: [{ + host: parameter.domain + http: { + paths: [ + for k, v in parameter.http { + path: k + backend: { + serviceName: context.name + servicePort: v + } + }, + ] + } + }] + } + } + +