in addons/addon-raas-s3-copy/packages/s3-synchronizer/src/s3-upload-file-watcher.go [315:390]
func deleteDirFromS3(sess *session.Session, syncDir string, dirName string, bucket string, prefix string, debug bool) error {
svc := s3.New(sess)
// Add trailing slash for the dir name if it doesn't exist
dirPrefixInS3 := filepath.ToSlash(dirName)
if !strings.HasSuffix(dirPrefixInS3, "/") {
dirPrefixInS3 = dirPrefixInS3 + "/"
}
dirKey := ToS3KeyForFile(dirPrefixInS3, prefix, syncDir)
if debug {
fmt.Printf("Deleting directory: %v from S3: %v\n", dirKey, bucket)
}
truncatedListing := true
query := &s3.ListObjectsV2Input{
Bucket: aws.String(bucket),
Prefix: aws.String(dirKey),
}
for truncatedListing {
resp, err := svc.ListObjectsV2(query)
if err != nil {
log.Println("Failed to list objects: ", err)
// 10 seconds backoff
time.Sleep(time.Duration(10) * time.Second)
continue
}
var objectIdentifiers []*s3.ObjectIdentifier
// If the directory path is not empty in S3 then first delete all objects under the directory
// (i.e., under the specific S3 suffix)
if len(resp.Contents) > 0 {
for _, item := range resp.Contents {
objectIdentifiers = append(objectIdentifiers, &s3.ObjectIdentifier{Key: item.Key})
}
deleteObjectsInput := &s3.DeleteObjectsInput{
Bucket: aws.String(bucket),
Delete: &s3.Delete{
Objects: objectIdentifiers,
},
}
if debug {
fmt.Printf("Deleting objects from old S3 path %v: %v\n", dirKey, deleteObjectsInput)
}
deleteObjectsResp, err := svc.DeleteObjects(deleteObjectsInput)
if err != nil {
log.Println("Failed to delete objects: ", err)
return err
}
if len(deleteObjectsResp.Errors) > 0 && len(deleteObjectsResp.Deleted) > 0 {
log.Println("Failed to delete some objects: ", deleteObjectsResp.Errors)
}
if len(deleteObjectsResp.Errors) > 0 && len(deleteObjectsResp.Deleted) == 0 {
log.Println("Failed to delete objects: ", deleteObjectsResp)
return errors.New(fmt.Sprintf("Failed to delete objects: %v\n", deleteObjectsResp.Errors))
}
}
query.ContinuationToken = resp.NextContinuationToken
truncatedListing = *resp.IsTruncated
}
keyToDelete := strings.TrimSuffix(dirKey, "/")
deleteObjectInput := &s3.DeleteObjectInput{Bucket: aws.String(bucket), Key: aws.String(keyToDelete)}
_, err := svc.DeleteObject(deleteObjectInput)
if err == nil {
if debug {
log.Println("Successfully deleted dir", keyToDelete, "from", bucket+"/"+keyToDelete)
}
} else {
log.Println("Failed to delete dir ", keyToDelete, "from S3", err)
}
return err
}