Commit 91b43a4b authored by Deyuan Deng's avatar Deyuan Deng

Merge pull request #4165 from smarterclayton/ignore_already_exists_errors_on_create_node

NodeController should tolerate when nodes already exist
parents c0d7e58b 8c1206ca
...@@ -26,6 +26,7 @@ import ( ...@@ -26,6 +26,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"
...@@ -121,14 +122,14 @@ func (s *NodeController) RegisterNodes(nodes *api.NodeList, retryCount int, retr ...@@ -121,14 +122,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
} }
} }
......
...@@ -25,6 +25,7 @@ import ( ...@@ -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"
...@@ -54,6 +55,11 @@ func (c *FakeNodeHandler) Nodes() client.NodeInterface { ...@@ -54,6 +55,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)
...@@ -179,6 +185,23 @@ func TestRegisterNodes(t *testing.T) { ...@@ -179,6 +185,23 @@ func TestRegisterNodes(t *testing.T) {
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"},
fakeNodeHandler: &FakeNodeHandler{ fakeNodeHandler: &FakeNodeHandler{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment