Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package nelm for openSUSE:Factory checked in at 2026-10-28 17:49:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/nelm (Old) and /work/SRC/openSUSE:Factory/.nelm.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "nelm" Wed Oct 28 17:49:17 2026 rev:35 rq:1393395 version:1.29.0 Changes: -------- --- /work/SRC/openSUSE:Factory/nelm/nelm.changes 2026-10-02 23:04:26.941068394 +0200 +++ /work/SRC/openSUSE:Factory/.nelm.new.2252680/nelm.changes 2026-10-28 17:49:31.473540885 +0100 @@ -1,0 +2,12 @@ +Wed Oct 28 06:25:03 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.29.0: + * Features + - add case-insensitive-condition-tracking feature gate + (3d2d2d0) + - track managed-services.deckhouse.io resources (2dc75a3) +- Update to version 1.28.0 (unreleased): + * Features + - add feat gate to own deckhouse-controller fields (6092c11) + +------------------------------------------------------------------- Old: ---- nelm-1.27.2.obscpio New: ---- nelm-1.29.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ nelm.spec ++++++ --- /var/tmp/diff_new_pack.evOoBa/_old 2026-10-28 17:49:32.842598389 +0100 +++ /var/tmp/diff_new_pack.evOoBa/_new 2026-10-28 17:49:32.847598599 +0100 @@ -17,7 +17,7 @@ Name: nelm -Version: 1.27.2 +Version: 1.29.0 Release: 0 Summary: Helm 3 alternative License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.evOoBa/_old 2026-10-28 17:49:32.933602211 +0100 +++ /var/tmp/diff_new_pack.evOoBa/_new 2026-10-28 17:49:32.946602757 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/werf/nelm.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">refs/tags/v1.27.2</param> + <param name="revision">refs/tags/v1.29.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.evOoBa/_old 2026-10-28 17:49:32.996604858 +0100 +++ /var/tmp/diff_new_pack.evOoBa/_new 2026-10-28 17:49:33.001605068 +0100 @@ -3,6 +3,6 @@ <param name="url">https://github.com/werf/nelm</param> <param name="changesrevision">9366af9135202b7d705c71fef6c7dbe0231c0345</param></service><service name="tar_scm"> <param name="url">https://github.com/werf/nelm.git</param> - <param name="changesrevision">aaca94218614a8f47dfaa88d2466a162fd7f21bc</param></service></servicedata> + <param name="changesrevision">71bbcdaff37f9ee1a57c7ff821d64002dd74af7b</param></service></servicedata> (No newline at EOF) ++++++ nelm-1.27.2.obscpio -> nelm-1.29.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/CHANGELOG.md new/nelm-1.29.0/CHANGELOG.md --- old/nelm-1.27.2/CHANGELOG.md 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/CHANGELOG.md 2026-08-11 12:53:05.000000000 +0200 @@ -1,5 +1,20 @@ # Changelog +## [1.29.0](https://github.com/werf/nelm/compare/v1.28.0...v1.29.0) (2026-08-11) + + +### Features + +* add case-insensitive-condition-tracking feature gate ([3d2d2d0](https://github.com/werf/nelm/commit/3d2d2d0bdfaa69ec64383ec7829ee351712758a0)) +* track managed-services.deckhouse.io resources ([2dc75a3](https://github.com/werf/nelm/commit/2dc75a38f2b05c4cf6c7a66e92e2c018d7756c0f)) + +## [1.28.0](https://github.com/werf/nelm/compare/v1.27.2...v1.28.0) (2026-08-03) + + +### Features + +* add feat gate to own deckhouse-controller fields ([6092c11](https://github.com/werf/nelm/commit/6092c11447c48613b98a647a861186febc432a18)) + ## [1.27.2](https://github.com/werf/nelm/compare/v1.27.1...v1.27.2) (2026-07-23) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/docs/reference.md new/nelm-1.29.0/docs/reference.md --- old/nelm-1.27.2/docs/reference.md 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/docs/reference.md 2026-08-11 12:53:05.000000000 +0200 @@ -56,6 +56,8 @@ - [NELM_FEAT_MORE_DETAILED_EXIT_CODE_FOR_PLAN](#nelm_feat_more_detailed_exit_code_for_plan) - [NELM_FEAT_RESOURCE_VALIDATION](#nelm_feat_resource_validation) - [NELM_FEAT_TYPESCRIPT](#nelm_feat_typescript) + - [NELM_FEAT_ADOPT_DECKHOUSE_CONTROLLER_FIELDS](#nelm_feat_adopt_deckhouse_controller_fields) + - [NELM_FEAT_CASE_INSENSITIVE_CONDITION_TRACKING](#nelm_feat_case_insensitive_condition_tracking) <!-- END doctoc generated TOC please keep comment here to allow auto update --> @@ -4165,3 +4167,15 @@ Enable TypeScript chart rendering from ts/ directory +### NELM_FEAT_ADOPT_DECKHOUSE_CONTROLLER_FIELDS + +**Default:** `false` + +Adopt managed fields owned by the legacy "deckhouse\-controller" field manager \(the pre\-nelm Helm 3 engine\)\. Unsafe if any resource still has hook\-owned "deckhouse\-controller" entries + +### NELM_FEAT_CASE_INSENSITIVE_CONDITION_TRACKING + +**Default:** `false` + +Match custom resource status condition types case\-insensitively when detecting readiness \(e\.g\. "Ready" in addition to "ready"\) + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/go.mod new/nelm-1.29.0/go.mod --- old/nelm-1.27.2/go.mod 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/go.mod 2026-08-11 12:53:05.000000000 +0200 @@ -58,7 +58,7 @@ github.com/tidwall/sjson v1.2.5 github.com/wI2L/jsondiff v0.5.0 github.com/werf/common-go v0.0.0-20251113140850-a1a98e909e9b - github.com/werf/kubedog v0.13.1-0.20260616105957-2c00b08fb99e + github.com/werf/kubedog v0.13.1-0.20260811104953-26a7ce74643f github.com/werf/lockgate v0.1.1 github.com/werf/logboek v0.6.1 github.com/xeipuuv/gojsonschema v1.2.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/go.sum new/nelm-1.29.0/go.sum --- old/nelm-1.27.2/go.sum 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/go.sum 2026-08-11 12:53:05.000000000 +0200 @@ -435,8 +435,10 @@ github.com/wI2L/jsondiff v0.5.0/go.mod h1:qqG6hnK0Lsrz2BpIVCxWiK9ItsBCpIZQiv0izJjOZ9s= github.com/werf/common-go v0.0.0-20251113140850-a1a98e909e9b h1:58850oFrnw5Jy5YaB8QifXz75qpGotfx6qqZ9Q2my1A= github.com/werf/common-go v0.0.0-20251113140850-a1a98e909e9b/go.mod h1:MXS0JR9zut+oR9oEM8PEkdXXoEbKDILTmWopt0z1eZs= -github.com/werf/kubedog v0.13.1-0.20260616105957-2c00b08fb99e h1:0GnrtMMti+Qywd4bs4tHtchBS61EzS6t1NYqMPql5dE= -github.com/werf/kubedog v0.13.1-0.20260616105957-2c00b08fb99e/go.mod h1:gu4EY4hxtiYVDy5o6WE2lRZS0YWqrOV0HS//GTYyrUE= +github.com/werf/kubedog v0.13.1-0.20260810124646-25ca603e12eb h1:MBZMwYpj+SFTkiZ+CZ+Ggj9EcEmlTs6S/hE9AWYq7Ws= +github.com/werf/kubedog v0.13.1-0.20260810124646-25ca603e12eb/go.mod h1:+pTZuZqy+xtj6yh49kfQuBGDMHdm7zVJbVl2s4xawe8= +github.com/werf/kubedog v0.13.1-0.20260811104953-26a7ce74643f h1:EBXXN/v3/zzRrHxu8Nu96XDU2zd2Oc5rSLIXCIhv1gg= +github.com/werf/kubedog v0.13.1-0.20260811104953-26a7ce74643f/go.mod h1:+pTZuZqy+xtj6yh49kfQuBGDMHdm7zVJbVl2s4xawe8= github.com/werf/lockgate v0.1.1 h1:S400JFYjtWfE4i4LY9FA8zx0fMdfui9DPrBiTciCrx4= github.com/werf/lockgate v0.1.1/go.mod h1:0yIFSLq9ausy6ejNxF5uUBf/Ib6daMAfXuCaTMZJzIE= github.com/werf/logboek v0.6.1 h1:oEe6FkmlKg0z0n80oZjLplj6sXcBeLleCkjfOOZEL2g= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/pkg/common/common.go new/nelm-1.29.0/pkg/common/common.go --- old/nelm-1.27.2/pkg/common/common.go 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/pkg/common/common.go 2026-08-11 12:53:05.000000000 +0200 @@ -121,6 +121,7 @@ DefaultWebhookRetryTimeout = 4 * time.Minute KubectlEditFieldManager = "kubectl-edit" LockConfigMapName = "werf-synchronization" + OldDeckhouseControllerManager = "deckhouse-controller" OldFieldManagerPrefix = "werf" OutputFormatJSON = "json" OutputFormatTable = "table" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/pkg/featgate/feat.go new/nelm-1.29.0/pkg/featgate/feat.go --- old/nelm-1.27.2/pkg/featgate/feat.go 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/pkg/featgate/feat.go 2026-08-11 12:53:05.000000000 +0200 @@ -53,6 +53,14 @@ "typescript", `Enable TypeScript chart rendering from ts/ directory`, ) + FeatGateAdoptDeckhouseControllerFields = NewFeatGate( + "adopt-deckhouse-controller-fields", + `Adopt managed fields owned by the legacy "deckhouse-controller" field manager (the pre-nelm Helm 3 engine). Unsafe if any resource still has hook-owned "deckhouse-controller" entries`, + ) + FeatGateCaseInsensitiveConditionTracking = NewFeatGate( + "case-insensitive-condition-tracking", + `Match custom resource status condition types case-insensitively when detecting readiness (e.g. "Ready" in addition to "ready")`, + ) ) // A feature gate, which enabled/disables a specific feature. Can be toggled via an env var or diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/pkg/featgate/feat_ai_test.go new/nelm-1.29.0/pkg/featgate/feat_ai_test.go --- old/nelm-1.27.2/pkg/featgate/feat_ai_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/nelm-1.29.0/pkg/featgate/feat_ai_test.go 2026-08-11 12:53:05.000000000 +0200 @@ -0,0 +1,36 @@ +//go:build ai_tests + +package featgate + +import ( + "testing" + + "github.com/samber/lo" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestAI_CaseInsensitiveConditionTracking_EnvVarName(t *testing.T) { + assert.Equal(t, "NELM_FEAT_CASE_INSENSITIVE_CONDITION_TRACKING", FeatGateCaseInsensitiveConditionTracking.EnvVarName()) + assert.Equal(t, "case-insensitive-condition-tracking", FeatGateCaseInsensitiveConditionTracking.Name) +} + +func TestAI_CaseInsensitiveConditionTracking_OnlyTrueEnables(t *testing.T) { + assert.False(t, FeatGateCaseInsensitiveConditionTracking.Default()) + + for _, value := range []string{"", "1", "yes", "TRUE", "True", "false"} { + t.Setenv(FeatGateCaseInsensitiveConditionTracking.EnvVarName(), value) + assert.False(t, FeatGateCaseInsensitiveConditionTracking.Enabled(), "value %q must not enable the gate", value) + } + + t.Setenv(FeatGateCaseInsensitiveConditionTracking.EnvVarName(), "true") + assert.True(t, FeatGateCaseInsensitiveConditionTracking.Enabled()) +} + +func TestAI_CaseInsensitiveConditionTracking_Registered(t *testing.T) { + _, found := lo.Find(FeatGates, func(fg *FeatGate) bool { + return fg == FeatGateCaseInsensitiveConditionTracking + }) + + require.True(t, found, "gate must be registered in FeatGates so CLI usage and reference docs pick it up") +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/pkg/plan/plan_execute.go new/nelm-1.29.0/pkg/plan/plan_execute.go --- old/nelm-1.27.2/pkg/plan/plan_execute.go 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/pkg/plan/plan_execute.go 2026-08-11 12:53:05.000000000 +0200 @@ -15,6 +15,7 @@ "github.com/werf/kubedog/pkg/trackers/dyntracker/statestore" kdutil "github.com/werf/kubedog/pkg/trackers/dyntracker/util" "github.com/werf/nelm/pkg/common" + "github.com/werf/nelm/pkg/featgate" "github.com/werf/nelm/pkg/kube" "github.com/werf/nelm/pkg/log" "github.com/werf/nelm/pkg/release" @@ -273,6 +274,7 @@ Timeout: timeout, NoActivityTimeout: opConfig.NoActivityTimeout, IgnoreReadinessProbeFailsByContainerName: opConfig.IgnoreReadinessProbeFailsByContainerName, + CaseInsensitiveConditionTracking: featgate.FeatGateCaseInsensitiveConditionTracking.Enabled(), SaveLogsOnlyForNumberOfReplicas: opConfig.SaveLogsOnlyForNumberOfReplicas, SaveLogsOnlyForContainers: opConfig.SaveLogsOnlyForContainers, SaveLogsByRegex: opConfig.SaveLogsByRegex, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/pkg/plan/resource_info.go new/nelm-1.29.0/pkg/plan/resource_info.go --- old/nelm-1.27.2/pkg/plan/resource_info.go 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/pkg/plan/resource_info.go 2026-08-11 12:53:05.000000000 +0200 @@ -17,6 +17,7 @@ "github.com/werf/kubedog/pkg/trackers/rollout/multitrack" "github.com/werf/nelm/pkg/common" + "github.com/werf/nelm/pkg/featgate" "github.com/werf/nelm/pkg/kube" "github.com/werf/nelm/pkg/log" "github.com/werf/nelm/pkg/resource" @@ -447,6 +448,7 @@ if managedField.Manager == common.DefaultFieldManager || managedField.Manager == common.KubectlEditFieldManager || + (featgate.FeatGateAdoptDeckhouseControllerFields.Enabled() && managedField.Manager == common.OldDeckhouseControllerManager) || strings.HasPrefix(managedField.Manager, common.OldFieldManagerPrefix) { continue } @@ -823,6 +825,7 @@ changed = true } else if (!noRemoveManualChanges && managedField.Manager == common.KubectlEditFieldManager) || + (featgate.FeatGateAdoptDeckhouseControllerFields.Enabled() && managedField.Manager == common.OldDeckhouseControllerManager) || strings.HasPrefix(managedField.Manager, common.OldFieldManagerPrefix) { merged, mergeChanged := lo.Must2(util.MergeJSON(fieldsByte, oursFieldsByte)) if mergeChanged { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/pkg/plan/resource_info_ai_test.go new/nelm-1.29.0/pkg/plan/resource_info_ai_test.go --- old/nelm-1.27.2/pkg/plan/resource_info_ai_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/nelm-1.29.0/pkg/plan/resource_info_ai_test.go 2026-08-11 12:53:05.000000000 +0200 @@ -0,0 +1,88 @@ +//go:build ai_tests + +package plan + +import ( + "testing" + + "github.com/stretchr/testify/assert" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/werf/nelm/pkg/common" + "github.com/werf/nelm/pkg/featgate" +) + +func TestAI_AdoptDeckhouseControllerFieldsGateEnvVarName(t *testing.T) { + assert.Equal(t, "NELM_FEAT_ADOPT_DECKHOUSE_CONTROLLER_FIELDS", featgate.FeatGateAdoptDeckhouseControllerFields.EnvVarName()) +} + +func TestAI_ExclusiveOwnershipForOurManagerDeckhouseControllerGateDisabled(t *testing.T) { + featgate.FeatGateAdoptDeckhouseControllerFields.Disable() + t.Cleanup(featgate.FeatGateAdoptDeckhouseControllerFields.Disable) + + oursEntry := testAIManagedFieldsEntry(common.DefaultFieldManager, v1.ManagedFieldsOperationApply, `{"f:spec":{"f:foo":{}}}`) + deckhouseEntry := testAIManagedFieldsEntry(common.OldDeckhouseControllerManager, v1.ManagedFieldsOperationUpdate, `{"f:spec":{"f:bar":{},"f:foo":{}}}`) + + newManagedFields, _ := exclusiveOwnershipForOurManager([]v1.ManagedFieldsEntry{deckhouseEntry}, oursEntry) + + assert.True(t, hasManager(newManagedFields, common.OldDeckhouseControllerManager)) +} + +func TestAI_ExclusiveOwnershipForOurManagerDeckhouseControllerGateEnabled(t *testing.T) { + featgate.FeatGateAdoptDeckhouseControllerFields.Enable() + t.Cleanup(featgate.FeatGateAdoptDeckhouseControllerFields.Disable) + + oursEntry := testAIManagedFieldsEntry(common.DefaultFieldManager, v1.ManagedFieldsOperationApply, `{"f:spec":{"f:foo":{}}}`) + deckhouseEntry := testAIManagedFieldsEntry(common.OldDeckhouseControllerManager, v1.ManagedFieldsOperationUpdate, `{"f:spec":{"f:bar":{},"f:foo":{}}}`) + + newManagedFields, changed := exclusiveOwnershipForOurManager([]v1.ManagedFieldsEntry{deckhouseEntry}, oursEntry) + + assert.False(t, changed) + assert.False(t, hasManager(newManagedFields, common.OldDeckhouseControllerManager)) +} + +func TestAI_RemoveUndesirableManagersDeckhouseControllerGateDisabled(t *testing.T) { + featgate.FeatGateAdoptDeckhouseControllerFields.Disable() + t.Cleanup(featgate.FeatGateAdoptDeckhouseControllerFields.Disable) + + oursEntry := testAIManagedFieldsEntry(common.DefaultFieldManager, v1.ManagedFieldsOperationApply, `{"f:spec":{"f:foo":{}}}`) + deckhouseEntry := testAIManagedFieldsEntry(common.OldDeckhouseControllerManager, v1.ManagedFieldsOperationUpdate, `{"f:spec":{"f:bar":{},"f:foo":{}}}`) + + _, newOursEntry, changed := removeUndesirableManagers([]v1.ManagedFieldsEntry{deckhouseEntry}, oursEntry, false) + + assert.False(t, changed) + assert.Equal(t, `{"f:spec":{"f:foo":{}}}`, string(newOursEntry.FieldsV1.Raw)) +} + +func TestAI_RemoveUndesirableManagersDeckhouseControllerGateEnabled(t *testing.T) { + featgate.FeatGateAdoptDeckhouseControllerFields.Enable() + t.Cleanup(featgate.FeatGateAdoptDeckhouseControllerFields.Disable) + + oursEntry := testAIManagedFieldsEntry(common.DefaultFieldManager, v1.ManagedFieldsOperationApply, `{"f:spec":{"f:foo":{}}}`) + deckhouseEntry := testAIManagedFieldsEntry(common.OldDeckhouseControllerManager, v1.ManagedFieldsOperationUpdate, `{"f:spec":{"f:bar":{},"f:foo":{}}}`) + + _, newOursEntry, changed := removeUndesirableManagers([]v1.ManagedFieldsEntry{deckhouseEntry}, oursEntry, false) + + assert.True(t, changed) + assert.Contains(t, string(newOursEntry.FieldsV1.Raw), "f:bar") +} + +func hasManager(managedFields []v1.ManagedFieldsEntry, manager string) bool { + for _, managedField := range managedFields { + if managedField.Manager == manager { + return true + } + } + + return false +} + +func testAIManagedFieldsEntry(manager string, operation v1.ManagedFieldsOperationType, rawFields string) v1.ManagedFieldsEntry { + return v1.ManagedFieldsEntry{ + Manager: manager, + Operation: operation, + APIVersion: "apps/v1", + FieldsType: "FieldsV1", + FieldsV1: &v1.FieldsV1{Raw: []byte(rawFields)}, + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.27.2/trdl_channels.yaml new/nelm-1.29.0/trdl_channels.yaml --- old/nelm-1.27.2/trdl_channels.yaml 2026-07-23 11:07:43.000000000 +0200 +++ new/nelm-1.29.0/trdl_channels.yaml 2026-08-11 12:53:05.000000000 +0200 @@ -2,7 +2,7 @@ - name: "1" channels: - name: alpha - version: 1.27.0 + version: 1.27.2 - name: beta version: 1.26.2 - name: ea ++++++ nelm.obsinfo ++++++ --- /var/tmp/diff_new_pack.evOoBa/_old 2026-10-28 17:49:34.440665512 +0100 +++ /var/tmp/diff_new_pack.evOoBa/_new 2026-10-28 17:49:34.452666016 +0100 @@ -1,5 +1,5 @@ name: nelm -version: 1.27.2 -mtime: 1784797663 -commit: aaca94218614a8f47dfaa88d2466a162fd7f21bc +version: 1.29.0 +mtime: 1786445585 +commit: 71bbcdaff37f9ee1a57c7ff821d64002dd74af7b ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/nelm/vendor.tar.gz /work/SRC/openSUSE:Factory/.nelm.new.2252680/vendor.tar.gz differ: char 131, line 2
