@@ -21,6 +21,7 @@ import (
21
21
"fmt"
22
22
"testing"
23
23
24
+ "github.com/IBM-Cloud/power-go-client/power/models"
24
25
"github.com/IBM/go-sdk-core/v5/core"
25
26
"github.com/IBM/platform-services-go-sdk/resourcecontrollerv2"
26
27
"github.com/IBM/vpc-go-sdk/vpcv1"
@@ -30,6 +31,7 @@ import (
30
31
"k8s.io/utils/ptr"
31
32
32
33
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
34
+ mockP "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs/mock"
33
35
capiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
34
36
35
37
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/utils"
@@ -2222,3 +2224,326 @@ func TestCheckVPC(t *testing.T) {
2222
2224
g .Expect (vpcID ).To (Equal ("" ))
2223
2225
})
2224
2226
}
2227
+
2228
+ func TestIsDHCPServerActive (t * testing.T ) {
2229
+ var (
2230
+ mockPowerVS * mockP.MockPowerVS
2231
+ mockCtrl * gomock.Controller
2232
+ )
2233
+
2234
+ setup := func (t * testing.T ) {
2235
+ t .Helper ()
2236
+ mockCtrl = gomock .NewController (t )
2237
+ mockPowerVS = mockP .NewMockPowerVS (mockCtrl )
2238
+ }
2239
+ teardown := func () {
2240
+ mockCtrl .Finish ()
2241
+ }
2242
+
2243
+ t .Run ("When GetDHCPServer returns error" , func (t * testing.T ) {
2244
+ g := NewWithT (t )
2245
+ setup (t )
2246
+ t .Cleanup (teardown )
2247
+ clusterScope := PowerVSClusterScope {
2248
+ IBMPowerVSClient : mockPowerVS ,
2249
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Status : infrav1beta2.IBMPowerVSClusterStatus {DHCPServer : & infrav1beta2.ResourceReference {ID : ptr .To ("dhcpID" )}}},
2250
+ }
2251
+ mockPowerVS .EXPECT ().GetDHCPServer (gomock .Any ()).Return (nil , fmt .Errorf ("GetDHCPServer returns error" ))
2252
+ isActive , err := clusterScope .isDHCPServerActive ()
2253
+ g .Expect (err ).ToNot (BeNil ())
2254
+ g .Expect (isActive ).To (BeFalse ())
2255
+ })
2256
+ t .Run ("When checkDHCPServerStatus returns error state" , func (t * testing.T ) {
2257
+ g := NewWithT (t )
2258
+ setup (t )
2259
+ t .Cleanup (teardown )
2260
+
2261
+ dhcpServer := & models.DHCPServerDetail {ID : ptr .To ("dhcpID" ), Status : ptr .To (string (infrav1beta2 .DHCPServerStateError ))}
2262
+ clusterScope := PowerVSClusterScope {
2263
+ IBMPowerVSClient : mockPowerVS ,
2264
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Status : infrav1beta2.IBMPowerVSClusterStatus {DHCPServer : & infrav1beta2.ResourceReference {ID : ptr .To ("dhcpID" )}}},
2265
+ }
2266
+ mockPowerVS .EXPECT ().GetDHCPServer (gomock .Any ()).Return (dhcpServer , nil )
2267
+
2268
+ isActive , err := clusterScope .isDHCPServerActive ()
2269
+ g .Expect (err ).ToNot (BeNil ())
2270
+ g .Expect (isActive ).To (BeFalse ())
2271
+ })
2272
+ t .Run ("When checkDHCPServerStatus returns active state" , func (t * testing.T ) {
2273
+ g := NewWithT (t )
2274
+ setup (t )
2275
+ t .Cleanup (teardown )
2276
+
2277
+ dhcpServer := & models.DHCPServerDetail {ID : ptr .To ("dhcpID" ), Status : ptr .To (string (infrav1beta2 .DHCPServerStateActive ))}
2278
+ clusterScope := PowerVSClusterScope {
2279
+ IBMPowerVSClient : mockPowerVS ,
2280
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Status : infrav1beta2.IBMPowerVSClusterStatus {DHCPServer : & infrav1beta2.ResourceReference {ID : ptr .To ("dhcpID" )}}},
2281
+ }
2282
+ mockPowerVS .EXPECT ().GetDHCPServer (gomock .Any ()).Return (dhcpServer , nil )
2283
+
2284
+ isActive , err := clusterScope .isDHCPServerActive ()
2285
+ g .Expect (err ).To (BeNil ())
2286
+ g .Expect (isActive ).To (BeTrue ())
2287
+ })
2288
+ }
2289
+
2290
+ func TestCheckDHCPServerStatus (t * testing.T ) {
2291
+ testCases := []struct {
2292
+ name string
2293
+ dhcpServer models.DHCPServerDetail
2294
+ expectedStatus bool
2295
+ }{
2296
+ {
2297
+ name : "DHCP server is in build state" ,
2298
+ dhcpServer : models.DHCPServerDetail {ID : ptr .To ("dhcpIDBuild" ), Status : ptr .To (string (infrav1beta2 .DHCPServerStateBuild ))},
2299
+ expectedStatus : false ,
2300
+ },
2301
+ {
2302
+ name : "DHCP server is in active state" ,
2303
+ dhcpServer : models.DHCPServerDetail {ID : ptr .To ("dhcpIDActive" ), Status : ptr .To (string (infrav1beta2 .DHCPServerStateActive ))},
2304
+ expectedStatus : true ,
2305
+ },
2306
+ {
2307
+ name : "DHCP server is in error state" ,
2308
+ dhcpServer : models.DHCPServerDetail {ID : ptr .To ("dhcpIDError" ), Status : ptr .To (string (infrav1beta2 .DHCPServerStateError ))},
2309
+ expectedStatus : false ,
2310
+ },
2311
+ {
2312
+ name : "DHCP server is in invalid state" ,
2313
+ dhcpServer : models.DHCPServerDetail {ID : ptr .To ("dhcpIDError" ), Status : ptr .To ("InvalidState" )},
2314
+ expectedStatus : false ,
2315
+ },
2316
+ }
2317
+ for _ , tc := range testCases {
2318
+ g := NewWithT (t )
2319
+ clusterScope := PowerVSClusterScope {}
2320
+ t .Run (tc .name , func (_ * testing.T ) {
2321
+ status , _ := clusterScope .checkDHCPServerStatus (tc .dhcpServer )
2322
+ g .Expect (status ).To (Equal (tc .expectedStatus ))
2323
+ })
2324
+ }
2325
+ }
2326
+
2327
+ func TestCreateDHCPServer (t * testing.T ) {
2328
+ var (
2329
+ mockPowerVS * mockP.MockPowerVS
2330
+ mockCtrl * gomock.Controller
2331
+ clusterName = "clusterName"
2332
+ )
2333
+
2334
+ setup := func (t * testing.T ) {
2335
+ t .Helper ()
2336
+ mockCtrl = gomock .NewController (t )
2337
+ mockPowerVS = mockP .NewMockPowerVS (mockCtrl )
2338
+ }
2339
+ teardown := func () {
2340
+ mockCtrl .Finish ()
2341
+ }
2342
+
2343
+ t .Run ("When dhcpServerDetails is empty" , func (t * testing.T ) {
2344
+ g := NewWithT (t )
2345
+ setup (t )
2346
+ t .Cleanup (teardown )
2347
+
2348
+ dhcpNetwork := & models.DHCPServerNetwork {ID : ptr .To ("dhcpNetworkID" )}
2349
+ dhcpServer := & models.DHCPServer {ID : ptr .To ("dhcpID" ), Network : dhcpNetwork }
2350
+ clusterScope := PowerVSClusterScope {
2351
+ IBMPowerVSClient : mockPowerVS ,
2352
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {ObjectMeta : metav1.ObjectMeta {Name : clusterName }},
2353
+ }
2354
+ mockPowerVS .EXPECT ().CreateDHCPServer (gomock .Any ()).Return (dhcpServer , nil )
2355
+ dhcpID , err := clusterScope .createDHCPServer ()
2356
+ g .Expect (dhcpID ).To (Equal (dhcpServer .ID ))
2357
+ g .Expect (err ).To (BeNil ())
2358
+ g .Expect (clusterScope .IBMPowerVSCluster .Status .Network .ID ).To (Equal (dhcpNetwork .ID ))
2359
+ })
2360
+
2361
+ t .Run ("When dhcpServerDetails are all set but createDHCPServer returns server with no network" , func (t * testing.T ) {
2362
+ g := NewWithT (t )
2363
+ setup (t )
2364
+ t .Cleanup (teardown )
2365
+
2366
+ dhcpServer := & models.DHCPServer {ID : ptr .To ("dhcpID" )}
2367
+ clusterScope := PowerVSClusterScope {
2368
+ IBMPowerVSClient : mockPowerVS ,
2369
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {
2370
+ ObjectMeta : metav1.ObjectMeta {Name : clusterName },
2371
+ Spec : infrav1beta2.IBMPowerVSClusterSpec {DHCPServer : & infrav1beta2.DHCPServer {
2372
+ ID : ptr .To ("dhcpID" ),
2373
+ DNSServer : ptr .To ("DNSServer" ),
2374
+ Cidr : ptr .To ("10.10.1.10/24" ),
2375
+ Snat : ptr .To (true ),
2376
+ }},
2377
+ },
2378
+ }
2379
+ mockPowerVS .EXPECT ().CreateDHCPServer (gomock .Any ()).Return (dhcpServer , nil )
2380
+ dhcpID , err := clusterScope .createDHCPServer ()
2381
+ g .Expect (dhcpID ).To (BeNil ())
2382
+ g .Expect (err ).ToNot (BeNil ())
2383
+ })
2384
+
2385
+ t .Run ("When dhcpServerDetails has no dnsserver,cidr or snat set" , func (t * testing.T ) {
2386
+ g := NewWithT (t )
2387
+ setup (t )
2388
+ t .Cleanup (teardown )
2389
+
2390
+ dhcpNetwork := & models.DHCPServerNetwork {ID : ptr .To ("dhcpNetworkID" )}
2391
+ dhcpServer := & models.DHCPServer {ID : ptr .To ("dhcpID" ), Network : dhcpNetwork }
2392
+ clusterScope := PowerVSClusterScope {
2393
+ IBMPowerVSClient : mockPowerVS ,
2394
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {ObjectMeta : metav1.ObjectMeta {Name : clusterName }},
2395
+ }
2396
+ mockPowerVS .EXPECT ().CreateDHCPServer (gomock .Any ()).Return (dhcpServer , nil )
2397
+ dhcpID , err := clusterScope .createDHCPServer ()
2398
+ g .Expect (dhcpID ).To (Equal (dhcpServer .ID ))
2399
+ g .Expect (err ).To (BeNil ())
2400
+ g .Expect (clusterScope .IBMPowerVSCluster .Status .Network .ID ).To (Equal (dhcpNetwork .ID ))
2401
+ })
2402
+
2403
+ t .Run ("When CreateDHCPServer returns empty dhcp server" , func (t * testing.T ) {
2404
+ g := NewWithT (t )
2405
+ setup (t )
2406
+ t .Cleanup (teardown )
2407
+
2408
+ clusterScope := PowerVSClusterScope {
2409
+ IBMPowerVSClient : mockPowerVS ,
2410
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {ObjectMeta : metav1.ObjectMeta {Name : clusterName }},
2411
+ }
2412
+ mockPowerVS .EXPECT ().CreateDHCPServer (gomock .Any ()).Return (nil , nil )
2413
+ dhcpID , err := clusterScope .createDHCPServer ()
2414
+ g .Expect (dhcpID ).To (BeNil ())
2415
+ g .Expect (err ).ToNot (BeNil ())
2416
+ })
2417
+
2418
+ t .Run ("When CreateDHCPServer returns error" , func (t * testing.T ) {
2419
+ g := NewWithT (t )
2420
+ setup (t )
2421
+ t .Cleanup (teardown )
2422
+
2423
+ clusterScope := PowerVSClusterScope {
2424
+ IBMPowerVSClient : mockPowerVS ,
2425
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {ObjectMeta : metav1.ObjectMeta {Name : clusterName }},
2426
+ }
2427
+ mockPowerVS .EXPECT ().CreateDHCPServer (gomock .Any ()).Return (nil , fmt .Errorf ("CreateDHCPServer returns error" ))
2428
+ dhcpID , err := clusterScope .createDHCPServer ()
2429
+ g .Expect (dhcpID ).To (BeNil ())
2430
+ g .Expect (err ).ToNot (BeNil ())
2431
+ })
2432
+ }
2433
+
2434
+ func TestReconcileNetwork (t * testing.T ) {
2435
+ var (
2436
+ mockPowerVS * mockP.MockPowerVS
2437
+ mockCtrl * gomock.Controller
2438
+ )
2439
+
2440
+ setup := func (t * testing.T ) {
2441
+ t .Helper ()
2442
+ mockCtrl = gomock .NewController (t )
2443
+ mockPowerVS = mockP .NewMockPowerVS (mockCtrl )
2444
+ }
2445
+ teardown := func () {
2446
+ mockCtrl .Finish ()
2447
+ }
2448
+ t .Run ("When GetDHCPServer returns error" , func (t * testing.T ) {
2449
+ g := NewWithT (t )
2450
+ setup (t )
2451
+ t .Cleanup (teardown )
2452
+
2453
+ clusterScope := PowerVSClusterScope {
2454
+ IBMPowerVSClient : mockPowerVS ,
2455
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Status : infrav1beta2.IBMPowerVSClusterStatus {DHCPServer : & infrav1beta2.ResourceReference {ID : ptr .To ("dhcpID" )}}},
2456
+ }
2457
+ mockPowerVS .EXPECT ().GetDHCPServer (gomock .Any ()).Return (nil , fmt .Errorf ("GetDHCPServer error" ))
2458
+
2459
+ requeue , err := clusterScope .ReconcileNetwork ()
2460
+ g .Expect (err ).ToNot (BeNil ())
2461
+ g .Expect (requeue ).To (BeFalse ())
2462
+ })
2463
+ t .Run ("When DHCPServer exists and is active" , func (t * testing.T ) {
2464
+ g := NewWithT (t )
2465
+ setup (t )
2466
+ t .Cleanup (teardown )
2467
+
2468
+ clusterScope := PowerVSClusterScope {
2469
+ IBMPowerVSClient : mockPowerVS ,
2470
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Status : infrav1beta2.IBMPowerVSClusterStatus {DHCPServer : & infrav1beta2.ResourceReference {ID : ptr .To ("dhcpID" )}}},
2471
+ }
2472
+
2473
+ dhcpServer := & models.DHCPServerDetail {ID : ptr .To ("dhcpID" ), Status : ptr .To (string (infrav1beta2 .DHCPServerStateActive ))}
2474
+ mockPowerVS .EXPECT ().GetDHCPServer (gomock .Any ()).Return (dhcpServer , nil )
2475
+
2476
+ requeue , err := clusterScope .ReconcileNetwork ()
2477
+ g .Expect (err ).To (BeNil ())
2478
+ g .Expect (requeue ).To (BeTrue ())
2479
+ })
2480
+ t .Run ("When DHCPID is empty and GetNetworkByID returns error " , func (t * testing.T ) {
2481
+ g := NewWithT (t )
2482
+ setup (t )
2483
+ t .Cleanup (teardown )
2484
+
2485
+ clusterScope := PowerVSClusterScope {
2486
+ IBMPowerVSClient : mockPowerVS ,
2487
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Spec : infrav1beta2.IBMPowerVSClusterSpec {
2488
+ Network : infrav1beta2.IBMPowerVSResourceReference {ID : ptr .To ("networkID" )}}},
2489
+ }
2490
+ network := & models.Network {}
2491
+ mockPowerVS .EXPECT ().GetNetworkByID (gomock .Any ()).Return (network , fmt .Errorf ("GetNetworkByID error" ))
2492
+
2493
+ requeue , err := clusterScope .ReconcileNetwork ()
2494
+ g .Expect (err ).ToNot (BeNil ())
2495
+ g .Expect (requeue ).To (BeFalse ())
2496
+ })
2497
+ t .Run ("When DHCPID is empty and networkID is not empty" , func (t * testing.T ) {
2498
+ g := NewWithT (t )
2499
+ setup (t )
2500
+ t .Cleanup (teardown )
2501
+ network := & models.Network {NetworkID : ptr .To ("networkID" )}
2502
+ clusterScope := PowerVSClusterScope {
2503
+ IBMPowerVSClient : mockPowerVS ,
2504
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Spec : infrav1beta2.IBMPowerVSClusterSpec {
2505
+ Network : infrav1beta2.IBMPowerVSResourceReference {ID : ptr .To ("networkID" )}}},
2506
+ }
2507
+ mockPowerVS .EXPECT ().GetNetworkByID (gomock .Any ()).Return (network , nil )
2508
+ requeue , err := clusterScope .ReconcileNetwork ()
2509
+ g .Expect (clusterScope .IBMPowerVSCluster .Status .Network .ID ).To (Equal (network .NetworkID ))
2510
+ g .Expect (err ).To (BeNil ())
2511
+ g .Expect (requeue ).To (BeTrue ())
2512
+ })
2513
+ t .Run ("When network name is set in spec and DHCP server is created successfully" , func (t * testing.T ) {
2514
+ g := NewWithT (t )
2515
+ setup (t )
2516
+ t .Cleanup (teardown )
2517
+
2518
+ dhcpNetwork := & models.DHCPServerNetwork {ID : ptr .To ("dhcpNetworkID" )}
2519
+ dhcpServer := & models.DHCPServer {ID : ptr .To ("dhcpID" ), Network : dhcpNetwork }
2520
+ clusterScope := PowerVSClusterScope {
2521
+ IBMPowerVSClient : mockPowerVS ,
2522
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Spec : infrav1beta2.IBMPowerVSClusterSpec {
2523
+ Network : infrav1beta2.IBMPowerVSResourceReference {Name : ptr .To ("networkName" )}}},
2524
+ }
2525
+ mockPowerVS .EXPECT ().GetNetworkByName (gomock .Any ()).Return (nil , nil )
2526
+ mockPowerVS .EXPECT ().CreateDHCPServer (gomock .Any ()).Return (dhcpServer , nil )
2527
+ requeue , err := clusterScope .ReconcileNetwork ()
2528
+ g .Expect (clusterScope .IBMPowerVSCluster .Status .DHCPServer .ID ).To (Equal (dhcpServer .ID ))
2529
+ g .Expect (clusterScope .IBMPowerVSCluster .Status .Network .ID ).To (Equal (dhcpNetwork .ID ))
2530
+ g .Expect (err ).To (BeNil ())
2531
+ g .Expect (requeue ).To (BeFalse ())
2532
+ })
2533
+ t .Run ("When network name is set in spec and createDHCPServer returns error" , func (t * testing.T ) {
2534
+ g := NewWithT (t )
2535
+ setup (t )
2536
+ t .Cleanup (teardown )
2537
+
2538
+ clusterScope := PowerVSClusterScope {
2539
+ IBMPowerVSClient : mockPowerVS ,
2540
+ IBMPowerVSCluster : & infrav1beta2.IBMPowerVSCluster {Spec : infrav1beta2.IBMPowerVSClusterSpec {
2541
+ Network : infrav1beta2.IBMPowerVSResourceReference {Name : ptr .To ("networkName" )}}},
2542
+ }
2543
+ mockPowerVS .EXPECT ().GetNetworkByName (gomock .Any ()).Return (nil , nil )
2544
+ mockPowerVS .EXPECT ().CreateDHCPServer (gomock .Any ()).Return (nil , fmt .Errorf ("CreateDHCPServer error" ))
2545
+ requeue , err := clusterScope .ReconcileNetwork ()
2546
+ g .Expect (err ).ToNot (BeNil ())
2547
+ g .Expect (requeue ).To (BeFalse ())
2548
+ })
2549
+ }
0 commit comments