Skip to content

Commit 78b60a4

Browse files
authored
use custom 'controller' role name if available (#184)
* use custom 'controller' role name if available * reconcile overrides formats * handle nil * actually parse config from the binary * ensure node has controller override role * intentionally break test * update code * undo intentional breakage * test both that the role was used and custom labels were applied * remove unused struct
1 parent 308e1b1 commit 78b60a4

File tree

11 files changed

+144
-81
lines changed

11 files changed

+144
-81
lines changed

cmd/embedded-cluster/install.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ import (
1616
"github.com/k0sproject/rig"
1717
"github.com/k0sproject/rig/log"
1818
k0sversion "github.com/k0sproject/version"
19+
embeddedclusterv1beta1 "github.com/replicatedhq/embedded-cluster-operator/api/v1beta1"
1920
"github.com/sirupsen/logrus"
2021
"github.com/urfave/cli/v2"
2122
"gopkg.in/yaml.v2"
23+
kyaml "sigs.k8s.io/yaml"
2224

2325
"github.com/replicatedhq/embedded-cluster/pkg/addons"
2426
"github.com/replicatedhq/embedded-cluster/pkg/config"
@@ -160,7 +162,12 @@ func updateConfig(c *cli.Context) error {
160162
if err != nil {
161163
return fmt.Errorf("unable to read overrides file: %w", err)
162164
}
163-
config.ApplyEmbeddedUnsupportedOverrides(cfg, data)
165+
var overrideCfg embeddedclusterv1beta1.Config
166+
if err := kyaml.Unmarshal(data, &overrideCfg); err != nil {
167+
return fmt.Errorf("unable to unmarshal overrides file: %w", err)
168+
}
169+
170+
config.ApplyEmbeddedUnsupportedOverrides(cfg, overrideCfg.Spec.UnsupportedOverrides.K0s)
164171
}
165172

166173
opts := []addons.Option{}
@@ -257,7 +264,12 @@ func ensureK0sctlConfig(c *cli.Context, useprompt bool) error {
257264
if err != nil {
258265
return fmt.Errorf("unable to read overrides file: %w", err)
259266
}
260-
config.ApplyEmbeddedUnsupportedOverrides(cfg, data)
267+
var overrideCfg embeddedclusterv1beta1.Config
268+
if err := kyaml.Unmarshal(data, &overrideCfg); err != nil {
269+
return fmt.Errorf("unable to unmarshal overrides file: %w", err)
270+
}
271+
272+
config.ApplyEmbeddedUnsupportedOverrides(cfg, overrideCfg.Spec.UnsupportedOverrides.K0s)
261273
}
262274

263275
opts := []addons.Option{}

e2e/kots-release/config.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
apiVersion: embeddedcluster.replicated.com/v1beta1
2+
kind: Config
3+
metadata:
4+
name: "testconfig"
5+
spec:
6+
controller:
7+
labels:
8+
controller-label: controller-label-value
9+
name: controller-test
10+
custom:
11+
- labels:
12+
abc-test-label: abc-test-label-value
13+
abc-test-label-two: abc-test-label-value-2
14+
name: abc
15+
- labels:
16+
xyz-test-label: xyz-value
17+
name: xyz
18+
unsupportedOverrides:
19+
k0s: |
20+
metadata:
21+
name: foo
22+
spec:
23+
telemetry:
24+
enabled: false

e2e/scripts/single-node-install.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ wait_for_healthy_node() {
1414
ready=$(kubectl get nodes | grep -v NotReady | grep -c Ready || true)
1515
kubectl get nodes || true
1616
done
17+
1718
return 0
1819
}
1920

@@ -45,6 +46,18 @@ wait_for_pods_running() {
4546
done
4647
}
4748

49+
ensure_node_config() {
50+
if ! kubectl describe node | grep "controller-label" ; then
51+
echo "Failed to find controller-label"
52+
return 1
53+
fi
54+
55+
if ! kubectl describe node | grep "controller-test" ; then
56+
echo "Failed to find controller-test"
57+
return 1
58+
fi
59+
}
60+
4861
main() {
4962
if ! embedded-cluster install --no-prompt 2>&1 | tee /tmp/log ; then
5063
cat /etc/os-release
@@ -59,6 +72,10 @@ main() {
5972
echo "Failed to install embedded-cluster"
6073
exit 1
6174
fi
75+
if ! ensure_node_config; then
76+
echo "Cluster did not respect node config"
77+
exit 1
78+
fi
6279
if ! wait_for_pods_running 900; then
6380
echo "Failed to install embedded-cluster"
6481
exit 1

pkg/addons/embeddedclusteroperator/embeddedclusteroperator.go

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"gopkg.in/yaml.v2"
1414
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1515
"sigs.k8s.io/controller-runtime/pkg/client"
16-
kyaml "sigs.k8s.io/yaml"
1716

1817
"github.com/replicatedhq/embedded-cluster/pkg/addons/adminconsole"
1918
"github.com/replicatedhq/embedded-cluster/pkg/customization"
@@ -76,22 +75,6 @@ func (e *EmbeddedClusterOperator) GenerateHelmConfig() ([]v1beta1.Chart, []v1bet
7675
return []v1beta1.Chart{chartConfig}, nil, nil
7776
}
7877

79-
// readEmbeddedClusterConfig reads and unmarshal the Config object from the embedded cluster
80-
// that has been embedded into this binary through a release.
81-
func (e *EmbeddedClusterOperator) readEmbeddedClusterConfig() (*embeddedclusterv1beta1.Config, error) {
82-
rawcfg, err := customization.AdminConsole{}.EmbeddedClusterConfig()
83-
if err != nil {
84-
return nil, fmt.Errorf("unable to read embeddec cluster config: %w", err)
85-
} else if rawcfg == nil {
86-
return nil, nil
87-
}
88-
var cfg embeddedclusterv1beta1.Config
89-
if err := kyaml.Unmarshal(rawcfg, &cfg); err != nil {
90-
return nil, fmt.Errorf("unable to unmarshal embedded cluster config: %w", err)
91-
}
92-
return &cfg, nil
93-
}
94-
9578
// Outro is executed after the cluster deployment.
9679
func (e *EmbeddedClusterOperator) Outro(ctx context.Context, cli client.Client) error {
9780
loading := pb.Start()
@@ -101,7 +84,7 @@ func (e *EmbeddedClusterOperator) Outro(ctx context.Context, cli client.Client)
10184
return err
10285
}
10386
loading.Closef("Embedded Cluster Operator is ready!")
104-
cfg, err := e.readEmbeddedClusterConfig()
87+
cfg, err := customization.AdminConsole{}.EmbeddedClusterConfig()
10588
if err != nil {
10689
return err
10790
}

pkg/config/config.go

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/k0sproject/k0sctl/pkg/apis/k0sctl.k0sproject.io/v1beta1"
2020
"github.com/k0sproject/k0sctl/pkg/apis/k0sctl.k0sproject.io/v1beta1/cluster"
2121
k0sversion "github.com/k0sproject/version"
22+
embeddedclusterv1beta1 "github.com/replicatedhq/embedded-cluster-operator/api/v1beta1"
2223
"github.com/sirupsen/logrus"
2324
yamlv2 "gopkg.in/yaml.v2"
2425
"sigs.k8s.io/yaml"
@@ -51,23 +52,25 @@ func ReadConfigFile(cfgPath string) (*v1beta1.Cluster, error) {
5152

5253
// RenderClusterConfig renders a cluster configuration interactively.
5354
func RenderClusterConfig(ctx context.Context, multi bool) (*v1beta1.Cluster, error) {
54-
embconfig, err := customization.AdminConsole{}.EmbeddedClusterConfig()
55+
clusterConfig, err := customization.AdminConsole{}.EmbeddedClusterConfig()
5556
if err != nil {
5657
return nil, fmt.Errorf("unable to get embedded cluster config: %w", err)
58+
} else if clusterConfig == nil {
59+
clusterConfig = &embeddedclusterv1beta1.Config{}
5760
}
5861
if multi {
5962
cfg, err := renderMultiNodeConfig(ctx)
6063
if err != nil {
6164
return nil, fmt.Errorf("unable to render multi-node config: %w", err)
6265
}
63-
ApplyEmbeddedUnsupportedOverrides(cfg, embconfig)
66+
ApplyEmbeddedUnsupportedOverrides(cfg, clusterConfig.Spec.UnsupportedOverrides.K0s)
6467
return cfg, nil
6568
}
6669
cfg, err := renderSingleNodeConfig(ctx)
6770
if err != nil {
6871
return nil, fmt.Errorf("unable to render single-node config: %w", err)
6972
}
70-
ApplyEmbeddedUnsupportedOverrides(cfg, embconfig)
73+
ApplyEmbeddedUnsupportedOverrides(cfg, clusterConfig.Spec.UnsupportedOverrides.K0s)
7174
return renderSingleNodeConfig(ctx)
7275
}
7376

@@ -251,16 +254,18 @@ func renderSingleNodeConfig(ctx context.Context) (*v1beta1.Cluster, error) {
251254
if err != nil {
252255
return nil, fmt.Errorf("unable to get preferred node IP address: %w", err)
253256
}
257+
258+
labels := additionalControllerLabels()
259+
labels["kots.io/embedded-cluster-role-0"] = getControllerRoleName()
260+
labels["kots.io/embedded-cluster-role"] = "total-1"
261+
254262
host := &hostcfg{
255263
Address: ipaddr,
256264
Role: "controller+worker",
257265
Port: 22,
258266
User: usr.Username,
259267
KeyPath: defaults.SSHKeyPath(),
260-
Labels: map[string]string{
261-
"kots.io/embedded-cluster-role-0": "controller",
262-
"kots.io/embedded-cluster-role": "total-1",
263-
},
268+
Labels: labels,
264269
}
265270
if err := host.testConnection(); err != nil {
266271
return nil, fmt.Errorf("unable to connect to %s: %w", ipaddr, err)
@@ -309,32 +314,11 @@ func UpdateHelmConfigs(cfg *v1beta1.Cluster, opts ...addons.Option) error {
309314
return nil
310315
}
311316

312-
// UnsupportedConfigOverrides is a auxiliary struct for parsing the unsupported overrides
313-
// as provided in the Kots release. XXX This should eventually become a CRD.
314-
type UnsupportedConfigOverrides struct {
315-
Spec struct {
316-
UnsupportedOverrides struct {
317-
K0s *cluster.K0s `yaml:"k0s"`
318-
} `yaml:"unsupportedOverrides"`
319-
} `yaml:"spec"`
320-
}
321-
322317
// ApplyEmbeddedUnsupportedOverrides applies the custom configuration to the cluster config.
323-
func ApplyEmbeddedUnsupportedOverrides(config *v1beta1.Cluster, embconfig []byte) error {
324-
if embconfig == nil {
318+
func ApplyEmbeddedUnsupportedOverrides(config *v1beta1.Cluster, embconfig string) error {
319+
if embconfig == "" {
325320
return nil
326321
}
327-
var overrides UnsupportedConfigOverrides
328-
if err := yaml.Unmarshal(embconfig, &overrides); err != nil {
329-
return fmt.Errorf("unable to parse cluster config overrides: %w", err)
330-
}
331-
if overrides.Spec.UnsupportedOverrides.K0s == nil {
332-
return nil
333-
}
334-
origConfigBytes, err := yaml.Marshal(overrides.Spec.UnsupportedOverrides.K0s.Config)
335-
if err != nil {
336-
return fmt.Errorf("unable to marshal cluster config overrides: %w", err)
337-
}
338322
newConfigBytes, err := yaml.Marshal(config.Spec.K0s.Config)
339323
if err != nil {
340324
return fmt.Errorf("unable to marshal original cluster config: %w", err)
@@ -343,7 +327,7 @@ func ApplyEmbeddedUnsupportedOverrides(config *v1beta1.Cluster, embconfig []byte
343327
if err != nil {
344328
return fmt.Errorf("unable to convert cluster config overrides to json: %w", err)
345329
}
346-
target, err := fmtconvert.YAMLToJSON(origConfigBytes)
330+
target, err := fmtconvert.YAMLToJSON([]byte(embconfig))
347331
if err != nil {
348332
return fmt.Errorf("unable to convert original cluster config to json: %w", err)
349333
}
@@ -362,3 +346,30 @@ func ApplyEmbeddedUnsupportedOverrides(config *v1beta1.Cluster, embconfig []byte
362346
config.Spec.K0s.Config = newK0sConfig
363347
return nil
364348
}
349+
350+
func getControllerRoleName() string {
351+
clusterConfig, err := customization.AdminConsole{}.EmbeddedClusterConfig()
352+
353+
controllerRoleName := "controller"
354+
if err == nil {
355+
if clusterConfig != nil {
356+
if clusterConfig.Spec.Controller.Name != "" {
357+
controllerRoleName = clusterConfig.Spec.Controller.Name
358+
}
359+
}
360+
}
361+
return controllerRoleName
362+
}
363+
364+
func additionalControllerLabels() map[string]string {
365+
clusterConfig, err := customization.AdminConsole{}.EmbeddedClusterConfig()
366+
367+
if err == nil {
368+
if clusterConfig != nil {
369+
if clusterConfig.Spec.Controller.Labels != nil {
370+
return clusterConfig.Spec.Controller.Labels
371+
}
372+
}
373+
}
374+
return map[string]string{}
375+
}

pkg/config/config_test.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ import (
77
"testing"
88

99
"github.com/k0sproject/k0sctl/pkg/apis/k0sctl.k0sproject.io/v1beta1"
10+
embeddedclusterv1beta1 "github.com/replicatedhq/embedded-cluster-operator/api/v1beta1"
1011
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
1113
"gopkg.in/yaml.v2"
14+
kyaml "sigs.k8s.io/yaml"
1215
)
1316

1417
//go:embed testdata/*yaml
@@ -39,16 +42,21 @@ func TestApplyUnsupportedOverrides(t *testing.T) {
3942
}
4043
for _, tt := range tests {
4144
t.Run(tt.Name, func(t *testing.T) {
45+
req := require.New(t)
46+
4247
var config v1beta1.Cluster
4348
err := yaml.Unmarshal([]byte(tt.Config), &config)
44-
assert.NoError(t, err)
45-
err = ApplyEmbeddedUnsupportedOverrides(&config, []byte(tt.Override))
46-
assert.NoError(t, err)
49+
req.NoError(err)
50+
var cfg embeddedclusterv1beta1.Config
51+
err = kyaml.Unmarshal([]byte(tt.Override), &cfg)
52+
req.NoError(err)
53+
err = ApplyEmbeddedUnsupportedOverrides(&config, cfg.Spec.UnsupportedOverrides.K0s)
54+
req.NoError(err)
4755
result, err := yaml.Marshal(config)
48-
assert.NoError(t, err)
56+
req.NoError(err)
4957
resultString := strings.TrimSpace(string(result))
5058
expectedString := strings.TrimSpace(string(tt.Expected))
51-
assert.Equal(t, resultString, expectedString)
59+
req.Equal(expectedString, resultString)
5260
})
5361
}
5462
}

pkg/config/testdata/override-change-name.yaml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,9 @@ override: |-
3232
kind: Config
3333
spec:
3434
unsupportedOverrides:
35-
k0s:
36-
config:
37-
metadata:
38-
name: foo
35+
k0s: |
36+
metadata:
37+
name: foo
3938
expected: |-
4039
apiVersion: k0sctl.k0sproject.io/v1beta1
4140
kind: Cluster

pkg/config/testdata/override-enable-telemetry.yaml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ override: |-
3232
kind: Config
3333
spec:
3434
unsupportedOverrides:
35-
k0s:
36-
config:
37-
spec:
38-
telemetry:
39-
enabled: true
35+
k0s: |
36+
spec:
37+
telemetry:
38+
enabled: true
4039
expected: |-
4140
apiVersion: k0sctl.k0sproject.io/v1beta1
4241
kind: Cluster

pkg/config/testdata/override-setting-ip-forward.yaml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,13 @@ override: |-
3232
kind: Config
3333
spec:
3434
unsupportedOverrides:
35-
k0s:
36-
config:
37-
spec:
38-
workerProfiles:
39-
- name: ip-forward
40-
values:
41-
allowedUnsafeSysctls:
42-
- net.ipv4.ip_forward
35+
k0s: |
36+
spec:
37+
workerProfiles:
38+
- name: ip-forward
39+
values:
40+
allowedUnsafeSysctls:
41+
- net.ipv4.ip_forward
4342
expected: |-
4443
apiVersion: k0sctl.k0sproject.io/v1beta1
4544
kind: Cluster

pkg/config/testdata/override-zero-out-sans-list.yaml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,10 @@ override: |-
3636
kind: Config
3737
spec:
3838
unsupportedOverrides:
39-
k0s:
40-
config:
41-
spec:
42-
api:
43-
sans: null
39+
k0s: |
40+
spec:
41+
api:
42+
sans: null
4443
expected: |-
4544
apiVersion: k0sctl.k0sproject.io/v1beta1
4645
kind: Cluster

0 commit comments

Comments
 (0)