@@ -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+ })
0 commit comments