Просмотр исходного кода

update mechanism to delete events to also delete sub events transactionally

Alexander Belanger 4 лет назад
Родитель
Сommit
719191cb44
2 измененных файлов с 41 добавлено и 3 удалено
  1. 15 3
      internal/repository/gorm/event.go
  2. 26 0
      internal/repository/gorm/event_test.go

+ 15 - 3
internal/repository/gorm/event.go

@@ -106,7 +106,11 @@ func (repo *KubeEventRepository) CreateEvent(
 				return err
 			}
 
-			if err := query.Unscoped().Preload("SubEvents").Delete(matchedEvent).Error; err != nil {
+			err := tx.Debug().Transaction(func(tx2 *gorm.DB) error {
+				return deleteEventPermanently(matchedEvent.ID, tx2)
+			})
+
+			if err != nil {
 				return err
 			}
 		}
@@ -262,9 +266,17 @@ func (repo *KubeEventRepository) AppendSubEvent(event *models.KubeEvent, subEven
 func (repo *KubeEventRepository) DeleteEvent(
 	id uint,
 ) error {
-	if err := repo.db.Unscoped().Preload("SubEvents").Where("id = ?", id).Delete(&models.KubeEvent{}).Error; err != nil {
+	return repo.db.Transaction(func(tx *gorm.DB) error {
+		return deleteEventPermanently(id, tx)
+	})
+}
+
+func deleteEventPermanently(id uint, tx *gorm.DB) error {
+	// delete all subevents first
+	if err := tx.Debug().Unscoped().Where("kube_event_id = ?", id).Delete(&models.KubeSubEvent{}).Error; err != nil {
 		return err
 	}
 
-	return nil
+	// delete event
+	return tx.Debug().Preload("SubEvents").Unscoped().Where("id = ?", id).Delete(&models.KubeEvent{}).Error
 }

+ 26 - 0
internal/repository/gorm/event_test.go

@@ -150,6 +150,32 @@ func TestListKubeEventsByProjectIDWithSkip(t *testing.T) {
 	}, tester.initKubeEvents[10:35])
 }
 
+func TestDeleteKubeEvents(t *testing.T) {
+	suffix, _ := repository.GenerateRandomBytes(4)
+
+	tester := &tester{
+		dbFileName: fmt.Sprintf("./porter_delete_events_%s.db", suffix),
+	}
+
+	setupTestEnv(tester, t)
+	initProject(tester, t)
+	initCluster(tester, t)
+	initKubeEvents(tester, t)
+	defer cleanup(tester, t)
+
+	// delete a specific event and then test list again
+	err := tester.repo.KubeEvent().DeleteEvent(11)
+
+	if err != nil {
+		t.Fatalf("%v\n", err)
+	}
+
+	testListKubeEventsByProjectID(tester, t, 1, true, &types.ListKubeEventRequest{
+		Limit: 25,
+		Skip:  10,
+	}, tester.initKubeEvents[11:36])
+}
+
 func testListKubeEventsByProjectID(tester *tester, t *testing.T, clusterID uint, decrypt bool, opts *types.ListKubeEventRequest, expKubeEvents []*models.KubeEvent) {
 	t.Helper()