From 141c6bb2ef225c2f316a40976e90b769a201a5bd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Oct 2021 16:58:20 +0800 Subject: [PATCH] [Backport release-1.1] Fix: change raw extension to pointer (#2469) * Fix: change raw extension to pointer (cherry picked from commit 113f785c97fede3a60b5010b4cd30749c10a7c3a) * Test: fix ut (cherry picked from commit 7b9dac98c2e232a31cbd2aa62a62ef5f214dbf8a) Co-authored-by: FogDong --- apis/core.oam.dev/common/types.go | 32 +- .../common/zz_generated.deepcopy.go | 33 +- apis/core.oam.dev/v1alpha1/workflow_types.go | 116 ------ .../v1alpha1/zz_generated.deepcopy.go | 149 -------- .../v1alpha2/application_types.go | 2 +- apis/core.oam.dev/v1alpha2/conversion.go | 6 +- .../v1alpha2/zz_generated.deepcopy.go | 6 +- .../core.oam.dev/v1beta1/application_types.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 12 +- .../crds/core.oam.dev_workflows.yaml | 352 ------------------ .../crds/core.oam.dev_workflows.yaml | 352 ------------------ pkg/appfile/appfile.go | 2 +- pkg/appfile/appfile_test.go | 6 +- pkg/appfile/parser.go | 12 +- .../v1alpha1/envbinding/binding.go | 6 +- .../v1alpha1/envbinding/engine.go | 2 +- .../envbinding/envbinding_controller_test.go | 26 +- .../application_controller_test.go | 69 ++-- .../application/application_finalizer_test.go | 6 +- .../v1alpha2/application/apply_test.go | 2 +- .../v1alpha2/application/generator.go | 2 +- .../v1alpha2/application/generator_test.go | 8 +- .../v1alpha2/application/revision.go | 8 +- .../application/revision_clean_up_test.go | 40 +- .../v1alpha2/application/revision_test.go | 18 +- .../v1alpha2/application/workflow_test.go | 52 +-- .../componentdefinition_controller_test.go | 4 +- pkg/oam/util/helper.go | 6 +- pkg/utils/env/helper.go | 2 +- pkg/workflow/hooks/data_passing.go | 35 +- pkg/workflow/hooks/data_passing_test.go | 2 +- pkg/workflow/providers/oam/apply_test.go | 2 +- pkg/workflow/tasks/custom/task.go | 4 +- pkg/workflow/tasks/custom/task_test.go | 2 +- references/appfile/addon_test.go | 2 +- references/appfile/api/appfile_test.go | 20 +- references/appfile/api/service.go | 4 +- references/appfile/app.go | 4 +- references/appfile/modify.go | 8 +- references/cli/status.go | 2 +- references/cli/workflow_test.go | 4 +- test/e2e-test/app_embed_rollout_test.go | 6 +- test/e2e-test/app_resourcetracker_test.go | 42 +-- test/e2e-test/app_revision_clean_up_test.go | 16 +- test/e2e-test/definition_revision_test.go | 8 +- test/e2e-test/helm_app_test.go | 12 +- 46 files changed, 306 insertions(+), 1202 deletions(-) delete mode 100644 apis/core.oam.dev/v1alpha1/workflow_types.go delete mode 100644 charts/vela-core/crds/core.oam.dev_workflows.yaml delete mode 100644 legacy/charts/vela-core-legacy/crds/core.oam.dev_workflows.yaml diff --git a/apis/core.oam.dev/common/types.go b/apis/core.oam.dev/common/types.go index a7fa1321a..363df57fd 100644 --- a/apis/core.oam.dev/common/types.go +++ b/apis/core.oam.dev/common/types.go @@ -17,6 +17,8 @@ limitations under the License. package common import ( + "encoding/json" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" @@ -374,7 +376,7 @@ type AppRolloutStatus struct { type ApplicationTrait struct { Type string `json:"type"` // +kubebuilder:pruning:PreserveUnknownFields - Properties runtime.RawExtension `json:"properties,omitempty"` + Properties *runtime.RawExtension `json:"properties,omitempty"` } // ApplicationComponent describe the component of application @@ -384,7 +386,7 @@ type ApplicationComponent struct { // ExternalRevision specified the component revisionName ExternalRevision string `json:"externalRevision,omitempty"` // +kubebuilder:pruning:PreserveUnknownFields - Properties runtime.RawExtension `json:"properties,omitempty"` + Properties *runtime.RawExtension `json:"properties,omitempty"` DependsOn []string `json:"dependsOn,omitempty"` Inputs StepInputs `json:"inputs,omitempty"` @@ -457,3 +459,29 @@ type ClusterObjectReference struct { Creator ResourceCreatorRole `json:"creator,omitempty"` corev1.ObjectReference `json:",inline"` } + +// RawExtensionPointer is the pointer of raw extension +type RawExtensionPointer struct { + RawExtension *runtime.RawExtension +} + +// MarshalJSON may get called on pointers or values, so implement MarshalJSON on value. +// http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go +func (re RawExtensionPointer) MarshalJSON() ([]byte, error) { + if re.RawExtension == nil { + return nil, nil + } + if re.RawExtension.Raw == nil { + // TODO: this is to support legacy behavior of JSONPrinter and YAMLPrinter, which + // expect to call json.Marshal on arbitrary versioned objects (even those not in + // the scheme). pkg/kubectl/resource#AsVersionedObjects and its interaction with + // kubectl get on objects not in the scheme needs to be updated to ensure that the + // objects that are not part of the scheme are correctly put into the right form. + if re.RawExtension.Object != nil { + return json.Marshal(re.RawExtension.Object) + } + return []byte("null"), nil + } + // TODO: Check whether ContentType is actually JSON before returning it. + return re.RawExtension.Raw, nil +} diff --git a/apis/core.oam.dev/common/zz_generated.deepcopy.go b/apis/core.oam.dev/common/zz_generated.deepcopy.go index dcbf9e834..c636ac71c 100644 --- a/apis/core.oam.dev/common/zz_generated.deepcopy.go +++ b/apis/core.oam.dev/common/zz_generated.deepcopy.go @@ -23,6 +23,7 @@ package common import ( crossplane_runtime "github.com/oam-dev/terraform-controller/api/types/crossplane-runtime" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -93,7 +94,11 @@ func (in *AppStatus) DeepCopy() *AppStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationComponent) DeepCopyInto(out *ApplicationComponent) { *out = *in - in.Properties.DeepCopyInto(&out.Properties) + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } if in.DependsOn != nil { in, out := &in.DependsOn, &out.DependsOn *out = make([]string, len(*in)) @@ -164,7 +169,11 @@ func (in *ApplicationComponentStatus) DeepCopy() *ApplicationComponentStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationTrait) DeepCopyInto(out *ApplicationTrait) { *out = *in - in.Properties.DeepCopyInto(&out.Properties) + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationTrait. @@ -404,6 +413,26 @@ func (in *RawComponent) DeepCopy() *RawComponent { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RawExtensionPointer) DeepCopyInto(out *RawExtensionPointer) { + *out = *in + if in.RawExtension != nil { + in, out := &in.RawExtension, &out.RawExtension + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RawExtensionPointer. +func (in *RawExtensionPointer) DeepCopy() *RawExtensionPointer { + if in == nil { + return nil + } + out := new(RawExtensionPointer) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Revision) DeepCopyInto(out *Revision) { *out = *in diff --git a/apis/core.oam.dev/v1alpha1/workflow_types.go b/apis/core.oam.dev/v1alpha1/workflow_types.go deleted file mode 100644 index e6441e97f..000000000 --- a/apis/core.oam.dev/v1alpha1/workflow_types.go +++ /dev/null @@ -1,116 +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 v1alpha1 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - - "github.com/oam-dev/kubevela/apis/core.oam.dev/common" - "github.com/oam-dev/kubevela/apis/core.oam.dev/condition" -) - -// WorkflowStepPhase describes the phase of a workflow step. -type WorkflowStepPhase string - -const ( - // WorkflowStepPhaseSucceeded will make the controller run the next step. - WorkflowStepPhaseSucceeded WorkflowStepPhase = "succeeded" - // WorkflowStepPhaseFailed will make the controller stop the workflow and report error in `message`. - WorkflowStepPhaseFailed WorkflowStepPhase = "failed" - // WorkflowStepPhaseTerminated will make the controller terminate the workflow. - WorkflowStepPhaseTerminated WorkflowStepPhase = "terminated" - // WorkflowStepPhaseSuspending will make the controller suspend the workflow. - WorkflowStepPhaseSuspending WorkflowStepPhase = "suspending" - // WorkflowStepPhaseRunning will make the controller continue the workflow. - WorkflowStepPhaseRunning WorkflowStepPhase = "running" -) - -// WorkflowStep defines how to execute a workflow step. -type WorkflowStep struct { - // Name is the unique name of the workflow step. - Name string `json:"name"` - Type string `json:"type"` - // +kubebuilder:pruning:PreserveUnknownFields - Properties runtime.RawExtension `json:"properties,omitempty"` - Inputs common.StepInputs `json:"inputs,omitempty"` - Outputs common.StepOutputs `json:"outputs,omitempty"` -} - -// A WorkflowSpec defines the desired state of a Workflow. -type WorkflowSpec struct { - Steps []WorkflowStep `json:"steps,omitempty"` -} - -// A WorkflowStatus is the status of Workflow -type WorkflowStatus struct { - // ConditionedStatus reflects the observed status of a resource - condition.ConditionedStatus `json:",inline"` - ObservedGeneration int64 `json:"observedGeneration,omitempty"` - StepIndex int `json:"stepIndex,omitempty"` - Suspend bool `json:"suspend"` - Terminated bool `json:"terminated"` - ContextBackend *corev1.ObjectReference `json:"contextBackend"` - Steps []WorkflowStepStatus `json:"steps,omitempty"` -} - -// WorkflowStepStatus record the status of a workflow step -type WorkflowStepStatus struct { - Name string `json:"name,omitempty"` - Type string `json:"type,omitempty"` - Phase WorkflowStepPhase `json:"phase,omitempty"` - // A human readable message indicating details about why the workflowStep is in this state. - Message string `json:"message,omitempty"` - // A brief CamelCase message indicating details about why the workflowStep is in this state. - Reason string `json:"reason,omitempty"` - ResourceRef corev1.ObjectReference `json:"resourceRef,omitempty"` -} - -// Workflow is the Schema for the Workflow API -// +kubebuilder:object:root=true -// +kubebuilder:storageversion -// +kubebuilder:subresource:status -// +kubebuilder:resource:scope=Namespaced,categories={oam},shortName=workflow -// +kubebuilder:printcolumn:name="PHASE",type=string,JSONPath=`.status.phase` -// +kubebuilder:printcolumn:name="AGE",type=date,JSONPath=".metadata.creationTimestamp" -type Workflow struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec WorkflowSpec `json:"spec,omitempty"` - Status WorkflowStatus `json:"status,omitempty"` -} - -// +kubebuilder:object:root=true - -// WorkflowList contains a list of Workflow. -type WorkflowList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Workflow `json:"items"` -} - -// SetConditions set condition for Workflow -func (w *Workflow) SetConditions(c ...condition.Condition) { - w.Status.SetConditions(c...) -} - -// GetCondition gets condition from Workflow -func (w *Workflow) GetCondition(conditionType condition.ConditionType) condition.Condition { - return w.Status.GetCondition(conditionType) -} diff --git a/apis/core.oam.dev/v1alpha1/zz_generated.deepcopy.go b/apis/core.oam.dev/v1alpha1/zz_generated.deepcopy.go index 64e22e9ba..8919c4b80 100644 --- a/apis/core.oam.dev/v1alpha1/zz_generated.deepcopy.go +++ b/apis/core.oam.dev/v1alpha1/zz_generated.deepcopy.go @@ -296,152 +296,3 @@ func (in *NamespaceSelector) DeepCopy() *NamespaceSelector { in.DeepCopyInto(out) return out } - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Workflow) DeepCopyInto(out *Workflow) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Workflow. -func (in *Workflow) DeepCopy() *Workflow { - if in == nil { - return nil - } - out := new(Workflow) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Workflow) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *WorkflowList) DeepCopyInto(out *WorkflowList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Workflow, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowList. -func (in *WorkflowList) DeepCopy() *WorkflowList { - if in == nil { - return nil - } - out := new(WorkflowList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *WorkflowList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *WorkflowSpec) DeepCopyInto(out *WorkflowSpec) { - *out = *in - if in.Steps != nil { - in, out := &in.Steps, &out.Steps - *out = make([]WorkflowStep, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowSpec. -func (in *WorkflowSpec) DeepCopy() *WorkflowSpec { - if in == nil { - return nil - } - out := new(WorkflowSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *WorkflowStatus) DeepCopyInto(out *WorkflowStatus) { - *out = *in - in.ConditionedStatus.DeepCopyInto(&out.ConditionedStatus) - if in.ContextBackend != nil { - in, out := &in.ContextBackend, &out.ContextBackend - *out = new(v1.ObjectReference) - **out = **in - } - if in.Steps != nil { - in, out := &in.Steps, &out.Steps - *out = make([]WorkflowStepStatus, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowStatus. -func (in *WorkflowStatus) DeepCopy() *WorkflowStatus { - if in == nil { - return nil - } - out := new(WorkflowStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *WorkflowStep) DeepCopyInto(out *WorkflowStep) { - *out = *in - in.Properties.DeepCopyInto(&out.Properties) - if in.Inputs != nil { - in, out := &in.Inputs, &out.Inputs - *out = make(common.StepInputs, len(*in)) - copy(*out, *in) - } - if in.Outputs != nil { - in, out := &in.Outputs, &out.Outputs - *out = make(common.StepOutputs, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowStep. -func (in *WorkflowStep) DeepCopy() *WorkflowStep { - if in == nil { - return nil - } - out := new(WorkflowStep) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *WorkflowStepStatus) DeepCopyInto(out *WorkflowStepStatus) { - *out = *in - out.ResourceRef = in.ResourceRef -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowStepStatus. -func (in *WorkflowStepStatus) DeepCopy() *WorkflowStepStatus { - if in == nil { - return nil - } - out := new(WorkflowStepStatus) - in.DeepCopyInto(out) - return out -} diff --git a/apis/core.oam.dev/v1alpha2/application_types.go b/apis/core.oam.dev/v1alpha2/application_types.go index 9bd35a864..fcc4a1f26 100644 --- a/apis/core.oam.dev/v1alpha2/application_types.go +++ b/apis/core.oam.dev/v1alpha2/application_types.go @@ -54,7 +54,7 @@ type AppStatus struct { type ApplicationTrait struct { Name string `json:"name"` // +kubebuilder:pruning:PreserveUnknownFields - Properties runtime.RawExtension `json:"properties,omitempty"` + Properties *runtime.RawExtension `json:"properties,omitempty"` } // ApplicationComponent describe the component of application diff --git a/apis/core.oam.dev/v1alpha2/conversion.go b/apis/core.oam.dev/v1alpha2/conversion.go index 46877caa1..ffcf3c7a3 100644 --- a/apis/core.oam.dev/v1alpha2/conversion.go +++ b/apis/core.oam.dev/v1alpha2/conversion.go @@ -44,7 +44,7 @@ func ApplicationV1alpha2ToV1beta1(v1a2 *Application, v1b1 *v1beta1.Application) for j, trait := range comp.Traits { traits[j] = common.ApplicationTrait{ Type: trait.Name, - Properties: *trait.Properties.DeepCopy(), + Properties: trait.Properties.DeepCopy(), } } @@ -58,7 +58,7 @@ func ApplicationV1alpha2ToV1beta1(v1a2 *Application, v1b1 *v1beta1.Application) v1b1.Spec.Components = append(v1b1.Spec.Components, common.ApplicationComponent{ Name: comp.Name, Type: comp.WorkloadType, - Properties: *comp.Settings.DeepCopy(), + Properties: comp.Settings.DeepCopy(), Traits: traits, Scopes: scopes, }) @@ -104,7 +104,7 @@ func (app *Application) ConvertFrom(src conversion.Hub) error { for j, trait := range comp.Traits { traits[j] = ApplicationTrait{ Name: trait.Type, - Properties: *trait.Properties.DeepCopy(), + Properties: trait.Properties.DeepCopy(), } } diff --git a/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go b/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go index 7eb6d7975..0fa669c9d 100644 --- a/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go +++ b/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go @@ -600,7 +600,11 @@ func (in *ApplicationSpec) DeepCopy() *ApplicationSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationTrait) DeepCopyInto(out *ApplicationTrait) { *out = *in - in.Properties.DeepCopyInto(&out.Properties) + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationTrait. diff --git a/apis/core.oam.dev/v1beta1/application_types.go b/apis/core.oam.dev/v1beta1/application_types.go index 50a398795..387af5e08 100644 --- a/apis/core.oam.dev/v1beta1/application_types.go +++ b/apis/core.oam.dev/v1beta1/application_types.go @@ -44,7 +44,7 @@ type AppPolicy struct { Type string `json:"type"` // +kubebuilder:pruning:PreserveUnknownFields - Properties runtime.RawExtension `json:"properties,omitempty"` + Properties *runtime.RawExtension `json:"properties,omitempty"` } // WorkflowStep defines how to execute a workflow step. @@ -55,7 +55,7 @@ type WorkflowStep struct { Type string `json:"type"` // +kubebuilder:pruning:PreserveUnknownFields - Properties runtime.RawExtension `json:"properties,omitempty"` + Properties *runtime.RawExtension `json:"properties,omitempty"` DependsOn []string `json:"dependsOn,omitempty"` diff --git a/apis/core.oam.dev/v1beta1/zz_generated.deepcopy.go b/apis/core.oam.dev/v1beta1/zz_generated.deepcopy.go index d42ccaf82..0fbee12be 100644 --- a/apis/core.oam.dev/v1beta1/zz_generated.deepcopy.go +++ b/apis/core.oam.dev/v1beta1/zz_generated.deepcopy.go @@ -141,7 +141,11 @@ func (in *AppDeploymentStatus) DeepCopy() *AppDeploymentStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AppPolicy) DeepCopyInto(out *AppPolicy) { *out = *in - in.Properties.DeepCopyInto(&out.Properties) + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AppPolicy. @@ -1450,7 +1454,11 @@ func (in *Workflow) DeepCopy() *Workflow { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WorkflowStep) DeepCopyInto(out *WorkflowStep) { *out = *in - in.Properties.DeepCopyInto(&out.Properties) + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } if in.DependsOn != nil { in, out := &in.DependsOn, &out.DependsOn *out = make([]string, len(*in)) diff --git a/charts/vela-core/crds/core.oam.dev_workflows.yaml b/charts/vela-core/crds/core.oam.dev_workflows.yaml deleted file mode 100644 index 005646b2d..000000000 --- a/charts/vela-core/crds/core.oam.dev_workflows.yaml +++ /dev/null @@ -1,352 +0,0 @@ - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.6.2 - name: workflows.core.oam.dev -spec: - group: core.oam.dev - names: - categories: - - oam - kind: Workflow - listKind: WorkflowList - plural: workflows - shortNames: - - workflow - singular: workflow - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.phase - name: PHASE - type: string - - jsonPath: .metadata.creationTimestamp - name: AGE - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: Workflow is the Schema for the Workflow API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: A WorkflowSpec defines the desired state of a Workflow. - properties: - steps: - items: - description: WorkflowStep defines how to execute a workflow step. - properties: - inputs: - description: StepInputs defines variable input of WorkflowStep - items: - properties: - from: - type: string - parameterKey: - type: string - required: - - from - - parameterKey - type: object - type: array - name: - description: Name is the unique name of the workflow step. - type: string - outputs: - description: StepOutputs defines output variable of WorkflowStep - items: - properties: - name: - type: string - valueFrom: - type: string - required: - - name - - valueFrom - type: object - type: array - properties: - type: object - x-kubernetes-preserve-unknown-fields: true - type: - type: string - required: - - name - - type - type: object - type: array - type: object - status: - description: A WorkflowStatus is the status of Workflow - properties: - conditions: - description: Conditions of the resource. - items: - description: A Condition that may apply to a resource. - properties: - lastTransitionTime: - description: LastTransitionTime is the last time this condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A Message containing details about this condition's - last transition from one status to another, if any. - type: string - reason: - description: A Reason for this condition's last transition from - one status to another. - type: string - status: - description: Status of this condition; is it currently True, - False, or Unknown? - type: string - type: - description: Type of this condition. At most one of each condition - type may apply to a resource at any point in time. - type: string - required: - - lastTransitionTime - - reason - - status - - type - type: object - type: array - contextBackend: - description: 'ObjectReference contains enough information to let you - inspect or modify the referred object. --- New uses of this type - are discouraged because of difficulty describing its usage when - embedded in APIs. 1. Ignored fields. It includes many fields which - are not generally honored. For instance, ResourceVersion and FieldPath - are both very rarely valid in actual usage. 2. Invalid usage help. It - is impossible to add specific help for individual usage. In most - embedded usages, there are particular restrictions like, "must - refer only to types A and B" or "UID not honored" or "name must - be restricted". Those cannot be well described when embedded. 3. - Inconsistent validation. Because the usages are different, the - validation rules are different by usage, which makes it hard for - users to predict what will happen. 4. The fields are both imprecise - and overly precise. Kind is not a precise mapping to a URL. This - can produce ambiguity during interpretation and require a REST - mapping. In most cases, the dependency is on the group,resource - tuple and the version of the actual struct is irrelevant. 5. - We cannot easily change it. Because this type is embedded in many - locations, updates to this type will affect numerous schemas. Don''t - make new APIs embed an underspecified API type they do not control. - Instead of using this type, create a locally provided and used type - that is well-focused on your reference. For example, ServiceReferences - for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 - .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - observedGeneration: - format: int64 - type: integer - stepIndex: - type: integer - steps: - items: - description: WorkflowStepStatus record the status of a workflow - step - properties: - message: - description: A human readable message indicating details about - why the workflowStep is in this state. - type: string - name: - type: string - phase: - description: WorkflowStepPhase describes the phase of a workflow - step. - type: string - reason: - description: A brief CamelCase message indicating details about - why the workflowStep is in this state. - type: string - resourceRef: - description: 'ObjectReference contains enough information to - let you inspect or modify the referred object. --- New uses - of this type are discouraged because of difficulty describing - its usage when embedded in APIs. 1. Ignored fields. It includes - many fields which are not generally honored. For instance, - ResourceVersion and FieldPath are both very rarely valid in - actual usage. 2. Invalid usage help. It is impossible to - add specific help for individual usage. In most embedded - usages, there are particular restrictions like, "must - refer only to types A and B" or "UID not honored" or "name - must be restricted". Those cannot be well described when - embedded. 3. Inconsistent validation. Because the usages - are different, the validation rules are different by usage, - which makes it hard for users to predict what will happen. 4. - The fields are both imprecise and overly precise. Kind is - not a precise mapping to a URL. This can produce ambiguity during - interpretation and require a REST mapping. In most cases, - the dependency is on the group,resource tuple and the - version of the actual struct is irrelevant. 5. We cannot - easily change it. Because this type is embedded in many locations, - updates to this type will affect numerous schemas. Don''t - make new APIs embed an underspecified API type they do not - control. Instead of using this type, create a locally provided - and used type that is well-focused on your reference. For - example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 - .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - type: - type: string - type: object - type: array - suspend: - type: boolean - terminated: - type: boolean - required: - - contextBackend - - suspend - - terminated - type: object - type: object - served: true - storage: true - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: Workflow defines workflow steps and other attributes - properties: - steps: - items: - description: WorkflowStep defines how to execute a workflow step. - properties: - dependsOn: - items: - type: string - type: array - inputs: - description: StepInputs defines variable input of WorkflowStep - items: - properties: - from: - type: string - parameterKey: - type: string - required: - - from - - parameterKey - type: object - type: array - name: - description: Name is the unique name of the workflow step. - type: string - outputs: - description: StepOutputs defines output variable of WorkflowStep - items: - properties: - name: - type: string - valueFrom: - type: string - required: - - name - - valueFrom - type: object - type: array - properties: - type: object - x-kubernetes-preserve-unknown-fields: true - type: - type: string - required: - - name - - type - type: object - type: array - type: object - served: true - storage: false -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/legacy/charts/vela-core-legacy/crds/core.oam.dev_workflows.yaml b/legacy/charts/vela-core-legacy/crds/core.oam.dev_workflows.yaml deleted file mode 100644 index c6bb33d03..000000000 --- a/legacy/charts/vela-core-legacy/crds/core.oam.dev_workflows.yaml +++ /dev/null @@ -1,352 +0,0 @@ - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.6.2 - name: workflows.core.oam.dev -spec: - group: core.oam.dev - names: - categories: - - oam - kind: Workflow - listKind: WorkflowList - plural: workflows - shortNames: - - workflow - singular: workflow - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.phase - name: PHASE - type: string - - jsonPath: .metadata.creationTimestamp - name: AGE - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: Workflow is the Schema for the Workflow API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: A WorkflowSpec defines the desired state of a Workflow. - properties: - steps: - items: - description: WorkflowStep defines how to execute a workflow step. - properties: - inputs: - description: StepInputs defines variable input of WorkflowStep - items: - properties: - from: - type: string - parameterKey: - type: string - required: - - from - - parameterKey - type: object - type: array - name: - description: Name is the unique name of the workflow step. - type: string - outputs: - description: StepOutputs defines output variable of WorkflowStep - items: - properties: - name: - type: string - valueFrom: - type: string - required: - - name - - valueFrom - type: object - type: array - properties: - type: object - - type: - type: string - required: - - name - - type - type: object - type: array - type: object - status: - description: A WorkflowStatus is the status of Workflow - properties: - conditions: - description: Conditions of the resource. - items: - description: A Condition that may apply to a resource. - properties: - lastTransitionTime: - description: LastTransitionTime is the last time this condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A Message containing details about this condition's - last transition from one status to another, if any. - type: string - reason: - description: A Reason for this condition's last transition from - one status to another. - type: string - status: - description: Status of this condition; is it currently True, - False, or Unknown? - type: string - type: - description: Type of this condition. At most one of each condition - type may apply to a resource at any point in time. - type: string - required: - - lastTransitionTime - - reason - - status - - type - type: object - type: array - contextBackend: - description: 'ObjectReference contains enough information to let you - inspect or modify the referred object. --- New uses of this type - are discouraged because of difficulty describing its usage when - embedded in APIs. 1. Ignored fields. It includes many fields which - are not generally honored. For instance, ResourceVersion and FieldPath - are both very rarely valid in actual usage. 2. Invalid usage help. It - is impossible to add specific help for individual usage. In most - embedded usages, there are particular restrictions like, "must - refer only to types A and B" or "UID not honored" or "name must - be restricted". Those cannot be well described when embedded. 3. - Inconsistent validation. Because the usages are different, the - validation rules are different by usage, which makes it hard for - users to predict what will happen. 4. The fields are both imprecise - and overly precise. Kind is not a precise mapping to a URL. This - can produce ambiguity during interpretation and require a REST - mapping. In most cases, the dependency is on the group,resource - tuple and the version of the actual struct is irrelevant. 5. - We cannot easily change it. Because this type is embedded in many - locations, updates to this type will affect numerous schemas. Don''t - make new APIs embed an underspecified API type they do not control. - Instead of using this type, create a locally provided and used type - that is well-focused on your reference. For example, ServiceReferences - for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 - .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - observedGeneration: - format: int64 - type: integer - stepIndex: - type: integer - steps: - items: - description: WorkflowStepStatus record the status of a workflow - step - properties: - message: - description: A human readable message indicating details about - why the workflowStep is in this state. - type: string - name: - type: string - phase: - description: WorkflowStepPhase describes the phase of a workflow - step. - type: string - reason: - description: A brief CamelCase message indicating details about - why the workflowStep is in this state. - type: string - resourceRef: - description: 'ObjectReference contains enough information to - let you inspect or modify the referred object. --- New uses - of this type are discouraged because of difficulty describing - its usage when embedded in APIs. 1. Ignored fields. It includes - many fields which are not generally honored. For instance, - ResourceVersion and FieldPath are both very rarely valid in - actual usage. 2. Invalid usage help. It is impossible to - add specific help for individual usage. In most embedded - usages, there are particular restrictions like, "must - refer only to types A and B" or "UID not honored" or "name - must be restricted". Those cannot be well described when - embedded. 3. Inconsistent validation. Because the usages - are different, the validation rules are different by usage, - which makes it hard for users to predict what will happen. 4. - The fields are both imprecise and overly precise. Kind is - not a precise mapping to a URL. This can produce ambiguity during - interpretation and require a REST mapping. In most cases, - the dependency is on the group,resource tuple and the - version of the actual struct is irrelevant. 5. We cannot - easily change it. Because this type is embedded in many locations, - updates to this type will affect numerous schemas. Don''t - make new APIs embed an underspecified API type they do not - control. Instead of using this type, create a locally provided - and used type that is well-focused on your reference. For - example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 - .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this pod). - This syntax is chosen only to have some well-defined way - of referencing a part of an object. TODO: this design - is not final and this field is subject to change in the - future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - type: - type: string - type: object - type: array - suspend: - type: boolean - terminated: - type: boolean - required: - - contextBackend - - suspend - - terminated - type: object - type: object - served: true - storage: true - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: Workflow defines workflow steps and other attributes - properties: - steps: - items: - description: WorkflowStep defines how to execute a workflow step. - properties: - dependsOn: - items: - type: string - type: array - inputs: - description: StepInputs defines variable input of WorkflowStep - items: - properties: - from: - type: string - parameterKey: - type: string - required: - - from - - parameterKey - type: object - type: array - name: - description: Name is the unique name of the workflow step. - type: string - outputs: - description: StepOutputs defines output variable of WorkflowStep - items: - properties: - name: - type: string - valueFrom: - type: string - required: - - name - - valueFrom - type: object - type: array - properties: - type: object - - type: - type: string - required: - - name - - type - type: object - type: array - type: object - served: true - storage: false -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/pkg/appfile/appfile.go b/pkg/appfile/appfile.go index 8ec7aacbd..89e78d3c7 100644 --- a/pkg/appfile/appfile.go +++ b/pkg/appfile/appfile.go @@ -708,7 +708,7 @@ func generateTerraformConfigurationWorkload(wl *Workload, ns string) (*unstructu } configuration.Spec.Variable = &runtime.RawExtension{Raw: data} raw := util.Object2RawExtension(&configuration) - return util.RawExtension2Unstructured(&raw) + return util.RawExtension2Unstructured(raw) } // a helper map whose key is parameter name diff --git a/pkg/appfile/appfile_test.go b/pkg/appfile/appfile_test.go index ade79bb76..8f328feb0 100644 --- a/pkg/appfile/appfile_test.go +++ b/pkg/appfile/appfile_test.go @@ -103,7 +103,7 @@ var _ = Describe("Test Helm schematic appfile", func() { }, }, Helm: &common.Helm{ - Release: util.Object2RawExtension(map[string]interface{}{ + Release: *util.Object2RawExtension(map[string]interface{}{ "chart": map[string]interface{}{ "spec": map[string]interface{}{ "chart": "podinfo", @@ -111,7 +111,7 @@ var _ = Describe("Test Helm schematic appfile", func() { }, }, }), - Repository: util.Object2RawExtension(map[string]interface{}{ + Repository: *util.Object2RawExtension(map[string]interface{}{ "url": "http://oam.dev/catalog/", }), }, @@ -1061,7 +1061,7 @@ func TestGenerateTerraformConfigurationWorkload(t *testing.T) { Spec: configSpec, } rawConf := util.Object2RawExtension(tfConfiguration) - wantWL, _ := util.RawExtension2Unstructured(&rawConf) + wantWL, _ := util.RawExtension2Unstructured(rawConf) if diff := cmp.Diff(wantWL, got); diff != "" { t.Errorf("\n%s\ngenerateTerraformConfigurationWorkload(...): -want, +got:\n%s\n", tcName, diff) diff --git a/pkg/appfile/parser.go b/pkg/appfile/parser.go index 9042dc86e..79ab91b84 100644 --- a/pkg/appfile/parser.go +++ b/pkg/appfile/parser.go @@ -251,7 +251,7 @@ func (p *Parser) parsePoliciesFromRevision(policies []v1beta1.AppPolicy, appRev return ws, nil } -func (p *Parser) makeWorkload(ctx context.Context, name, typ string, capType types.CapType, props runtime.RawExtension) (*Workload, error) { +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) if err != nil { return nil, errors.WithMessagef(err, "fetch component/policy type of %s", name) @@ -259,7 +259,7 @@ func (p *Parser) makeWorkload(ctx context.Context, name, typ string, capType typ return p.convertTemplate2Workload(name, typ, props, templ) } -func (p *Parser) makeWorkloadFromRevision(name, typ string, capType types.CapType, props runtime.RawExtension, appRev *v1beta1.ApplicationRevision) (*Workload, error) { +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) if err != nil { return nil, errors.WithMessagef(err, "fetch component/policy type of %s from revision", name) @@ -268,8 +268,8 @@ func (p *Parser) makeWorkloadFromRevision(name, typ string, capType types.CapTyp return p.convertTemplate2Workload(name, typ, props, templ) } -func (p *Parser) convertTemplate2Workload(name, typ string, props runtime.RawExtension, templ *Template) (*Workload, error) { - settings, err := util.RawExtension2Map(&props) +func (p *Parser) convertTemplate2Workload(name, typ string, props *runtime.RawExtension, templ *Template) (*Workload, error) { + settings, err := util.RawExtension2Map(props) if err != nil { return nil, errors.WithMessagef(err, "fail to parse settings for %s", name) } @@ -299,7 +299,7 @@ func (p *Parser) parseWorkload(ctx context.Context, comp common.ApplicationCompo workload.ExternalRevision = comp.ExternalRevision for _, traitValue := range comp.Traits { - properties, err := util.RawExtension2Map(&traitValue.Properties) + properties, err := util.RawExtension2Map(traitValue.Properties) if err != nil { return nil, errors.Errorf("fail to parse properties of %s for %s", traitValue.Type, comp.Name) } @@ -335,7 +335,7 @@ func (p *Parser) ParseWorkloadFromRevision(comp common.ApplicationComponent, app workload.ExternalRevision = comp.ExternalRevision for _, traitValue := range comp.Traits { - properties, err := util.RawExtension2Map(&traitValue.Properties) + properties, err := util.RawExtension2Map(traitValue.Properties) if err != nil { return nil, errors.Errorf("fail to parse properties of %s for %s", traitValue.Type, comp.Name) } diff --git a/pkg/controller/core.oam.dev/v1alpha1/envbinding/binding.go b/pkg/controller/core.oam.dev/v1alpha1/envbinding/binding.go index 4b5a01982..f61ad3a89 100644 --- a/pkg/controller/core.oam.dev/v1alpha1/envbinding/binding.go +++ b/pkg/controller/core.oam.dev/v1alpha1/envbinding/binding.go @@ -260,12 +260,12 @@ func PatchComponent(baseComponent *common.ApplicationComponent, patchComponent * } // PatchProperties merge patch parameter for dst parameter -func PatchProperties(dst runtime.RawExtension, patch runtime.RawExtension) (map[string]interface{}, error) { - patchParameter, err := util.RawExtension2Map(&patch) +func PatchProperties(dst *runtime.RawExtension, patch *runtime.RawExtension) (map[string]interface{}, error) { + patchParameter, err := util.RawExtension2Map(patch) if err != nil { return nil, err } - baseParameter, err := util.RawExtension2Map(&dst) + baseParameter, err := util.RawExtension2Map(dst) if err != nil { return nil, err } diff --git a/pkg/controller/core.oam.dev/v1alpha1/envbinding/engine.go b/pkg/controller/core.oam.dev/v1alpha1/envbinding/engine.go index 0d8b1dce9..ef7a34645 100644 --- a/pkg/controller/core.oam.dev/v1alpha1/envbinding/engine.go +++ b/pkg/controller/core.oam.dev/v1alpha1/envbinding/engine.go @@ -123,7 +123,7 @@ func (o *OCMEngine) schedule(ctx context.Context, apps []*EnvBindApp) ([]v1alpha manifest := app.assembledManifests[component.Name] for j := range manifest { workloads = append(workloads, ocmworkv1.Manifest{ - RawExtension: util.Object2RawExtension(manifest[j]), + RawExtension: *util.Object2RawExtension(manifest[j]), }) } } diff --git a/pkg/controller/core.oam.dev/v1alpha1/envbinding/envbinding_controller_test.go b/pkg/controller/core.oam.dev/v1alpha1/envbinding/envbinding_controller_test.go index c4f3d66cb..2349f3f1f 100644 --- a/pkg/controller/core.oam.dev/v1alpha1/envbinding/envbinding_controller_test.go +++ b/pkg/controller/core.oam.dev/v1alpha1/envbinding/envbinding_controller_test.go @@ -182,7 +182,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-select-cluster-by-name") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Envs[0].Placement.ClusterSelector.Name = spokeClusterName envBinding.Spec.OutputResourcesTo = &v1alpha1.ConfigMapReference{ @@ -229,7 +229,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-select-cluster-by-label") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Envs[0].Placement.ClusterSelector.Labels = map[string]string{ "purpose": "test", @@ -277,7 +277,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-with-two-env-config") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Envs[0].Placement.ClusterSelector.Name = spokeClusterName @@ -361,7 +361,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-with-app-has-helm") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Envs = []v1alpha1.EnvConfig{{ @@ -416,7 +416,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-apply-resources-with-ocm") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Envs[0].Placement.ClusterSelector.Name = spokeClusterName envBinding.Spec.Engine = v1alpha1.OCMEngine @@ -458,7 +458,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-apply-resources") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Engine = v1alpha1.SingleClusterEngine @@ -494,7 +494,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-store2configmap") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Engine = v1alpha1.SingleClusterEngine envBinding.Spec.OutputResourcesTo = &v1alpha1.ConfigMapReference{ @@ -538,7 +538,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-specify-ns") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Engine = v1alpha1.SingleClusterEngine envBinding.Spec.Envs[0].Placement = v1alpha1.EnvPlacement{ @@ -579,7 +579,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetNamespace(namespace) envBinding.SetName("envbinding-select-ns-label") envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Engine = v1alpha1.SingleClusterEngine envBinding.Spec.Envs[0].Placement = v1alpha1.EnvPlacement{ @@ -624,7 +624,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetName("test-envbinding-gc-single-cluster") envBinding.SetNamespace(namespace) envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Engine = v1alpha1.SingleClusterEngine envBinding.Spec.Envs[0].Placement = v1alpha1.EnvPlacement{ @@ -742,7 +742,7 @@ var _ = Describe("EnvBinding Normal tests", func() { envBinding.SetName("test-envbinding-gc-multi-cluster") envBinding.SetNamespace(namespace) envBinding.Spec.AppTemplate = v1alpha1.AppTemplate{ - RawExtension: util.Object2RawExtension(appTemplate), + RawExtension: *util.Object2RawExtension(appTemplate), } envBinding.Spec.Envs[0].Placement.ClusterSelector.Name = spokeClusterName @@ -1007,7 +1007,7 @@ var podInfo = &v1beta1.ComponentDefinition{ }, Schematic: &commontype.Schematic{ HELM: &commontype.Helm{ - Release: util.Object2RawExtension(map[string]interface{}{ + Release: *util.Object2RawExtension(map[string]interface{}{ "chart": map[string]interface{}{ "spec": map[string]interface{}{ "chart": "podinfo", @@ -1015,7 +1015,7 @@ var podInfo = &v1beta1.ComponentDefinition{ }, }, }), - Repository: util.Object2RawExtension(map[string]interface{}{ + Repository: *util.Object2RawExtension(map[string]interface{}{ "url": "http://oam.dev/catalog/", }), }, diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/application_controller_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/application_controller_test.go index 938038dbf..80b9df4f4 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/application_controller_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/application_controller_test.go @@ -73,7 +73,7 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb1", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","config":"myconfig"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","config":"myconfig"}`)}, }, }, }, @@ -91,7 +91,7 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb2", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, @@ -103,7 +103,7 @@ var _ = Describe("Test Application Controller", func() { appFailRender := appwithNoTrait.DeepCopy() appFailRender.SetName("app-fail-to-render") - appFailRender.Spec.Components[0].Properties = runtime.RawExtension{ + appFailRender.Spec.Components[0].Properties = &runtime.RawExtension{ Raw: []byte(`{"cmd1":["sleep","1000"],"image1":"busybox"}`), } @@ -120,11 +120,11 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb", Type: "worker-import", - Properties: runtime.RawExtension{Raw: []byte("{\"cmd\":[\"sleep\",\"1000\"],\"image\":\"busybox\"}")}, + Properties: &runtime.RawExtension{Raw: []byte("{\"cmd\":[\"sleep\",\"1000\"],\"image\":\"busybox\"}")}, Traits: []common.ApplicationTrait{ { Type: "ingress-import", - Properties: runtime.RawExtension{Raw: []byte("{\"http\":{\"/\":80},\"domain\":\"abc.com\"}")}, + Properties: &runtime.RawExtension{Raw: []byte("{\"http\":{\"/\":80},\"domain\":\"abc.com\"}")}, }, }, }, @@ -176,7 +176,7 @@ var _ = Describe("Test Application Controller", func() { appWithTrait.Spec.Components[0].Traits = []common.ApplicationTrait{ { Type: "scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas":2}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas":2}`)}, }, } appWithTrait.Spec.Components[0].Name = "myweb3" @@ -220,7 +220,7 @@ var _ = Describe("Test Application Controller", func() { appWithTwoComp.Spec.Components = append(appWithTwoComp.Spec.Components, common.ApplicationComponent{ Name: "myweb6", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox2","config":"myconfig"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox2","config":"myconfig"}`)}, Scopes: map[string]string{"healthscopes.core.oam.dev": "app-with-two-comp-default-health"}, }) @@ -457,7 +457,7 @@ var _ = Describe("Test Application Controller", func() { appWithComposedWorkload.Spec.Components[0].Traits = []common.ApplicationTrait{ { Type: "scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas":2}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas":2}`)}, }, } appWithComposedWorkload.Spec.Components[0].Name = compName @@ -702,13 +702,13 @@ var _ = Describe("Test Application Controller", func() { curApp.Spec.Components[0] = common.ApplicationComponent{ Name: "myweb5", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox3"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox3"}`)}, Scopes: map[string]string{"healthscopes.core.oam.dev": "app-with-two-comp-default-health"}, } curApp.Spec.Components[1] = common.ApplicationComponent{ Name: "myweb7", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, Scopes: map[string]string{"healthscopes.core.oam.dev": "app-with-two-comp-default-health"}, } Expect(k8sClient.Update(ctx, curApp)).Should(BeNil()) @@ -1029,9 +1029,9 @@ var _ = Describe("Test Application Controller", func() { app := appWithTraitHealthStatus.DeepCopy() app.Spec.Components[0].Name = compName app.Spec.Components[0].Type = "nworker" - app.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox3","lives":"3","enemies":"alien"}`)} + app.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox3","lives":"3","enemies":"alien"}`)} app.Spec.Components[0].Traits[0].Type = "ingress" - app.Spec.Components[0].Traits[0].Properties = runtime.RawExtension{Raw: []byte(`{"domain":"example.com","http":{"/":80}}`)} + app.Spec.Components[0].Traits[0].Properties = &runtime.RawExtension{Raw: []byte(`{"domain":"example.com","http":{"/":80}}`)} expDeployment.Name = app.Name expDeployment.Namespace = ns.Name @@ -1167,7 +1167,7 @@ var _ = Describe("Test Application Controller", func() { appRefertoWd.Spec.Components[0] = common.ApplicationComponent{ Name: "mytask", Type: "task", - Properties: runtime.RawExtension{Raw: []byte(`{"image":"busybox", "cmd":["sleep","1000"]}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"image":"busybox", "cmd":["sleep","1000"]}`)}, } ns := &corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{ @@ -1217,7 +1217,7 @@ var _ = Describe("Test Application Controller", func() { appMix.Spec.Components[1] = common.ApplicationComponent{ Name: "mytask", Type: "task", - Properties: runtime.RawExtension{Raw: []byte(`{"image":"busybox", "cmd":["sleep","1000"]}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"image":"busybox", "cmd":["sleep","1000"]}`)}, } ns := &corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{ @@ -1438,11 +1438,10 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb1", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, Traits: []common.ApplicationTrait{ { - Type: "rollout", - Properties: runtime.RawExtension{Raw: []byte(`{}`)}, + Type: "rollout", }, }, }, @@ -1463,7 +1462,7 @@ var _ = Describe("Test Application Controller", func() { Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "myweb1", Namespace: ns.Name}, deploy)).Should(util.NotFoundMatcher{}) By("update component targetComponentRev will change") - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","2000"],"image":"nginx"}`)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","2000"],"image":"nginx"}`)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) checkApp = &v1beta1.Application{} @@ -1478,7 +1477,7 @@ var _ = Describe("Test Application Controller", func() { By("check update rollout trait won't generate new appRevision") appRevName := checkApp.Status.LatestRevision.Name - checkApp.Spec.Components[0].Traits[0].Properties.Raw = []byte(`{"targetRevision":"myweb1-v3"}`) + checkApp.Spec.Components[0].Traits[0].Properties = &runtime.RawExtension{Raw: []byte(`{"targetRevision":"myweb1-v3"}`)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) checkApp = &v1beta1.Application{} @@ -1518,11 +1517,10 @@ var _ = Describe("Test Application Controller", func() { Name: "myweb1", Type: "worker", ExternalRevision: externalRevision, - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, Traits: []common.ApplicationTrait{ { - Type: "rollout", - Properties: runtime.RawExtension{Raw: []byte(`{}`)}, + Type: "rollout", }, }, }, @@ -1570,7 +1568,7 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb1", Type: "worker-revision", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, @@ -1619,7 +1617,7 @@ var _ = Describe("Test Application Controller", func() { Name: "myweb1", Type: "worker-revision", ExternalRevision: externalRevision, - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, @@ -1676,11 +1674,10 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb1", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, Traits: []common.ApplicationTrait{ { - Type: "rollout", - Properties: runtime.RawExtension{Raw: []byte(`{}`)}, + Type: "rollout", }, }, }, @@ -1690,7 +1687,7 @@ var _ = Describe("Test Application Controller", func() { { Name: "apply", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component" : "myweb1"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component" : "myweb1"}`)}, }, }, }, @@ -1742,7 +1739,7 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb1", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep"],"image":"busybox"}`)}, Inputs: common.StepInputs{ { From: "message", @@ -1761,7 +1758,7 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, Outputs: common.StepOutputs{ {Name: "message", ValueFrom: "output.status.conditions[0].message+\",\"+outputs.gameconfig.data.lives"}, {Name: "sleepTime", ValueFrom: "\"100\""}, @@ -1842,13 +1839,13 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb1", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, DependsOn: []string{"myweb2"}, }, { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, }, }, }, @@ -1917,7 +1914,7 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb1", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, DependsOn: []string{"myweb2"}, Inputs: common.StepInputs{ { @@ -1933,7 +1930,7 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, Outputs: common.StepOutputs{ {Name: "message", ValueFrom: "output.status.conditions[0].message+\",\"+outputs.gameconfig.data.lives"}, }, @@ -2016,12 +2013,12 @@ var _ = Describe("Test Application Controller", func() { { Name: "myweb1", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, }, { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, }, }, }, diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/application_finalizer_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/application_finalizer_test.go index f66bb4361..49cac578e 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/application_finalizer_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/application_finalizer_test.go @@ -107,7 +107,7 @@ var _ = Describe("Test application controller finalizer logic", func() { updateApp.Spec.Components[0].Traits = []common.ApplicationTrait{ { Type: "cross-scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, }, } Expect(k8sClient.Update(ctx, updateApp)).Should(BeNil()) @@ -236,7 +236,7 @@ var _ = Describe("Test application controller finalizer logic", func() { app.Spec.Components[0].Traits = []common.ApplicationTrait{ { Type: "cross-scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, }, } Expect(k8sClient.Create(ctx, app)).Should(BeNil()) @@ -284,7 +284,7 @@ func getApp(appName, namespace, comptype string) *v1beta1.Application { { Name: "comp1", Type: comptype, - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/apply_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/apply_test.go index f8eabd157..7d313cdc5 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/apply_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/apply_test.go @@ -113,7 +113,7 @@ var _ = Describe("Test Application apply", func() { Components: []common.ApplicationComponent{{ Type: "test-worker", Name: "test-app", - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(`{"image": "oamdev/testapp:v1", "cmd": ["node", "server.js"]}`), }, }}, diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/generator.go b/pkg/controller/core.oam.dev/v1alpha2/application/generator.go index 50376b057..622216def 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/generator.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/generator.go @@ -92,7 +92,7 @@ func convertStepProperties(step *v1beta1.WorkflowStep, app *v1beta1.Application) o := struct { Component string `json:"component"` }{} - js, err := step.Properties.MarshalJSON() + js, err := common.RawExtensionPointer{RawExtension: step.Properties}.MarshalJSON() if err != nil { return err } diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/generator_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/generator_test.go index 7df36d55e..d26d6b223 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/generator_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/generator_test.go @@ -81,7 +81,7 @@ var _ = Describe("Test Application workflow generator", func() { { Name: "myweb1", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, Inputs: common.StepInputs{ { From: "message", @@ -96,7 +96,7 @@ var _ = Describe("Test Application workflow generator", func() { { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, Outputs: common.StepOutputs{ { Name: "message", @@ -145,12 +145,12 @@ var _ = Describe("Test Application workflow generator", func() { { Name: "myweb1", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, }, }, }, diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/revision.go b/pkg/controller/core.oam.dev/v1alpha2/application/revision.go index 9f6152b55..ab2a5854c 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/revision.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/revision.go @@ -633,7 +633,7 @@ func (h *AppHandler) createControllerRevision(ctx context.Context, cm *types.Com }, }, Revision: int64(revision), - Data: util.Object2RawExtension(comp), + Data: *util.Object2RawExtension(comp), } return h.r.Create(ctx, cr) } @@ -651,15 +651,15 @@ func componentManifest2Component(cm *types.ComponentManifest) (*v1alpha2.Compone wl = cm.StandardWorkload.DeepCopy() util.RemoveLabels(wl, []string{oam.LabelAppRevision}) } - component.Spec.Workload = util.Object2RawExtension(wl) + component.Spec.Workload = *util.Object2RawExtension(wl) if len(cm.PackagedWorkloadResources) > 0 { helm := &common.Helm{} for _, helmResource := range cm.PackagedWorkloadResources { if helmResource.GetKind() == helmapi.HelmReleaseGVK.Kind { - helm.Release = util.Object2RawExtension(helmResource) + helm.Release = *util.Object2RawExtension(helmResource) } if helmResource.GetKind() == helmapi.HelmRepositoryGVK.Kind { - helm.Repository = util.Object2RawExtension(helmResource) + helm.Repository = *util.Object2RawExtension(helmResource) } } component.Spec.Helm = helm diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/revision_clean_up_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/revision_clean_up_test.go index 2c80a9006..6479ff099 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/revision_clean_up_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/revision_clean_up_test.go @@ -79,7 +79,7 @@ var _ = Describe("Test application controller clean up ", func() { for i := 0; i < appRevisionLimit+1; i++ { Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) testutil.ReconcileOnceAfterFinalizer(reconciler, ctrl.Request{NamespacedName: appKey}) } @@ -104,7 +104,7 @@ var _ = Describe("Test application controller clean up ", func() { By("create new appRevision will remove appRevison1") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err := reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -131,7 +131,7 @@ var _ = Describe("Test application controller clean up ", func() { By("update app again will gc appRevision2") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 7) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err = reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -164,7 +164,7 @@ var _ = Describe("Test application controller clean up ", func() { for i := 0; i < appRevisionLimit+1; i++ { Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) testutil.ReconcileOnceAfterFinalizer(reconciler, ctrl.Request{NamespacedName: appKey}) } @@ -189,7 +189,7 @@ var _ = Describe("Test application controller clean up ", func() { By("create new appRevision will remove revision v1") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err := reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -216,7 +216,7 @@ var _ = Describe("Test application controller clean up ", func() { By("update app again will gc revision v2") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 7) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err = reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -242,7 +242,7 @@ var _ = Describe("Test application controller clean up ", func() { By("update app with comp as latest revision will not gc revision v3") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err = reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -273,7 +273,7 @@ var _ = Describe("Test application controller clean up ", func() { for i := 0; i < appRevisionLimit+1; i++ { Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) testutil.ReconcileOnceAfterFinalizer(reconciler, ctrl.Request{NamespacedName: appKey}) } @@ -298,7 +298,7 @@ var _ = Describe("Test application controller clean up ", func() { By("create new appRevision will remove revision v1") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err := reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -325,7 +325,7 @@ var _ = Describe("Test application controller clean up ", func() { By("update app again will gc revision v2") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 7) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err = reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -351,7 +351,7 @@ var _ = Describe("Test application controller clean up ", func() { By("update app with comp as latest revision will not gc revision v3") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err = reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -382,7 +382,7 @@ var _ = Describe("Test application controller clean up ", func() { for i := 0; i < appRevisionLimit+1; i++ { Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) testutil.ReconcileOnceAfterFinalizer(reconciler, ctrl.Request{NamespacedName: appKey}) } @@ -407,7 +407,7 @@ var _ = Describe("Test application controller clean up ", func() { By("create new appRevision will remove appRevison1") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err := reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -437,7 +437,7 @@ var _ = Describe("Test application controller clean up ", func() { By("update app again will gc appRevision2") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 7) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err = reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -475,7 +475,7 @@ var _ = Describe("Test application controller clean up ", func() { for i := 0; i < appRevisionLimit+1; i++ { Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) testutil.ReconcileOnceAfterFinalizer(reconciler, ctrl.Request{NamespacedName: appKey}) } @@ -500,7 +500,7 @@ var _ = Describe("Test application controller clean up ", func() { By("create new appRevision will remove appRevison1") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err := reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -530,7 +530,7 @@ var _ = Describe("Test application controller clean up ", func() { By("update app again will gc appRevision2") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 7) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err = reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -568,7 +568,7 @@ var _ = Describe("Test application controller clean up ", func() { for i := 0; i < appRevisionLimit+1; i++ { Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) testutil.ReconcileOnceAfterFinalizer(reconciler, ctrl.Request{NamespacedName: appKey}) } @@ -593,7 +593,7 @@ var _ = Describe("Test application controller clean up ", func() { By("create new appRevision will remove appRevison1") Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err := reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) @@ -644,7 +644,7 @@ var _ = Describe("Test application controller clean up ", func() { for i := 7; i < 9; i++ { Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} Expect(k8sClient.Update(ctx, checkApp)).Should(BeNil()) _, err = reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: appKey}) Expect(err).Should(BeNil()) diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/revision_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/revision_test.go index 26ce01a2e..e5428d84f 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/revision_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/revision_test.go @@ -118,13 +118,13 @@ var _ = Describe("test generate revision ", func() { Type: cd.Name, Name: "express-server", Scopes: map[string]string{"healthscopes.core.oam.dev": "myapp-default-health"}, - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(`{"image": "oamdev/testapp:v1", "cmd": ["node", "server.js"]}`), }, Traits: []common.ApplicationTrait{ { Type: td.Name, - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(`{"replicas": 5}`), }, }, @@ -232,7 +232,7 @@ var _ = Describe("test generate revision ", func() { It("Test appliction contain a SkipAppRevision tait will have same hash", func() { rolloutTrait := common.ApplicationTrait{ Type: "rollout", - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(`{"targetRevision":"myrev-v1"}`), }, } @@ -336,7 +336,7 @@ var _ = Describe("test generate revision ", func() { Expect(err).Should(BeNil()) expectWorkload = comps[0].StandardWorkload.DeepCopy() util.RemoveLabels(expectWorkload, []string{oam.LabelAppRevision, oam.LabelAppRevisionHash, oam.LabelAppComponentRevision}) - Expect(cmp.Diff(gotComp.Spec.Workload, util.Object2RawExtension(expectWorkload))).Should(BeEmpty()) + Expect(cmp.Diff(gotComp.Spec.Workload, *util.Object2RawExtension(expectWorkload))).Should(BeEmpty()) By("Verify component revision is not changed") expectCompRevName = "express-server-v1" @@ -348,7 +348,7 @@ var _ = Describe("test generate revision ", func() { By("Change the application and apply again") // bump the image tag app.ResourceVersion = curApp.ResourceVersion - app.Spec.Components[0].Properties = runtime.RawExtension{ + app.Spec.Components[0].Properties = &runtime.RawExtension{ Raw: []byte(`{"image": "oamdev/testapp:v2", "cmd": ["node", "server.js"]}`), } // persist the app @@ -400,12 +400,12 @@ var _ = Describe("test generate revision ", func() { Expect(err).Should(BeNil()) expectWorkload = comps[0].StandardWorkload.DeepCopy() util.RemoveLabels(expectWorkload, []string{oam.LabelAppRevision, oam.LabelAppRevisionHash, oam.LabelAppComponentRevision}) - Expect(cmp.Diff(gotComp.Spec.Workload, util.Object2RawExtension(expectWorkload))).Should(BeEmpty()) + Expect(cmp.Diff(gotComp.Spec.Workload, *util.Object2RawExtension(expectWorkload))).Should(BeEmpty()) By("Change the application same as v1 and apply again") // bump the image tag app.ResourceVersion = curApp.ResourceVersion - app.Spec.Components[0].Properties = runtime.RawExtension{ + app.Spec.Components[0].Properties = &runtime.RawExtension{ Raw: []byte(`{"image": "oamdev/testapp:v1", "cmd": ["node", "server.js"]}`), } // persist the app @@ -465,7 +465,7 @@ var _ = Describe("test generate revision ", func() { expectWorkload = comps[0].StandardWorkload.DeepCopy() util.RemoveLabels(expectWorkload, []string{oam.LabelAppRevision, oam.LabelAppRevisionHash, oam.LabelAppComponentRevision}) expectWorkload.SetAnnotations(map[string]string{"testKey1": "true"}) - Expect(cmp.Diff(gotComp.Spec.Workload, util.Object2RawExtension(expectWorkload))).Should(BeEmpty()) + Expect(cmp.Diff(gotComp.Spec.Workload, *util.Object2RawExtension(expectWorkload))).Should(BeEmpty()) }) It("Test App with rollout template", func() { @@ -546,7 +546,7 @@ var _ = Describe("test generate revision ", func() { // bump the image tag app.SetAnnotations(map[string]string{oam.AnnotationAppRollout: strconv.FormatBool(true)}) app.ResourceVersion = curApp.ResourceVersion - app.Spec.Components[0].Properties = runtime.RawExtension{ + app.Spec.Components[0].Properties = &runtime.RawExtension{ Raw: []byte(`{"image": "oamdev/testapp:v2", "cmd": ["node", "server.js"]}`), } // persist the app diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/workflow_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/workflow_test.go index 9c10c797c..a8ecb1fad 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/workflow_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/workflow_test.go @@ -55,13 +55,13 @@ var _ = Describe("Test Workflow", func() { Components: []common.ApplicationComponent{{ Name: "test-component", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }}, Workflow: &oamcore.Workflow{ Steps: []oamcore.WorkflowStep{{ Name: "test-wf1", Type: "foowf", - Properties: runtime.RawExtension{Raw: []byte(`{"namespace":"test-ns"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"namespace":"test-ns"}`)}, }}, }, }, @@ -71,7 +71,7 @@ var _ = Describe("Test Workflow", func() { appWithWorkflowAndPolicy.Spec.Policies = []oamcore.AppPolicy{{ Name: "test-policy", Type: "foopolicy", - Properties: runtime.RawExtension{Raw: []byte(`{"key":"test"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"key":"test"}`)}, }} appWithPolicy := &oamcore.Application{ @@ -83,12 +83,12 @@ var _ = Describe("Test Workflow", func() { Components: []common.ApplicationComponent{{ Name: "test-component", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }}, Policies: []oamcore.AppPolicy{{ Name: "test-policy", Type: "foopolicy", - Properties: runtime.RawExtension{Raw: []byte(`{"key":"test"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"key":"test"}`)}, }}, }, } @@ -160,7 +160,7 @@ var _ = Describe("Test Workflow", func() { appWithPolicyAndWorkflow.Spec.Policies = []oamcore.AppPolicy{{ Name: "test-foo-policy", Type: "foopolicy", - Properties: runtime.RawExtension{Raw: []byte(`{"key":"test"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"key":"test"}`)}, }} Expect(k8sClient.Create(ctx, appWithPolicyAndWorkflow)).Should(BeNil()) @@ -237,7 +237,7 @@ var _ = Describe("Test Workflow", func() { suspendApp.Spec.Workflow.Steps = []oamcore.WorkflowStep{{ Name: "suspend", Type: "suspend", - Properties: runtime.RawExtension{Raw: []byte(`{}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{}`)}, }} Expect(k8sClient.Create(ctx, suspendApp)).Should(BeNil()) @@ -284,12 +284,12 @@ var _ = Describe("Test Workflow", func() { { Name: "suspend", Type: "suspend", - Properties: runtime.RawExtension{Raw: []byte(`{}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{}`)}, }, { Name: "suspend-1", Type: "suspend", - Properties: runtime.RawExtension{Raw: []byte(`{}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{}`)}, }} Expect(k8sClient.Create(ctx, suspendApp)).Should(BeNil()) @@ -352,7 +352,7 @@ var _ = Describe("Test Workflow", func() { { Name: "myweb1", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, Inputs: common.StepInputs{ { From: "message", @@ -367,7 +367,7 @@ var _ = Describe("Test Workflow", func() { { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, Outputs: common.StepOutputs{ {Name: "message", ValueFrom: "output.status.conditions[0].message+\",\"+outputs.gameconfig.data.lives"}, }, @@ -377,11 +377,11 @@ var _ = Describe("Test Workflow", func() { Steps: []oamcore.WorkflowStep{{ Name: "test-web2", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, }, { Name: "test-web1", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, }}, }, }, @@ -461,24 +461,24 @@ var _ = Describe("Test Workflow", func() { { Name: "myweb1", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, DependsOn: []string{"myweb2"}, }, { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, }, }, Workflow: &oamcore.Workflow{ Steps: []oamcore.WorkflowStep{{ Name: "test-web2", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, }, { Name: "test-web1", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, }}, }, }, @@ -549,7 +549,7 @@ var _ = Describe("Test Workflow", func() { { Name: "myweb1", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, DependsOn: []string{"myweb2"}, Inputs: common.StepInputs{ { @@ -565,7 +565,7 @@ var _ = Describe("Test Workflow", func() { { Name: "myweb2", Type: "worker-with-health", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, Outputs: common.StepOutputs{ {Name: "message", ValueFrom: "output.status.conditions[0].message+\",\"+outputs.gameconfig.data.lives"}, }, @@ -575,11 +575,11 @@ var _ = Describe("Test Workflow", func() { Steps: []oamcore.WorkflowStep{{ Name: "test-web2", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, }, { Name: "test-web1", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, }}, }, }, @@ -649,12 +649,12 @@ var _ = Describe("Test Workflow", func() { { Name: "myweb1", Type: "webserver", - Properties: runtime.RawExtension{Raw: []byte(`{"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"image":"busybox"}`)}, }, { Name: "myweb2", Type: "webserver", - Properties: runtime.RawExtension{Raw: []byte(`{"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"image":"busybox"}`)}, }, }, }, @@ -666,19 +666,19 @@ var _ = Describe("Test Workflow", func() { updateApp := &oamcore.Application{} Expect(k8sClient.Get(ctx, appKey, updateApp)).Should(BeNil()) Expect(updateApp.Status.Phase).Should(BeEquivalentTo(common.ApplicationRunning)) - updateApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(`{}`)} + updateApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(`{}`)} updateApp.Spec.Workflow = &oamcore.Workflow{ Steps: []oamcore.WorkflowStep{{ Name: "test-web2", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, Outputs: common.StepOutputs{ {Name: "image", ValueFrom: "output.spec.template.spec.containers[0].image"}, }, }, { Name: "test-web1", Type: "apply-component", - Properties: runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, Inputs: common.StepInputs{ { From: "image", diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_controller_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_controller_test.go index 6225ea23b..70378c3d6 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_controller_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_controller_test.go @@ -328,7 +328,7 @@ spec: cd.Spec.Workload.Definition = common.WorkloadGVK{APIVersion: "apps/v1", Kind: "Deployment"} cd.Spec.Schematic = &common.Schematic{ HELM: &common.Helm{ - Release: util.Object2RawExtension(map[string]interface{}{ + Release: *util.Object2RawExtension(map[string]interface{}{ "chart": map[string]interface{}{ "spec": map[string]interface{}{ "chart": "podinfo", @@ -336,7 +336,7 @@ spec: }, }, }), - Repository: util.Object2RawExtension(map[string]interface{}{ + Repository: *util.Object2RawExtension(map[string]interface{}{ "url": "http://oam.dev/catalog/", }), }, diff --git a/pkg/oam/util/helper.go b/pkg/oam/util/helper.go index d148c46cd..226578ec0 100644 --- a/pkg/oam/util/helper.go +++ b/pkg/oam/util/helper.go @@ -727,9 +727,9 @@ func Object2Map(obj interface{}) (map[string]interface{}, error) { } // Object2RawExtension converts an object to a rawExtension -func Object2RawExtension(obj interface{}) runtime.RawExtension { +func Object2RawExtension(obj interface{}) *runtime.RawExtension { bts := MustJSONMarshal(obj) - return runtime.RawExtension{ + return &runtime.RawExtension{ Raw: bts, } } @@ -774,7 +774,7 @@ func GenTraitName(componentName string, ct *v1alpha2.ComponentTrait, traitType s // compatibility func GenTraitNameCompatible(componentName string, trait *unstructured.Unstructured, traitType string) string { ct := &v1alpha2.ComponentTrait{ - Trait: Object2RawExtension(trait), + Trait: *Object2RawExtension(trait), } return GenTraitName(componentName, ct, traitType) } diff --git a/pkg/utils/env/helper.go b/pkg/utils/env/helper.go index 7f3db720d..29999e367 100644 --- a/pkg/utils/env/helper.go +++ b/pkg/utils/env/helper.go @@ -59,7 +59,7 @@ func getEnvNamespace(application *v1beta1.Application) string { namespace := DefaultEnvNamespace for _, comp := range application.Spec.Components { if comp.Type == RawType { - obj, err := util.RawExtension2Unstructured(&comp.Properties) + obj, err := util.RawExtension2Unstructured(comp.Properties) if err != nil { return "" } diff --git a/pkg/workflow/hooks/data_passing.go b/pkg/workflow/hooks/data_passing.go index c2c94d8cb..c76728734 100644 --- a/pkg/workflow/hooks/data_passing.go +++ b/pkg/workflow/hooks/data_passing.go @@ -55,23 +55,24 @@ func Input(ctx wfContext.Context, paramValue *value.Value, step v1beta1.Workflow // Output get data from task value. func Output(ctx wfContext.Context, taskValue *value.Value, step v1beta1.WorkflowStep, phase common.WorkflowStepPhase) error { if phase == common.WorkflowStepPhaseSucceeded { - ready, err := value.NewValue(`true`, nil, "") - if err != nil { - return err - } - - o := struct { - Name string `json:"name"` - }{} - js, err := step.Properties.MarshalJSON() - if err != nil { - return err - } - if err := json.Unmarshal(js, &o); err != nil { - return err - } - if err := ctx.SetVar(ready, ReadyComponent, o.Name); err != nil { - return err + if step.Properties != nil { + o := struct { + Name string `json:"name"` + }{} + js, err := common.RawExtensionPointer{RawExtension: step.Properties}.MarshalJSON() + if err != nil { + return err + } + if err := json.Unmarshal(js, &o); err != nil { + return err + } + ready, err := value.NewValue(`true`, nil, "") + if err != nil { + return err + } + if err := ctx.SetVar(ready, ReadyComponent, o.Name); err != nil { + return err + } } for _, output := range step.Outputs { diff --git a/pkg/workflow/hooks/data_passing_test.go b/pkg/workflow/hooks/data_passing_test.go index 4de87475b..797641465 100644 --- a/pkg/workflow/hooks/data_passing_test.go +++ b/pkg/workflow/hooks/data_passing_test.go @@ -71,7 +71,7 @@ output: score: 99 `, nil, "") r.NoError(err) err = Output(wfCtx, taskValue, v1beta1.WorkflowStep{ - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte("{\"name\":\"mystep\"}"), }, Outputs: common.StepOutputs{{ diff --git a/pkg/workflow/providers/oam/apply_test.go b/pkg/workflow/providers/oam/apply_test.go index d0cf9b664..47fa67dc2 100644 --- a/pkg/workflow/providers/oam/apply_test.go +++ b/pkg/workflow/providers/oam/apply_test.go @@ -89,7 +89,7 @@ func TestLoadComponent(t *testing.T) { { Name: "c1", Type: "web", - Properties: runtime.RawExtension{Raw: []byte(`{"image": "busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"image": "busybox"}`)}, }, }, }, diff --git a/pkg/workflow/tasks/custom/task.go b/pkg/workflow/tasks/custom/task.go index 171b6ed72..bcbb207f5 100644 --- a/pkg/workflow/tasks/custom/task.go +++ b/pkg/workflow/tasks/custom/task.go @@ -122,8 +122,8 @@ func (t *TaskLoader) makeTaskGenerator(templ string) (wfTypes.TaskGenerator, err params := map[string]interface{}{} - if len(wfStep.Properties.Raw) > 0 { - bt, err := wfStep.Properties.MarshalJSON() + if wfStep.Properties != nil && len(wfStep.Properties.Raw) > 0 { + bt, err := common.RawExtensionPointer{RawExtension: wfStep.Properties}.MarshalJSON() if err != nil { return nil, err } diff --git a/pkg/workflow/tasks/custom/task_test.go b/pkg/workflow/tasks/custom/task_test.go index 0ba99398b..de407ff33 100644 --- a/pkg/workflow/tasks/custom/task_test.go +++ b/pkg/workflow/tasks/custom/task_test.go @@ -182,7 +182,7 @@ close({ { Name: "input-err", Type: "ok", - Properties: runtime.RawExtension{Raw: []byte(` + Properties: &runtime.RawExtension{Raw: []byte(` {"score": {"y": 101}} `)}, Inputs: common.StepInputs{{ diff --git a/references/appfile/addon_test.go b/references/appfile/addon_test.go index 26ab7fd22..ef3c75172 100644 --- a/references/appfile/addon_test.go +++ b/references/appfile/addon_test.go @@ -37,7 +37,7 @@ var _ = It("Test ApplyTerraform", func() { Spec: v1beta1.ApplicationSpec{Components: []commontype.ApplicationComponent{{ Name: "test-terraform-svc", Type: "aliyun-oss", - Properties: runtime.RawExtension{Raw: []byte("{\"bucket\": \"oam-website\"}")}, + Properties: &runtime.RawExtension{Raw: []byte("{\"bucket\": \"oam-website\"}")}, }, }}, } diff --git a/references/appfile/api/appfile_test.go b/references/appfile/api/appfile_test.go index ba2370f8b..184413b99 100644 --- a/references/appfile/api/appfile_test.go +++ b/references/appfile/api/appfile_test.go @@ -77,7 +77,7 @@ func TestBuildOAMApplication2(t *testing.T) { { Name: "webapp", Type: "containerWorkload", - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte("{\"image\":\"busybox\"}"), }, Scopes: map[string]string{"healthscopes.core.oam.dev": "test-default-health"}, @@ -111,14 +111,14 @@ func TestBuildOAMApplication2(t *testing.T) { { Name: "webapp", Type: "containerWorkload", - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte("{\"image\":\"busybox\"}"), }, Scopes: map[string]string{"healthscopes.core.oam.dev": "test-default-health"}, Traits: []common.ApplicationTrait{ { Type: "scaler", - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte("{\"replicas\":10}"), }, }, @@ -261,12 +261,12 @@ outputs: ingress: { Type: "webservice", Name: "express-server", Scopes: map[string]string{"healthscopes.core.oam.dev": "myapp-default-health"}, - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(`{"image": "oamdev/testapp:v1", "cmd": ["node", "server.js"]}`), }, Traits: []common.ApplicationTrait{{ Type: "route", - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(`{"domain": "example.com", "http":{"/": 8080}}`), }, }, @@ -278,7 +278,7 @@ outputs: ingress: { ac2.Spec.Components = append(ac2.Spec.Components, common.ApplicationComponent{ Name: "mongodb", Type: "backend", - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(`{"image":"bitnami/mongodb:3.6.20","cmd": ["mongodb"]}`), }, Traits: []common.ApplicationTrait{}, @@ -395,17 +395,17 @@ outputs: ingress: { assert.Equal(t, comp.Name, c.want.app.Spec.Components[idx].Name) assert.Equal(t, comp.Scopes, c.want.app.Spec.Components[idx].Scopes) - got, err := util.RawExtension2Map(&comp.Properties) + got, err := util.RawExtension2Map(comp.Properties) assert.NoError(t, err) - exp, err := util.RawExtension2Map(&c.want.app.Spec.Components[idx].Properties) + exp, err := util.RawExtension2Map(c.want.app.Spec.Components[idx].Properties) assert.NoError(t, err) assert.Equal(t, exp, got) for tidx, tr := range comp.Traits { assert.Equal(t, tr.Type, c.want.app.Spec.Components[idx].Traits[tidx].Type) - got, err := util.RawExtension2Map(&tr.Properties) + got, err := util.RawExtension2Map(tr.Properties) assert.NoError(t, err) - exp, err := util.RawExtension2Map(&c.want.app.Spec.Components[idx].Traits[tidx].Properties) + exp, err := util.RawExtension2Map(c.want.app.Spec.Components[idx].Traits[tidx].Properties) assert.NoError(t, err) assert.Equal(t, exp, got) } diff --git a/references/appfile/api/service.go b/references/appfile/api/service.go index e8ee6cd62..05ad0e27e 100644 --- a/references/appfile/api/service.go +++ b/references/appfile/api/service.go @@ -90,7 +90,7 @@ func (s Service) RenderServiceToApplicationComponent(tm template.Manager, servic if err := pts.UnmarshalJSON(jt); err != nil { return comp, err } - trait.Properties = *pts + trait.Properties = pts traits = append(traits, trait) continue } @@ -106,7 +106,7 @@ func (s Service) RenderServiceToApplicationComponent(tm template.Manager, servic if err := settings.UnmarshalJSON(pt); err != nil { return comp, err } - comp.Properties = *settings + comp.Properties = settings if len(traits) > 0 { comp.Traits = traits diff --git a/references/appfile/app.go b/references/appfile/app.go index b1cb3c123..aa1397b49 100644 --- a/references/appfile/app.go +++ b/references/appfile/app.go @@ -108,7 +108,9 @@ func GetApplicationSettings(app *v1beta1.Application, componentName string) (str for _, comp := range app.Spec.Components { if comp.Name == componentName { data := map[string]interface{}{} - _ = json.Unmarshal(comp.Properties.Raw, &data) + if comp.Properties != nil { + _ = json.Unmarshal(comp.Properties.Raw, &data) + } return comp.Type, data } } diff --git a/references/appfile/modify.go b/references/appfile/modify.go index 890085443..d40542261 100644 --- a/references/appfile/modify.go +++ b/references/appfile/modify.go @@ -72,10 +72,14 @@ func SetTrait(app *v1beta1.Application, componentName, traitType string, traitDa continue } added = true - app.Spec.Components[idx].Traits[j].Properties.Raw = data + if app.Spec.Components[idx].Traits[j].Properties == nil && data != nil { + app.Spec.Components[idx].Traits[j].Properties = &runtime.RawExtension{Raw: data} + } else { + app.Spec.Components[idx].Traits[j].Properties.Raw = data + } } if !added { - app.Spec.Components[idx].Traits = append(app.Spec.Components[idx].Traits, common.ApplicationTrait{Type: traitType, Properties: runtime.RawExtension{Raw: data}}) + app.Spec.Components[idx].Traits = append(app.Spec.Components[idx].Traits, common.ApplicationTrait{Type: traitType, Properties: &runtime.RawExtension{Raw: data}}) } } if !foundComp { diff --git a/references/cli/status.go b/references/cli/status.go index 8396336c7..e4e6ace04 100644 --- a/references/cli/status.go +++ b/references/cli/status.go @@ -193,7 +193,7 @@ func loopCheckStatus(ctx context.Context, c client.Client, ioStreams cmdutil.IOS var message string for _, v := range comp.Traits { if v.Type == tr.Type { - traitData, _ := util.RawExtension2Map(&v.Properties) + traitData, _ := util.RawExtension2Map(v.Properties) for k, v := range traitData { message += fmt.Sprintf("%v=%v\n\t\t", k, v) } diff --git a/references/cli/workflow_test.go b/references/cli/workflow_test.go index 09be7aad8..c69c47bfd 100644 --- a/references/cli/workflow_test.go +++ b/references/cli/workflow_test.go @@ -36,13 +36,13 @@ var workflowSpec = v1beta1.ApplicationSpec{ Components: []common.ApplicationComponent{{ Name: "test-component", Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }}, Workflow: &v1beta1.Workflow{ Steps: []v1beta1.WorkflowStep{{ Name: "test-wf1", Type: "foowf", - Properties: runtime.RawExtension{Raw: []byte(`{"namespace":"default"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"namespace":"default"}`)}, }}, }, } diff --git a/test/e2e-test/app_embed_rollout_test.go b/test/e2e-test/app_embed_rollout_test.go index c27c6f1a4..8c59d526b 100644 --- a/test/e2e-test/app_embed_rollout_test.go +++ b/test/e2e-test/app_embed_rollout_test.go @@ -117,7 +117,7 @@ var _ = Describe("rollout related e2e-test,Cloneset based app embed rollout test { Name: appName, Type: compType, - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(initialProperty), }, }, @@ -496,7 +496,7 @@ var _ = Describe("rollout related e2e-test,Cloneset based app embed rollout test appName = "app-rollout-5" app := generateNewApp(appName, namespaceName, "clonesetservice", plan) ingressProperties := `{"domain":"test-1.example.com","http":{"/":8080}}` - app.Spec.Components[0].Traits = []apicommon.ApplicationTrait{{Type: "ingress", Properties: runtime.RawExtension{Raw: []byte(ingressProperties)}}} + app.Spec.Components[0].Traits = []apicommon.ApplicationTrait{{Type: "ingress", Properties: &runtime.RawExtension{Raw: []byte(ingressProperties)}}} Expect(k8sClient.Create(ctx, app)).Should(BeNil()) verifyRolloutSucceeded(utils.ConstructRevisionName(appName, 1), "1") updateAppWithCpuAndPlan(app, "2", plan) @@ -530,7 +530,7 @@ var _ = Describe("rollout related e2e-test,Cloneset based app embed rollout test annotherComp := apicommon.ApplicationComponent{ Name: "another-comp", Type: "clonesetservice", - Properties: runtime.RawExtension{ + Properties: &runtime.RawExtension{ Raw: []byte(initialProperty), }, } diff --git a/test/e2e-test/app_resourcetracker_test.go b/test/e2e-test/app_resourcetracker_test.go index cbd5377cf..f555a565e 100644 --- a/test/e2e-test/app_resourcetracker_test.go +++ b/test/e2e-test/app_resourcetracker_test.go @@ -99,10 +99,10 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"image": "nginx:latest"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"image": "nginx:latest"}`)}, Traits: []common.ApplicationTrait{{ Type: "cluster-scope-trait", - Properties: runtime.RawExtension{Raw: []byte("{}")}, + Properties: &runtime.RawExtension{Raw: []byte("{}")}, }}, }, }, @@ -177,15 +177,15 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"image": "nginx:latest"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"image": "nginx:latest"}`)}, Traits: []common.ApplicationTrait{ { Type: "cluster-scope-trait", - Properties: runtime.RawExtension{Raw: []byte("{}")}, + Properties: &runtime.RawExtension{Raw: []byte("{}")}, }, { Type: "cross-scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, }, }, }, @@ -217,7 +217,7 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "worker", - Properties: runtime.RawExtension{Raw: []byte(`{"image": "nginx:latest"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"image": "nginx:latest"}`)}, Traits: []common.ApplicationTrait{ // remove the cluster-scoped trait and keep the // cross-namespaced trait. @@ -226,7 +226,7 @@ var _ = Describe("Test application cross namespace resource", func() { // not cascading deletion { Type: "cross-scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, }}, }, }, @@ -274,7 +274,7 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "cross-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, @@ -379,7 +379,7 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "normal-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, @@ -426,7 +426,7 @@ var _ = Describe("Test application cross namespace resource", func() { app.Spec.Components[0].Traits = []common.ApplicationTrait{ { Type: "cross-scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, }, } return k8sClient.Update(ctx, app) @@ -495,11 +495,11 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "normal-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, Traits: []common.ApplicationTrait{ { Type: "cross-scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas": 1}`)}, }, }, }, @@ -607,12 +607,12 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: component1Name, Type: "normal-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, { Name: component2Name, Type: "cross-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, @@ -738,7 +738,7 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "cross-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, @@ -799,7 +799,7 @@ var _ = Describe("Test application cross namespace resource", func() { if err != nil { return err } - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"nginx"}`)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"nginx"}`)} err = k8sClient.Update(ctx, checkApp) if err != nil { return err @@ -882,12 +882,12 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: component1Name, Type: "cross-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, { Name: component2Name, Type: "cross-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, @@ -1036,11 +1036,11 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "cross-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, Traits: []common.ApplicationTrait{ { Type: "cross-scaler", - Properties: runtime.RawExtension{Raw: []byte(`{"replicas": 0}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"replicas": 0}`)}, }, }, }, @@ -1194,7 +1194,7 @@ var _ = Describe("Test application cross namespace resource", func() { { Name: componentName, Type: "cross-worker", - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, diff --git a/test/e2e-test/app_revision_clean_up_test.go b/test/e2e-test/app_revision_clean_up_test.go index 2a990dc15..8cad684d9 100644 --- a/test/e2e-test/app_revision_clean_up_test.go +++ b/test/e2e-test/app_revision_clean_up_test.go @@ -93,7 +93,7 @@ var _ = Describe("Test application controller clean up appRevision", func() { checkApp = new(v1beta1.Application) Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} if err := k8sClient.Update(ctx, checkApp); err != nil { return err } @@ -133,7 +133,7 @@ var _ = Describe("Test application controller clean up appRevision", func() { return err } property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 5) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} return k8sClient.Update(ctx, checkApp) }, time.Second*10, time.Millisecond*500).Should(BeNil()) @@ -163,7 +163,7 @@ var _ = Describe("Test application controller clean up appRevision", func() { return err } property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, 6) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} if err := k8sClient.Update(ctx, checkApp); err != nil { return err } @@ -212,7 +212,7 @@ var _ = Describe("Test application controller clean up appRevision", func() { checkApp = new(v1beta1.Application) Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) property := fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} if err := k8sClient.Update(ctx, checkApp); err != nil { return err } @@ -243,7 +243,7 @@ var _ = Describe("Test application controller clean up appRevision", func() { if err := k8sClient.Get(ctx, appKey, checkApp); err != nil { return err } - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} return k8sClient.Update(ctx, checkApp) }, 15*time.Second, 500*time.Millisecond).Should(Succeed()) deletedRevison := new(v1beta1.ApplicationRevision) @@ -272,7 +272,7 @@ var _ = Describe("Test application controller clean up appRevision", func() { if err := k8sClient.Get(ctx, appKey, checkApp); err != nil { return err } - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} return k8sClient.Update(ctx, checkApp) }, 15*time.Second, 500*time.Millisecond).Should(Succeed()) Eventually(func() error { @@ -333,7 +333,7 @@ var _ = Describe("Test application controller clean up appRevision", func() { return err } property = fmt.Sprintf(`{"cmd":["sleep","1000"],"image":"busybox:%d"}`, i) - checkApp.Spec.Components[0].Properties = runtime.RawExtension{Raw: []byte(property)} + checkApp.Spec.Components[0].Properties = &runtime.RawExtension{Raw: []byte(property)} if err := k8sClient.Update(ctx, checkApp); err != nil { return err } @@ -438,7 +438,7 @@ func getApp(appName, namespace, comptype string) *v1beta1.Application { { Name: "comp1", Type: comptype, - Properties: runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, }, }, }, diff --git a/test/e2e-test/definition_revision_test.go b/test/e2e-test/definition_revision_test.go index 7001f6f9d..2132c4bd8 100644 --- a/test/e2e-test/definition_revision_test.go +++ b/test/e2e-test/definition_revision_test.go @@ -366,7 +366,7 @@ var _ = Describe("Test application of the specified definition version", func() } helmworkerV1.Spec.Schematic = &common.Schematic{ HELM: &common.Helm{ - Release: util.Object2RawExtension(map[string]interface{}{ + Release: *util.Object2RawExtension(map[string]interface{}{ "chart": map[string]interface{}{ "spec": map[string]interface{}{ "chart": "podinfo", @@ -374,7 +374,7 @@ var _ = Describe("Test application of the specified definition version", func() }, }, }), - Repository: util.Object2RawExtension(map[string]interface{}{ + Repository: *util.Object2RawExtension(map[string]interface{}{ "url": "https://stefanprodan.github.io/podinfo", }), }, @@ -399,7 +399,7 @@ var _ = Describe("Test application of the specified definition version", func() helmworkerV2.Spec.Workload.Type = "deployments.apps" helmworkerV2.Spec.Schematic = &common.Schematic{ HELM: &common.Helm{ - Release: util.Object2RawExtension(map[string]interface{}{ + Release: *util.Object2RawExtension(map[string]interface{}{ "chart": map[string]interface{}{ "spec": map[string]interface{}{ "chart": "podinfo", @@ -407,7 +407,7 @@ var _ = Describe("Test application of the specified definition version", func() }, }, }), - Repository: util.Object2RawExtension(map[string]interface{}{ + Repository: *util.Object2RawExtension(map[string]interface{}{ "url": "https://stefanprodan.github.io/podinfo", }), }, diff --git a/test/e2e-test/helm_app_test.go b/test/e2e-test/helm_app_test.go index 0d9e378d5..527bf87ff 100644 --- a/test/e2e-test/helm_app_test.go +++ b/test/e2e-test/helm_app_test.go @@ -66,7 +66,7 @@ var _ = Describe("Test application containing helm module", func() { cd.Spec.Workload.Definition = common.WorkloadGVK{APIVersion: "apps/v1", Kind: "Deployment"} cd.Spec.Schematic = &common.Schematic{ HELM: &common.Helm{ - Release: util.Object2RawExtension(map[string]interface{}{ + Release: *util.Object2RawExtension(map[string]interface{}{ "chart": map[string]interface{}{ "spec": map[string]interface{}{ "chart": "podinfo", @@ -74,7 +74,7 @@ var _ = Describe("Test application containing helm module", func() { }, }, }), - Repository: util.Object2RawExtension(map[string]interface{}{ + Repository: *util.Object2RawExtension(map[string]interface{}{ "url": "http://oam.dev/catalog/", }), }, @@ -266,7 +266,7 @@ var _ = Describe("Test application containing helm module", func() { workloaddef.Spec.Reference = common.DefinitionReference{Name: "deployments.apps", Version: "v1"} workloaddef.Spec.Schematic = &common.Schematic{ HELM: &common.Helm{ - Release: util.Object2RawExtension(map[string]interface{}{ + Release: *util.Object2RawExtension(map[string]interface{}{ "chart": map[string]interface{}{ "spec": map[string]interface{}{ "chart": "podinfo", @@ -274,7 +274,7 @@ var _ = Describe("Test application containing helm module", func() { }, }, }), - Repository: util.Object2RawExtension(map[string]interface{}{ + Repository: *util.Object2RawExtension(map[string]interface{}{ "url": "http://oam.dev/catalog/", }), }, @@ -321,7 +321,7 @@ var _ = Describe("Test application containing helm module", func() { cd.SetNamespace(namespace) cd.Spec.Schematic = &common.Schematic{ HELM: &common.Helm{ - Release: util.Object2RawExtension(map[string]interface{}{ + Release: *util.Object2RawExtension(map[string]interface{}{ "chart": map[string]interface{}{ "spec": map[string]interface{}{ "chart": "podinfo", @@ -329,7 +329,7 @@ var _ = Describe("Test application containing helm module", func() { }, }, }), - Repository: util.Object2RawExtension(map[string]interface{}{ + Repository: *util.Object2RawExtension(map[string]interface{}{ "url": "http://oam.dev/catalog/", }), },