Skip to content

Commit e208e9c

Browse files
committed
fix(nelm): don't skip release if all resources up-to-date but the release itself changed
Signed-off-by: Ilya Lesikov <ilya@lesikov.com>
1 parent 7dabc56 commit e208e9c

File tree

3 files changed

+50
-10
lines changed

3 files changed

+50
-10
lines changed

cmd/werf/bundle/apply/apply.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/werf/nelm/pkg/resrcpatcher"
3838
"github.com/werf/nelm/pkg/resrcprocssr"
3939
"github.com/werf/nelm/pkg/rls"
40+
"github.com/werf/nelm/pkg/rlsdiff"
4041
"github.com/werf/nelm/pkg/rlshistor"
4142
"github.com/werf/nelm/pkg/track"
4243
"github.com/werf/nelm/pkg/utls"
@@ -490,11 +491,19 @@ func runApply(ctx context.Context) error {
490491
}
491492
}
492493

493-
if useless, err := plan.Useless(); err != nil {
494+
releaseUpToDate, err := rlsdiff.ReleaseUpToDate(prevRelease, newRel)
495+
if err != nil {
496+
return fmt.Errorf("error checking if release is up to date: %w", err)
497+
}
498+
499+
planUseless, err := plan.Useless()
500+
if err != nil {
494501
return fmt.Errorf("error checking if deploy plan will do nothing useful: %w", err)
495-
} else if useless {
502+
}
503+
504+
if releaseUpToDate && planUseless {
496505
printNotes(ctx, notes)
497-
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render("Skipped release")+" %q (namespace: %q): cluster resources already as desired", releaseName, releaseNamespace.Name())
506+
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render(fmt.Sprintf("Skipped release %q (namespace: %q): cluster resources already as desired", releaseName, releaseNamespace.Name())))
498507
return nil
499508
}
500509

@@ -650,7 +659,7 @@ func runApply(ctx context.Context) error {
650659
} else if len(nonCriticalErrs) > 0 {
651660
return utls.Multierrorf("succeeded release %q (namespace: %q), but non-critical errors encountered", nonCriticalErrs, releaseName, releaseNamespace.Name())
652661
} else {
653-
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render("Succeeded release")+" %q (namespace: %q)", releaseName, releaseNamespace.Name())
662+
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render(fmt.Sprintf("Succeeded release %q (namespace: %q)", releaseName, releaseNamespace.Name())))
654663
return nil
655664
}
656665
})

cmd/werf/converge/converge.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"github.com/werf/nelm/pkg/resrcpatcher"
4141
"github.com/werf/nelm/pkg/resrcprocssr"
4242
"github.com/werf/nelm/pkg/rls"
43+
"github.com/werf/nelm/pkg/rlsdiff"
4344
"github.com/werf/nelm/pkg/rlshistor"
4445
"github.com/werf/nelm/pkg/track"
4546
"github.com/werf/nelm/pkg/utls"
@@ -755,11 +756,19 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken
755756
}
756757
}
757758

758-
if useless, err := plan.Useless(); err != nil {
759+
releaseUpToDate, err := rlsdiff.ReleaseUpToDate(prevRelease, newRel)
760+
if err != nil {
761+
return fmt.Errorf("error checking if release is up to date: %w", err)
762+
}
763+
764+
planUseless, err := plan.Useless()
765+
if err != nil {
759766
return fmt.Errorf("error checking if deploy plan will do nothing useful: %w", err)
760-
} else if useless {
767+
}
768+
769+
if releaseUpToDate && planUseless {
761770
printNotes(ctx, notes)
762-
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render("Skipped release")+" %q (namespace: %q): cluster resources already as desired", releaseName, releaseNamespace.Name())
771+
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render(fmt.Sprintf("Skipped release %q (namespace: %q): cluster resources already as desired", releaseName, releaseNamespace.Name())))
763772
return nil
764773
}
765774

