@@ -45,13 +45,17 @@ import (
45
45
"k8s.io/apimachinery/pkg/util/rand"
46
46
"k8s.io/apimachinery/pkg/util/strategicpatch"
47
47
"k8s.io/apimachinery/pkg/util/uuid"
48
+ utilversion "k8s.io/apimachinery/pkg/util/version"
48
49
"k8s.io/apimachinery/pkg/util/wait"
50
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
49
51
clientset "k8s.io/client-go/kubernetes"
50
52
"k8s.io/client-go/kubernetes/fake"
51
53
"k8s.io/client-go/rest"
52
54
core "k8s.io/client-go/testing"
55
+ featuregatetesting "k8s.io/component-base/featuregate/testing"
53
56
"k8s.io/component-base/version"
54
57
kubeletapis "k8s.io/kubelet/pkg/apis"
58
+ "k8s.io/kubernetes/pkg/features"
55
59
cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing"
56
60
"k8s.io/kubernetes/pkg/kubelet/cm"
57
61
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
@@ -1386,6 +1390,10 @@ func TestTryRegisterWithApiServer(t *testing.T) {
1386
1390
ErrStatus : metav1.Status {Reason : metav1 .StatusReasonConflict },
1387
1391
}
1388
1392
1393
+ forbidden := & apierrors.StatusError {
1394
+ ErrStatus : metav1.Status {Reason : metav1 .StatusReasonForbidden },
1395
+ }
1396
+
1389
1397
newNode := func (cmad bool ) * v1.Node {
1390
1398
node := & v1.Node {
1391
1399
ObjectMeta : metav1.ObjectMeta {
@@ -1408,18 +1416,19 @@ func TestTryRegisterWithApiServer(t *testing.T) {
1408
1416
}
1409
1417
1410
1418
cases := []struct {
1411
- name string
1412
- newNode * v1.Node
1413
- existingNode * v1.Node
1414
- createError error
1415
- getError error
1416
- patchError error
1417
- deleteError error
1418
- expectedResult bool
1419
- expectedActions int
1420
- testSavedNode bool
1421
- savedNodeIndex int
1422
- savedNodeCMAD bool
1419
+ name string
1420
+ newNode * v1.Node
1421
+ existingNode * v1.Node
1422
+ createError error
1423
+ getError error
1424
+ patchError error
1425
+ deleteError error
1426
+ expectedResult bool
1427
+ expectedActions int
1428
+ testSavedNode bool
1429
+ getOnForbiddenDisabled bool
1430
+ savedNodeIndex int
1431
+ savedNodeCMAD bool
1423
1432
}{
1424
1433
{
1425
1434
name : "success case - new node" ,
@@ -1435,6 +1444,25 @@ func TestTryRegisterWithApiServer(t *testing.T) {
1435
1444
expectedResult : true ,
1436
1445
expectedActions : 2 ,
1437
1446
},
1447
+ {
1448
+ name : "success case - existing node - create forbidden - no change in CMAD" ,
1449
+ newNode : newNode (true ),
1450
+ createError : forbidden ,
1451
+ existingNode : newNode (true ),
1452
+ expectedResult : true ,
1453
+ expectedActions : 2 ,
1454
+ },
1455
+ {
1456
+ name : "success case - existing node - create forbidden - CMAD disabled" ,
1457
+ newNode : newNode (false ),
1458
+ createError : forbidden ,
1459
+ existingNode : newNode (true ),
1460
+ expectedResult : true ,
1461
+ expectedActions : 3 ,
1462
+ testSavedNode : true ,
1463
+ savedNodeIndex : 2 ,
1464
+ savedNodeCMAD : false ,
1465
+ },
1438
1466
{
1439
1467
name : "success case - existing node - CMAD disabled" ,
1440
1468
newNode : newNode (false ),
@@ -1464,6 +1492,14 @@ func TestTryRegisterWithApiServer(t *testing.T) {
1464
1492
expectedResult : false ,
1465
1493
expectedActions : 1 ,
1466
1494
},
1495
+ {
1496
+ name : "create failed with forbidden - get-on-forbidden feature is disabled" ,
1497
+ newNode : newNode (false ),
1498
+ getOnForbiddenDisabled : true ,
1499
+ createError : forbidden ,
1500
+ expectedResult : false ,
1501
+ expectedActions : 1 ,
1502
+ },
1467
1503
{
1468
1504
name : "get existing node failed" ,
1469
1505
newNode : newNode (false ),
@@ -1484,55 +1520,61 @@ func TestTryRegisterWithApiServer(t *testing.T) {
1484
1520
}
1485
1521
1486
1522
for _ , tc := range cases {
1487
- testKubelet := newTestKubelet (t , false /* controllerAttachDetachEnabled is a don't-care for this test */ )
1488
- defer testKubelet .Cleanup ()
1489
- kubelet := testKubelet .kubelet
1490
- kubeClient := testKubelet .fakeKubeClient
1491
-
1492
- kubeClient .AddReactor ("create" , "nodes" , func (action core.Action ) (bool , runtime.Object , error ) {
1493
- return true , nil , tc .createError
1494
- })
1495
- kubeClient .AddReactor ("get" , "nodes" , func (action core.Action ) (bool , runtime.Object , error ) {
1496
- // Return an existing (matching) node on get.
1497
- return true , tc .existingNode , tc .getError
1498
- })
1499
- kubeClient .AddReactor ("patch" , "nodes" , func (action core.Action ) (bool , runtime.Object , error ) {
1500
- if action .GetSubresource () == "status" {
1501
- return true , nil , tc .patchError
1523
+ t .Run (tc .name , func (t * testing.T ) {
1524
+ if tc .getOnForbiddenDisabled {
1525
+ featuregatetesting .SetFeatureGateEmulationVersionDuringTest (t , utilfeature .DefaultFeatureGate , utilversion .MustParse ("1.32" ))
1526
+ featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .KubeletRegistrationGetOnExistsOnly , true )
1502
1527
}
1503
- return notImplemented (action )
1504
- })
1505
- kubeClient .AddReactor ("delete" , "nodes" , func (action core.Action ) (bool , runtime.Object , error ) {
1506
- return true , nil , tc .deleteError
1507
- })
1508
- addNotImplatedReaction (kubeClient )
1528
+ testKubelet := newTestKubelet (t , false /* controllerAttachDetachEnabled is a don't-care for this test */ )
1529
+ defer testKubelet .Cleanup ()
1530
+ kubelet := testKubelet .kubelet
1531
+ kubeClient := testKubelet .fakeKubeClient
1509
1532
1510
- result := kubelet .tryRegisterWithAPIServer (tc .newNode )
1511
- require .Equal (t , tc .expectedResult , result , "test [%s]" , tc .name )
1533
+ kubeClient .AddReactor ("create" , "nodes" , func (action core.Action ) (bool , runtime.Object , error ) {
1534
+ return true , nil , tc .createError
1535
+ })
1536
+ kubeClient .AddReactor ("get" , "nodes" , func (action core.Action ) (bool , runtime.Object , error ) {
1537
+ // Return an existing (matching) node on get.
1538
+ return true , tc .existingNode , tc .getError
1539
+ })
1540
+ kubeClient .AddReactor ("patch" , "nodes" , func (action core.Action ) (bool , runtime.Object , error ) {
1541
+ if action .GetSubresource () == "status" {
1542
+ return true , nil , tc .patchError
1543
+ }
1544
+ return notImplemented (action )
1545
+ })
1546
+ kubeClient .AddReactor ("delete" , "nodes" , func (action core.Action ) (bool , runtime.Object , error ) {
1547
+ return true , nil , tc .deleteError
1548
+ })
1549
+ addNotImplatedReaction (kubeClient )
1512
1550
1513
- actions := kubeClient .Actions ()
1514
- assert .Len (t , actions , tc .expectedActions , "test [%s]" , tc .name )
1515
-
1516
- if tc .testSavedNode {
1517
- var savedNode * v1.Node
1518
-
1519
- t .Logf ("actions: %v: %+v" , len (actions ), actions )
1520
- action := actions [tc .savedNodeIndex ]
1521
- if action .GetVerb () == "create" {
1522
- createAction := action .(core.CreateAction )
1523
- obj := createAction .GetObject ()
1524
- require .IsType (t , & v1.Node {}, obj )
1525
- savedNode = obj .(* v1.Node )
1526
- } else if action .GetVerb () == "patch" {
1527
- patchAction := action .(core.PatchActionImpl )
1528
- var err error
1529
- savedNode , err = applyNodeStatusPatch (tc .existingNode , patchAction .GetPatch ())
1530
- require .NoError (t , err )
1531
- }
1551
+ result := kubelet .tryRegisterWithAPIServer (tc .newNode )
1552
+ require .Equal (t , tc .expectedResult , result , "test [%s]" , tc .name )
1532
1553
1533
- actualCMAD , _ := strconv .ParseBool (savedNode .Annotations [util .ControllerManagedAttachAnnotation ])
1534
- assert .Equal (t , tc .savedNodeCMAD , actualCMAD , "test [%s]" , tc .name )
1535
- }
1554
+ actions := kubeClient .Actions ()
1555
+ assert .Len (t , actions , tc .expectedActions , "test [%s]" , tc .name )
1556
+
1557
+ if tc .testSavedNode {
1558
+ var savedNode * v1.Node
1559
+
1560
+ t .Logf ("actions: %v: %+v" , len (actions ), actions )
1561
+ action := actions [tc .savedNodeIndex ]
1562
+ if action .GetVerb () == "create" {
1563
+ createAction := action .(core.CreateAction )
1564
+ obj := createAction .GetObject ()
1565
+ require .IsType (t , & v1.Node {}, obj )
1566
+ savedNode = obj .(* v1.Node )
1567
+ } else if action .GetVerb () == "patch" {
1568
+ patchAction := action .(core.PatchActionImpl )
1569
+ var err error
1570
+ savedNode , err = applyNodeStatusPatch (tc .existingNode , patchAction .GetPatch ())
1571
+ require .NoError (t , err )
1572
+ }
1573
+
1574
+ actualCMAD , _ := strconv .ParseBool (savedNode .Annotations [util .ControllerManagedAttachAnnotation ])
1575
+ assert .Equal (t , tc .savedNodeCMAD , actualCMAD , "test [%s]" , tc .name )
1576
+ }
1577
+ })
1536
1578
}
1537
1579
}
1538
1580
0 commit comments