func()

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
}