Skip to content

Commit ac35757

Browse files
authored
[Feature] Allow to abort upload (#845)
1 parent d93167f commit ac35757

File tree

4 files changed

+101
-18
lines changed

4 files changed

+101
-18
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
44
- Add ArangoBackup backoff functionality
5+
- Allow to abort ArangoBackup uploads by removing spec.upload
56

67
## [1.2.5](https://github.com/arangodb/kube-arangodb/tree/1.2.5) (2021-10-25)
78
- Split & Unify Lifecycle management functionality

pkg/backup/handlers/arango/backup/arango_client_impl.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,13 @@ func (ac *arangoClientBackupImpl) Progress(jobID driver.BackupTransferJobID) (Ar
188188
return ArangoBackupProgress{}, err
189189
}
190190

191+
if report.Cancelled {
192+
return ArangoBackupProgress{
193+
Failed: true,
194+
FailMessage: "Upload cancelled",
195+
}, nil
196+
}
197+
191198
var ret ArangoBackupProgress
192199
var completedCount int
193200
var total int

pkg/backup/handlers/arango/backup/state_uploading.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,20 @@ func stateUploadingHandler(h *handler, backup *backupApi.ArangoBackup) (*backupA
8383
)
8484
}
8585

86+
if backup.Spec.Upload == nil {
87+
// Upload is canceled
88+
89+
if err = client.Abort(driver.BackupTransferJobID(backup.Status.Progress.JobID)); err == nil {
90+
return wrapUpdateStatus(backup,
91+
updateStatusState(backupApi.ArangoBackupStateReady, ""),
92+
cleanStatusJob(),
93+
updateStatusBackupUpload(util.NewBool(false)),
94+
updateStatusAvailable(true),
95+
cleanBackOff(),
96+
)
97+
}
98+
}
99+
86100
return wrapUpdateStatus(backup,
87101
updateStatusState(backupApi.ArangoBackupStateUploading, ""),
88102
updateStatusAvailable(true),

pkg/backup/handlers/arango/backup/state_uploading_test.go

Lines changed: 79 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ func Test_State_Uploading_Success(t *testing.T) {
5757

5858
obj.Status.Backup = createBackupFromMeta(backupMeta, nil)
5959

60+
obj.Spec.Upload = &backupApi.ArangoBackupSpecOperation{
61+
RepositoryURL: "S3 URL",
62+
}
63+
6064
obj.Status.Progress = &backupApi.ArangoBackupProgress{
6165
JobID: string(progress),
6266
}
@@ -162,16 +166,13 @@ func Test_StateUploading_FailedProgress(t *testing.T) {
162166
backupMeta, err := mock.Get(createResponse.ID)
163167
require.NoError(t, err)
164168

165-
progress, err := mock.Download(backupMeta.ID)
169+
progress, err := mock.Upload(backupMeta.ID)
166170
require.NoError(t, err)
167171

168172
obj.Status.Backup = createBackupFromMeta(backupMeta, nil)
169173

170-
obj.Spec.Download = &backupApi.ArangoBackupSpecDownload{
171-
ArangoBackupSpecOperation: backupApi.ArangoBackupSpecOperation{
172-
RepositoryURL: "S3 URL",
173-
},
174-
ID: string(backupMeta.ID),
174+
obj.Spec.Upload = &backupApi.ArangoBackupSpecOperation{
175+
RepositoryURL: "S3 URL",
175176
}
176177

177178
obj.Status.Progress = &backupApi.ArangoBackupProgress{
@@ -204,16 +205,13 @@ func Test_State_Uploading_TemporaryFailedProgress(t *testing.T) {
204205
backupMeta, err := mock.Get(createResponse.ID)
205206
require.NoError(t, err)
206207

207-
progress, err := mock.Download(backupMeta.ID)
208+
progress, err := mock.Upload(backupMeta.ID)
208209
require.NoError(t, err)
209210

210211
obj.Status.Backup = createBackupFromMeta(backupMeta, nil)
211212

212-
obj.Spec.Download = &backupApi.ArangoBackupSpecDownload{
213-
ArangoBackupSpecOperation: backupApi.ArangoBackupSpecOperation{
214-
RepositoryURL: "S3 URL",
215-
},
216-
ID: string(backupMeta.ID),
213+
obj.Spec.Upload = &backupApi.ArangoBackupSpecOperation{
214+
RepositoryURL: "S3 URL",
217215
}
218216

219217
obj.Status.Progress = &backupApi.ArangoBackupProgress{
@@ -248,16 +246,13 @@ func Test_State_Uploading_NotFoundProgress(t *testing.T) {
248246
backupMeta, err := mock.Get(createResponse.ID)
249247
require.NoError(t, err)
250248

251-
progress, err := mock.Download(backupMeta.ID)
249+
progress, err := mock.Upload(backupMeta.ID)
252250
require.NoError(t, err)
253251

254252
obj.Status.Backup = createBackupFromMeta(backupMeta, nil)
255253

256-
obj.Spec.Download = &backupApi.ArangoBackupSpecDownload{
257-
ArangoBackupSpecOperation: backupApi.ArangoBackupSpecOperation{
258-
RepositoryURL: "S3 URL",
259-
},
260-
ID: string(backupMeta.ID),
254+
obj.Spec.Upload = &backupApi.ArangoBackupSpecOperation{
255+
RepositoryURL: "S3 URL",
261256
}
262257

263258
obj.Status.Progress = &backupApi.ArangoBackupProgress{
@@ -276,3 +271,69 @@ func Test_State_Uploading_NotFoundProgress(t *testing.T) {
276271
require.Equal(t, fmt.Sprintf("job with id %s does not exist anymore", progress), newObj.Status.Message)
277272
require.Nil(t, newObj.Status.Progress)
278273
}
274+
275+
func Test_StateUploading_Abort_Success(t *testing.T) {
276+
// Arrange
277+
handler, mock := newErrorsFakeHandler(mockErrorsArangoClientBackup{})
278+
279+
obj, deployment := newObjectSet(backupApi.ArangoBackupStateUploading)
280+
281+
createResponse, err := mock.Create()
282+
require.NoError(t, err)
283+
284+
backupMeta, err := mock.Get(createResponse.ID)
285+
require.NoError(t, err)
286+
287+
progress, err := mock.Upload(backupMeta.ID)
288+
require.NoError(t, err)
289+
290+
obj.Status.Backup = createBackupFromMeta(backupMeta, nil)
291+
292+
obj.Status.Progress = &backupApi.ArangoBackupProgress{
293+
JobID: string(progress),
294+
}
295+
296+
// Act
297+
createArangoDeployment(t, handler, deployment)
298+
createArangoBackup(t, handler, obj)
299+
300+
require.NoError(t, handler.Handle(newItemFromBackup(operation.Update, obj)))
301+
302+
// Assert
303+
newObj := refreshArangoBackup(t, handler, obj)
304+
checkBackup(t, newObj, backupApi.ArangoBackupStateReady, true)
305+
}
306+
307+
func Test_StateUploading_Abort_Fail(t *testing.T) {
308+
// Arrange
309+
handler, mock := newErrorsFakeHandler(mockErrorsArangoClientBackup{
310+
abortError: newTemporaryErrorf("error"),
311+
})
312+
313+
obj, deployment := newObjectSet(backupApi.ArangoBackupStateUploading)
314+
315+
createResponse, err := mock.Create()
316+
require.NoError(t, err)
317+
318+
backupMeta, err := mock.Get(createResponse.ID)
319+
require.NoError(t, err)
320+
321+
progress, err := mock.Upload(backupMeta.ID)
322+
require.NoError(t, err)
323+
324+
obj.Status.Backup = createBackupFromMeta(backupMeta, nil)
325+
326+
obj.Status.Progress = &backupApi.ArangoBackupProgress{
327+
JobID: string(progress),
328+
}
329+
330+
// Act
331+
createArangoDeployment(t, handler, deployment)
332+
createArangoBackup(t, handler, obj)
333+
334+
require.NoError(t, handler.Handle(newItemFromBackup(operation.Update, obj)))
335+
336+
// Assert
337+
newObj := refreshArangoBackup(t, handler, obj)
338+
checkBackup(t, newObj, backupApi.ArangoBackupStateUploading, true)
339+
}

0 commit comments

Comments
 (0)