@@ -1403,6 +1403,113 @@ foo 0/0 0 <unknown>
1403
1403
}
1404
1404
}
1405
1405
1406
+ func TestWatchResourceTable (t * testing.T ) {
1407
+ columns := []metav1beta1.TableColumnDefinition {
1408
+ {Name : "Name" , Type : "string" , Format : "name" , Description : "the name" , Priority : 0 },
1409
+ {Name : "Active" , Type : "boolean" , Description : "active" , Priority : 0 },
1410
+ }
1411
+
1412
+ listTable := & metav1beta1.Table {
1413
+ TypeMeta : metav1.TypeMeta {APIVersion : "meta.k8s.io/v1beta1" , Kind : "Table" },
1414
+ ColumnDefinitions : columns ,
1415
+ Rows : []metav1beta1.TableRow {
1416
+ {
1417
+ Cells : []interface {}{"a" , true },
1418
+ Object : runtime.RawExtension {
1419
+ Object : & corev1.Pod {
1420
+ TypeMeta : metav1.TypeMeta {APIVersion : "v1" , Kind : "Pod" },
1421
+ ObjectMeta : metav1.ObjectMeta {Name : "a" , Namespace : "test" , ResourceVersion : "10" },
1422
+ },
1423
+ },
1424
+ },
1425
+ {
1426
+ Cells : []interface {}{"b" , true },
1427
+ Object : runtime.RawExtension {
1428
+ Object : & corev1.Pod {
1429
+ TypeMeta : metav1.TypeMeta {APIVersion : "v1" , Kind : "Pod" },
1430
+ ObjectMeta : metav1.ObjectMeta {Name : "b" , Namespace : "test" , ResourceVersion : "20" },
1431
+ },
1432
+ },
1433
+ },
1434
+ },
1435
+ }
1436
+
1437
+ events := []watch.Event {
1438
+ {
1439
+ Type : watch .Added ,
1440
+ Object : & metav1beta1.Table {
1441
+ TypeMeta : metav1.TypeMeta {APIVersion : "meta.k8s.io/v1beta1" , Kind : "Table" },
1442
+ ColumnDefinitions : columns , // first event includes the columns
1443
+ Rows : []metav1beta1.TableRow {{
1444
+ Cells : []interface {}{"a" , false },
1445
+ Object : runtime.RawExtension {
1446
+ Object : & corev1.Pod {
1447
+ TypeMeta : metav1.TypeMeta {APIVersion : "v1" , Kind : "Pod" },
1448
+ ObjectMeta : metav1.ObjectMeta {Name : "a" , Namespace : "test" , ResourceVersion : "30" },
1449
+ },
1450
+ },
1451
+ }},
1452
+ },
1453
+ },
1454
+ {
1455
+ Type : watch .Deleted ,
1456
+ Object : & metav1beta1.Table {
1457
+ ColumnDefinitions : []metav1beta1.TableColumnDefinition {},
1458
+ Rows : []metav1beta1.TableRow {{
1459
+ Cells : []interface {}{"b" , false },
1460
+ Object : runtime.RawExtension {
1461
+ Object : & corev1.Pod {
1462
+ TypeMeta : metav1.TypeMeta {APIVersion : "v1" , Kind : "Pod" },
1463
+ ObjectMeta : metav1.ObjectMeta {Name : "b" , Namespace : "test" , ResourceVersion : "40" },
1464
+ },
1465
+ },
1466
+ }},
1467
+ },
1468
+ },
1469
+ }
1470
+
1471
+ tf := cmdtesting .NewTestFactory ().WithNamespace ("test" )
1472
+ defer tf .Cleanup ()
1473
+ codec := scheme .Codecs .LegacyCodec (scheme .Scheme .PrioritizedVersionsAllGroups ()... )
1474
+
1475
+ tf .UnstructuredClient = & fake.RESTClient {
1476
+ NegotiatedSerializer : resource .UnstructuredPlusDefaultContentConfig ().NegotiatedSerializer ,
1477
+ Client : fake .CreateHTTPClient (func (req * http.Request ) (* http.Response , error ) {
1478
+ switch req .URL .Path {
1479
+ case "/namespaces/test/pods" :
1480
+ if req .URL .Query ().Get ("watch" ) != "true" && req .URL .Query ().Get ("fieldSelector" ) == "" {
1481
+ return & http.Response {StatusCode : 200 , Header : cmdtesting .DefaultHeader (), Body : cmdtesting .ObjBody (codec , listTable )}, nil
1482
+ }
1483
+ if req .URL .Query ().Get ("watch" ) == "true" && req .URL .Query ().Get ("fieldSelector" ) == "" {
1484
+ return & http.Response {StatusCode : 200 , Header : cmdtesting .DefaultHeader (), Body : watchBody (codec , events )}, nil
1485
+ }
1486
+ t .Fatalf ("request url: %#v,and request: %#v" , req .URL , req )
1487
+ return nil , nil
1488
+ default :
1489
+ t .Fatalf ("request url: %#v,and request: %#v" , req .URL , req )
1490
+ return nil , nil
1491
+ }
1492
+ }),
1493
+ }
1494
+
1495
+ streams , _ , buf , _ := genericclioptions .NewTestIOStreams ()
1496
+ cmd := NewCmdGet ("kubectl" , tf , streams )
1497
+ cmd .SetOutput (buf )
1498
+
1499
+ cmd .Flags ().Set ("watch" , "true" )
1500
+ cmd .Run (cmd , []string {"pods" })
1501
+
1502
+ expected := `NAME ACTIVE
1503
+ a true
1504
+ b true
1505
+ a false
1506
+ b false
1507
+ `
1508
+ if e , a := expected , buf .String (); e != a {
1509
+ t .Errorf ("expected\n %v\n got\n %v" , e , a )
1510
+ }
1511
+ }
1512
+
1406
1513
func TestWatchResourceIdentifiedByFile (t * testing.T ) {
1407
1514
pods , events := watchTestData ()
1408
1515
@@ -1538,7 +1645,9 @@ func watchBody(codec runtime.Codec, events []watch.Event) io.ReadCloser {
1538
1645
buf := bytes .NewBuffer ([]byte {})
1539
1646
enc := restclientwatch .NewEncoder (streaming .NewEncoder (buf , codec ), codec )
1540
1647
for i := range events {
1541
- enc .Encode (& events [i ])
1648
+ if err := enc .Encode (& events [i ]); err != nil {
1649
+ panic (err )
1650
+ }
1542
1651
}
1543
1652
return json .Framer .NewFrameReader (ioutil .NopCloser (buf ))
1544
1653
}
0 commit comments