func()

in cmd/aotutil/efs.go [68:131]


func (w *EFSWrapper) Clean(ctx context.Context, dryRun bool) error {
	logger := w.logger
	descFsReq := &efs.DescribeFileSystemsInput{}
	threeDaysAgo := time.Now().Add(-3 * 24 * time.Hour)

	for {
		descFsRes, err := w.client.DescribeFileSystems(ctx, descFsReq)
		if err != nil {
			return fmt.Errorf("efs describe file system failed: %w", err)
		}
		var toDelete []string
		for _, fs := range descFsRes.FileSystems {
			createTime := aws.ToTime(fs.CreationTime)
			shouldDelete := false
			if createTime.Before(threeDaysAgo) {
				shouldDelete = true
			}
			logger.Info(aws.ToString(fs.FileSystemId), zap.String("Name", aws.ToString(fs.Name)),
				zap.Time("Created", createTime), zap.Bool("ShouldDelete", shouldDelete))
			if shouldDelete {
				toDelete = append(toDelete, aws.ToString(fs.FileSystemId))
			}
		}
		if len(toDelete) > 9 && !dryRun {
			// NOTE: we don't run the delete in paralle by design to avoid triggering API rate limit.
			for _, fsId := range toDelete {
				descMountReq := &efs.DescribeMountTargetsInput{FileSystemId: aws.String(fsId)}
				descMountRes, err := w.client.DescribeMountTargets(ctx, descMountReq)
				if err != nil {
					return fmt.Errorf("efs desc mount target failed for %s: %w", fsId, err)
				}
				for _, m := range descMountRes.MountTargets {
					delMountReq := &efs.DeleteMountTargetInput{MountTargetId: m.MountTargetId}
					_, err := w.client.DeleteMountTarget(ctx, delMountReq)
					if err != nil {
						return fmt.Errorf("efs delete mount target failed for fs %s mount %s: %w",
							fsId, aws.ToString(m.MountTargetId), err)
					}
				}
				logger.Info("Deleted File System Mounts", zap.String("FileSystemId", fsId),
					zap.Int("Mounts", len(descMountRes.MountTargets)))

				// NOTE: hack to wait for the file system to know it has no mount targets.
				// The 20s magic number is based on observation for 3 mount targets,
				// which is always the case for ecs test.
				if len(descMountRes.MountTargets) > 0 {
					time.Sleep(20 * time.Second)
				}
				delFsReq := &efs.DeleteFileSystemInput{FileSystemId: aws.String(fsId)}
				_, err = w.client.DeleteFileSystem(ctx, delFsReq)
				if err != nil {
					return fmt.Errorf("efs delete file system failed for %s: %w", fsId, err)
				}
				logger.Info("Deleted File System", zap.String("FileSystemId", fsId))
			}
		}
		if descFsRes.NextMarker != nil {
			descFsReq.Marker = descFsRes.NextMarker
		} else {
			break
		}
	}
	return nil
}