From c24cbdc6f964eee6076353d8ca9f23e7d9c73d7e Mon Sep 17 00:00:00 2001 From: qiaozp <47812250+chivalryq@users.noreply.github.com> Date: Thu, 6 Apr 2023 11:48:26 +0800 Subject: [PATCH] Feat: compatibility on componentDefinition spec.workload.definition field (#5800) * Feat: compatibility on componentDefinition spec.workload.definition field Signed-off-by: Qiaozp * rollback Signed-off-by: Qiaozp * remove hack fallback Signed-off-by: Qiaozp --------- Signed-off-by: Qiaozp --- apis/types/capability.go | 5 +- .../templates/defwithtemplate/cron-task.yaml | 5 +- .../templates/defwithtemplate/cron-task.yaml | 5 +- pkg/oam/util/helper.go | 29 ---- pkg/oam/util/helper_test.go | 124 ------------------ references/common/registry.go | 43 ------ references/docgen/cluster.go | 12 +- .../internal/component/cron-task.cue | 8 +- 8 files changed, 6 insertions(+), 225 deletions(-) diff --git a/apis/types/capability.go b/apis/types/capability.go index 270e07632..b889a9cc2 100644 --- a/apis/types/capability.go +++ b/apis/types/capability.go @@ -176,9 +176,8 @@ type Capability struct { Namespace string `json:"namespace,omitempty"` // Plugin Source - Source *Source `json:"source,omitempty"` - Install *Installation `json:"install,omitempty"` - CrdInfo *CRDInfo `json:"crdInfo,omitempty"` + Source *Source `json:"source,omitempty"` + CrdInfo *CRDInfo `json:"crdInfo,omitempty"` // Terraform TerraformConfiguration string `json:"terraformConfiguration,omitempty"` diff --git a/charts/vela-core/templates/defwithtemplate/cron-task.yaml b/charts/vela-core/templates/defwithtemplate/cron-task.yaml index a8f4fcbfa..ead91038c 100644 --- a/charts/vela-core/templates/defwithtemplate/cron-task.yaml +++ b/charts/vela-core/templates/defwithtemplate/cron-task.yaml @@ -320,8 +320,5 @@ spec: failureThreshold: *3 | int } workload: - definition: - apiVersion: batch/v1beta1 - kind: CronJob - type: cronjobs.batch + type: autodetects.core.oam.dev diff --git a/charts/vela-minimal/templates/defwithtemplate/cron-task.yaml b/charts/vela-minimal/templates/defwithtemplate/cron-task.yaml index a8f4fcbfa..ead91038c 100644 --- a/charts/vela-minimal/templates/defwithtemplate/cron-task.yaml +++ b/charts/vela-minimal/templates/defwithtemplate/cron-task.yaml @@ -320,8 +320,5 @@ spec: failureThreshold: *3 | int } workload: - definition: - apiVersion: batch/v1beta1 - kind: CronJob - type: cronjobs.batch + type: autodetects.core.oam.dev diff --git a/pkg/oam/util/helper.go b/pkg/oam/util/helper.go index 25cb8aab6..044e89ab5 100644 --- a/pkg/oam/util/helper.go +++ b/pkg/oam/util/helper.go @@ -51,13 +51,6 @@ import ( "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" ) -var ( - // KindDeployment is the k8s Deployment kind. - KindDeployment = reflect.TypeOf(appsv1.Deployment{}).Name() - // KindService is the k8s Service kind. - KindService = reflect.TypeOf(corev1.Service{}).Name() -) - const ( // TraitPrefixKey is prefix of trait name TraitPrefixKey = "trait" @@ -870,28 +863,6 @@ func MergeMapOverrideWithDst(src, dst map[string]string) map[string]string { return r } -// ConvertComponentDef2WorkloadDef help convert a ComponentDefinition to WorkloadDefinition -func ConvertComponentDef2WorkloadDef(dm discoverymapper.DiscoveryMapper, componentDef *v1beta1.ComponentDefinition, - workloadDef *v1beta1.WorkloadDefinition) error { - var reference common.DefinitionReference - reference, err := ConvertWorkloadGVK2Definition(dm, componentDef.Spec.Workload.Definition) - if err != nil { - return fmt.Errorf("create DefinitionReference fail %w", err) - } - - workloadDef.SetName(componentDef.Name) - workloadDef.SetNamespace(componentDef.Namespace) - workloadDef.SetLabels(componentDef.Labels) - workloadDef.SetAnnotations(componentDef.Annotations) - workloadDef.Spec.Reference = reference - workloadDef.Spec.ChildResourceKinds = componentDef.Spec.ChildResourceKinds - workloadDef.Spec.Extension = componentDef.Spec.Extension - workloadDef.Spec.RevisionLabel = componentDef.Spec.RevisionLabel - workloadDef.Spec.Status = componentDef.Spec.Status - workloadDef.Spec.Schematic = componentDef.Spec.Schematic - return nil -} - // ExtractComponentName will extract the componentName from a revisionName func ExtractComponentName(revisionName string) string { splits := strings.Split(revisionName, "-") diff --git a/pkg/oam/util/helper_test.go b/pkg/oam/util/helper_test.go index ea944bbe0..d48eec131 100644 --- a/pkg/oam/util/helper_test.go +++ b/pkg/oam/util/helper_test.go @@ -37,12 +37,10 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/yaml" "github.com/oam-dev/kubevela/apis/core.oam.dev/common" "github.com/oam-dev/kubevela/apis/core.oam.dev/condition" "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" - "github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1" "github.com/oam-dev/kubevela/pkg/oam" "github.com/oam-dev/kubevela/pkg/oam/mock" "github.com/oam-dev/kubevela/pkg/oam/util" @@ -1560,128 +1558,6 @@ func TestGetScopeDefinition(t *testing.T) { } } -func TestConvertComponentDef2WorkloadDef(t *testing.T) { - var cd = v1beta1.ComponentDefinition{} - mapper := mock.NewMockDiscoveryMapper() - - var componentDefWithWrongDefinition = ` -apiVersion: core.oam.dev/v1beta1 -kind: ComponentDefinition -metadata: - name: worker -spec: - workload: - definition: - apiVersion: /apps/v1/ - kind: Deployment -` - cd = v1beta1.ComponentDefinition{} - err := yaml.Unmarshal([]byte(componentDefWithWrongDefinition), &cd) - assert.Equal(t, nil, err) - err = util.ConvertComponentDef2WorkloadDef(mapper, &cd, &v1beta1.WorkloadDefinition{}) - assert.Error(t, err) - - mapper.MockRESTMapping = mock.NewMockRESTMapping("deployments") - var Template = ` - schematic: - cue: - template: | - output: { - apiVersion: "apps/v1" - kind: "Deployment" - spec: { - selector: matchLabels: { - "app.oam.dev/component": context.name - } - - template: { - metadata: labels: { - "app.oam.dev/component": context.name - } - - spec: { - containers: [{ - name: context.name - image: parameter.image - - if parameter["cmd"] != _|_ { - command: parameter.cmd - } - }] - } - } - } - } - - parameter: { - // +usage=Which image would you like to use for your service - // +short=i - image: string - // +usage=Commands to run in the container - cmd?: [...string] - } -` - var componentDefWithDefinition = ` -apiVersion: core.oam.dev/v1beta1 -kind: ComponentDefinition -metadata: - name: worker - namespace: vela-system - labels: - env: test - annotations: - definition.oam.dev/description: "Describes long-running, scalable, containerized services that running at backend." -spec: - workload: - definition: - apiVersion: apps/v1 - kind: Deployment - childResourceKinds: - - apiVersion: apps/v1 - kind: Deployment - status: - healthPolicy: | - isHealth: (context.output.status.readyReplicas > 0) && (context.output.status.readyReplicas == context.output.status.replicas)` + Template - - var expectWorkloadDef = ` -apiVersion: core.oam.dev/v1beta1 -kind: WorkloadDefinition -metadata: - name: worker - namespace: vela-system - labels: - env: test - annotations: - definition.oam.dev/description: "Describes long-running, scalable, containerized services that running at backend." -spec: - definitionRef: - name: deployments.apps - version: v1 - childResourceKinds: - - apiVersion: apps/v1 - kind: Deployment - status: - healthPolicy: | - isHealth: (context.output.status.readyReplicas > 0) && (context.output.status.readyReplicas == context.output.status.replicas)` + Template - cd = v1beta1.ComponentDefinition{} - wd := &v1beta1.WorkloadDefinition{} - err = yaml.Unmarshal([]byte(componentDefWithDefinition), &cd) - assert.NoError(t, err) - err = util.ConvertComponentDef2WorkloadDef(mapper, &cd, wd) - assert.NoError(t, err) - expectWd := v1beta1.WorkloadDefinition{} - err = yaml.Unmarshal([]byte(expectWorkloadDef), &expectWd) - assert.NoError(t, err) - assert.Equal(t, expectWd.Namespace, wd.Namespace) - assert.Equal(t, expectWd.Name, wd.Name) - assert.Equal(t, expectWd.Labels, wd.Labels) - assert.Equal(t, expectWd.Annotations, wd.Annotations) - assert.Equal(t, expectWd.Spec.Reference, wd.Spec.Reference) - assert.Equal(t, expectWd.Spec.ChildResourceKinds, wd.Spec.ChildResourceKinds) - assert.Equal(t, expectWd.Spec.Status, wd.Spec.Status) - assert.Equal(t, expectWd.Spec.Schematic, wd.Spec.Schematic) -} - func TestExtractRevisionNum(t *testing.T) { testcases := []struct { revName string diff --git a/references/common/registry.go b/references/common/registry.go index 85d4824d5..0349b9902 100644 --- a/references/common/registry.go +++ b/references/common/registry.go @@ -32,7 +32,6 @@ import ( "github.com/oam-dev/kubevela/apis/types" "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" "github.com/oam-dev/kubevela/pkg/oam/util" - "github.com/oam-dev/kubevela/pkg/utils/helm" cmdutil "github.com/oam-dev/kubevela/pkg/utils/util" ) @@ -48,16 +47,6 @@ func InstallComponentDefinition(client client.Client, componentData []byte, ioSt } cd.Namespace = types.DefaultKubeVelaNS ioStreams.Info("Installing component: " + cd.Name) - if tp.Install != nil { - tp.Source.ChartName = tp.Install.Helm.Name - if err = helm.InstallHelmChart(ioStreams, tp.Install.Helm); err != nil { - return err - } - err = addSourceIntoExtension(cd.Spec.Extension, tp.Source) - if err != nil { - return err - } - } if cd.Spec.Workload.Type == "" { tp.CrdInfo = &types.CRDInfo{ APIVersion: cd.Spec.Workload.Definition.APIVersion, @@ -79,19 +68,6 @@ func InstallTraitDefinition(client client.Client, mapper discoverymapper.Discove } td.Namespace = types.DefaultKubeVelaNS ioStreams.Info("Installing trait " + td.Name) - if cap.Install != nil { - cap.Source.ChartName = cap.Install.Helm.Name - if err = helm.InstallHelmChart(ioStreams, cap.Install.Helm); err != nil { - return err - } - err = addSourceIntoExtension(td.Spec.Extension, cap.Source) - if err != nil { - return err - } - } - if err = HackForStandardTrait(*cap, client); err != nil { - return err - } gvk, err := util.GetGVKFromDefinition(mapper, td.Spec.Reference) if err != nil { return err @@ -109,25 +85,6 @@ func InstallTraitDefinition(client client.Client, mapper discoverymapper.Discove return nil } -// HackForStandardTrait will do some hack install for standard registry -func HackForStandardTrait(tp types.Capability, client client.Client) error { - switch tp.Name { - case "metrics": - // metrics trait will rely on a Prometheus instance to be installed - // make sure the chart is a prometheus operator - if tp.Install == nil { - break - } - if tp.Install.Helm.Namespace == "monitoring" && tp.Install.Helm.Name == "kube-prometheus-stack" { - if err := InstallPrometheusInstance(client); err != nil { - return err - } - } - default: - } - return nil -} - func addSourceIntoExtension(in *runtime.RawExtension, source *types.Source) error { var extension map[string]interface{} err := json.Unmarshal(in.Raw, &extension) diff --git a/references/docgen/cluster.go b/references/docgen/cluster.go index 9eff09c69..3faace00d 100644 --- a/references/docgen/cluster.go +++ b/references/docgen/cluster.go @@ -19,7 +19,6 @@ package docgen import ( "context" "fmt" - "os" "strings" "github.com/pkg/errors" @@ -42,8 +41,6 @@ import ( "github.com/oam-dev/kubevela/pkg/oam/util" "github.com/oam-dev/kubevela/pkg/utils" "github.com/oam-dev/kubevela/pkg/utils/common" - "github.com/oam-dev/kubevela/pkg/utils/helm" - util2 "github.com/oam-dev/kubevela/pkg/utils/util" "github.com/oam-dev/kubevela/references/docgen/fix" ) @@ -300,16 +297,9 @@ func GetPolicies(ctx context.Context, namespace string, c common.Args) ([]types. return templates, templateErrors, nil } -// validateCapabilities validates whether helm charts are successful installed, GVK are successfully retrieved. +// validateCapabilities validates whether GVK are successfully retrieved. func validateCapabilities(tmp *types.Capability, dm discoverymapper.DiscoveryMapper, definitionName string, reference commontypes.DefinitionReference) error { var err error - if tmp.Install != nil { - tmp.Source = &types.Source{ChartName: tmp.Install.Helm.Name} - ioStream := util2.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr} - if err = helm.InstallHelmChart(ioStream, tmp.Install.Helm); err != nil { - return fmt.Errorf("unable to install helm chart dependency %s(%s from %s) for this trait '%s': %w ", tmp.Install.Helm.Name, tmp.Install.Helm.Version, tmp.Install.Helm.URL, definitionName, err) - } - } gvk, err := util.GetGVKFromDefinition(dm, reference) if err != nil { errMsg := err.Error() diff --git a/vela-templates/definitions/internal/component/cron-task.cue b/vela-templates/definitions/internal/component/cron-task.cue index bce5ae14f..51ffd16e4 100644 --- a/vela-templates/definitions/internal/component/cron-task.cue +++ b/vela-templates/definitions/internal/component/cron-task.cue @@ -3,13 +3,7 @@ annotations: {} labels: {} description: "Describes cron jobs that run code or a script to completion." - attributes: workload: { - definition: { - apiVersion: "batch/v1beta1" - kind: "CronJob" - } - type: "cronjobs.batch" - } + attributes: workload: type: "autodetects.core.oam.dev" } template: { output: {