Skip to content

Commit cb8ea7b

Browse files
committed
Inline manifestsSaver into the Calico component
Adjust the tests to use temporary directories and let them call all the lifecycle methods. Signed-off-by: Tom Wieczorek <[email protected]>
1 parent 716f601 commit cb8ea7b

File tree

3 files changed

+56
-52
lines changed

3 files changed

+56
-52
lines changed

cmd/controller/controller.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -455,16 +455,7 @@ func (c *command) start(ctx context.Context) error {
455455

456456
if !slices.Contains(c.DisableComponents, constant.NetworkProviderComponentName) {
457457
logrus.Infof("Creating network reconcilers")
458-
459-
calicoSaver, err := controller.NewManifestsSaver("calico", c.K0sVars.DataDir)
460-
if err != nil {
461-
return fmt.Errorf("failed to create calico manifests saver: %w", err)
462-
}
463-
calicoInitSaver, err := controller.NewManifestsSaver("calico_init", c.K0sVars.DataDir)
464-
if err != nil {
465-
return fmt.Errorf("failed to create calico_init manifests saver: %w", err)
466-
}
467-
clusterComponents.Add(ctx, controller.NewCalico(c.K0sVars, calicoInitSaver, calicoSaver))
458+
clusterComponents.Add(ctx, controller.NewCalico(c.K0sVars))
468459
if !slices.Contains(c.DisableComponents, constant.WindowsNodeComponentName) {
469460
clusterComponents.Add(ctx, controller.NewWindowsStackComponent(c.K0sVars, adminClientFactory))
470461
}

pkg/component/controller/calico.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package controller
1919
import (
2020
"bytes"
2121
"context"
22+
"errors"
2223
"fmt"
2324
"io/fs"
2425
"path"
@@ -36,6 +37,8 @@ import (
3637

3738
"github.com/sirupsen/logrus"
3839

40+
"github.com/k0sproject/k0s/internal/pkg/dir"
41+
"github.com/k0sproject/k0s/internal/pkg/file"
3942
"github.com/k0sproject/k0s/internal/pkg/templatewriter"
4043
)
4144

@@ -49,8 +52,6 @@ var calicoCRDOnce sync.Once
4952
type Calico struct {
5053
log logrus.FieldLogger
5154

52-
crdSaver manifestsSaver
53-
saver manifestsSaver
5455
prevConfig calicoConfig
5556
k0sVars *config.CfgVars
5657
}
@@ -88,24 +89,25 @@ type calicoConfig struct {
8889
}
8990

9091
// NewCalico creates new Calico reconciler component
91-
func NewCalico(k0sVars *config.CfgVars, crdSaver manifestsSaver, manifestsSaver manifestsSaver) *Calico {
92+
func NewCalico(k0sVars *config.CfgVars) *Calico {
9293
return &Calico{
9394
log: logrus.WithFields(logrus.Fields{"component": "calico"}),
9495

95-
crdSaver: crdSaver,
96-
saver: manifestsSaver,
9796
prevConfig: calicoConfig{},
9897
k0sVars: k0sVars,
9998
}
10099
}
101100

102-
// Init does nothing
103-
func (c *Calico) Init(_ context.Context) error {
104-
return nil
101+
// Init implements [manager.Component].
102+
func (c *Calico) Init(context.Context) error {
103+
return errors.Join(
104+
dir.Init(filepath.Join(c.k0sVars.ManifestsDir, "calico_init"), constant.ManifestsDirMode),
105+
dir.Init(filepath.Join(c.k0sVars.ManifestsDir, "calico"), constant.ManifestsDirMode),
106+
)
105107
}
106108

107-
// Run nothing really running, all logic based on reactive reconcile
108-
func (c *Calico) Start(_ context.Context) error {
109+
// Start implements [manager.Component].
110+
func (c *Calico) Start(context.Context) error {
109111
return nil
110112
}
111113

@@ -138,7 +140,9 @@ func (c *Calico) dumpCRDs() error {
138140
return fmt.Errorf("failed to write calico crd manifests %s: %w", manifestName, err)
139141
}
140142

141-
if err := c.crdSaver.Save(manifestName, output.Bytes()); err != nil {
143+
if err := file.AtomicWithTarget(filepath.Join(c.k0sVars.ManifestsDir, "calico_init", manifestName)).
144+
WithPermissions(constant.CertMode).
145+
Write(output.Bytes()); err != nil {
142146
return fmt.Errorf("failed to save calico crd manifest %s: %w", manifestName, err)
143147
}
144148
}
@@ -184,7 +188,9 @@ func (c *Calico) processConfigChanges(newConfig calicoConfig) error {
184188
Data: newConfig,
185189
}
186190
tryAndLog(manifestName, tw.WriteToBuffer(output))
187-
tryAndLog(manifestName, c.saver.Save(manifestName, output.Bytes()))
191+
tryAndLog(manifestName, file.AtomicWithTarget(filepath.Join(c.k0sVars.ManifestsDir, "calico", manifestName)).
192+
WithPermissions(constant.CertMode).
193+
Write(output.Bytes()))
188194
}
189195
}
190196

@@ -227,7 +233,7 @@ func (c *Calico) getConfig(clusterConfig *v1beta1.ClusterConfig) (calicoConfig,
227233
return config, nil
228234
}
229235

230-
// Stop stops the calico reconciler
236+
// Stop implements [manager.Component].
231237
func (c *Calico) Stop() error {
232238
return nil
233239
}

pkg/component/controller/calico_test.go

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@ limitations under the License.
1717
package controller
1818

1919
import (
20+
"context"
21+
"os"
22+
"path/filepath"
2023
"testing"
2124

2225
"github.com/k0sproject/k0s/pkg/apis/k0s/v1beta1"
2326
"github.com/k0sproject/k0s/pkg/config"
2427

28+
"github.com/stretchr/testify/assert"
2529
"github.com/stretchr/testify/require"
2630
"sigs.k8s.io/yaml"
2731
)
@@ -34,54 +38,61 @@ func (i inMemorySaver) Save(dst string, content []byte) error {
3438
}
3539

3640
func TestCalicoManifests(t *testing.T) {
37-
k0sVars, err := config.NewCfgVars(nil, t.TempDir())
38-
require.NoError(t, err)
41+
newTestInstance := func(t *testing.T) *Calico {
42+
k0sVars, err := config.NewCfgVars(nil, t.TempDir())
43+
require.NoError(t, err)
44+
calico := NewCalico(k0sVars)
45+
require.NoError(t, calico.Init(context.TODO()))
46+
require.NoError(t, calico.Start(context.TODO()))
47+
t.Cleanup(func() { assert.NoError(t, calico.Stop()) })
48+
return calico
49+
}
50+
3951
clusterConfig := v1beta1.DefaultClusterConfig()
4052
clusterConfig.Spec.Network.Calico = v1beta1.DefaultCalico()
4153
clusterConfig.Spec.Network.Provider = "calico"
4254
clusterConfig.Spec.Network.KubeRouter = nil
4355

4456
t.Run("must_write_only_non_crd_on_change", func(t *testing.T) {
45-
saver := inMemorySaver{}
46-
crdSaver := inMemorySaver{}
47-
calico := NewCalico(k0sVars, crdSaver, saver)
57+
calico := newTestInstance(t)
4858

49-
_ = calico.processConfigChanges(calicoConfig{})
59+
assert.NoError(t, calico.processConfigChanges(calicoConfig{}))
5060

51-
for k := range saver {
52-
require.NotContains(t, k, "calico-crd")
61+
if entries, err := os.ReadDir(filepath.Join(calico.k0sVars.ManifestsDir, "calico")); assert.NoError(t, err) {
62+
assert.NotEmpty(t, entries)
63+
for _, entry := range entries {
64+
assert.NotContains(t, entry.Name(), "calico-crd")
65+
}
66+
}
67+
if entries, err := os.ReadDir(filepath.Join(calico.k0sVars.ManifestsDir, "calico_init")); assert.NoError(t, err) {
68+
assert.Empty(t, entries)
5369
}
54-
require.Len(t, crdSaver, 0)
5570
})
5671

5772
t.Run("must_have_wireguard_enabled_if_config_has", func(t *testing.T) {
5873
clusterConfig.Spec.Network.Calico.EnableWireguard = true
59-
saver := inMemorySaver{}
60-
crdSaver := inMemorySaver{}
61-
calico := NewCalico(k0sVars, crdSaver, saver)
74+
calico := newTestInstance(t)
6275
cfg, err := calico.getConfig(clusterConfig)
6376
require.NoError(t, err)
6477
require.NoError(t, calico.processConfigChanges(cfg))
6578

66-
daemonSetManifestRaw, foundRaw := saver["calico-DaemonSet-calico-node.yaml"]
67-
require.True(t, foundRaw, "must have daemon set for calico")
79+
daemonSetManifestRaw, err := os.ReadFile(filepath.Join(calico.k0sVars.ManifestsDir, "calico", "calico-DaemonSet-calico-node.yaml"))
80+
require.NoError(t, err, "must have daemon set for calico")
6881
spec := daemonSetContainersEnv{}
6982
require.NoError(t, yaml.Unmarshal(daemonSetManifestRaw, &spec))
7083
spec.RequireContainerHasEnvVariable(t, "calico-node", "FELIX_WIREGUARDENABLED", "true")
7184
})
7285

7386
t.Run("must_not_have_wireguard_enabled_if_config_has_no", func(t *testing.T) {
7487
clusterConfig.Spec.Network.Calico.EnableWireguard = false
75-
saver := inMemorySaver{}
76-
crdSaver := inMemorySaver{}
77-
calico := NewCalico(k0sVars, crdSaver, saver)
88+
calico := newTestInstance(t)
7889

7990
cfg, err := calico.getConfig(clusterConfig)
8091
require.NoError(t, err)
8192
_ = calico.processConfigChanges(cfg)
8293

83-
daemonSetManifestRaw, foundRaw := saver["calico-DaemonSet-calico-node.yaml"]
84-
require.True(t, foundRaw, "must have daemon set for calico")
94+
daemonSetManifestRaw, err := os.ReadFile(filepath.Join(calico.k0sVars.ManifestsDir, "calico", "calico-DaemonSet-calico-node.yaml"))
95+
require.NoError(t, err, "must have daemon set for calico")
8596
spec := daemonSetContainersEnv{}
8697
require.NoError(t, yaml.Unmarshal(daemonSetManifestRaw, &spec))
8798
spec.RequireContainerHasNoEnvVariable(t, "calico-node", "FELIX_WIREGUARDENABLED")
@@ -90,18 +101,16 @@ func TestCalicoManifests(t *testing.T) {
90101
t.Run("ip_autodetection", func(t *testing.T) {
91102
t.Run("use_IPAutodetectionMethod_for_both_families_by_default", func(t *testing.T) {
92103
clusterConfig.Spec.Network.Calico.IPAutodetectionMethod = "somemethod"
93-
saver := inMemorySaver{}
94-
crdSaver := inMemorySaver{}
95-
calico := NewCalico(k0sVars, crdSaver, saver)
104+
calico := newTestInstance(t)
96105
templateContext, err := calico.getConfig(clusterConfig)
97106
require.NoError(t, err)
98107
require.Equal(t, clusterConfig.Spec.Network.Calico.IPAutodetectionMethod, templateContext.IPAutodetectionMethod)
99108
require.Equal(t, templateContext.IPV6AutodetectionMethod, templateContext.IPV6AutodetectionMethod)
100109
cfg, err := calico.getConfig(clusterConfig)
101110
require.NoError(t, err)
102111
_ = calico.processConfigChanges(cfg)
103-
daemonSetManifestRaw, foundRaw := saver["calico-DaemonSet-calico-node.yaml"]
104-
require.True(t, foundRaw, "must have daemon set for calico")
112+
daemonSetManifestRaw, err := os.ReadFile(filepath.Join(calico.k0sVars.ManifestsDir, "calico", "calico-DaemonSet-calico-node.yaml"))
113+
require.NoError(t, err, "must have daemon set for calico")
105114

106115
spec := daemonSetContainersEnv{}
107116
require.NoError(t, yaml.Unmarshal(daemonSetManifestRaw, &spec))
@@ -111,19 +120,17 @@ func TestCalicoManifests(t *testing.T) {
111120
t.Run("use_IPV6AutodetectionMethod_for_ipv6_if_specified", func(t *testing.T) {
112121
clusterConfig.Spec.Network.Calico.IPAutodetectionMethod = "somemethod"
113122
clusterConfig.Spec.Network.Calico.IPv6AutodetectionMethod = "anothermethod"
114-
saver := inMemorySaver{}
115-
crdSaver := inMemorySaver{}
116-
calico := NewCalico(k0sVars, crdSaver, saver)
123+
calico := newTestInstance(t)
117124
templateContext, err := calico.getConfig(clusterConfig)
118125
require.NoError(t, err)
119126
require.Equal(t, clusterConfig.Spec.Network.Calico.IPAutodetectionMethod, templateContext.IPAutodetectionMethod)
120127
require.Equal(t, clusterConfig.Spec.Network.Calico.IPv6AutodetectionMethod, templateContext.IPV6AutodetectionMethod)
121128
cfg, err := calico.getConfig(clusterConfig)
122129
require.NoError(t, err)
123130
_ = calico.processConfigChanges(cfg)
124-
daemonSetManifestRaw, foundRaw := saver["calico-DaemonSet-calico-node.yaml"]
131+
daemonSetManifestRaw, err := os.ReadFile(filepath.Join(calico.k0sVars.ManifestsDir, "calico", "calico-DaemonSet-calico-node.yaml"))
132+
require.NoError(t, err, "must have daemon set for calico")
125133

126-
require.True(t, foundRaw, "must have daemon set for calico")
127134
spec := daemonSetContainersEnv{}
128135
require.NoError(t, yaml.Unmarshal(daemonSetManifestRaw, &spec))
129136
spec.RequireContainerHasEnvVariable(t, "calico-node", "IP6_AUTODETECTION_METHOD", templateContext.IPV6AutodetectionMethod)

0 commit comments

Comments
 (0)