mirror of
https://github.com/kubevela/kubevela.git
synced 2026-02-14 18:10:21 +00:00
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:
@@ -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"`
|
||||
|
||||
@@ -320,8 +320,5 @@ spec:
|
||||
failureThreshold: *3 | int
|
||||
}
|
||||
workload:
|
||||
definition:
|
||||
apiVersion: batch/v1beta1
|
||||
kind: CronJob
|
||||
type: cronjobs.batch
|
||||
type: autodetects.core.oam.dev
|
||||
|
||||
|
||||
@@ -320,8 +320,5 @@ spec:
|
||||
failureThreshold: *3 | int
|
||||
}
|
||||
workload:
|
||||
definition:
|
||||
apiVersion: batch/v1beta1
|
||||
kind: CronJob
|
||||
type: cronjobs.batch
|
||||
type: autodetects.core.oam.dev
|
||||
|
||||
|
||||
@@ -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, "-")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user