From 8c1206ca2d315930c213e4b6ade80778b369010f Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 5 Feb 2015 11:02:56 -0500 Subject: [PATCH] NodeController should tolerate when nodes already exist During startup, if nodes have already been defined the controller does not need to create them, just needs to keep them up to date. When defining a static list, the controller would loop and fail repeatedly if the node existed. I don't know if we need to update the node during registration, as long as the sync loop checks it later. --- .../controller/nodecontroller.go | 7 +++--- .../controller/nodecontroller_test.go | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/pkg/cloudprovider/controller/nodecontroller.go b/pkg/cloudprovider/controller/nodecontroller.go index acdf826c5dc..6455d0ccec7 100644 --- a/pkg/cloudprovider/controller/nodecontroller.go +++ b/pkg/cloudprovider/controller/nodecontroller.go @@ -25,6 +25,7 @@ import ( "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + apierrors "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" "github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider" "github.com/GoogleCloudPlatform/kubernetes/pkg/probe" @@ -120,14 +121,14 @@ func (s *NodeController) RegisterNodes(nodes *api.NodeList, retryCount int, retr continue } _, err := s.kubeClient.Nodes().Create(&node) - if err == nil { + if err == nil || apierrors.IsAlreadyExists(err) { registered.Insert(node.Name) glog.Infof("Registered node in registry: %s", node.Name) } else { - glog.Errorf("Error registrying node %s, retrying: %s", node.Name, err) + glog.Errorf("Error registering node %s, retrying: %s", node.Name, err) } if registered.Len() == len(nodes.Items) { - glog.Infof("Successfully Registered all nodes") + glog.Infof("Successfully registered all nodes") return nil } } diff --git a/pkg/cloudprovider/controller/nodecontroller_test.go b/pkg/cloudprovider/controller/nodecontroller_test.go index 4462a74fbcc..899a88b395f 100644 --- a/pkg/cloudprovider/controller/nodecontroller_test.go +++ b/pkg/cloudprovider/controller/nodecontroller_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + apierrors "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource" "github.com/GoogleCloudPlatform/kubernetes/pkg/client" fake_cloud "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/fake" @@ -53,6 +54,11 @@ func (c *FakeNodeHandler) Nodes() client.NodeInterface { func (m *FakeNodeHandler) Create(node *api.Node) (*api.Node, error) { defer func() { m.RequestCount++ }() + for _, n := range m.Existing { + if n.Name == node.Name { + return nil, apierrors.NewAlreadyExists("Minion", node.Name) + } + } if m.CreateHook == nil || m.CreateHook(m, node) { nodeCopy := *node m.CreatedNodes = append(m.CreatedNodes, &nodeCopy) @@ -177,6 +183,23 @@ func TestRegisterNodes(t *testing.T) { expectedCreateCount: 2, expectedFail: false, }, + { + // One node already exists + machines: []string{"node0", "node1"}, + fakeNodeHandler: &FakeNodeHandler{ + Existing: []*api.Node{ + { + ObjectMeta: api.ObjectMeta{ + Name: "node1", + }, + }, + }, + }, + retryCount: 10, + expectedRequestCount: 2, + expectedCreateCount: 1, + expectedFail: false, + }, { // The first node always fails. machines: []string{"node0", "node1"},