Skip to content

Commit 03f5c5a

Browse files
authored
Added UT for reconcilePowerVSResources function (#2032)
1 parent 2409ff0 commit 03f5c5a

File tree

1 file changed

+165
-9
lines changed

1 file changed

+165
-9
lines changed

controllers/ibmpowervscluster_controller_test.go

Lines changed: 165 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,16 +1146,159 @@ func TestReconcileVPCResources(t *testing.T) {
11461146
}
11471147
}
11481148

1149-
func getServiceInstanceReadyCondition() capiv1beta1.Condition {
1150-
return capiv1beta1.Condition{
1151-
Type: infrav1beta2.ServiceInstanceReadyCondition,
1152-
Status: "True",
1149+
func TestReconcilePowerVSResources(t *testing.T) {
1150+
testCases := []struct {
1151+
name string
1152+
powerVSClusterScopeFunc func() *scope.PowerVSClusterScope
1153+
reconcileResult reconcileResult
1154+
conditions capiv1beta1.Conditions
1155+
}{
1156+
{
1157+
name: "When Reconciling PowerVS service instance returns error",
1158+
powerVSClusterScopeFunc: func() *scope.PowerVSClusterScope {
1159+
clusterScope := &scope.PowerVSClusterScope{
1160+
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{
1161+
Status: infrav1beta2.IBMPowerVSClusterStatus{
1162+
ServiceInstance: &infrav1beta2.ResourceReference{
1163+
ID: ptr.To("serviceInstanceID"),
1164+
},
1165+
},
1166+
},
1167+
}
1168+
mockResourceController := resourceclientmock.NewMockResourceController(gomock.NewController(t))
1169+
mockResourceController.EXPECT().GetResourceInstance(gomock.Any()).Return(nil, nil, fmt.Errorf("error getting resource instance"))
1170+
clusterScope.ResourceClient = mockResourceController
1171+
return clusterScope
1172+
},
1173+
reconcileResult: reconcileResult{
1174+
error: errors.New("error getting resource instance"),
1175+
},
1176+
1177+
conditions: capiv1beta1.Conditions{
1178+
capiv1beta1.Condition{
1179+
Type: infrav1beta2.ServiceInstanceReadyCondition,
1180+
Status: "False",
1181+
Severity: capiv1beta1.ConditionSeverityError,
1182+
LastTransitionTime: metav1.Time{},
1183+
Reason: infrav1beta2.ServiceInstanceReconciliationFailedReason,
1184+
Message: "error getting resource instance",
1185+
},
1186+
},
1187+
},
1188+
{
1189+
name: "When Reconciling PowerVS service instance returns requeue as true",
1190+
powerVSClusterScopeFunc: func() *scope.PowerVSClusterScope {
1191+
clusterScope := &scope.PowerVSClusterScope{
1192+
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{
1193+
Status: infrav1beta2.IBMPowerVSClusterStatus{
1194+
ServiceInstance: &infrav1beta2.ResourceReference{
1195+
ID: ptr.To("serviceInstanceID"),
1196+
},
1197+
},
1198+
},
1199+
}
1200+
mockResourceController := resourceclientmock.NewMockResourceController(gomock.NewController(t))
1201+
mockResourceController.EXPECT().GetResourceInstance(gomock.Any()).Return(&resourcecontrollerv2.ResourceInstance{State: ptr.To(string(infrav1beta2.ServiceInstanceStateProvisioning)), Name: ptr.To("serviceInstanceName")}, nil, nil)
1202+
clusterScope.ResourceClient = mockResourceController
1203+
return clusterScope
1204+
},
1205+
reconcileResult: reconcileResult{
1206+
Result: reconcile.Result{
1207+
Requeue: true,
1208+
},
1209+
},
1210+
},
1211+
{
1212+
name: "When Reconciling network returns error",
1213+
powerVSClusterScopeFunc: func() *scope.PowerVSClusterScope {
1214+
clusterScope := &scope.PowerVSClusterScope{
1215+
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{
1216+
Spec: infrav1beta2.IBMPowerVSClusterSpec{
1217+
ServiceInstanceID: "serviceInstanceID",
1218+
},
1219+
Status: infrav1beta2.IBMPowerVSClusterStatus{
1220+
DHCPServer: &infrav1beta2.ResourceReference{ID: ptr.To("DHCPServerID")},
1221+
ServiceInstance: &infrav1beta2.ResourceReference{ID: ptr.To("serviceInstanceID")},
1222+
},
1223+
},
1224+
}
1225+
mockPowerVS := powervsmock.NewMockPowerVS(gomock.NewController(t))
1226+
dhcpServer := &models.DHCPServerDetail{ID: ptr.To("dhcpID"), Status: ptr.To(string(infrav1beta2.DHCPServerStateError))}
1227+
mockPowerVS.EXPECT().GetDHCPServer(gomock.Any()).Return(dhcpServer, nil)
1228+
mockPowerVS.EXPECT().WithClients(gomock.Any())
1229+
mockResourceController := resourceclientmock.NewMockResourceController(gomock.NewController(t))
1230+
mockResourceController.EXPECT().GetResourceInstance(gomock.Any()).Return(&resourcecontrollerv2.ResourceInstance{State: ptr.To(string(infrav1beta2.ServiceInstanceStateActive)), Name: ptr.To("serviceInstanceName")}, nil, nil)
1231+
clusterScope.ResourceClient = mockResourceController
1232+
clusterScope.IBMPowerVSClient = mockPowerVS
1233+
return clusterScope
1234+
},
1235+
reconcileResult: reconcileResult{
1236+
error: errors.New("DHCP server creation failed and is in error state"),
1237+
},
1238+
conditions: capiv1beta1.Conditions{
1239+
capiv1beta1.Condition{
1240+
Type: infrav1beta2.NetworkReadyCondition,
1241+
Status: "False",
1242+
Severity: capiv1beta1.ConditionSeverityError,
1243+
LastTransitionTime: metav1.Time{},
1244+
Reason: infrav1beta2.NetworkReconciliationFailedReason,
1245+
Message: "DHCP server creation failed and is in error state",
1246+
},
1247+
getServiceInstanceReadyCondition(),
1248+
},
1249+
},
1250+
{
1251+
name: "When reconcile network returns with DHCP server in active state",
1252+
powerVSClusterScopeFunc: func() *scope.PowerVSClusterScope {
1253+
clusterScope := &scope.PowerVSClusterScope{
1254+
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{
1255+
Spec: infrav1beta2.IBMPowerVSClusterSpec{
1256+
ServiceInstanceID: "serviceInstanceID",
1257+
},
1258+
Status: infrav1beta2.IBMPowerVSClusterStatus{
1259+
DHCPServer: &infrav1beta2.ResourceReference{ID: ptr.To("DHCPServerID")},
1260+
ServiceInstance: &infrav1beta2.ResourceReference{ID: ptr.To("serviceInstanceID")},
1261+
},
1262+
},
1263+
}
1264+
mockPowerVS := powervsmock.NewMockPowerVS(gomock.NewController(t))
1265+
dhcpServer := &models.DHCPServerDetail{ID: ptr.To("dhcpID"), Status: ptr.To(string(infrav1beta2.DHCPServerStateActive))}
1266+
mockPowerVS.EXPECT().GetDHCPServer(gomock.Any()).Return(dhcpServer, nil)
1267+
mockPowerVS.EXPECT().WithClients(gomock.Any())
1268+
mockResourceController := resourceclientmock.NewMockResourceController(gomock.NewController(t))
1269+
mockResourceController.EXPECT().GetResourceInstance(gomock.Any()).Return(&resourcecontrollerv2.ResourceInstance{State: ptr.To(string(infrav1beta2.ServiceInstanceStateActive)), Name: ptr.To("serviceInstanceName")}, nil, nil)
1270+
clusterScope.ResourceClient = mockResourceController
1271+
clusterScope.IBMPowerVSClient = mockPowerVS
1272+
return clusterScope
1273+
},
1274+
conditions: capiv1beta1.Conditions{
1275+
getNetworkReadyCondition(),
1276+
getServiceInstanceReadyCondition(),
1277+
},
1278+
},
11531279
}
1154-
}
1155-
func getNetworkReadyCondition() capiv1beta1.Condition {
1156-
return capiv1beta1.Condition{
1157-
Type: infrav1beta2.NetworkReadyCondition,
1158-
Status: "True",
1280+
for _, tc := range testCases {
1281+
t.Run(tc.name, func(t *testing.T) {
1282+
g := NewWithT(t)
1283+
reconciler := &IBMPowerVSClusterReconciler{
1284+
Client: testEnv.Client,
1285+
}
1286+
clusterScope := tc.powerVSClusterScopeFunc()
1287+
ch := make(chan reconcileResult, 1)
1288+
pvsCluster := &powerVSCluster{
1289+
cluster: clusterScope.IBMPowerVSCluster,
1290+
}
1291+
wg := &sync.WaitGroup{}
1292+
wg.Add(1)
1293+
reconciler.reconcilePowerVSResources(clusterScope, pvsCluster, ch, wg)
1294+
wg.Wait()
1295+
close(ch)
1296+
g.Expect(<-ch).To(Equal(tc.reconcileResult))
1297+
ignoreLastTransitionTime := cmp.Transformer("", func(metav1.Time) metav1.Time {
1298+
return metav1.Time{}
1299+
})
1300+
g.Expect(pvsCluster.cluster.GetConditions()).To(BeComparableTo(tc.conditions, ignoreLastTransitionTime))
1301+
})
11591302
}
11601303
}
11611304

@@ -1328,3 +1471,16 @@ func cleanupCluster(g *WithT, powervsCluster *infrav1beta2.IBMPowerVSCluster, na
13281471
}(powervsCluster, namespace)
13291472
}
13301473
}
1474+
1475+
func getServiceInstanceReadyCondition() capiv1beta1.Condition {
1476+
return capiv1beta1.Condition{
1477+
Type: infrav1beta2.ServiceInstanceReadyCondition,
1478+
Status: "True",
1479+
}
1480+
}
1481+
func getNetworkReadyCondition() capiv1beta1.Condition {
1482+
return capiv1beta1.Condition{
1483+
Type: infrav1beta2.NetworkReadyCondition,
1484+
Status: "True",
1485+
}
1486+
}

0 commit comments

Comments
 (0)