@@ -2373,6 +2373,17 @@ func TestValidateServiceCIDR(t *testing.T) {
2373
2373
},
2374
2374
},
2375
2375
},
2376
+ "bad-iprange-ipv6-bad-ipv4" : {
2377
+ expectedErrors : 2 ,
2378
+ ipRange : & networking.ServiceCIDR {
2379
+ ObjectMeta : metav1.ObjectMeta {
2380
+ Name : "test-name" ,
2381
+ },
2382
+ Spec : networking.ServiceCIDRSpec {
2383
+ CIDRs : []string {"192.168.007.0/24" , "MN00:1234::/64" },
2384
+ },
2385
+ },
2386
+ },
2376
2387
}
2377
2388
2378
2389
for name , testCase := range testCases {
@@ -2386,55 +2397,224 @@ func TestValidateServiceCIDR(t *testing.T) {
2386
2397
}
2387
2398
2388
2399
func TestValidateServiceCIDRUpdate (t * testing.T ) {
2389
- oldServiceCIDR := & networking.ServiceCIDR {
2400
+ oldServiceCIDRv4 := & networking.ServiceCIDR {
2401
+ ObjectMeta : metav1.ObjectMeta {
2402
+ Name : "mysvc-v4" ,
2403
+ ResourceVersion : "1" ,
2404
+ },
2405
+ Spec : networking.ServiceCIDRSpec {
2406
+ CIDRs : []string {"192.168.0.0/24" },
2407
+ },
2408
+ }
2409
+ oldServiceCIDRv6 := & networking.ServiceCIDR {
2390
2410
ObjectMeta : metav1.ObjectMeta {
2391
- Name : "mysvc" ,
2411
+ Name : "mysvc-v6" ,
2412
+ ResourceVersion : "1" ,
2413
+ },
2414
+ Spec : networking.ServiceCIDRSpec {
2415
+ CIDRs : []string {"fd00:1234::/64" },
2416
+ },
2417
+ }
2418
+ oldServiceCIDRDual := & networking.ServiceCIDR {
2419
+ ObjectMeta : metav1.ObjectMeta {
2420
+ Name : "mysvc-dual" ,
2392
2421
ResourceVersion : "1" ,
2393
2422
},
2394
2423
Spec : networking.ServiceCIDRSpec {
2395
2424
CIDRs : []string {"192.168.0.0/24" , "fd00:1234::/64" },
2396
2425
},
2397
2426
}
2398
2427
2428
+ // Define expected immutable field error for convenience
2429
+ cidrsPath := field .NewPath ("spec" ).Child ("cidrs" )
2430
+ cidr0Path := cidrsPath .Index (0 )
2431
+ cidr1Path := cidrsPath .Index (1 )
2432
+
2399
2433
testCases := []struct {
2400
- name string
2401
- svc func (svc * networking.ServiceCIDR ) * networking.ServiceCIDR
2402
- expectErr bool
2434
+ name string
2435
+ old * networking.ServiceCIDR
2436
+ new * networking.ServiceCIDR
2437
+ expectedErrs field.ErrorList
2403
2438
}{
2404
2439
{
2405
- name : "Successful update, no changes" ,
2406
- svc : func (svc * networking.ServiceCIDR ) * networking.ServiceCIDR {
2407
- out := svc .DeepCopy ()
2440
+ name : "Successful update, no changes (dual)" ,
2441
+ old : oldServiceCIDRDual ,
2442
+ new : oldServiceCIDRDual .DeepCopy (),
2443
+ },
2444
+ {
2445
+ name : "Successful update, no changes (v4)" ,
2446
+ old : oldServiceCIDRv4 ,
2447
+ new : oldServiceCIDRv4 .DeepCopy (),
2448
+ },
2449
+ {
2450
+ name : "Successful update, single IPv4 to dual stack upgrade" ,
2451
+ old : oldServiceCIDRv4 ,
2452
+ new : func () * networking.ServiceCIDR {
2453
+ out := oldServiceCIDRv4 .DeepCopy ()
2454
+ out .Spec .CIDRs = []string {"192.168.0.0/24" , "fd00:1234::/64" } // Add IPv6
2455
+ return out
2456
+ }(),
2457
+ },
2458
+ {
2459
+ name : "Successful update, single IPv6 to dual stack upgrade" ,
2460
+ old : oldServiceCIDRv6 ,
2461
+ new : func () * networking.ServiceCIDR {
2462
+ out := oldServiceCIDRv6 .DeepCopy ()
2463
+ out .Spec .CIDRs = []string {"fd00:1234::/64" , "192.168.0.0/24" } // Add IPv4
2408
2464
return out
2465
+ }(),
2466
+ },
2467
+ {
2468
+ name : "Failed update, change CIDRs (dual)" ,
2469
+ old : oldServiceCIDRDual ,
2470
+ new : func () * networking.ServiceCIDR {
2471
+ out := oldServiceCIDRDual .DeepCopy ()
2472
+ out .Spec .CIDRs = []string {"10.0.0.0/16" , "fd00:abcd::/64" }
2473
+ return out
2474
+ }(),
2475
+ expectedErrs : field.ErrorList {
2476
+ field .Invalid (cidr0Path , "10.0.0.0/16" , apimachineryvalidation .FieldImmutableErrorMsg ),
2477
+ field .Invalid (cidr1Path , "fd00:abcd::/64" , apimachineryvalidation .FieldImmutableErrorMsg ),
2409
2478
},
2410
- expectErr : false ,
2411
2479
},
2412
-
2413
2480
{
2414
- name : "Failed update, update spec.CIDRs single stack" ,
2415
- svc : func (svc * networking.ServiceCIDR ) * networking.ServiceCIDR {
2416
- out := svc .DeepCopy ()
2481
+ name : "Failed update, change CIDRs (single)" ,
2482
+ old : oldServiceCIDRv4 ,
2483
+ new : func () * networking.ServiceCIDR {
2484
+ out := oldServiceCIDRv4 .DeepCopy ()
2417
2485
out .Spec .CIDRs = []string {"10.0.0.0/16" }
2418
2486
return out
2419
- }, expectErr : true ,
2487
+ }(),
2488
+ expectedErrs : field.ErrorList {field .Invalid (cidr0Path , "10.0.0.0/16" , apimachineryvalidation .FieldImmutableErrorMsg )},
2420
2489
},
2421
2490
{
2422
- name : "Failed update, update spec.CIDRs dual stack" ,
2423
- svc : func (svc * networking.ServiceCIDR ) * networking.ServiceCIDR {
2424
- out := svc .DeepCopy ()
2425
- out .Spec .CIDRs = []string {"10.0.0.0/24" , "fd00:1234::/64" }
2491
+ name : "Failed update, single IPv4 to dual stack upgrade with primary change" ,
2492
+ old : oldServiceCIDRv4 ,
2493
+ new : func () * networking.ServiceCIDR {
2494
+ out := oldServiceCIDRv4 .DeepCopy ()
2495
+ // Change primary CIDR during upgrade
2496
+ out .Spec .CIDRs = []string {"10.0.0.0/16" , "fd00:1234::/64" }
2426
2497
return out
2427
- }, expectErr : true ,
2498
+ }(),
2499
+ expectedErrs : field.ErrorList {field .Invalid (cidr0Path , "10.0.0.0/16" , apimachineryvalidation .FieldImmutableErrorMsg )},
2500
+ },
2501
+ {
2502
+ name : "Failed update, single IPv6 to dual stack upgrade with primary change" ,
2503
+ old : oldServiceCIDRv6 ,
2504
+ new : func () * networking.ServiceCIDR {
2505
+ out := oldServiceCIDRv6 .DeepCopy ()
2506
+ // Change primary CIDR during upgrade
2507
+ out .Spec .CIDRs = []string {"fd00:abcd::/64" , "192.168.0.0/24" }
2508
+ return out
2509
+ }(),
2510
+ expectedErrs : field.ErrorList {field .Invalid (cidr0Path , "fd00:abcd::/64" , apimachineryvalidation .FieldImmutableErrorMsg )},
2511
+ },
2512
+ {
2513
+ name : "Failed update, dual stack downgrade to single" ,
2514
+ old : oldServiceCIDRDual ,
2515
+ new : func () * networking.ServiceCIDR {
2516
+ out := oldServiceCIDRDual .DeepCopy ()
2517
+ out .Spec .CIDRs = []string {"192.168.0.0/24" } // Remove IPv6
2518
+ return out
2519
+ }(),
2520
+ expectedErrs : field.ErrorList {field .Invalid (cidrsPath , []string {"192.168.0.0/24" }, apimachineryvalidation .FieldImmutableErrorMsg )},
2521
+ },
2522
+ {
2523
+ name : "Failed update, dual stack reorder" ,
2524
+ old : oldServiceCIDRDual ,
2525
+ new : func () * networking.ServiceCIDR {
2526
+ out := oldServiceCIDRDual .DeepCopy ()
2527
+ // Swap order
2528
+ out .Spec .CIDRs = []string {"fd00:1234::/64" , "192.168.0.0/24" }
2529
+ return out
2530
+ }(),
2531
+ expectedErrs : field.ErrorList {
2532
+ field .Invalid (cidr0Path , "fd00:1234::/64" , apimachineryvalidation .FieldImmutableErrorMsg ),
2533
+ field .Invalid (cidr1Path , "192.168.0.0/24" , apimachineryvalidation .FieldImmutableErrorMsg ),
2534
+ },
2535
+ },
2536
+ {
2537
+ name : "Failed update, add invalid CIDR during upgrade" ,
2538
+ old : oldServiceCIDRv4 ,
2539
+ new : func () * networking.ServiceCIDR {
2540
+ out := oldServiceCIDRv4 .DeepCopy ()
2541
+ out .Spec .CIDRs = []string {"192.168.0.0/24" , "invalid-cidr" }
2542
+ return out
2543
+ }(),
2544
+ expectedErrs : field.ErrorList {field .Invalid (cidrsPath .Index (1 ), "invalid-cidr" , "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)" )},
2545
+ },
2546
+ {
2547
+ name : "Failed update, add duplicate family CIDR during upgrade" ,
2548
+ old : oldServiceCIDRv4 ,
2549
+ new : func () * networking.ServiceCIDR {
2550
+ out := oldServiceCIDRv4 .DeepCopy ()
2551
+ out .Spec .CIDRs = []string {"192.168.0.0/24" , "10.0.0.0/16" }
2552
+ return out
2553
+ }(),
2554
+ expectedErrs : field.ErrorList {field .Invalid (cidrsPath , []string {"192.168.0.0/24" , "10.0.0.0/16" }, "may specify no more than one IP for each IP family, i.e 192.168.0.0/24 and 2001:db8::/64" )},
2555
+ },
2556
+ {
2557
+ name : "Failed update, dual stack remove one cidr" ,
2558
+ old : oldServiceCIDRDual ,
2559
+ new : func () * networking.ServiceCIDR {
2560
+ out := oldServiceCIDRDual .DeepCopy ()
2561
+ out .Spec .CIDRs = out .Spec .CIDRs [0 :1 ]
2562
+ return out
2563
+ }(),
2564
+ expectedErrs : field.ErrorList {
2565
+ field .Invalid (cidrsPath , []string {"192.168.0.0/24" }, apimachineryvalidation .FieldImmutableErrorMsg ),
2566
+ },
2567
+ },
2568
+ {
2569
+ name : "Failed update, dual stack remove all cidrs" ,
2570
+ old : oldServiceCIDRDual ,
2571
+ new : func () * networking.ServiceCIDR {
2572
+ out := oldServiceCIDRDual .DeepCopy ()
2573
+ out .Spec .CIDRs = []string {}
2574
+ return out
2575
+ }(),
2576
+ expectedErrs : field.ErrorList {
2577
+ field .Invalid (cidrsPath , []string {}, apimachineryvalidation .FieldImmutableErrorMsg ),
2578
+ },
2579
+ },
2580
+ {
2581
+ name : "Failed update, single stack remove cidr" ,
2582
+ old : oldServiceCIDRv4 ,
2583
+ new : func () * networking.ServiceCIDR {
2584
+ out := oldServiceCIDRv4 .DeepCopy ()
2585
+ out .Spec .CIDRs = []string {}
2586
+ return out
2587
+ }(),
2588
+ expectedErrs : field.ErrorList {
2589
+ field .Invalid (cidrsPath , []string {}, apimachineryvalidation .FieldImmutableErrorMsg ),
2590
+ },
2591
+ },
2592
+ {
2593
+ name : "Failed update, add additional cidrs" ,
2594
+ old : oldServiceCIDRDual ,
2595
+ new : func () * networking.ServiceCIDR {
2596
+ out := oldServiceCIDRDual .DeepCopy ()
2597
+ out .Spec .CIDRs = append (out .Spec .CIDRs , "172.16.0.0/24" )
2598
+ return out
2599
+ }(),
2600
+ expectedErrs : field.ErrorList {
2601
+ field .Invalid (cidrsPath , []string {"192.168.0.0/24" , "fd00:1234::/64" , "172.16.0.0/24" }, apimachineryvalidation .FieldImmutableErrorMsg ),
2602
+ },
2428
2603
},
2429
2604
}
2430
- for _ , testCase := range testCases {
2431
- t .Run (testCase .name , func (t * testing.T ) {
2432
- err := ValidateServiceCIDRUpdate (testCase .svc (oldServiceCIDR ), oldServiceCIDR )
2433
- if ! testCase .expectErr && err != nil {
2434
- t .Errorf ("ValidateServiceCIDRUpdate must be successful for test '%s', got %v" , testCase .name , err )
2605
+ for _ , tc := range testCases {
2606
+ t .Run (tc .name , func (t * testing.T ) {
2607
+ // Ensure ResourceVersion is set for update validation
2608
+ tc .new .ResourceVersion = tc .old .ResourceVersion
2609
+ errs := ValidateServiceCIDRUpdate (tc .new , tc .old )
2610
+
2611
+ if len (errs ) != len (tc .expectedErrs ) {
2612
+ t .Fatalf ("Expected %d errors, got %d errors: %v" , len (tc .expectedErrs ), len (errs ), errs )
2435
2613
}
2436
- if testCase .expectErr && err == nil {
2437
- t .Errorf ("ValidateServiceCIDRUpdate must return error for test: %s, but got nil" , testCase .name )
2614
+ for i , expectedErr := range tc .expectedErrs {
2615
+ if errs [i ].Error () != expectedErr .Error () {
2616
+ t .Errorf ("Expected error %d: %v, got: %v" , i , expectedErr , errs [i ])
2617
+ }
2438
2618
}
2439
2619
})
2440
2620
}
0 commit comments