keel/provider/helm/updates.go

124 lines
3.6 KiB
Go

package helm
import (
"github.com/keel-hq/keel/internal/policy"
"github.com/keel-hq/keel/types"
"github.com/keel-hq/keel/util/image"
hapi_chart "k8s.io/helm/pkg/proto/hapi/chart"
log "github.com/sirupsen/logrus"
)
func checkRelease(repo *types.Repository, namespace, name string, chart *hapi_chart.Chart, config *hapi_chart.Config) (plan *UpdatePlan, shouldUpdateRelease bool, err error) {
plan = &UpdatePlan{
Chart: chart,
Namespace: namespace,
Name: name,
Values: make(map[string]string),
}
eventRepoRef, err := image.Parse(repo.String())
if err != nil {
log.WithFields(log.Fields{
"error": err,
"repository_name": repo.Name,
}).Error("provider.helm: failed to parse event repository name")
return
}
// getting configuration
vals, err := values(chart, config)
if err != nil {
log.WithFields(log.Fields{
"error": err,
}).Error("provider.helm: failed to get values.yaml for release")
return
}
keelCfg, err := getKeelConfig(vals)
if err != nil {
log.WithFields(log.Fields{
"error": err,
}).Error("provider.helm: failed to get keel configuration for release")
// ignoring this release, no keel config found
return plan, false, nil
}
log.Infof("policy for release %s/%s parsed: %s", namespace, name, keelCfg.Plc.Name())
if keelCfg.Plc.Type() == policy.PolicyTypeNone {
// policy is not set, ignoring release
return plan, false, nil
}
// checking for impacted images
for _, imageDetails := range keelCfg.Images {
imageRef, err := parseImage(vals, &imageDetails)
if err != nil {
log.WithFields(log.Fields{
"error": err,
"repository_name": imageDetails.RepositoryPath,
"repository_tag": imageDetails.TagPath,
}).Error("provider.helm: failed to parse image")
continue
}
if imageRef.Repository() != eventRepoRef.Repository() {
log.WithFields(log.Fields{
"parsed_image_name": imageRef.Remote(),
"target_image_name": repo.Name,
}).Debug("provider.helm: images do not match, ignoring")
continue
}
shouldUpdate, err := keelCfg.Plc.ShouldUpdate(imageRef.Tag(), eventRepoRef.Tag())
if err != nil {
log.WithFields(log.Fields{
"error": err,
"repository_name": imageDetails.RepositoryPath,
"repository_tag": imageDetails.TagPath,
}).Error("provider.helm: got error while checking whether update the chart")
continue
}
if !shouldUpdate {
log.WithFields(log.Fields{
"parsed_image_name": imageRef.Remote(),
"target_image_name": repo.Name,
"policy": keelCfg.Plc.Name(),
}).Info("provider.helm: ignoring")
continue
}
// if keelCfg.MatchTag && imageRef.Tag() != eventRepoRef.Tag() {
// log.WithFields(log.Fields{
// "parsed_image_name": imageRef.Remote(),
// "target_image_name": repo.Name,
// "policy": keelCfg.Policy.String(),
// }).Info("provider.helm: match tag set but tags do not match, ignoring")
// continue
// }
if imageDetails.DigestPath != "" {
plan.Values[imageDetails.DigestPath] = repo.Digest
log.WithFields(log.Fields{
"image_details_digestPath": imageDetails.DigestPath,
"target_image_digest": repo.Digest,
}).Debug("provider.helm: setting image Digest")
}
path, value := getUnversionedPlanValues(repo.Tag, imageRef, &imageDetails)
plan.Values[path] = value
plan.NewVersion = repo.Tag
plan.CurrentVersion = imageRef.Tag()
plan.Config = keelCfg
shouldUpdateRelease = true
if imageDetails.ReleaseNotes != "" {
plan.ReleaseNotes = append(plan.ReleaseNotes, imageDetails.ReleaseNotes)
}
}
return plan, shouldUpdateRelease, nil
}