From af9278032b218f8ee87f72de0c69906cdedcb120 Mon Sep 17 00:00:00 2001 From: Kimmo Lehto Date: Thu, 4 Nov 2021 16:20:02 +0200 Subject: [PATCH] Validate config apiVersion and kind Signed-off-by: Kimmo Lehto Fix Signed-off-by: Kimmo Lehto Perform validation in Validate() Signed-off-by: Kimmo Lehto Controller config kind Signed-off-by: Kimmo Lehto Another "clusterconfigs" --- docs/airgap-install.md | 4 ++-- docs/configuration.md | 2 +- docs/k0s-in-docker.md | 2 +- examples/footloose-ha-controllers/k0s.yaml | 2 +- examples/footloose-mysql/mke.yaml | 4 ++-- inttest/backup/backup_test.go | 2 +- inttest/customports/customports_test.go | 2 +- .../v1beta1/clusterconfig_types.go | 17 ++++++++++++----- .../v1beta1/clusterconfig_types_test.go | 19 +++++++++++++++++++ .../k0s.k0sproject.io/v1beta1/network_test.go | 2 +- pkg/component/controller/clusterConfig.go | 2 +- pkg/config/config.go | 2 +- 12 files changed, 43 insertions(+), 17 deletions(-) diff --git a/docs/airgap-install.md b/docs/airgap-install.md index 6c179b6da7da..f89551dac6a0 100644 --- a/docs/airgap-install.md +++ b/docs/airgap-install.md @@ -59,7 +59,7 @@ As an alternative to the previous step, you can use k0sctl to upload the bundle ```YAML apiVersion: k0sctl.k0sproject.io/v1beta1 -kind: Cluster +kind: ClusterConfig metadata: name: k0s-cluster spec: @@ -93,7 +93,7 @@ Use the following `k0s.yaml` to ensure that containerd does not pull images for ```yaml apiVersion: k0s.k0sproject.io/v1beta1 -kind: Cluster +kind: ClusterConfig metadata: name: k0s spec: diff --git a/docs/configuration.md b/docs/configuration.md index cb485b781039..090b8607182b 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -34,7 +34,7 @@ A YAML config file follows, with defaults as generated by the `k0s default-confi ```yaml apiVersion: k0s.k0sproject.io/v1beta1 -kind: Cluster +kind: ClusterConfig metadata: name: k0s spec: diff --git a/docs/k0s-in-docker.md b/docs/k0s-in-docker.md index 321bb565f203..1e01b585f0cf 100644 --- a/docs/k0s-in-docker.md +++ b/docs/k0s-in-docker.md @@ -75,7 +75,7 @@ services: environment: K0S_CONFIG: |- apiVersion: k0s.k0sproject.io/v1beta1 - kind: Cluster + kind: ClusterConfig metadata: name: k0s # Any additional configuration goes here ... diff --git a/examples/footloose-ha-controllers/k0s.yaml b/examples/footloose-ha-controllers/k0s.yaml index ea0e061a71c3..f2528536941e 100644 --- a/examples/footloose-ha-controllers/k0s.yaml +++ b/examples/footloose-ha-controllers/k0s.yaml @@ -1,5 +1,5 @@ apiVersion: k0s.k0sproject.io/v1beta1 -kind: Cluster +kind: ClusterConfig metadata: name: k0s-etcd spec: diff --git a/examples/footloose-mysql/mke.yaml b/examples/footloose-mysql/mke.yaml index 8dc220ce8d7d..ad3d91107fd7 100644 --- a/examples/footloose-mysql/mke.yaml +++ b/examples/footloose-mysql/mke.yaml @@ -1,6 +1,6 @@ apiVersion: k0s.k0sproject.io/v1beta1 -kind: Cluster +kind: ClusterConfig metadata: name: foobar spec: @@ -10,6 +10,6 @@ spec: dataSource: mysql://root:kine@tcp(172.17.0.4)/kine api: address: 172.17.0.2 # Address where the k8s API is accessed at (nodes public IP or LB) - + diff --git a/inttest/backup/backup_test.go b/inttest/backup/backup_test.go index 51c34658c78c..7eb504afbe15 100644 --- a/inttest/backup/backup_test.go +++ b/inttest/backup/backup_test.go @@ -32,7 +32,7 @@ import ( const configWithExternaladdress = ` apiVersion: k0s.k0sproject.io/v1beta1 -kind: Cluster +kind: ClusterConfig metadata: name: k0s spec: diff --git a/inttest/customports/customports_test.go b/inttest/customports/customports_test.go index 26913e9b3b30..127a6a961cea 100644 --- a/inttest/customports/customports_test.go +++ b/inttest/customports/customports_test.go @@ -36,7 +36,7 @@ type Suite struct { const configWithExternaladdress = ` apiVersion: k0s.k0sproject.io/v1beta1 -kind: Cluster +kind: ClusterConfig metadata: name: k0s spec: diff --git a/pkg/apis/k0s.k0sproject.io/v1beta1/clusterconfig_types.go b/pkg/apis/k0s.k0sproject.io/v1beta1/clusterconfig_types.go index ab2ba973cc4d..2c69ed32f36e 100644 --- a/pkg/apis/k0s.k0sproject.io/v1beta1/clusterconfig_types.go +++ b/pkg/apis/k0s.k0sproject.io/v1beta1/clusterconfig_types.go @@ -188,9 +188,11 @@ func ConfigFromString(yml string, dataDir string) (*ClusterConfig, error) { if err != nil { return config, err } + if config.Spec == nil { config.Spec = DefaultClusterSpec(dataDir) } + return config, nil } @@ -199,8 +201,8 @@ func DefaultClusterConfig(dataDir string) *ClusterConfig { return &ClusterConfig{ ObjectMeta: metav1.ObjectMeta{Name: "k0s"}, TypeMeta: metav1.TypeMeta{ - APIVersion: "k0s.k0sproject.io/v1beta1", - Kind: "ClusterConfig", + APIVersion: ClusterConfigAPIVersion, + Kind: ClusterConfigKind, }, Spec: DefaultClusterSpec(dataDir), } @@ -208,9 +210,6 @@ func DefaultClusterConfig(dataDir string) *ClusterConfig { // UnmarshalJSON sets in some sane defaults when unmarshaling the data from json func (c *ClusterConfig) UnmarshalJSON(data []byte) error { - if c.Kind == "" { - c.Kind = "ClusterConfig" - } if c.ClusterName == "" { c.ClusterName = "k0s" } @@ -268,6 +267,14 @@ type Validateable interface { func (c *ClusterConfig) Validate() []error { var errors []error + if c.APIVersion != ClusterConfigAPIVersion { + errors = append(errors, fmt.Errorf("expected apiVersion: %s but found %s", ClusterConfigAPIVersion, c.APIVersion)) + } + + if c.Kind != ClusterConfigKind { + errors = append(errors, fmt.Errorf("expected kind: %s but found %s", ClusterConfigKind, c.Kind)) + } + errors = append(errors, validateSpecs(c.Spec.API)...) errors = append(errors, validateSpecs(c.Spec.ControllerManager)...) errors = append(errors, validateSpecs(c.Spec.Scheduler)...) diff --git a/pkg/apis/k0s.k0sproject.io/v1beta1/clusterconfig_types_test.go b/pkg/apis/k0s.k0sproject.io/v1beta1/clusterconfig_types_test.go index 3c7199a29fc8..671d3c20eb1f 100644 --- a/pkg/apis/k0s.k0sproject.io/v1beta1/clusterconfig_types_test.go +++ b/pkg/apis/k0s.k0sproject.io/v1beta1/clusterconfig_types_test.go @@ -17,6 +17,7 @@ package v1beta1 import ( "encoding/json" + "fmt" "testing" "github.com/k0sproject/k0s/internal/pkg/iface" @@ -40,6 +41,24 @@ unknown: 1`, dataDir) assert.Error(t, err) } +func TestAPIVersionValidation(t *testing.T) { + c, _ := ConfigFromString("apiVersion: "+ClusterConfigAPIVersion, dataDir) + assert.Len(t, c.Validate(), 0) + c, _ = ConfigFromString("apiVersion: k0sctl.k0sproject.io/v1beta1", dataDir) + errors := c.Validate() + assert.Len(t, errors, 1) + assert.Contains(t, errors[0].Error(), "k0sctl.k0sproject.io") +} + +func TestKindValidation(t *testing.T) { + c, _ := ConfigFromString(fmt.Sprintf("apiVersion: %s\nkind: %s", ClusterConfigAPIVersion, ClusterConfigKind), dataDir) + assert.Len(t, c.Validate(), 0) + c, _ = ConfigFromString(fmt.Sprintf("apiVersion: %s\nkind: %s", ClusterConfigAPIVersion, "UnsupportedKind"), dataDir) + errors := c.Validate() + assert.Len(t, errors, 1) + assert.Contains(t, errors[0].Error(), "UnsupportedKind") +} + func TestStorageDefaults(t *testing.T) { yamlData := ` apiVersion: k0s.k0sproject.io/v1beta1 diff --git a/pkg/apis/k0s.k0sproject.io/v1beta1/network_test.go b/pkg/apis/k0s.k0sproject.io/v1beta1/network_test.go index f7b14c7d68ca..4765ee502983 100644 --- a/pkg/apis/k0s.k0sproject.io/v1beta1/network_test.go +++ b/pkg/apis/k0s.k0sproject.io/v1beta1/network_test.go @@ -93,7 +93,7 @@ func (s *NetworkSuite) TestNetworkDefaults() { func (s *NetworkSuite) TestCalicoDefaultsAfterMashaling() { yamlData := ` apiVersion: k0s.k0sproject.io/v1beta1 -kind: Cluster +kind: ClusterConfig metadata: name: foobar spec: diff --git a/pkg/component/controller/clusterConfig.go b/pkg/component/controller/clusterConfig.go index 9a6c811eca2f..aa4acb9c026f 100644 --- a/pkg/component/controller/clusterConfig.go +++ b/pkg/component/controller/clusterConfig.go @@ -26,7 +26,7 @@ import ( ) var ( - resourceType = v1.TypeMeta{APIVersion: "k0s.k0sproject.io/v1beta1", Kind: "clusterconfigs"} + resourceType = v1.TypeMeta{APIVersion: "k0s.k0sproject.io/v1beta1", Kind: "ClusterConfig"} cOpts = v1.CreateOptions{TypeMeta: resourceType} getOpts = v1.GetOptions{TypeMeta: resourceType} ) diff --git a/pkg/config/config.go b/pkg/config/config.go index 0a9fb92098fd..8ecf6ea95e25 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -33,7 +33,7 @@ import ( ) var ( - resourceType = v1.TypeMeta{APIVersion: "k0s.k0sproject.io/v1beta1", Kind: "clusterconfigs"} + resourceType = v1.TypeMeta{APIVersion: "k0s.k0sproject.io/v1beta1", Kind: "ClusterConfig"} getOpts = v1.GetOptions{TypeMeta: resourceType} )