Skip to content

Commit bcc6ea8

Browse files
joe-lombrozo-s-bot[bot]djeebotdjeebus
authored
feat(cli): add pause and resume commands for sandboxes (#1170)
Co-authored-by: djeebot <djeebot@users.noreply.github.com> Co-authored-by: Joseph Lombrozo <joe.lombrozo@e2b.dev>
1 parent 01f5713 commit bcc6ea8

4 files changed

Lines changed: 88 additions & 0 deletions

File tree

.changeset/add-pause-command.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"@e2b/cli": minor
3+
---
4+
5+
Add `pause` and `resume` commands to manage sandbox state.
6+
7+
- `e2b sandbox pause <sandboxID>` - pause a running sandbox
8+
- `e2b sandbox resume <sandboxID>` - resume a paused sandbox

packages/cli/src/commands/sandbox/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import * as commander from 'commander'
33
import { connectCommand } from './connect'
44
import { listCommand } from './list'
55
import { killCommand } from './kill'
6+
import { pauseCommand } from './pause'
7+
import { resumeCommand } from './resume'
68
import { createCommand } from './create'
79
import { logsCommand } from './logs'
810
import { metricsCommand } from './metrics'
@@ -14,6 +16,8 @@ export const sandboxCommand = new commander.Command('sandbox')
1416
.addCommand(connectCommand)
1517
.addCommand(listCommand)
1618
.addCommand(killCommand)
19+
.addCommand(pauseCommand)
20+
.addCommand(resumeCommand)
1721
.addCommand(createCommand('create', 'cr', false))
1822
.addCommand(createCommand('spawn', 'sp', true), { hidden: true })
1923
.addCommand(logsCommand)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import * as commander from 'commander'
2+
3+
import { ensureAPIKey } from 'src/api'
4+
import { asBold } from 'src/utils/format'
5+
import * as e2b from 'e2b'
6+
import { NotFoundError } from 'e2b'
7+
8+
async function pauseSandbox(sandboxID: string, apiKey: string) {
9+
try {
10+
const paused = await e2b.Sandbox.betaPause(sandboxID, { apiKey })
11+
if (paused) {
12+
console.log(`Sandbox ${asBold(sandboxID)} has been paused`)
13+
} else {
14+
console.log(`Sandbox ${asBold(sandboxID)} is already paused`)
15+
}
16+
} catch (err: unknown) {
17+
if (err instanceof NotFoundError) {
18+
console.error(`Sandbox ${asBold(sandboxID)} wasn't found`)
19+
process.exit(1)
20+
}
21+
throw err
22+
}
23+
}
24+
25+
export const pauseCommand = new commander.Command('pause')
26+
.description('pause sandbox')
27+
.argument(
28+
'<sandboxID>',
29+
`pause the sandbox specified by ${asBold('<sandboxID>')}`
30+
)
31+
.alias('ps')
32+
.action(async (sandboxID: string) => {
33+
try {
34+
const apiKey = ensureAPIKey()
35+
await pauseSandbox(sandboxID, apiKey)
36+
} catch (err: unknown) {
37+
console.error(err)
38+
process.exit(1)
39+
}
40+
})
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import * as commander from 'commander'
2+
3+
import { ensureAPIKey } from 'src/api'
4+
import { asBold } from 'src/utils/format'
5+
import * as e2b from 'e2b'
6+
import { NotFoundError } from 'e2b'
7+
8+
async function resumeSandbox(sandboxID: string, apiKey: string) {
9+
try {
10+
await e2b.Sandbox.connect(sandboxID, { apiKey })
11+
console.log(`Sandbox ${asBold(sandboxID)} has been resumed`)
12+
} catch (err: unknown) {
13+
if (err instanceof NotFoundError) {
14+
console.error(`Sandbox ${asBold(sandboxID)} wasn't found`)
15+
process.exit(1)
16+
}
17+
throw err
18+
}
19+
}
20+
21+
export const resumeCommand = new commander.Command('resume')
22+
.description('resume paused sandbox')
23+
.argument(
24+
'<sandboxID>',
25+
`resume the sandbox specified by ${asBold('<sandboxID>')}`
26+
)
27+
.alias('rs')
28+
.action(async (sandboxID: string) => {
29+
try {
30+
const apiKey = ensureAPIKey()
31+
await resumeSandbox(sandboxID, apiKey)
32+
} catch (err: unknown) {
33+
console.error(err)
34+
process.exit(1)
35+
}
36+
})

0 commit comments

Comments
 (0)