From 16c41098eb86ba27ecd2154d5bdd913b36e11018 Mon Sep 17 00:00:00 2001 From: Zheng Xi Zhou Date: Fri, 31 Jul 2020 10:27:19 +0800 Subject: [PATCH] Change type of xxxDefinition.spec.extension to `runtime.RawExtension` (#153) * Change type of xxxDefinition.spec.extension to `runtime.RawExtension` When listing xxxDefinitionList, it will hit the error `Object 'Kind' is missing` if the type is `unstructured.Unstructured` Signed-off-by: zzxwill Co-authored-by: Sun Jianbo --- apis/core/v1alpha2/core_types.go | 7 ++--- apis/core/v1alpha2/zz_generated.deepcopy.go | 9 ++++-- test/e2e-test/suite_test.go | 32 +++++++++++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/apis/core/v1alpha2/core_types.go b/apis/core/v1alpha2/core_types.go index 5ec3511c..de85fece 100644 --- a/apis/core/v1alpha2/core_types.go +++ b/apis/core/v1alpha2/core_types.go @@ -19,7 +19,6 @@ package v1alpha2 import ( runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1" 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/util/intstr" ) @@ -52,7 +51,7 @@ type WorkloadDefinitionSpec struct { // Extension is used for extension needs by OAM platform builders // +optional - Extension *unstructured.Unstructured `json:"extension,omitempty"` + Extension *runtime.RawExtension `json:"extension,omitempty"` } // +kubebuilder:object:root=true @@ -101,7 +100,7 @@ type TraitDefinitionSpec struct { // Extension is used for extension needs by OAM platform builders // +optional - Extension *unstructured.Unstructured `json:"extension,omitempty"` + Extension *runtime.RawExtension `json:"extension,omitempty"` } // +kubebuilder:object:root=true @@ -142,7 +141,7 @@ type ScopeDefinitionSpec struct { // Extension is used for extension needs by OAM platform builders // +optional - Extension *unstructured.Unstructured `json:"extension,omitempty"` + Extension *runtime.RawExtension `json:"extension,omitempty"` } // +kubebuilder:object:root=true diff --git a/apis/core/v1alpha2/zz_generated.deepcopy.go b/apis/core/v1alpha2/zz_generated.deepcopy.go index e26e0a43..b6b21ab2 100644 --- a/apis/core/v1alpha2/zz_generated.deepcopy.go +++ b/apis/core/v1alpha2/zz_generated.deepcopy.go @@ -1290,7 +1290,8 @@ func (in *ScopeDefinitionSpec) DeepCopyInto(out *ScopeDefinitionSpec) { out.Reference = in.Reference if in.Extension != nil { in, out := &in.Extension, &out.Extension - *out = (*in).DeepCopy() + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) } } @@ -1403,7 +1404,8 @@ func (in *TraitDefinitionSpec) DeepCopyInto(out *TraitDefinitionSpec) { } if in.Extension != nil { in, out := &in.Extension, &out.Extension - *out = (*in).DeepCopy() + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) } } @@ -1535,7 +1537,8 @@ func (in *WorkloadDefinitionSpec) DeepCopyInto(out *WorkloadDefinitionSpec) { } if in.Extension != nil { in, out := &in.Extension, &out.Extension - *out = (*in).DeepCopy() + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) } } diff --git a/test/e2e-test/suite_test.go b/test/e2e-test/suite_test.go index dc0afddd..ccc8fafd 100644 --- a/test/e2e-test/suite_test.go +++ b/test/e2e-test/suite_test.go @@ -17,6 +17,7 @@ package controllers_test import ( "context" + "encoding/json" "testing" . "github.com/onsi/ginkgo" @@ -45,9 +46,15 @@ import ( var k8sClient client.Client var scheme = runtime.NewScheme() var manualscalertrait v1alpha2.TraitDefinition +var extendedmanualscalertrait v1alpha2.TraitDefinition var roleBindingName = "oam-role-binding" var crd crdv1.CustomResourceDefinition +// A DefinitionExtension is an Object type for xxxDefinitin.spec.extension +type DefinitionExtension struct { + Alias string `json:"alias,omitempty"` +} + func TestAPIs(t *testing.T) { RegisterFailHandler(Fail) @@ -100,6 +107,30 @@ var _ = BeforeSuite(func(done Done) { // For some reason, traitDefinition is created as a Cluster scope object Expect(k8sClient.Create(context.Background(), &manualscalertrait)).Should(SatisfyAny(BeNil(), &util.AlreadyExistMatcher{})) By("Created manual scalar trait definition") + + // Create manual scaler trait definition with spec.extension field + definitionExtension := DefinitionExtension{ + Alias: "ManualScaler", + } + in := new(runtime.RawExtension) + in.Raw, _ = json.Marshal(definitionExtension) + + extendedmanualscalertrait = v1alpha2.TraitDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: "manualscalertraits-extended.core.oam.dev", + Labels: map[string]string{"trait": "manualscalertrait"}, + }, + Spec: v1alpha2.TraitDefinitionSpec{ + WorkloadRefPath: "spec.workloadRef", + Reference: v1alpha2.DefinitionReference{ + Name: "manualscalertraits-extended.core.oam.dev", + }, + Extension: in, + }, + } + Expect(k8sClient.Create(context.Background(), &extendedmanualscalertrait)).Should(SatisfyAny(BeNil(), &util.AlreadyExistMatcher{})) + By("Created extended manualscalertraits.core.oam.dev") + adminRoleBinding := rbac.ClusterRoleBinding{ ObjectMeta: metav1.ObjectMeta{ Name: roleBindingName, @@ -178,6 +209,7 @@ var _ = AfterSuite(func() { }, } Expect(k8sClient.Delete(context.Background(), &manualscalertrait)).Should(BeNil()) + Expect(k8sClient.Delete(context.Background(), &extendedmanualscalertrait)).Should(BeNil()) By("Deleted the manual scalertrait definition") crd = crdv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{