Skip to content

Commit 29026b1

Browse files
authored
Merge pull request #288 from weaviate/feat/overwrite-alias
Add support for overwriting aliases during backup restoration
2 parents 2902263 + 1ef2816 commit 29026b1

File tree

2 files changed

+100
-3
lines changed

2 files changed

+100
-3
lines changed

test/backup/backup_test.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/stretchr/testify/require"
1313
"github.com/weaviate/weaviate-go-client/v5/test/testsuit"
1414
"github.com/weaviate/weaviate-go-client/v5/weaviate"
15+
"github.com/weaviate/weaviate-go-client/v5/weaviate/alias"
1516
"github.com/weaviate/weaviate-go-client/v5/weaviate/backup"
1617
"github.com/weaviate/weaviate-go-client/v5/weaviate/graphql"
1718
"github.com/weaviate/weaviate-go-client/v5/weaviate/testenv"
@@ -961,6 +962,94 @@ func TestBackups_integration(t *testing.T) {
961962
}
962963
require.Len(t, relevant, 3, "wrong number of backups")
963964
})
965+
966+
t.Run("create and restore with overwriteAlias points to original collection", func(t *testing.T) {
967+
ctx := context.Background()
968+
client := testsuit.CreateTestClient(false)
969+
970+
schemaClass := &models.Class{
971+
Class: "Spy",
972+
Description: "Spy that spies on other spies",
973+
}
974+
975+
schemaDifferentClass := &models.Class{
976+
Class: "FakeSpy",
977+
Description: "Spy that only plays a spy on movies",
978+
}
979+
980+
alias := &alias.Alias{
981+
Alias: "SpyAlias",
982+
Class: schemaClass.Class,
983+
}
984+
985+
err := client.Schema().ClassDeleter().WithClassName(schemaClass.Class).Do(ctx)
986+
require.NoError(t, err)
987+
988+
err = client.Schema().ClassDeleter().WithClassName(schemaDifferentClass.Class).Do(ctx)
989+
require.NoError(t, err)
990+
991+
err = client.Schema().ClassCreator().WithClass(schemaClass).Do(ctx)
992+
require.NoError(t, err)
993+
994+
defer func() {
995+
errRm := client.Schema().AllDeleter().Do(context.Background())
996+
assert.Nil(t, errRm)
997+
}()
998+
999+
err = client.Alias().AliasCreator().WithAlias(alias).Do(ctx)
1000+
require.NoError(t, err)
1001+
defer func() {
1002+
require.NoError(t, client.Alias().AliasDeleter().WithAliasName(alias.Alias).Do(ctx))
1003+
}()
1004+
1005+
backend := backup.BACKEND_FILESYSTEM
1006+
backupID := fmt.Sprintf("overwrite-alias-%d", random.Int63())
1007+
1008+
// Create backup
1009+
_, err = client.Backup().Creator().
1010+
WithBackupID(backupID).
1011+
WithBackend(backend).
1012+
WithIncludeClassNames(schemaClass.Class).
1013+
WithWaitForCompletion(true).
1014+
Do(context.Background())
1015+
require.Nil(t, err)
1016+
1017+
// Delete original class
1018+
err = client.Schema().ClassDeleter().
1019+
WithClassName(schemaClass.Class).
1020+
Do(context.Background())
1021+
require.Nil(t, err)
1022+
1023+
// Create different class
1024+
err = client.Schema().ClassCreator().WithClass(schemaDifferentClass).Do(ctx)
1025+
require.NoError(t, err)
1026+
1027+
// Update alias to point to different class
1028+
alias.Class = schemaDifferentClass.Class
1029+
1030+
err = client.Alias().AliasUpdater().
1031+
WithAlias(alias).
1032+
Do(context.Background())
1033+
require.Nil(t, err)
1034+
1035+
// Act: restore with overwriteAlias
1036+
_, err = client.Backup().Restorer().
1037+
WithBackupID(backupID).
1038+
WithBackend(backend).
1039+
WithIncludeClassNames(schemaClass.Class).
1040+
WithOverwriteAlias(true).
1041+
WithWaitForCompletion(true).
1042+
Do(context.Background())
1043+
require.Nil(t, err)
1044+
1045+
// Assert: alias points to original class
1046+
aliasObj, err := client.Alias().AliasGetter().
1047+
WithAliasName("SpyAlias").
1048+
Do(context.Background())
1049+
require.Nil(t, err)
1050+
require.NotNil(t, aliasObj)
1051+
assert.Equal(t, schemaClass.Class, aliasObj.Class)
1052+
})
9641053
}
9651054

9661055
func assertAllPizzasExist(t *testing.T, client *weaviate.Client) {

weaviate/backup/backup_restorer.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type BackupRestorer struct {
2121
excludeClasses []string
2222
backend string
2323
backupID string
24+
overwriteAlias bool
2425
waitForCompletion bool
2526
config *models.RestoreConfig
2627
}
@@ -47,6 +48,12 @@ func (r *BackupRestorer) WithBackupID(backupID string) *BackupRestorer {
4748
return r
4849
}
4950

51+
// WithOverwriteAlias specifies whether to overwrite any existing aliases with ones restored from backup.
52+
func (r *BackupRestorer) WithOverwriteAlias(overwriteAlias bool) *BackupRestorer {
53+
r.overwriteAlias = overwriteAlias
54+
return r
55+
}
56+
5057
// WithWaitForCompletion block until backup is restored (succeeds or fails)
5158
func (r *BackupRestorer) WithWaitForCompletion(waitForCompletion bool) *BackupRestorer {
5259
r.waitForCompletion = waitForCompletion
@@ -94,9 +101,10 @@ func (r *BackupRestorer) WithoutRBAC() *BackupRestorer {
94101

95102
func (r *BackupRestorer) Do(ctx context.Context) (*models.BackupRestoreResponse, error) {
96103
payload := models.BackupRestoreRequest{
97-
Include: r.includeClasses,
98-
Exclude: r.excludeClasses,
99-
Config: r.config,
104+
Include: r.includeClasses,
105+
Exclude: r.excludeClasses,
106+
OverwriteAlias: r.overwriteAlias,
107+
Config: r.config,
100108
}
101109

102110
if r.waitForCompletion {

0 commit comments

Comments
 (0)