From f0d82fb5f453d6fc1fd7d9f514237583ae898105 Mon Sep 17 00:00:00 2001 From: "Rostislav M. Georgiev" Date: Thu, 4 Oct 2018 15:54:29 +0300 Subject: [PATCH] kubeadm: Allow mixing Init and Join Configurations This change allows mixing InitConfiguration/ClusterConfiguration with JoinConfiguration in a single YAML file, by performing the following changes: - Replace the explicit error in `DetectUnsupportedVersion` with a warning. - Modify `NodeConfigFileAndDefaultsToInternalConfig` to use only `JoinConfiguration`. Signed-off-by: Rostislav M. Georgiev --- cmd/kubeadm/app/util/config/common.go | 16 ++++++++-------- cmd/kubeadm/app/util/config/common_test.go | 18 ++++++++++-------- cmd/kubeadm/app/util/config/nodeconfig.go | 20 +++++++++++++++++++- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/cmd/kubeadm/app/util/config/common.go b/cmd/kubeadm/app/util/config/common.go index b55d0d8a4ed..63a5ab57778 100644 --- a/cmd/kubeadm/app/util/config/common.go +++ b/cmd/kubeadm/app/util/config/common.go @@ -93,19 +93,19 @@ func DetectUnsupportedVersion(b []byte) error { } knownKinds[gvk.Kind] = true } - // InitConfiguration, MasterConfiguration and NodeConfiguration are mutually exclusive, error if more than one are specified + + // InitConfiguration and JoinConfiguration may not apply together, warn if more than one is specified mutuallyExclusive := []string{constants.InitConfigurationKind, constants.JoinConfigurationKind} - foundOne := false + mutuallyExclusiveCount := 0 for _, kind := range mutuallyExclusive { if knownKinds[kind] { - if !foundOne { - foundOne = true - continue - } - - return fmt.Errorf("invalid configuration: kinds %v are mutually exclusive", mutuallyExclusive) + mutuallyExclusiveCount++ } } + if mutuallyExclusiveCount > 1 { + glog.Warningf("WARNING: Detected resource kinds that may not apply: %v", mutuallyExclusive) + } + return nil } diff --git a/cmd/kubeadm/app/util/config/common_test.go b/cmd/kubeadm/app/util/config/common_test.go index bc4ecf60932..358cc483984 100644 --- a/cmd/kubeadm/app/util/config/common_test.go +++ b/cmd/kubeadm/app/util/config/common_test.go @@ -163,25 +163,27 @@ func TestDetectUnsupportedVersion(t *testing.T) { name: "Ignore other Kind", fileContents: bytes.Join([][]byte{files["Foo"], files["Master_v1beta1"]}, []byte(constants.YAMLDocumentSeparator)), }, + // CanMixInitJoin cases used to be MustNotMixInitJoin, however due to UX issues DetectUnsupportedVersion had to tolerate that. + // So the following tests actually verify, that Init and Join can be mixed together with no error. { - name: "MustNotMixInitJoin v1alpha3", + name: "CanMixInitJoin v1alpha3", fileContents: bytes.Join([][]byte{files["Init_v1alpha3"], files["Join_v1alpha3"]}, []byte(constants.YAMLDocumentSeparator)), - expectedErr: true, + expectedErr: false, }, { - name: "MustNotMixInitJoin v1alpha3 - v1beta1", + name: "CanMixInitJoin v1alpha3 - v1beta1", fileContents: bytes.Join([][]byte{files["Init_v1alpha3"], files["Join_v1beta1"]}, []byte(constants.YAMLDocumentSeparator)), - expectedErr: true, + expectedErr: false, }, { - name: "MustNotMixInitJoin v1beta1 - v1alpha3", + name: "CanMixInitJoin v1beta1 - v1alpha3", fileContents: bytes.Join([][]byte{files["Init_v1beta1"], files["Join_v1alpha3"]}, []byte(constants.YAMLDocumentSeparator)), - expectedErr: true, + expectedErr: false, }, { - name: "MustNotMixInitJoin v1beta1", + name: "CanMixInitJoin v1beta1", fileContents: bytes.Join([][]byte{files["Init_v1beta1"], files["Join_v1beta1"]}, []byte(constants.YAMLDocumentSeparator)), - expectedErr: true, + expectedErr: false, }, } diff --git a/cmd/kubeadm/app/util/config/nodeconfig.go b/cmd/kubeadm/app/util/config/nodeconfig.go index e161be5adbe..f10cf6fea64 100644 --- a/cmd/kubeadm/app/util/config/nodeconfig.go +++ b/cmd/kubeadm/app/util/config/nodeconfig.go @@ -19,6 +19,7 @@ package config import ( "fmt" "io/ioutil" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" "github.com/golang/glog" @@ -27,6 +28,7 @@ import ( kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" ) // SetJoinDynamicDefaults checks and sets configuration values for the JoinConfiguration object @@ -61,7 +63,23 @@ func NodeConfigFileAndDefaultsToInternalConfig(cfgPath string, defaultversionedc return nil, err } - if err := runtime.DecodeInto(kubeadmscheme.Codecs.UniversalDecoder(), b, internalcfg); err != nil { + gvkmap, err := kubeadmutil.SplitYAMLDocuments(b) + if err != nil { + return nil, err + } + + joinBytes := []byte{} + for gvk, bytes := range gvkmap { + if gvk.Kind == constants.JoinConfigurationKind { + joinBytes = bytes + } + } + + if len(joinBytes) == 0 { + return nil, fmt.Errorf("no %s found in config file %q", constants.JoinConfigurationKind, cfgPath) + } + + if err := runtime.DecodeInto(kubeadmscheme.Codecs.UniversalDecoder(), joinBytes, internalcfg); err != nil { return nil, err } } else {