@@ -5,60 +5,70 @@ import (
55 "strings"
66
77 "github.com/crytic/cloudexec/pkg/config"
8- do "github.com/crytic/cloudexec/pkg/digitalocean"
98 "github.com/crytic/cloudexec/pkg/s3"
9+ "github.com/crytic/cloudexec/pkg/ssh"
1010 "github.com/crytic/cloudexec/pkg/state"
1111)
1212
13- func ConfirmCancelAll (config config.Config , existingState * state.State ) error {
14- droplets , err := do .GetAllDroplets (config )
13+ func CleanBucketJob (config config.Config , existingState * state.State , jobID int64 , force bool ) error {
14+ prefix := fmt .Sprintf ("job-%v" , jobID )
15+ objects , err := s3 .ListObjects (config , prefix )
1516 if err != nil {
16- return fmt .Errorf ("Failed to get all running servers : %w" , err )
17+ return fmt .Errorf ("Failed to list objects in bucket with prefix %s : %w" , prefix , err )
1718 }
18- if len (droplets ) == 0 {
19- fmt .Printf ("Zero servers found\n " )
19+ // Confirm job data deletion
20+ var numToRm int = len (objects )
21+ if numToRm == 0 {
22+ fmt .Printf ("Bucket is already empty.\n " )
2023 return nil
2124 }
22- fmt .Printf ("Found %v running server(s):\n " , len (droplets ))
23- for _ , job := range existingState .Jobs {
24- if job .Status != state .Provisioning && job .Status != state .Running {
25- continue // skip jobs that aren't running
25+ fmt .Printf ("Removing ALL input, output, and logs associated with %s...\n " , prefix )
26+ if ! force { // Ask for confirmation before cleaning this job if no force flag
27+ fmt .Println ("Confirm? (y/n)" )
28+ var response string
29+ fmt .Scanln (& response )
30+ if strings .ToLower (response ) != "y" {
31+ fmt .Printf ("Job %v was not cleaned\n " , jobID )
32+ return nil
2633 }
27- err = CancelJob (& job , existingState , config )
34+ }
35+ fmt .Printf ("Deleting bucket contents...\n " )
36+ // Delete all objects in the bucket
37+ for _ , object := range objects {
38+ fmt .Println ("Deleting object: " , object )
39+ err = s3 .DeleteObject (config , object )
2840 if err != nil {
29- fmt . Printf ( "Failed to cancel job %v" , job . ID )
41+ return err
3042 }
3143 }
32- return nil
33- }
34-
35- func ResetBucket (config config.Config ) error {
36- objects , err := s3 .ListObjects (config , "" )
44+ fmt .Printf ("Deleted %d objects from bucket, removing job %v from state file..\n " , numToRm , jobID )
45+ newState := & state.State {}
46+ deleteJob := state.Job {
47+ ID : jobID ,
48+ Delete : true ,
49+ }
50+ newState .CreateJob (deleteJob )
51+ err = state .MergeAndSave (config , newState )
3752 if err != nil {
38- return fmt .Errorf ("Failed to list objects in bucket : %w" , err )
53+ return fmt .Errorf ("Error removing %s from state file : %w\n " , prefix , err )
3954 }
55+ fmt .Printf ("Removing ssh config for job %v...\n " , jobID )
56+ err = ssh .DeleteSSHConfig (jobID )
57+ if err != nil {
58+ return fmt .Errorf ("Failed to delete ssh config: %w" , err )
59+ }
60+ return nil
61+ }
4062
41- // Confirm bucket deletion
42- var numToRm int = len (objects )
43- if numToRm == 0 {
44- fmt .Printf ("Bucket is already empty.\n " )
63+ func CleanBucketAll (config config.Config , existingState * state.State , force bool ) error {
64+ if len (existingState .Jobs ) == 0 {
65+ fmt .Println ("No jobs are available" )
4566 return nil
46- } else {
47- fmt .Printf ("Removing the first %d items from bucket...\n " , numToRm )
48- fmt .Println ("Confirm? (y/n)" )
49- var response string
50- fmt .Scanln (& response )
51- if strings .ToLower (response ) == "y" {
52- fmt .Printf ("Deleting bucket contents...\n " )
53- // Delete all objects in the bucket
54- for _ , object := range objects {
55- fmt .Println ("Deleting object: " , object )
56- err = s3 .DeleteObject (config , object )
57- if err != nil {
58- return err
59- }
60- }
61- fmt .Printf ("Deleted %d objects from bucket...\n " , numToRm )
67+ }
68+ for _ , job := range existingState .Jobs {
69+ err := CleanBucketJob (config , existingState , job .ID , force )
70+ if err != nil {
71+ return err
6272 }
6373 }
6474 return nil
0 commit comments