mirror of
https://github.com/kubevela/kubevela.git
synced 2026-04-22 10:37:04 +00:00
* Refactor: remove use of AppConfig in AppRevision * Refactor: remove insert secret and configmap * Feat(workflow): upgrade * Fix(conflict): workflow cherry * Feat(workflow): support DAG mode * Feat(workflow): prepare steps in step * Feat(tools): random string * Fix(rand): gosec weak random * Fix(ci): test passing * Feat(workflow): generate steps * Fix: fix rebase from master * Fix: fix workflow ut * Feat(test): add test cases * Fix: fix lint and rebase from master * Refactor: application code * Fix: fix ci lint * Fix: make code reviewable * Fix: workflow_test.go * Feat: collect services * Fix(ci): unit tests * Feat: make one * Test: application with input/output and workflow * Fix: trace test * Fix: update step index falied * Feat: refactor op.#Load * Fix: delete dead code * Refactor: op.xxx * Fix: patch component * Test: add generator test * Fix: add license * Fix: pending e2e plugin test * Fix: disable test/e2e-test * Fix: patch by script Co-authored-by: 天元 <jianbo.sjb@alibaba-inc.com> Co-authored-by: FogDong <dongtianxin.tx@alibaba-inc.com>
88 lines
2.9 KiB
Go
88 lines
2.9 KiB
Go
/*
|
|
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 appfile
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/oam-dev/kubevela/apis/types"
|
|
"github.com/oam-dev/kubevela/pkg/cue/process"
|
|
)
|
|
|
|
// ValidateCUESchematicAppfile validates CUE schematic workloads in an Appfile
|
|
func (p *Parser) ValidateCUESchematicAppfile(a *Appfile) error {
|
|
for _, wl := range a.Workloads {
|
|
// because helm & kube schematic has no CUE template
|
|
// it only validates CUE schematic workload
|
|
if wl.CapabilityCategory != types.CUECategory {
|
|
continue
|
|
}
|
|
pCtx, err := newValidationProcessContext(wl, a.Name, a.AppRevisionName, a.Namespace)
|
|
if err != nil {
|
|
return errors.WithMessage(err, "cannot create validationg process context")
|
|
}
|
|
for _, tr := range wl.Traits {
|
|
if tr.CapabilityCategory != types.CUECategory {
|
|
continue
|
|
}
|
|
if err := tr.EvalContext(pCtx); err != nil {
|
|
return errors.WithMessagef(err, "cannot evaluate trait %q", tr.Name)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func newValidationProcessContext(wl *Workload, appName, revisionName, ns string) (process.Context, error) {
|
|
baseHooks := []process.BaseHook{
|
|
// add more hook funcs here to validate CUE base
|
|
}
|
|
auxiliaryHooks := []process.AuxiliaryHook{
|
|
// add more hook funcs here to validate CUE auxiliaries
|
|
validateAuxiliaryNameUnique(),
|
|
}
|
|
|
|
pCtx := process.NewContextWithHooks(ns, wl.Name, appName, revisionName, baseHooks, auxiliaryHooks)
|
|
if err := wl.EvalContext(pCtx); err != nil {
|
|
return nil, errors.Wrapf(err, "evaluate base template app=%s in namespace=%s", appName, ns)
|
|
}
|
|
return pCtx, nil
|
|
}
|
|
|
|
// validateAuxiliaryNameUnique validates the name of each outputs item which is
|
|
// called auxiliary in vela CUE-based DSL.
|
|
// Each capability definition can have arbitrary number of outputs and each
|
|
// outputs can have more than one auxiliaries.
|
|
// Auxiliaries can be referenced by other cap's template to pass data
|
|
// within a workload, so their names must be unique.
|
|
func validateAuxiliaryNameUnique() process.AuxiliaryHook {
|
|
return process.AuxiliaryHookFn(func(c process.Context, a []process.Auxiliary) error {
|
|
_, existingAuxs := c.Output()
|
|
for _, newAux := range a {
|
|
for _, existingAux := range existingAuxs {
|
|
if existingAux.Name == newAux.Name {
|
|
return errors.Wrap(fmt.Errorf("auxiliary %q already exits", newAux.Name),
|
|
"outputs item name must be unique")
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|