@@ -916,7 +925,7 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken
916925
} else if len(nonCriticalErrs) > 0 {
917926
return utls.Multierrorf("succeeded release %q (namespace: %q), but non-critical errors encountered", nonCriticalErrs, releaseName, releaseNamespace.Name())
918927
} else {
919-
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render("Succeeded release")+" %q (namespace: %q)", releaseName, releaseNamespace.Name())
928+
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render(fmt.Sprintf("Succeeded release %q (namespace: %q)", releaseName, releaseNamespace.Name())))
920929
return nil
921930
}
922931
})

cmd/werf/plan/plan.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io/ioutil"
77
"os"
88
"path/filepath"
9+
"time"
910

1011
"github.com/gookit/color"
1112
"github.com/samber/lo"
@@ -30,6 +31,8 @@ import (
3031
"github.com/werf/nelm/pkg/resrcchanglog"
3132
"github.com/werf/nelm/pkg/resrcpatcher"
3233
"github.com/werf/nelm/pkg/resrcprocssr"
34+
"github.com/werf/nelm/pkg/rls"
35+
"github.com/werf/nelm/pkg/rlsdiff"
3336
"github.com/werf/nelm/pkg/rlshistor"
3437
"github.com/werf/werf/cmd/werf/common"
3538
"github.com/werf/werf/pkg/build"
@@ -552,8 +555,10 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken
552555
}
553556

554557
var newRevision int
558+
var firstDeployed time.Time
555559
if prevReleaseFound {
556560
newRevision = prevRelease.Revision() + 1
561+
firstDeployed = prevRelease.FirstDeployed()
557562
} else {
558563
newRevision = 1
559564
}
@@ -589,6 +594,8 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken
589594
return fmt.Errorf("error constructing chart tree: %w", err)
590595
}
591596

597+
notes := chartTree.Notes()
598+
592599
var prevRelGeneralResources []*resrc.GeneralResource
593600
var prevRelFailed bool
594601
if prevReleaseFound {
@@ -633,8 +640,17 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken
633640
return fmt.Errorf("error processing deployable resources: %w", err)
634641
}
635642

643+
log.Default.Info(ctx, "Constructing new release")
644+
newRel, err := rls.NewRelease(releaseName, releaseNamespace.Name(), newRevision, chartTree.ReleaseValues(), chartTree.LegacyChart(), resProcessor.ReleasableHookResources(), resProcessor.ReleasableGeneralResources(), notes, rls.ReleaseOptions{
645+
FirstDeployed: firstDeployed,
646+
Mapper: clientFactory.Mapper(),
647+
})
648+
if err != nil {
649+
return fmt.Errorf("error constructing new release: %w", err)
650+
}
651+
636652
log.Default.Info(ctx, "Calculating planned changes")
637-
createdChanges, recreatedChanges, updatedChanges, appliedChanges, deletedChanges, anyChangesPlanned := resrcchangcalc.CalculatePlannedChanges(
653+
createdChanges, recreatedChanges, updatedChanges, appliedChanges, deletedChanges, planChangesPlanned := resrcchangcalc.CalculatePlannedChanges(
638654
resProcessor.DeployableReleaseNamespaceInfo(),
639655
resProcessor.DeployableStandaloneCRDsInfos(),
640656
resProcessor.DeployableHookResourcesInfos(),
@@ -643,18 +659,24 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken
643659
prevRelFailed,
644660
)
645661

662+
releaseUpToDate, err := rlsdiff.ReleaseUpToDate(prevRelease, newRel)
663+
if err != nil {
664+
return fmt.Errorf("error checking if release is up to date: %w", err)
665+
}
666+
646667
resrcchanglog.LogPlannedChanges(
647668
ctx,
648669
releaseName,
649670
releaseNamespace.Name(),
671+
!releaseUpToDate,
650672
createdChanges,
651673
recreatedChanges,
652674
updatedChanges,
653675
appliedChanges,
654676
deletedChanges,
655677
)
656678

657-
if cmdData.DetailedExitCode && anyChangesPlanned {
679+
if cmdData.DetailedExitCode && (planChangesPlanned || !releaseUpToDate) {
658680
return resrcchangcalc.ErrChangesPlanned
659681
}
660682

0 commit comments

Comments
 (0)