capability: use def name as name

Signed-off-by: Hongchao Deng <hongchaodeng1@gmail.com>
This commit is contained in:
Hongchao Deng
2020-10-26 20:51:16 -07:00
parent e9186fa8eb
commit cff6a74430
7 changed files with 23 additions and 36 deletions
-1
View File
@@ -39,7 +39,6 @@ type CrdInfo struct {
type Capability struct {
Name string `json:"name"`
Type CapType `json:"type"`
DefName string `json:"defName,omitempty"`
CueTemplate string `json:"template,omitempty"`
CueTemplateURI string `json:"templateURI,omitempty"`
Parameters []Parameter `json:"parameters,omitempty"`
+3 -5
View File
@@ -104,8 +104,7 @@ func (s Service) RenderService(tm template.Manager, name, ns string, cg configGe
}
ctxData["config"] = data
}
_, rawTmpl := tm.LoadTemplate(wtype)
u, err := evalComponent(rawTmpl, ctxData, intifyValues(workloadKeys))
u, err := evalComponent(tm.LoadTemplate(wtype), ctxData, intifyValues(workloadKeys))
if err != nil {
return nil, nil, fmt.Errorf("eval component failed: %w", err)
}
@@ -114,14 +113,13 @@ func (s Service) RenderService(tm template.Manager, name, ns string, cg configGe
// render traits
traits := make([]v1alpha2.ComponentTrait, 0)
for traitType, traitData := range traitKeys {
defName, rawTmpl := tm.LoadTemplate(traitType)
ts, err := evalTraits(rawTmpl, ctxData, intifyValues(traitData))
ts, err := evalTraits(tm.LoadTemplate(traitType), ctxData, intifyValues(traitData))
if err != nil {
return nil, nil, fmt.Errorf("eval traits failed: %w", err)
}
// one capability corresponds to one trait only
if len(ts) == 1 {
ts[0].SetLabels(map[string]string{oam.TraitTypeLabel: defName})
ts[0].SetLabels(map[string]string{oam.TraitTypeLabel: traitType})
}
for _, t := range ts {
traits = append(traits, v1alpha2.ComponentTrait{
+4 -6
View File
@@ -7,7 +7,7 @@ import (
type Manager interface {
IsTrait(key string) bool
LoadTemplate(key string) (defName, tmpl string)
LoadTemplate(key string) (tmpl string)
}
func Load() (Manager, error) {
@@ -20,7 +20,6 @@ func Load() (Manager, error) {
t := &Template{}
t.Captype = cap.Type
t.Raw = cap.CueTemplate
t.DefName = cap.DefName
m.Templates[cap.Name] = t
}
return m, nil
@@ -29,7 +28,6 @@ func Load() (Manager, error) {
type Template struct {
Captype types.CapType
Raw string
DefName string
}
type manager struct {
@@ -50,10 +48,10 @@ func (m *manager) IsTrait(key string) bool {
return t.Captype == types.TypeTrait
}
func (m *manager) LoadTemplate(key string) (string, string) {
func (m *manager) LoadTemplate(key string) string {
t, ok := m.Templates[key]
if !ok {
return "", ""
return ""
}
return t.DefName, t.Raw
return t.Raw
}
+7 -9
View File
@@ -57,19 +57,19 @@ func Eval(templatePath string, value map[string]interface{}) (*unstructured.Unst
return &unstructured.Unstructured{Object: obj}, nil
}
func GetParameters(templatePath string) ([]types.Parameter, string, error) {
func GetParameters(templatePath string) ([]types.Parameter, error) {
r := cue.Runtime{}
b, err := ioutil.ReadFile(templatePath)
if err != nil {
return nil, "", err
return nil, err
}
template, err := r.Compile("", string(b)+BaseTemplate)
if err != nil {
return nil, "", err
return nil, err
}
tempStruct, err := template.Value().Struct()
if err != nil {
return nil, "", err
return nil, err
}
// find the parameter definition
var paraDef cue.FieldInfo
@@ -83,14 +83,12 @@ func GetParameters(templatePath string) ([]types.Parameter, string, error) {
break
}
if !found {
return nil, "", errors.New("arguments not exist")
return nil, errors.New("arguments not exist")
}
arguments, err := paraDef.Value.Struct()
if err != nil {
return nil, "", fmt.Errorf("arguments not defined as struct %v", err)
return nil, fmt.Errorf("arguments not defined as struct %v", err)
}
// workloadType is the name of the parameter definition
var workloadType = strings.TrimPrefix(paraDef.Name, "#")
// parse each fields in the parameter fields
var params []types.Parameter
for i := 0; i < arguments.Len(); i++ {
@@ -115,7 +113,7 @@ func GetParameters(templatePath string) ([]types.Parameter, string, error) {
param.Short, param.Usage = RetrieveComments(val)
params = append(params, param)
}
return params, workloadType, nil
return params, nil
}
func getDefaultByKind(k cue.Kind) interface{} {
+3 -6
View File
@@ -55,9 +55,8 @@ func TestEvalDeployment(t *testing.T) {
}
func TestGetParameter(t *testing.T) {
params, workloadType, err := GetParameters("testdata/workloads/metrics.cue")
params, err := GetParameters("testdata/workloads/metrics.cue")
assert.NoError(t, err)
assert.Equal(t, "metrics", workloadType)
assert.Equal(t, params, []types.Parameter{
{Name: "format", Required: false, Default: "prometheus", Usage: "format of the metrics, " +
"default as prometheus", Short: "f", Type: cue.StringKind},
@@ -66,9 +65,8 @@ func TestGetParameter(t *testing.T) {
{Name: "selector", Required: false, Usage: "the label selector for the pods, default is the workload labels", Type: cue.StructKind},
})
params, workloadType, err = GetParameters("testdata/workloads/deployment.cue")
params, err = GetParameters("testdata/workloads/deployment.cue")
assert.NoError(t, err)
assert.Equal(t, "deployment", workloadType)
assert.Equal(t, []types.Parameter{
{Name: "name", Required: true, Default: "", Type: cue.StringKind},
{Name: "env", Required: false, Default: nil, Type: cue.ListKind},
@@ -77,9 +75,8 @@ func TestGetParameter(t *testing.T) {
Type: cue.IntKind}},
params)
params, workloadType, err = GetParameters("testdata/workloads/test-param.cue")
params, err = GetParameters("testdata/workloads/test-param.cue")
assert.NoError(t, err)
assert.Equal(t, "deployment", workloadType)
assert.Equal(t, []types.Parameter{
{Name: "name", Required: true, Default: "", Type: cue.StringKind},
{Name: "env", Required: false, Default: nil, Type: cue.ListKind},
+2 -2
View File
@@ -95,7 +95,7 @@ func HandleDefinition(name, syncDir, crdName string, annotation map[string]strin
return types.Capability{}, err
}
tmp.Type = tp
tmp.DefName = name
tmp.Name = name
if tp == types.TypeTrait {
tmp.AppliesTo = applyTo
}
@@ -147,7 +147,7 @@ func HandleTemplate(in *runtime.RawExtension, name, syncDir string) (types.Capab
return types.Capability{}, err
}
tmp.DefinitionPath = filePath
tmp.Parameters, tmp.Name, err = cue.GetParameters(filePath)
tmp.Parameters, err = cue.GetParameters(filePath)
if err != nil {
return types.Capability{}, err
}
+4 -7
View File
@@ -18,9 +18,8 @@ import (
var _ = Describe("DefinitionFiles", func() {
route := types.Capability{
Name: "route",
Type: types.TypeTrait,
DefName: "routes.test",
Name: "routes.test",
Type: types.TypeTrait,
Parameters: []types.Parameter{
{
Name: "domain",
@@ -34,9 +33,8 @@ var _ = Describe("DefinitionFiles", func() {
}
deployment := types.Capability{
Name: "deployment",
Name: "deployments.testapps",
Type: types.TypeWorkload,
DefName: "deployments.testapps",
CrdName: "deployments.testapps",
Description: "description not defined",
Parameters: []types.Parameter{
@@ -63,9 +61,8 @@ var _ = Describe("DefinitionFiles", func() {
}
websvc := types.Capability{
Name: "webservice",
Name: "webservice.testapps",
Type: types.TypeWorkload,
DefName: "webservice.testapps",
Description: "description not defined",
Parameters: []types.Parameter{{
Name: "env", Type: cue.ListKind,