in pkg/util/bindings/kamelet.go [43:147]
func (k BindingConverter) Translate(ctx BindingContext, endpointCtx EndpointContext, e v1.Endpoint) (*Binding, error) {
if e.Ref == nil {
// works only on refs
return nil, nil
}
gv, err := schema.ParseGroupVersion(e.Ref.APIVersion)
if err != nil {
return nil, err
}
// it translates only Kamelet refs
if e.Ref.Kind != v1.KameletKind || gv.Group != v1.SchemeGroupVersion.Group {
return nil, nil
}
kameletName := url.PathEscape(e.Ref.Name)
props, err := e.Properties.GetPropertyMap()
if err != nil {
return nil, err
}
id, idPresent := props[v1.KameletIDProperty]
if idPresent {
delete(props, v1.KameletIDProperty)
} else {
id = endpointCtx.GenerateID()
}
version, versionPresent := props[v1.KameletVersionProperty]
if versionPresent {
delete(props, v1.KameletVersionProperty)
}
kameletTranslated := getKameletName(kameletName, id, version)
binding := Binding{}
binding.ApplicationProperties = make(map[string]string)
for k, v := range props {
propKey := fmt.Sprintf("camel.kamelet.%s.%s.%s", kameletName, id, k)
binding.ApplicationProperties[propKey] = v
}
dataTypeActionKamelet := ctx.Metadata[v1.KameletDataTypeLabel]
if dataTypeActionKamelet == "" {
dataTypeActionKamelet = defaultDataTypeActionKamelet
}
switch endpointCtx.Type {
case v1.EndpointTypeAction:
steps := make([]map[string]interface{}, 0)
if in, applicationProperties := k.DataTypeStep(e, id, v1.TypeSlotIn, dataTypeActionKamelet); in != nil {
steps = append(steps, in)
for k, v := range applicationProperties {
binding.ApplicationProperties[k] = v
}
}
steps = append(steps, map[string]interface{}{
"kamelet": map[string]interface{}{
"name": kameletTranslated,
},
})
if out, applicationProperties := k.DataTypeStep(e, id, v1.TypeSlotOut, dataTypeActionKamelet); out != nil {
steps = append(steps, out)
for k, v := range applicationProperties {
binding.ApplicationProperties[k] = v
}
}
if len(steps) > 1 {
binding.Step = map[string]interface{}{
"pipeline": map[string]interface{}{
"id": fmt.Sprintf("%s-pipeline", id),
"steps": steps,
},
}
} else if len(steps) == 1 {
binding.Step = steps[0]
}
case v1.EndpointTypeSource:
if out, applicationProperties := k.DataTypeStep(e, id, v1.TypeSlotOut, dataTypeActionKamelet); out != nil {
binding.Step = out
for k, v := range applicationProperties {
binding.ApplicationProperties[k] = v
}
}
binding.URI = fmt.Sprintf("kamelet:%s", kameletTranslated)
case v1.EndpointTypeSink:
if in, applicationProperties := k.DataTypeStep(e, id, v1.TypeSlotIn, dataTypeActionKamelet); in != nil {
binding.Step = in
for k, v := range applicationProperties {
binding.ApplicationProperties[k] = v
}
}
binding.URI = fmt.Sprintf("kamelet:%s", kameletTranslated)
default:
binding.URI = fmt.Sprintf("kamelet:%s", kameletTranslated)
}
return &binding, nil
}