Skip to content

Commit d8e915c

Browse files
authored
Merge pull request #2283 from vyncint/fix-syslogng-image-tag-2202
fix(syslog-ng): keep default image tags when only the repository is set
2 parents 34c0f5f + 73f9e0d commit d8e915c

2 files changed

Lines changed: 158 additions & 8 deletions

File tree

pkg/sdk/logging/api/v1beta1/syslogng_types.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,13 @@ func (s *SyslogNGSpec) SetDefaults() {
150150
}
151151
}
152152
if s.SyslogNGImage == nil {
153-
s.SyslogNGImage = &BasicImageSpec{
154-
Repository: defaultSyslogngImageRepository,
155-
Tag: defaultSyslogngImageTag,
156-
}
153+
s.SyslogNGImage = &BasicImageSpec{}
154+
}
155+
if s.SyslogNGImage.Repository == "" {
156+
s.SyslogNGImage.Repository = defaultSyslogngImageRepository
157+
}
158+
if s.SyslogNGImage.Tag == "" {
159+
s.SyslogNGImage.Tag = defaultSyslogngImageTag
157160
}
158161
if s.ConfigReloadImage == nil {
159162
s.ConfigReloadImage = &BasicImageSpec{}
@@ -169,10 +172,13 @@ func (s *SyslogNGSpec) SetDefaults() {
169172
}
170173
}
171174
if s.MetricsExporterImage == nil {
172-
s.MetricsExporterImage = &BasicImageSpec{
173-
Repository: defaultPrometheusExporterImageRepository,
174-
Tag: defaultPrometheusExporterImageTag,
175-
}
175+
s.MetricsExporterImage = &BasicImageSpec{}
176+
}
177+
if s.MetricsExporterImage.Repository == "" {
178+
s.MetricsExporterImage.Repository = defaultPrometheusExporterImageRepository
179+
}
180+
if s.MetricsExporterImage.Tag == "" {
181+
s.MetricsExporterImage.Tag = defaultPrometheusExporterImageTag
176182
}
177183
if s.BufferVolumeMetricsImage == nil {
178184
s.BufferVolumeMetricsImage = &BasicImageSpec{}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
// Copyright © 2026 Kube logging authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package v1beta1
16+
17+
import (
18+
"testing"
19+
20+
"github.com/stretchr/testify/assert"
21+
"github.com/stretchr/testify/require"
22+
)
23+
24+
// Every image in SyslogNGSpec has to default its repository and its tag
25+
// independently, so that overriding only the repository - to point at a
26+
// registry mirror, for example - keeps the operator's own default tag.
27+
func TestSyslogNGSpecSetDefaultsImages(t *testing.T) {
28+
images := []struct {
29+
name string
30+
get func(*SyslogNGSpec) *BasicImageSpec
31+
set func(*SyslogNGSpec, *BasicImageSpec)
32+
defaultRepo string
33+
defaultTag string
34+
}{
35+
{
36+
name: "syslogNGImage",
37+
get: func(s *SyslogNGSpec) *BasicImageSpec { return s.SyslogNGImage },
38+
set: func(s *SyslogNGSpec, i *BasicImageSpec) { s.SyslogNGImage = i },
39+
defaultRepo: defaultSyslogngImageRepository,
40+
defaultTag: defaultSyslogngImageTag,
41+
},
42+
{
43+
name: "configReloadImage",
44+
get: func(s *SyslogNGSpec) *BasicImageSpec { return s.ConfigReloadImage },
45+
set: func(s *SyslogNGSpec, i *BasicImageSpec) { s.ConfigReloadImage = i },
46+
defaultRepo: defaultConfigReloaderImageRepository,
47+
defaultTag: defaultConfigReloaderImageTag,
48+
},
49+
{
50+
name: "metricsExporterImage",
51+
get: func(s *SyslogNGSpec) *BasicImageSpec { return s.MetricsExporterImage },
52+
set: func(s *SyslogNGSpec, i *BasicImageSpec) { s.MetricsExporterImage = i },
53+
defaultRepo: defaultPrometheusExporterImageRepository,
54+
defaultTag: defaultPrometheusExporterImageTag,
55+
},
56+
{
57+
name: "bufferVolumeMetricsImage",
58+
get: func(s *SyslogNGSpec) *BasicImageSpec { return s.BufferVolumeMetricsImage },
59+
set: func(s *SyslogNGSpec, i *BasicImageSpec) { s.BufferVolumeMetricsImage = i },
60+
defaultRepo: defaultBufferVolumeImageRepository,
61+
defaultTag: defaultBufferVolumeImageTag,
62+
},
63+
}
64+
65+
// Version is baked in at build time and overrides the fallback tag of the
66+
// operator's own images. Pin it so the expectations below stay stable.
67+
originalVersion := Version
68+
Version = ""
69+
t.Cleanup(func() { Version = originalVersion })
70+
71+
const (
72+
customRepo = "registry.internal/mirror/some-image"
73+
customTag = "1.2.3-custom"
74+
)
75+
76+
for _, image := range images {
77+
t.Run(image.name, func(t *testing.T) {
78+
t.Run("unset defaults both fields", func(t *testing.T) {
79+
spec := &SyslogNGSpec{}
80+
spec.SetDefaults()
81+
82+
result := image.get(spec)
83+
require.NotNil(t, result)
84+
assert.Equal(t, image.defaultRepo, result.Repository)
85+
assert.Equal(t, image.defaultTag, result.Tag)
86+
})
87+
88+
t.Run("repository override keeps the default tag", func(t *testing.T) {
89+
spec := &SyslogNGSpec{}
90+
image.set(spec, &BasicImageSpec{Repository: customRepo})
91+
spec.SetDefaults()
92+
93+
result := image.get(spec)
94+
require.NotNil(t, result)
95+
assert.Equal(t, customRepo, result.Repository)
96+
assert.Equal(t, image.defaultTag, result.Tag)
97+
assert.Equal(t, customRepo+":"+image.defaultTag, result.RepositoryWithTag())
98+
})
99+
100+
t.Run("tag override keeps the default repository", func(t *testing.T) {
101+
spec := &SyslogNGSpec{}
102+
image.set(spec, &BasicImageSpec{Tag: customTag})
103+
spec.SetDefaults()
104+
105+
result := image.get(spec)
106+
require.NotNil(t, result)
107+
assert.Equal(t, image.defaultRepo, result.Repository)
108+
assert.Equal(t, customTag, result.Tag)
109+
})
110+
111+
t.Run("both overrides are preserved", func(t *testing.T) {
112+
spec := &SyslogNGSpec{}
113+
image.set(spec, &BasicImageSpec{Repository: customRepo, Tag: customTag})
114+
spec.SetDefaults()
115+
116+
result := image.get(spec)
117+
require.NotNil(t, result)
118+
assert.Equal(t, customRepo, result.Repository)
119+
assert.Equal(t, customTag, result.Tag)
120+
})
121+
})
122+
}
123+
}
124+
125+
// The operator's own images follow the build-time Version when the user does
126+
// not pin a tag, while the third-party images keep their vendored defaults.
127+
func TestSyslogNGSpecSetDefaultsImagesFollowVersion(t *testing.T) {
128+
originalVersion := Version
129+
Version = "9.9.9"
130+
t.Cleanup(func() { Version = originalVersion })
131+
132+
spec := &SyslogNGSpec{
133+
ConfigReloadImage: &BasicImageSpec{Repository: "registry.internal/mirror/reloader"},
134+
BufferVolumeMetricsImage: &BasicImageSpec{Repository: "registry.internal/mirror/node-exporter"},
135+
SyslogNGImage: &BasicImageSpec{Repository: "registry.internal/mirror/axosyslog"},
136+
MetricsExporterImage: &BasicImageSpec{Repository: "registry.internal/mirror/metrics-exporter"},
137+
}
138+
spec.SetDefaults()
139+
140+
assert.Equal(t, "registry.internal/mirror/reloader:9.9.9", spec.ConfigReloadImage.RepositoryWithTag())
141+
assert.Equal(t, "registry.internal/mirror/node-exporter:9.9.9", spec.BufferVolumeMetricsImage.RepositoryWithTag())
142+
assert.Equal(t, "registry.internal/mirror/axosyslog:"+defaultSyslogngImageTag, spec.SyslogNGImage.RepositoryWithTag())
143+
assert.Equal(t, "registry.internal/mirror/metrics-exporter:"+defaultPrometheusExporterImageTag, spec.MetricsExporterImage.RepositoryWithTag())
144+
}

0 commit comments

Comments
 (0)