Skip to content

Commit ddcb2bf

Browse files
committed
WIP: Added a functional test
1 parent 832bf37 commit ddcb2bf

File tree

2 files changed

+198
-1
lines changed

2 files changed

+198
-1
lines changed

test/functional/nova_multicell_test.go

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,3 +952,198 @@ var _ = Describe("Nova multi cell", func() {
952952
})
953953
})
954954
})
955+
956+
var _ = Describe("Nova multi cell deletion", func() {
957+
BeforeEach(func() {
958+
apiMariaDBAccount, apiMariaDBSecret := mariadb.CreateMariaDBAccountAndSecret(
959+
novaNames.APIMariaDBDatabaseAccount, mariadbv1.MariaDBAccountSpec{})
960+
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBAccount)
961+
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBSecret)
962+
963+
cell0Account, cell0Secret := mariadb.CreateMariaDBAccountAndSecret(
964+
cell0.MariaDBAccountName, mariadbv1.MariaDBAccountSpec{})
965+
DeferCleanup(k8sClient.Delete, ctx, cell0Account)
966+
DeferCleanup(k8sClient.Delete, ctx, cell0Secret)
967+
968+
// cell1Account, cell1Secret := mariadb.CreateMariaDBAccountAndSecret(
969+
// cell1.MariaDBAccountName, mariadbv1.MariaDBAccountSpec{})
970+
// DeferCleanup(k8sClient.Delete, ctx, cell1Account)
971+
// DeferCleanup(k8sClient.Delete, ctx, cell1Secret)
972+
973+
mariadb.CreateMariaDBAccountAndSecret(
974+
cell1.MariaDBAccountName, mariadbv1.MariaDBAccountSpec{})
975+
// DeferCleanup(k8sClient.Delete, ctx, cell1Account)
976+
// DeferCleanup(k8sClient.Delete, ctx, cell1Secret)
977+
978+
})
979+
980+
When("Nova CR instance is created with 3 cells", func() {
981+
BeforeEach(func() {
982+
983+
mariadb.CreateMariaDBAccountAndSecret(
984+
cell2.MariaDBAccountName, mariadbv1.MariaDBAccountSpec{})
985+
986+
// mariadb.CreateMariaDBAccountAndSecret(
987+
// cell3.MariaDBAccountName, mariadbv1.MariaDBAccountSpec{})
988+
989+
// TODO(bogdando): deduplicate this into CreateNovaWith3CellsAndEnsureReady()
990+
DeferCleanup(k8sClient.Delete, ctx, CreateNovaSecretFor3Cells(novaNames.NovaName.Namespace, SecretName))
991+
DeferCleanup(k8sClient.Delete, ctx, CreateNovaMessageBusSecret(cell0))
992+
DeferCleanup(k8sClient.Delete, ctx, CreateNovaMessageBusSecret(cell1))
993+
DeferCleanup(k8sClient.Delete, ctx, CreateNovaMessageBusSecret(cell2))
994+
DeferCleanup(k8sClient.Delete, ctx, CreateNovaMessageBusSecret(cell3))
995+
996+
serviceSpec := corev1.ServiceSpec{Ports: []corev1.ServicePort{{Port: 3306}}}
997+
DeferCleanup(mariadb.DeleteDBService, mariadb.CreateDBService(novaNames.APIMariaDBDatabaseName.Namespace, novaNames.APIMariaDBDatabaseName.Name, serviceSpec))
998+
DeferCleanup(mariadb.DeleteDBService, mariadb.CreateDBService(cell0.MariaDBDatabaseName.Namespace, cell0.MariaDBDatabaseName.Name, serviceSpec))
999+
DeferCleanup(mariadb.DeleteDBService, mariadb.CreateDBService(cell1.MariaDBDatabaseName.Namespace, cell1.MariaDBDatabaseName.Name, serviceSpec))
1000+
DeferCleanup(mariadb.DeleteDBService, mariadb.CreateDBService(cell2.MariaDBDatabaseName.Namespace, cell2.MariaDBDatabaseName.Name, serviceSpec))
1001+
DeferCleanup(mariadb.DeleteDBService, mariadb.CreateDBService(cell3.MariaDBDatabaseName.Namespace, cell3.MariaDBDatabaseName.Name, serviceSpec))
1002+
1003+
spec := GetDefaultNovaSpec()
1004+
cell0Template := GetDefaultNovaCellTemplate()
1005+
cell0Template["cellDatabaseInstance"] = cell0.MariaDBDatabaseName.Name
1006+
cell0Template["cellDatabaseAccount"] = cell0.MariaDBAccountName.Name
1007+
1008+
cell1Template := GetDefaultNovaCellTemplate()
1009+
cell1Template["cellDatabaseInstance"] = cell1.MariaDBDatabaseName.Name
1010+
cell1Template["cellDatabaseAccount"] = cell1.MariaDBAccountName.Name
1011+
cell1Template["cellMessageBusInstance"] = cell1.TransportURLName.Name
1012+
cell1Template["passwordSelectors"] = map[string]interface{}{
1013+
"database": "NovaCell1DatabasePassword",
1014+
}
1015+
cell1Template["novaComputeTemplates"] = map[string]interface{}{
1016+
ironicComputeName: GetDefaultNovaComputeTemplate(),
1017+
}
1018+
cell1Memcached := "memcached1"
1019+
cell1Template["memcachedInstance"] = cell1Memcached
1020+
1021+
cell2Template := GetDefaultNovaCellTemplate()
1022+
cell2Template["cellDatabaseInstance"] = cell2.MariaDBDatabaseName.Name
1023+
cell2Template["cellDatabaseAccount"] = cell2.MariaDBAccountName.Name
1024+
cell2Template["cellMessageBusInstance"] = cell2.TransportURLName.Name
1025+
cell2Template["hasAPIAccess"] = false
1026+
cell2Template["passwordSelectors"] = map[string]interface{}{
1027+
"database": "NovaCell2DatabasePassword",
1028+
}
1029+
1030+
cell3Template := GetDefaultNovaCellTemplate()
1031+
cell3Template["cellDatabaseInstance"] = cell3.MariaDBDatabaseName.Name
1032+
cell3Template["cellDatabaseAccount"] = cell3.MariaDBAccountName.Name
1033+
cell3Template["cellMessageBusInstance"] = cell3.TransportURLName.Name
1034+
cell3Template["hasAPIAccess"] = false
1035+
cell3Template["passwordSelectors"] = map[string]interface{}{
1036+
"database": "NovaCell3DatabasePassword",
1037+
}
1038+
1039+
spec["cellTemplates"] = map[string]interface{}{
1040+
"cell0": cell0Template,
1041+
"cell1": cell1Template,
1042+
"cell2": cell2Template,
1043+
"cell3": cell3Template,
1044+
}
1045+
1046+
spec["apiDatabaseInstance"] = novaNames.APIMariaDBDatabaseName.Name
1047+
spec["apiMessageBusInstance"] = cell0.TransportURLName.Name
1048+
1049+
DeferCleanup(th.DeleteInstance, CreateNova(novaNames.NovaName, spec))
1050+
DeferCleanup(keystone.DeleteKeystoneAPI, keystone.CreateKeystoneAPI(novaNames.NovaName.Namespace))
1051+
memcachedSpecCell1 := memcachedv1.MemcachedSpec{
1052+
MemcachedSpecCore: memcachedv1.MemcachedSpecCore{
1053+
Replicas: ptr.To(int32(3)),
1054+
},
1055+
}
1056+
memcachedNamespace := types.NamespacedName{
1057+
Name: cell1Memcached,
1058+
Namespace: novaNames.NovaName.Namespace,
1059+
}
1060+
DeferCleanup(infra.DeleteMemcached, infra.CreateMemcached(novaNames.NovaName.Namespace, cell1Memcached, memcachedSpecCell1))
1061+
infra.SimulateMemcachedReady(memcachedNamespace)
1062+
1063+
memcachedSpec := memcachedv1.MemcachedSpec{
1064+
MemcachedSpecCore: memcachedv1.MemcachedSpecCore{
1065+
Replicas: ptr.To(int32(3)),
1066+
},
1067+
}
1068+
1069+
DeferCleanup(infra.DeleteMemcached, infra.CreateMemcached(novaNames.NovaName.Namespace, MemcachedInstance, memcachedSpec))
1070+
infra.SimulateMemcachedReady(novaNames.MemcachedNamespace)
1071+
keystone.SimulateKeystoneServiceReady(novaNames.KeystoneServiceName)
1072+
1073+
// Pre-requisite simulation
1074+
mariadb.SimulateMariaDBDatabaseCompleted(novaNames.APIMariaDBDatabaseName)
1075+
mariadb.SimulateMariaDBAccountCompleted(novaNames.APIMariaDBDatabaseAccount)
1076+
mariadb.SimulateMariaDBDatabaseCompleted(cell0.MariaDBDatabaseName)
1077+
mariadb.SimulateMariaDBAccountCompleted(cell0.MariaDBAccountName)
1078+
infra.SimulateTransportURLReady(cell0.TransportURLName)
1079+
th.SimulateJobSuccess(cell0.DBSyncJobName)
1080+
th.SimulateStatefulSetReplicaReady(cell0.ConductorStatefulSetName)
1081+
th.SimulateJobSuccess(cell0.CellMappingJobName)
1082+
1083+
th.SimulateStatefulSetReplicaReady(novaNames.APIStatefulSetName)
1084+
keystone.SimulateKeystoneEndpointReady(novaNames.APIKeystoneEndpointName)
1085+
th.SimulateStatefulSetReplicaReady(novaNames.SchedulerStatefulSetName)
1086+
th.SimulateStatefulSetReplicaReady(novaNames.MetadataStatefulSetName)
1087+
1088+
// cell1
1089+
mariadb.SimulateMariaDBDatabaseCompleted(cell1.MariaDBDatabaseName)
1090+
mariadb.SimulateMariaDBAccountCompleted(cell1.MariaDBAccountName)
1091+
infra.SimulateTransportURLReady(cell1.TransportURLName)
1092+
th.SimulateStatefulSetReplicaReady(cell1.NovaComputeStatefulSetName)
1093+
th.SimulateStatefulSetReplicaReady(cell1.NoVNCProxyStatefulSetName)
1094+
th.SimulateJobSuccess(cell1.DBSyncJobName)
1095+
th.SimulateStatefulSetReplicaReady(cell1.ConductorStatefulSetName)
1096+
th.SimulateJobSuccess(cell1.CellMappingJobName)
1097+
th.SimulateJobSuccess(cell1.HostDiscoveryJobName)
1098+
1099+
// Create/Simulate DB for cell2 and cell3
1100+
mariadb.SimulateMariaDBDatabaseCompleted(cell2.MariaDBDatabaseName)
1101+
mariadb.SimulateMariaDBAccountCompleted(cell2.MariaDBAccountName)
1102+
infra.SimulateTransportURLReady(cell2.TransportURLName)
1103+
th.SimulateStatefulSetReplicaReady(cell2.NoVNCProxyStatefulSetName)
1104+
th.SimulateJobSuccess(cell2.DBSyncJobName)
1105+
th.SimulateStatefulSetReplicaReady(cell2.ConductorStatefulSetName)
1106+
th.SimulateJobSuccess(cell2.CellMappingJobName)
1107+
1108+
mariadb.SimulateMariaDBDatabaseCompleted(cell3.MariaDBDatabaseName)
1109+
mariadb.SimulateMariaDBAccountCompleted(cell3.MariaDBAccountName)
1110+
infra.SimulateTransportURLReady(cell3.TransportURLName)
1111+
th.SimulateStatefulSetReplicaReady(cell3.NoVNCProxyStatefulSetName)
1112+
th.SimulateJobSuccess(cell3.DBSyncJobName)
1113+
th.SimulateStatefulSetReplicaReady(cell3.ConductorStatefulSetName)
1114+
th.SimulateJobSuccess(cell3.CellMappingJobName)
1115+
1116+
})
1117+
1118+
It("delete cell1 and cell2, verify for cell1", func() {
1119+
1120+
nova := GetNova(novaNames.NovaName)
1121+
Expect(nova.Status.RegisteredCells).To(HaveKey(cell0.CellCRName.Name), "cell0 is not in the RegisteredCells", nova.Status.RegisteredCells)
1122+
Expect(nova.Status.RegisteredCells).To(HaveKey(cell1.CellCRName.Name), "cell1 is not in the RegisteredCells", nova.Status.RegisteredCells)
1123+
Expect(nova.Status.RegisteredCells).To(HaveKey(cell2.CellCRName.Name), "cell2 is not in the RegisteredCells", nova.Status.RegisteredCells)
1124+
1125+
// manually delete DB for cell2, to reproduce the error in cell2 deletion
1126+
Expect(k8sClient.Delete(ctx, mariadb.GetMariaDBDatabase(cell1.MariaDBDatabaseName))).To(Succeed())
1127+
1128+
// delete cell1 and then cell2,
1129+
// the overall call should succeed
1130+
Eventually(func(g Gomega) {
1131+
nova := GetNova(novaNames.NovaName)
1132+
delete(nova.Spec.CellTemplates, "cell1")
1133+
delete(nova.Spec.CellTemplates, "cell2")
1134+
g.Expect(k8sClient.Update(ctx, nova)).To(Succeed())
1135+
}, timeout, interval).Should(Succeed())
1136+
1137+
Eventually(func(g Gomega) {
1138+
// test cell2 is not present in CR
1139+
nova := GetNova(novaNames.NovaName)
1140+
g.Expect(nova.Status.RegisteredCells).NotTo(HaveKey(cell1.CellCRName.Name))
1141+
g.Expect(nova.Status.RegisteredCells).NotTo(HaveKey(cell2.CellCRName.Name))
1142+
}, timeout, interval).Should(Succeed())
1143+
1144+
NovaCellNotExists(cell1.CellCRName)
1145+
NovaCellNotExists(cell2.CellCRName)
1146+
1147+
})
1148+
})
1149+
})

test/functional/suite_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ var (
8383
cell0 CellNames
8484
cell1 CellNames
8585
cell2 CellNames
86+
cell3 CellNames
8687
)
8788

8889
func TestAPIs(t *testing.T) {
@@ -280,8 +281,9 @@ var _ = BeforeEach(func() {
280281
Name: uuid.New().String()[:25],
281282
}
282283

283-
novaNames = GetNovaNames(novaName, []string{"cell0", "cell1", "cell2"})
284+
novaNames = GetNovaNames(novaName, []string{"cell0", "cell1", "cell2", "cell3"})
284285
cell0 = novaNames.Cells["cell0"]
285286
cell1 = novaNames.Cells["cell1"]
286287
cell2 = novaNames.Cells["cell2"]
288+
cell3 = novaNames.Cells["cell3"]
287289
})

0 commit comments

Comments
 (0)