From 16453a33346c4d8e407623e3e49daf476e91a353 Mon Sep 17 00:00:00 2001 From: Kenan Karamehmedovic Date: Fri, 18 Nov 2016 13:37:26 +0100 Subject: [PATCH] Fail fast if there is already a node with same name as the one being joined. --- cmd/kubeadm/app/cmd/join.go | 5 +++++ cmd/kubeadm/app/node/BUILD | 1 + cmd/kubeadm/app/node/bootstrap.go | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/cmd/kubeadm/app/cmd/join.go b/cmd/kubeadm/app/cmd/join.go index c2bd76abc21..b6c7780e973 100644 --- a/cmd/kubeadm/app/cmd/join.go +++ b/cmd/kubeadm/app/cmd/join.go @@ -145,6 +145,11 @@ func (j *Join) Run(out io.Writer) error { return err } + err = kubenode.CheckForNodeNameDuplicates(connectionDetails) + if err != nil { + return err + } + kubeconfig, err := kubenode.PerformTLSBootstrap(connectionDetails) if err != nil { return err diff --git a/cmd/kubeadm/app/node/BUILD b/cmd/kubeadm/app/node/BUILD index 86970ec037b..d11e982f881 100644 --- a/cmd/kubeadm/app/node/BUILD +++ b/cmd/kubeadm/app/node/BUILD @@ -21,6 +21,7 @@ go_library( deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/util:go_default_library", + "//pkg/api/v1:go_default_library", "//pkg/apis/certificates:go_default_library", "//pkg/client/clientset_generated/release_1_5:go_default_library", "//pkg/client/clientset_generated/release_1_5/typed/certificates/v1alpha1:go_default_library", diff --git a/cmd/kubeadm/app/node/bootstrap.go b/cmd/kubeadm/app/node/bootstrap.go index 808b361ec09..c2a8815a349 100644 --- a/cmd/kubeadm/app/node/bootstrap.go +++ b/cmd/kubeadm/app/node/bootstrap.go @@ -24,6 +24,7 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" + "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/apis/certificates" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" certclient "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/typed/certificates/v1alpha1" @@ -34,6 +35,7 @@ import ( // ConnectionDetails represents a master API endpoint connection type ConnectionDetails struct { + ClientSet *clientset.Clientset CertClient *certclient.CertificatesV1alpha1Client Endpoint string CACert []byte @@ -82,6 +84,7 @@ func EstablishMasterConnection(s *kubeadmapi.NodeConfiguration, clusterInfo *kub // connection established, stop all wait threads close(stopChan) result <- &ConnectionDetails{ + ClientSet: clientSet, CertClient: clientSet.CertificatesV1alpha1Client, Endpoint: apiEndpoint, CACert: caCert, @@ -124,6 +127,24 @@ func createClients(caCert []byte, endpoint, token string, nodeName types.NodeNam return clientSet, nil } +// check to see if there are other nodes in the cluster with identical node names. +func CheckForNodeNameDuplicates(connection *ConnectionDetails) error { + hostName, err := os.Hostname() + if err != nil { + return fmt.Errorf("Failed to get node hostname [%v]", err) + } + nodeList, err := connection.ClientSet.Nodes().List(v1.ListOptions{}) + if err != nil { + return fmt.Errorf("Failed to list the nodes in the cluster: [%v]\n", err) + } + for _, node := range nodeList.Items { + if hostName == node.Name { + return fmt.Errorf("Node with name [%q] already exists.", node.Name) + } + } + return nil +} + // checks the connection requirements for a specific API endpoint func checkAPIEndpoint(clientSet *clientset.Clientset, endpoint string) error { // check general connectivity