From c11e2ae4eafeecf038cf58e211149bf3d10e72c8 Mon Sep 17 00:00:00 2001 From: Eric Lin Date: Wed, 6 Mar 2024 19:50:35 +0000 Subject: [PATCH] Remove setting NoRouteCreated condition Signed-off-by: Eric Lin --- .../controllers/node/node_controller.go | 28 +-- .../controllers/node/node_controller_test.go | 184 ------------------ 2 files changed, 3 insertions(+), 209 deletions(-) diff --git a/staging/src/k8s.io/cloud-provider/controllers/node/node_controller.go b/staging/src/k8s.io/cloud-provider/controllers/node/node_controller.go index 9b402239f4f..45cbd16429b 100644 --- a/staging/src/k8s.io/cloud-provider/controllers/node/node_controller.go +++ b/staging/src/k8s.io/cloud-provider/controllers/node/node_controller.go @@ -446,31 +446,9 @@ func (cnc *CloudNodeController) syncNode(ctx context.Context, nodeName string) e }) err = clientretry.RetryOnConflict(UpdateNodeSpecBackoff, func() error { - var curNode *v1.Node - if cnc.cloud.ProviderName() == "gce" { - // TODO(wlan0): Move this logic to the route controller using the node taint instead of condition - // Since there are node taints, do we still need this? - // This condition marks the node as unusable until routes are initialized in the cloud provider - if err := nodeutil.SetNodeCondition(cnc.kubeClient, types.NodeName(nodeName), v1.NodeCondition{ - Type: v1.NodeNetworkUnavailable, - Status: v1.ConditionTrue, - Reason: "NoRouteCreated", - Message: "Node created without a route", - LastTransitionTime: metav1.Now(), - }); err != nil { - return err - } - - // fetch latest node from API server since GCE-specific condition was set and informer cache may be stale - curNode, err = cnc.kubeClient.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}) - if err != nil { - return err - } - } else { - curNode, err = cnc.nodeInformer.Lister().Get(nodeName) - if err != nil { - return err - } + curNode, err = cnc.nodeInformer.Lister().Get(nodeName) + if err != nil { + return err } newNode := curNode.DeepCopy() diff --git a/staging/src/k8s.io/cloud-provider/controllers/node/node_controller_test.go b/staging/src/k8s.io/cloud-provider/controllers/node/node_controller_test.go index 2f0800b6c0f..7a1294f9552 100644 --- a/staging/src/k8s.io/cloud-provider/controllers/node/node_controller_test.go +++ b/staging/src/k8s.io/cloud-provider/controllers/node/node_controller_test.go @@ -1816,190 +1816,6 @@ func Test_syncNode(t *testing.T) { } } -// test syncNode with instanceV2, same test case with TestGCECondition. -func TestGCEConditionV2(t *testing.T) { - existingNode := &v1.Node{ - ObjectMeta: metav1.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), - }, - }, - }, - Spec: v1.NodeSpec{ - Taints: []v1.Taint{ - { - Key: cloudproviderapi.TaintExternalCloudProvider, - Value: "true", - Effect: v1.TaintEffectNoSchedule, - }, - }, - }, - } - - fakeCloud := &fakecloud.Cloud{ - EnableInstancesV2: true, - InstanceTypes: map[types.NodeName]string{ - types.NodeName("node0"): "t1.micro", - }, - ProviderID: map[types.NodeName]string{ - types.NodeName("node0"): "fake://12334", - }, - Addresses: []v1.NodeAddress{ - { - Type: v1.NodeHostName, - Address: "node0.cloud.internal", - }, - { - Type: v1.NodeInternalIP, - Address: "10.0.0.1", - }, - { - Type: v1.NodeExternalIP, - Address: "132.143.154.163", - }, - }, - Provider: "gce", - Err: nil, - } - - clientset := fake.NewSimpleClientset(existingNode) - factory := informers.NewSharedInformerFactory(clientset, 0) - - eventBroadcaster := record.NewBroadcaster() - cloudNodeController := &CloudNodeController{ - kubeClient: clientset, - nodeInformer: factory.Core().V1().Nodes(), - nodesLister: factory.Core().V1().Nodes().Lister(), - cloud: fakeCloud, - recorder: eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cloud-node-controller"}), - nodeStatusUpdateFrequency: 1 * time.Second, - } - - stopCh := make(chan struct{}) - defer close(stopCh) - - factory.Start(stopCh) - factory.WaitForCacheSync(stopCh) - - w := eventBroadcaster.StartLogging(klog.Infof) - defer w.Stop() - - cloudNodeController.syncNode(context.TODO(), existingNode.Name) - - updatedNode, err := clientset.CoreV1().Nodes().Get(context.TODO(), existingNode.Name, metav1.GetOptions{}) - if err != nil { - t.Fatalf("error getting updated nodes: %v", err) - } - - conditionAdded := false - for _, cond := range updatedNode.Status.Conditions { - if cond.Status == "True" && cond.Type == "NetworkUnavailable" && cond.Reason == "NoRouteCreated" { - conditionAdded = true - } - } - - assert.True(t, conditionAdded, "Network Route Condition for GCE not added by external cloud initializer") -} - -// This test checks that a node with the external cloud provider taint is cloudprovider initialized and -// the GCE route condition is added if cloudprovider is GCE -func TestGCECondition(t *testing.T) { - existingNode := &v1.Node{ - ObjectMeta: metav1.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), - }, - }, - }, - Spec: v1.NodeSpec{ - Taints: []v1.Taint{ - { - Key: cloudproviderapi.TaintExternalCloudProvider, - Value: "true", - Effect: v1.TaintEffectNoSchedule, - }, - }, - }, - } - - fakeCloud := &fakecloud.Cloud{ - EnableInstancesV2: false, - InstanceTypes: map[types.NodeName]string{ - types.NodeName("node0"): "t1.micro", - }, - Addresses: []v1.NodeAddress{ - { - Type: v1.NodeHostName, - Address: "node0.cloud.internal", - }, - { - Type: v1.NodeInternalIP, - Address: "10.0.0.1", - }, - { - Type: v1.NodeExternalIP, - Address: "132.143.154.163", - }, - }, - Provider: "gce", - Err: nil, - } - - clientset := fake.NewSimpleClientset(existingNode) - factory := informers.NewSharedInformerFactory(clientset, 0) - - eventBroadcaster := record.NewBroadcaster() - cloudNodeController := &CloudNodeController{ - kubeClient: clientset, - nodeInformer: factory.Core().V1().Nodes(), - nodesLister: factory.Core().V1().Nodes().Lister(), - cloud: fakeCloud, - recorder: eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cloud-node-controller"}), - nodeStatusUpdateFrequency: 1 * time.Second, - } - - stopCh := make(chan struct{}) - defer close(stopCh) - - factory.Start(stopCh) - factory.WaitForCacheSync(stopCh) - - w := eventBroadcaster.StartLogging(klog.Infof) - defer w.Stop() - - cloudNodeController.syncNode(context.TODO(), existingNode.Name) - - updatedNode, err := clientset.CoreV1().Nodes().Get(context.TODO(), existingNode.Name, metav1.GetOptions{}) - if err != nil { - t.Fatalf("error getting updated nodes: %v", err) - } - - conditionAdded := false - for _, cond := range updatedNode.Status.Conditions { - if cond.Status == "True" && cond.Type == "NetworkUnavailable" && cond.Reason == "NoRouteCreated" { - conditionAdded = true - } - } - - assert.True(t, conditionAdded, "Network Route Condition for GCE not added by external cloud initializer") -} - func Test_reconcileNodeLabels(t *testing.T) { testcases := []struct { name string