func deleteDirFromS3()

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
}