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.
This commit is contained in:
Clayton Coleman 2015-02-05 11:02:56 -05:00
parent bb6b332a8b
commit 8c1206ca2d
2 changed files with 27 additions and 3 deletions

View File

@ -25,6 +25,7 @@ import (
"time" "time"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api" "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/client"
"github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider" "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider"
"github.com/GoogleCloudPlatform/kubernetes/pkg/probe" "github.com/GoogleCloudPlatform/kubernetes/pkg/probe"
@ -120,14 +121,14 @@ func (s *NodeController) RegisterNodes(nodes *api.NodeList, retryCount int, retr
continue continue
} }
_, err := s.kubeClient.Nodes().Create(&node) _, err := s.kubeClient.Nodes().Create(&node)
if err == nil { if err == nil || apierrors.IsAlreadyExists(err) {
registered.Insert(node.Name) registered.Insert(node.Name)
glog.Infof("Registered node in registry: %s", node.Name) glog.Infof("Registered node in registry: %s", node.Name)
} else { } 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) { if registered.Len() == len(nodes.Items) {
glog.Infof("Successfully Registered all nodes") glog.Infof("Successfully registered all nodes")
return nil return nil
} }
} }

View File

@ -25,6 +25,7 @@ import (
"time" "time"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api" "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/api/resource"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/client"
fake_cloud "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/fake" 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) { func (m *FakeNodeHandler) Create(node *api.Node) (*api.Node, error) {
defer func() { m.RequestCount++ }() 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) { if m.CreateHook == nil || m.CreateHook(m, node) {
nodeCopy := *node nodeCopy := *node
m.CreatedNodes = append(m.CreatedNodes, &nodeCopy) m.CreatedNodes = append(m.CreatedNodes, &nodeCopy)
@ -177,6 +183,23 @@ func TestRegisterNodes(t *testing.T) {
expectedCreateCount: 2, expectedCreateCount: 2,
expectedFail: false, 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. // The first node always fails.
machines: []string{"node0", "node1"}, machines: []string{"node0", "node1"},