From b30855acba456f8efed0811870c9bf871ceb3c87 Mon Sep 17 00:00:00 2001 From: Piotr Skamruk Date: Tue, 4 Apr 2017 11:45:12 +0200 Subject: [PATCH] kubeadm: Wait for node before updating labels and taints fixes kubernetes/kubeadm#221 --- cmd/kubeadm/app/phases/apiconfig/BUILD | 2 ++ .../app/phases/apiconfig/setupmaster.go | 30 ++++++++----------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/cmd/kubeadm/app/phases/apiconfig/BUILD b/cmd/kubeadm/app/phases/apiconfig/BUILD index 0d681f63a0..54d2d01d03 100644 --- a/cmd/kubeadm/app/phases/apiconfig/BUILD +++ b/cmd/kubeadm/app/phases/apiconfig/BUILD @@ -17,10 +17,12 @@ go_library( deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//pkg/bootstrap/api:go_default_library", + "//pkg/util/node:go_default_library", "//vendor:k8s.io/apimachinery/pkg/api/errors", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/types", "//vendor:k8s.io/apimachinery/pkg/util/strategicpatch", + "//vendor:k8s.io/apimachinery/pkg/util/wait", "//vendor:k8s.io/client-go/kubernetes", "//vendor:k8s.io/client-go/pkg/api/v1", "//vendor:k8s.io/client-go/pkg/apis/rbac/v1beta1", diff --git a/cmd/kubeadm/app/phases/apiconfig/setupmaster.go b/cmd/kubeadm/app/phases/apiconfig/setupmaster.go index 37ec2b43a0..2c3c96a1fc 100644 --- a/cmd/kubeadm/app/phases/apiconfig/setupmaster.go +++ b/cmd/kubeadm/app/phases/apiconfig/setupmaster.go @@ -25,34 +25,28 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/pkg/api/v1" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" + "k8s.io/kubernetes/pkg/util/node" ) const apiCallRetryInterval = 500 * time.Millisecond // TODO: Can we think of any unit tests here? Or should this code just be covered through integration/e2e tests? -// It's safe to do this for alpha, as we don't have HA and there is no way we can get -// more then one node here (TODO(phase1+) use os.Hostname) -func findMyself(client *clientset.Clientset) (*v1.Node, error) { - nodeList, err := client.Nodes().List(metav1.ListOptions{}) - if err != nil { - return nil, fmt.Errorf("unable to list nodes [%v]", err) - } - if len(nodeList.Items) < 1 { - return nil, fmt.Errorf("no nodes found") - } - node := &nodeList.Items[0] - return node, nil -} - func attemptToUpdateMasterRoleLabelsAndTaints(client *clientset.Clientset) error { - n, err := findMyself(client) - if err != nil { - return err - } + var n *v1.Node + + // Wait for current node registration + wait.PollInfinite(kubeadmconstants.APICallRetryInterval, func() (bool, error) { + var err error + if n, err = client.Nodes().Get(node.GetHostname(""), metav1.GetOptions{}); err != nil { + return true, nil + } + return false, nil + }) oldData, err := json.Marshal(n) if err != nil {