From 981bf1930c73a7d95bbbd1dc9b3bfff122ad09a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Fern=C3=A1ndez=20L=C3=B3pez?= Date: Sun, 3 Feb 2019 20:43:16 +0100 Subject: [PATCH] kubeadm: do not create etcd datastore if we are in dryrun mode This allows for kubeadm tests to pass when run with an unprivileged user. --- cmd/kubeadm/app/cmd/join.go | 5 +++++ cmd/kubeadm/app/cmd/phases/init/etcd.go | 12 +++++++++++- cmd/kubeadm/app/phases/etcd/local.go | 14 +------------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/cmd/kubeadm/app/cmd/join.go b/cmd/kubeadm/app/cmd/join.go index 92bc369c64..c00ded135c 100644 --- a/cmd/kubeadm/app/cmd/join.go +++ b/cmd/kubeadm/app/cmd/join.go @@ -571,6 +571,11 @@ func (j *joinData) PostInstallControlPlane(initConfiguration *kubeadmapi.InitCon // in case of local etcd if initConfiguration.Etcd.External == nil { + // creates target folder if doesn't exist already + if err := os.MkdirAll(initConfiguration.Etcd.Local.DataDir, 0700); err != nil { + return errors.Wrapf(err, "failed to create etcd directory %q", initConfiguration.Etcd.Local.DataDir) + } + // Adds a new etcd instance; in order to do this the new etcd instance should be "announced" to // the existing etcd members before being created. // This operation must be executed after kubelet is already started in order to minimize the time diff --git a/cmd/kubeadm/app/cmd/phases/init/etcd.go b/cmd/kubeadm/app/cmd/phases/init/etcd.go index 92fce50ce3..f531ee9041 100644 --- a/cmd/kubeadm/app/cmd/phases/init/etcd.go +++ b/cmd/kubeadm/app/cmd/phases/init/etcd.go @@ -18,6 +18,7 @@ package phases import ( "fmt" + "os" "github.com/pkg/errors" "k8s.io/klog" @@ -31,7 +32,7 @@ import ( var ( etcdLocalExample = normalizer.Examples(` - # Generates the static Pod manifest file for etcd, functionally + # Generates the static Pod manifest file for etcd, functionally # equivalent to what is generated by kubeadm init. kubeadm init phase etcd local @@ -43,6 +44,7 @@ var ( type etcdData interface { Cfg() *kubeadmapi.InitConfiguration + DryRun() bool ManifestDir() string } @@ -89,6 +91,14 @@ func runEtcdPhaseLocal() func(c workflow.RunData) error { // Add etcd static pod spec only if external etcd is not configured if cfg.Etcd.External == nil { + // creates target folder if doesn't exist already + if !data.DryRun() { + if err := os.MkdirAll(cfg.Etcd.Local.DataDir, 0700); err != nil { + return errors.Wrapf(err, "failed to create etcd directory %q", cfg.Etcd.Local.DataDir) + } + } else { + fmt.Printf("[dryrun] Would ensure that %q directory is present\n", cfg.Etcd.Local.DataDir) + } fmt.Printf("[etcd] Creating static Pod manifest for local etcd in %q\n", data.ManifestDir()) if err := etcdphase.CreateLocalEtcdStaticPodManifestFile(data.ManifestDir(), cfg.NodeRegistration.Name, &cfg.ClusterConfiguration, &cfg.LocalAPIEndpoint); err != nil { return errors.Wrap(err, "error creating local etcd static pod manifest file") diff --git a/cmd/kubeadm/app/phases/etcd/local.go b/cmd/kubeadm/app/phases/etcd/local.go index e912feef60..5d5f5e4a6d 100644 --- a/cmd/kubeadm/app/phases/etcd/local.go +++ b/cmd/kubeadm/app/phases/etcd/local.go @@ -18,7 +18,6 @@ package etcd import ( "fmt" - "os" "path/filepath" "strings" "time" @@ -51,14 +50,8 @@ func CreateLocalEtcdStaticPodManifestFile(manifestDir string, nodeName string, c return errors.New("etcd static pod manifest cannot be generated for cluster using external etcd") } // gets etcd StaticPodSpec - emptyInitialCluster := []etcdutil.Member{} + spec := GetEtcdPodSpec(cfg, endpoint, nodeName, []etcdutil.Member{}) - // creates target folder if not already exists - if err := os.MkdirAll(cfg.Etcd.Local.DataDir, 0700); err != nil { - return errors.Wrapf(err, "failed to create etcd directory %q", cfg.Etcd.Local.DataDir) - } - - spec := GetEtcdPodSpec(cfg, endpoint, nodeName, emptyInitialCluster) // writes etcd StaticPod to disk if err := staticpodutil.WriteStaticPodToDisk(kubeadmconstants.Etcd, manifestDir, spec); err != nil { return err @@ -110,11 +103,6 @@ func CreateStackedEtcdStaticPodManifestFile(client clientset.Interface, manifest fmt.Println("[etcd] Announced new etcd member joining to the existing etcd cluster") klog.V(1).Infof("Updated etcd member list: %v", initialCluster) - // creates target folder if not already exists - if err := os.MkdirAll(cfg.Etcd.Local.DataDir, 0700); err != nil { - return errors.Wrapf(err, "failed to create etcd directory %q", cfg.Etcd.Local.DataDir) - } - klog.V(1).Info("Creating local etcd static pod manifest file") // gets etcd StaticPodSpec, actualized for the current InitConfiguration and the new list of etcd members spec := GetEtcdPodSpec(cfg, endpoint, nodeName, initialCluster)