Feat: compatibility on componentDefinition spec.workload.definition field (#5800)

* Feat: compatibility on componentDefinition spec.workload.definition field

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>

* rollback

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>

* remove hack fallback

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>

---------

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
This commit is contained in:
qiaozp
2023-04-06 11:48:26 +08:00
committed by GitHub
parent 0a368ec856
commit c24cbdc6f9
8 changed files with 6 additions and 225 deletions

View File

@@ -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"`

View File

@@ -320,8 +320,5 @@ spec:
failureThreshold: *3 | int
}
workload:
definition:
apiVersion: batch/v1beta1
kind: CronJob
type: cronjobs.batch
type: autodetects.core.oam.dev

View File

@@ -320,8 +320,5 @@ spec:
failureThreshold: *3 | int
}
workload:
definition:
apiVersion: batch/v1beta1
kind: CronJob
type: cronjobs.batch
type: autodetects.core.oam.dev

View File

@@ -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, "-")

View File

@@ -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

View File

@@ -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)

View File

@@ -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()

View File

@@ -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: {