Skip to content

Commit 1f11b45

Browse files
authored
Merge pull request #43 from crytic/pull-and-clean
Pull and clean
2 parents 20251d4 + a0783b9 commit 1f11b45

File tree

11 files changed

+366
-241
lines changed

11 files changed

+366
-241
lines changed

cmd/cloudexec/cancel.go

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,54 @@ import (
66

77
"github.com/crytic/cloudexec/pkg/config"
88
do "github.com/crytic/cloudexec/pkg/digitalocean"
9-
"github.com/crytic/cloudexec/pkg/ssh"
109
"github.com/crytic/cloudexec/pkg/state"
1110
)
1211

13-
func CancelJob(job *state.Job, existingState *state.State, config config.Config) error {
12+
func CancelJob(config config.Config, existingState *state.State, job *state.Job, force bool) error {
1413
if job.Status != state.Provisioning && job.Status != state.Running {
1514
return fmt.Errorf("Job %v is not running, it is %s", job.ID, job.Status)
1615
}
17-
18-
fmt.Printf("Droplet %s associated with job %v: IP=%v | CreatedAt=%s\n", job.Droplet.Name, job.ID, job.Droplet.IP, job.Droplet.Created)
19-
fmt.Println("Destroy this droplet? (y/n)")
20-
var response string
21-
fmt.Scanln(&response)
22-
if strings.ToLower(response) == "y" {
23-
fmt.Printf("Destroying droplet %v...\n", job.Droplet.ID)
24-
err := do.DeleteDroplet(config, job.Droplet.ID)
25-
if err != nil {
26-
return fmt.Errorf("Failed to destroy droplet: %w", err)
16+
fmt.Printf("Destroying droplet %s associated with job %v: IP=%v | CreatedAt=%s\n", job.Droplet.Name, job.ID, job.Droplet.IP, job.Droplet.Created)
17+
if !force { // Ask for confirmation before cleaning this job if no force flag
18+
fmt.Println("Confirm? (y/n)")
19+
var response string
20+
fmt.Scanln(&response)
21+
if strings.ToLower(response) != "y" {
22+
fmt.Printf("Droplet %s was not destroyed\n", job.Droplet.Name)
23+
return nil
2724
}
28-
fmt.Printf("Removing ssh config for droplet %v...\n", job.Droplet.ID)
29-
err = ssh.DeleteSSHConfig(job.ID)
30-
if err != nil {
31-
return fmt.Errorf("Failed to delete ssh config: %w", err)
25+
}
26+
fmt.Printf("Destroying droplet %v...\n", job.Droplet.ID)
27+
err := do.DeleteDroplet(config, job.Droplet.ID)
28+
if err != nil {
29+
return fmt.Errorf("Failed to destroy droplet: %w", err)
30+
}
31+
fmt.Printf("Marking job %v as cancelled...\n", job.Droplet.ID)
32+
err = existingState.CancelRunningJob(config, job.ID)
33+
if err != nil {
34+
return fmt.Errorf("Failed to mark job as cancelled: %w", err)
35+
}
36+
return nil
37+
}
38+
39+
func CancelAll(config config.Config, existingState *state.State, force bool) error {
40+
droplets, err := do.GetAllDroplets(config)
41+
if err != nil {
42+
return fmt.Errorf("Failed to get all running servers: %w", err)
43+
}
44+
if len(droplets) == 0 {
45+
fmt.Println("No running servers found")
46+
return nil
47+
}
48+
fmt.Printf("Found %v running server(s):\n", len(droplets))
49+
for _, job := range existingState.Jobs {
50+
if job.Status != state.Provisioning && job.Status != state.Running {
51+
continue // skip jobs that aren't running
3252
}
33-
fmt.Printf("Marking job %v as cancelled...\n", job.Droplet.ID)
34-
err = existingState.CancelRunningJob(config, job.ID)
53+
err = CancelJob(config, existingState, &job, force)
3554
if err != nil {
36-
return fmt.Errorf("Failed to mark job as cancelled: %w", err)
55+
fmt.Printf("Failed to cancel job %v", job.ID)
3756
}
38-
fmt.Println("Done")
39-
} else {
40-
fmt.Printf("Job %v was not cancelled\n", job.ID)
4157
}
4258
return nil
4359
}

cmd/cloudexec/clean.go

Lines changed: 48 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

cmd/cloudexec/launch.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func Launch(config config.Config, dropletSize string, dropletRegion string, lc L
115115
newState.CreateJob(newJob)
116116
// sync state to bucket
117117
fmt.Printf("Adding new job to the state...\n")
118-
err = state.UpdateState(config, newState)
118+
err = state.MergeAndSave(config, newState)
119119
if err != nil {
120120
return fmt.Errorf("Failed to update S3 state: %w", err)
121121
}
@@ -161,7 +161,7 @@ func Launch(config config.Config, dropletSize string, dropletRegion string, lc L
161161
}
162162
}
163163
fmt.Printf("Uploading new state to %s\n", bucketName)
164-
err = state.UpdateState(config, newState)
164+
err = state.MergeAndSave(config, newState)
165165
if err != nil {
166166
return fmt.Errorf("Failed to update S3 state: %w", err)
167167
}

0 commit comments

Comments
 (0)