Skip to content

Commit 557a58d

Browse files
[release-2.4] 🐛 fix: s3: fix bucket object not found (#4907)
* 🐛 fix: s3: do not ignore non-aws errors when deleting object If any error of non awserr.Error type happens when trying to list a bootstrap data object, it would be silently ignored. * 🐛fix: s3: ignore "NotFound" errors The `s3.HeadObject` API call can return "NotFound" when either the bucket or the object does not exist (as opposed to the more descriptive `s3.ErrCodeNoSuchKey` or `s3.ErrCodeNoSuchBucket`). This would cause the machine controller to loop indefinitely trying to delete an already deleted object but failing: ``` E0316 16:37:08.973942 366 awsmachine_controller.go:307] "unable to delete machine" err=< deleting bootstrap data object: deleting S3 object: NotFound: Not Found status code: 404, request id: 5Z101DW1KN380WTY, host id: tYlSi9K38lBkIsr2DNf/xFfgDuFaVfeUmpscXdljiMZC5iRxPIDuXSLwHJwdFnosYCfi7Bih25GaDpVAbSq4ZA== > ``` * 🌱s3: add unit test for already deleted s3 object. --------- Co-authored-by: Rafael Fonseca <[email protected]>
1 parent cbf5317 commit 557a58d

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

pkg/cloud/services/s3/s3.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,17 +204,19 @@ func (s *Service) Delete(m *scope.MachineScope) error {
204204

205205
s.scope.Debug("Delete object call succeeded despite missing GetObject permission", "bucket", bucket, "key", key)
206206

207+
return nil
208+
case "NotFound":
209+
s.scope.Debug("Either bucket or object does not exist", "bucket", bucket, "key", key)
207210
return nil
208211
case s3.ErrCodeNoSuchKey:
209212
s.scope.Debug("Object already deleted", "bucket", bucket, "key", key)
210213
return nil
211214
case s3.ErrCodeNoSuchBucket:
212215
s.scope.Debug("Bucket does not exist", "bucket", bucket)
213216
return nil
214-
default:
215-
return errors.Wrap(aerr, "deleting S3 object")
216217
}
217218
}
219+
return errors.Wrap(err, "deleting S3 object")
218220
}
219221

220222
s.scope.Info("Deleting S3 object", "bucket", bucket, "key", key)

pkg/cloud/services/s3/s3_test.go

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -694,11 +694,9 @@ func TestDeleteObject(t *testing.T) {
694694
}
695695
})
696696

697-
t.Run("succeeds_when_bucket_has_already_been_removed", func(t *testing.T) {
697+
t.Run("succeeds_when", func(t *testing.T) {
698698
t.Parallel()
699699

700-
svc, s3Mock := testService(t, &testServiceInput{Bucket: &infrav1.S3Bucket{}})
701-
702700
machineScope := &scope.MachineScope{
703701
Machine: &clusterv1.Machine{},
704702
AWSMachine: &infrav1.AWSMachine{
@@ -708,11 +706,38 @@ func TestDeleteObject(t *testing.T) {
708706
},
709707
}
710708

711-
s3Mock.EXPECT().HeadObject(gomock.Any()).Return(nil, awserr.New(s3svc.ErrCodeNoSuchBucket, "", nil))
709+
t.Run("bucket_has_already_been_removed", func(t *testing.T) {
710+
t.Parallel()
712711

713-
if err := svc.Delete(machineScope); err != nil {
714-
t.Fatalf("Unexpected error, got: %v", err)
715-
}
712+
svc, s3Mock := testService(t, &testServiceInput{Bucket: &infrav1.S3Bucket{}})
713+
s3Mock.EXPECT().HeadObject(gomock.Any()).Return(nil, awserr.New(s3svc.ErrCodeNoSuchBucket, "", nil))
714+
715+
if err := svc.Delete(machineScope); err != nil {
716+
t.Fatalf("Unexpected error, got: %v", err)
717+
}
718+
})
719+
720+
t.Run("object_has_already_been_removed", func(t *testing.T) {
721+
t.Parallel()
722+
723+
svc, s3Mock := testService(t, &testServiceInput{Bucket: &infrav1.S3Bucket{}})
724+
s3Mock.EXPECT().HeadObject(gomock.Any()).Return(nil, awserr.New(s3svc.ErrCodeNoSuchKey, "", nil))
725+
726+
if err := svc.Delete(machineScope); err != nil {
727+
t.Fatalf("Unexpected error, got: %v", err)
728+
}
729+
})
730+
731+
t.Run("bucket_or_object_not_found", func(t *testing.T) {
732+
t.Parallel()
733+
734+
svc, s3Mock := testService(t, &testServiceInput{Bucket: &infrav1.S3Bucket{}})
735+
s3Mock.EXPECT().HeadObject(gomock.Any()).Return(nil, awserr.New("NotFound", "Not found", nil))
736+
737+
if err := svc.Delete(machineScope); err != nil {
738+
t.Fatalf("Unexpected error, got: %v", err)
739+
}
740+
})
716741
})
717742

718743
t.Run("returns_error_when", func(t *testing.T) {

0 commit comments

Comments
 (0)