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"
"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
}
}

View File

@ -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"},