in pkg/util/digest/digest.go [47:140]
func ComputeForIntegration(integration *v1.Integration) (string, error) {
hash := sha256.New()
// Integration version is relevant
if _, err := hash.Write([]byte(integration.Status.Version)); err != nil {
return "", err
}
// Integration operator id is relevant
if _, err := hash.Write([]byte(v1.GetOperatorIDAnnotation(integration))); err != nil {
return "", err
}
// Integration Kit is relevant
if integration.Spec.IntegrationKit != nil {
if _, err := hash.Write([]byte(fmt.Sprintf("%s/%s", integration.Spec.IntegrationKit.Namespace, integration.Spec.IntegrationKit.Name))); err != nil {
return "", err
}
}
// Profile is relevant
if _, err := hash.Write([]byte(integration.Spec.Profile)); err != nil {
return "", err
}
// Integration code
for _, s := range integration.Spec.Sources {
if s.Content != "" {
if _, err := hash.Write([]byte(s.Content)); err != nil {
return "", err
}
}
}
// Integration flows
if len(integration.Spec.Flows) > 0 {
flows, err := dsl.ToYamlDSL(integration.Spec.Flows)
if err != nil {
return "", err
}
if _, err := hash.Write(flows); err != nil {
return "", err
}
}
// Integration dependencies
for _, item := range integration.Spec.Dependencies {
if _, err := hash.Write([]byte(item)); err != nil {
return "", err
}
}
// Integration configuration
for _, item := range integration.Spec.Configuration {
if _, err := hash.Write([]byte(item.String())); err != nil {
return "", err
}
}
// Integration traits
// Calculation logic prior to 1.10.0 (the new Traits API schema) is maintained
// in order to keep consistency in the digest calculated from the same set of
// Trait configurations for backward compatibility.
traitsMap, err := toMap(integration.Spec.Traits)
if err != nil {
return "", err
}
for _, name := range sortedTraitsMapKeys(traitsMap) {
if name != "addons" {
if err := computeForTrait(hash, name, traitsMap[name]); err != nil {
return "", err
}
} else {
// Addons
addons := traitsMap["addons"]
for _, name := range util.SortedMapKeys(addons) {
if addon, ok := addons[name].(map[string]interface{}); ok {
if err := computeForTrait(hash, name, addon); err != nil {
return "", err
}
}
}
}
}
// Integration traits as annotations
for _, k := range sortedTraitAnnotationsKeys(integration) {
v := integration.Annotations[k]
if _, err := hash.Write([]byte(fmt.Sprintf("%s=%v,", k, v))); err != nil {
return "", err
}
}
// Add a letter at the beginning and use URL safe encoding
digest := "v" + base64.RawURLEncoding.EncodeToString(hash.Sum(nil))
return digest, nil
}