123 lines
3.3 KiB
Go
123 lines
3.3 KiB
Go
|
/*
|
||
|
Copyright 2016 The Kubernetes Authors.
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package cloud
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/golang/glog"
|
||
|
|
||
|
"k8s.io/kubernetes/pkg/api/v1"
|
||
|
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake"
|
||
|
|
||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||
|
"k8s.io/kubernetes/pkg/client/record"
|
||
|
"k8s.io/kubernetes/pkg/cloudprovider"
|
||
|
fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake"
|
||
|
"k8s.io/kubernetes/pkg/controller"
|
||
|
"k8s.io/kubernetes/pkg/controller/informers"
|
||
|
"k8s.io/kubernetes/pkg/controller/node/testutil"
|
||
|
)
|
||
|
|
||
|
// This test checks that the node is deleted when kubelet stops reporting
|
||
|
// and cloud provider says node is gone
|
||
|
func TestNodeDeleted(t *testing.T) {
|
||
|
pod0 := &v1.Pod{
|
||
|
ObjectMeta: v1.ObjectMeta{
|
||
|
Namespace: "default",
|
||
|
Name: "pod0",
|
||
|
},
|
||
|
Spec: v1.PodSpec{
|
||
|
NodeName: "node0",
|
||
|
},
|
||
|
Status: v1.PodStatus{
|
||
|
Conditions: []v1.PodCondition{
|
||
|
{
|
||
|
Type: v1.PodReady,
|
||
|
Status: v1.ConditionTrue,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
pod1 := &v1.Pod{
|
||
|
ObjectMeta: v1.ObjectMeta{
|
||
|
Namespace: "default",
|
||
|
Name: "pod1",
|
||
|
},
|
||
|
Spec: v1.PodSpec{
|
||
|
NodeName: "node0",
|
||
|
},
|
||
|
Status: v1.PodStatus{
|
||
|
Conditions: []v1.PodCondition{
|
||
|
{
|
||
|
Type: v1.PodReady,
|
||
|
Status: v1.ConditionTrue,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
fnh := &testutil.FakeNodeHandler{
|
||
|
Existing: []*v1.Node{
|
||
|
{
|
||
|
ObjectMeta: v1.ObjectMeta{
|
||
|
Name: "node0",
|
||
|
CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC),
|
||
|
},
|
||
|
Status: v1.NodeStatus{
|
||
|
Conditions: []v1.NodeCondition{
|
||
|
{
|
||
|
Type: v1.NodeReady,
|
||
|
Status: v1.ConditionUnknown,
|
||
|
LastHeartbeatTime: metav1.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC),
|
||
|
LastTransitionTime: metav1.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*pod0, *pod1}}),
|
||
|
DeleteWaitChan: make(chan struct{}),
|
||
|
}
|
||
|
|
||
|
factory := informers.NewSharedInformerFactory(fnh, nil, controller.NoResyncPeriodFunc())
|
||
|
|
||
|
eventBroadcaster := record.NewBroadcaster()
|
||
|
cloudNodeController := &CloudNodeController{
|
||
|
kubeClient: fnh,
|
||
|
nodeInformer: factory.Nodes(),
|
||
|
cloud: &fakecloud.FakeCloud{Err: cloudprovider.InstanceNotFound},
|
||
|
nodeMonitorPeriod: 5 * time.Second,
|
||
|
recorder: eventBroadcaster.NewRecorder(v1.EventSource{Component: "controllermanager"}),
|
||
|
}
|
||
|
eventBroadcaster.StartLogging(glog.Infof)
|
||
|
|
||
|
cloudNodeController.Run()
|
||
|
|
||
|
select {
|
||
|
case <-fnh.DeleteWaitChan:
|
||
|
case <-time.After(wait.ForeverTestTimeout):
|
||
|
t.Errorf("Timed out waiting %v for node to be deleted", wait.ForeverTestTimeout)
|
||
|
}
|
||
|
if len(fnh.DeletedNodes) != 1 || fnh.DeletedNodes[0].Name != "node0" {
|
||
|
t.Errorf("Node was not deleted")
|
||
|
}
|
||
|
}
|