diff --git a/packages/api/internal/api/api.gen.go b/packages/api/internal/api/api.gen.go index b3acbb1ed3..22149d8ab8 100644 --- a/packages/api/internal/api/api.gen.go +++ b/packages/api/internal/api/api.gen.go @@ -2245,6 +2245,9 @@ type SandboxID = string // SecretID Identifier of the secret (sec_ prefixed), or its canonical lower-case name type SecretID = string +// SnapshotID Identifier of the snapshot (template ID) +type SnapshotID = string + // Tag Tag name type Tag = string @@ -2669,6 +2672,9 @@ type PostSecretsJSONRequestBody = NewSecret // PostSecretsSecretIDJSONRequestBody defines body for PostSecretsSecretID for application/json ContentType. type PostSecretsSecretIDJSONRequestBody = SecretUpdate +// PostSnapshotsSnapshotIDForkJSONRequestBody defines body for PostSnapshotsSnapshotIDFork for application/json ContentType. +type PostSnapshotsSnapshotIDForkJSONRequestBody = SandboxForkRequest + // DeleteTemplatesTagsJSONRequestBody defines body for DeleteTemplatesTags for application/json ContentType. type DeleteTemplatesTagsJSONRequestBody = DeleteTemplateTagsRequest @@ -3506,6 +3512,24 @@ type ClientInterface interface { // Corresponds with GET /snapshots (the `GetSnapshots` operationId). GetSnapshots(ctx context.Context, params *GetSnapshotsParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // PostSnapshotsSnapshotIDForkWithBody Fork snapshot + // + // Create one or more sandboxes from a named snapshot. The snapshot must be owned by the team. Each fork boots independently from the same snapshot and succeeds or fails independently; the outcome of each is reported in its entry of the response list. + // + // Takes any type of body and a specified content type. + // + // Corresponds with POST /snapshots/{snapshotID}/fork (the `PostSnapshotsSnapshotIDFork` operationId). + PostSnapshotsSnapshotIDForkWithBody(ctx context.Context, snapshotID SnapshotID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + // PostSnapshotsSnapshotIDFork Fork snapshot + // + // Create one or more sandboxes from a named snapshot. The snapshot must be owned by the team. Each fork boots independently from the same snapshot and succeeds or fails independently; the outcome of each is reported in its entry of the response list. + // + // Takes a body of the `application/json` content type. + // + // Corresponds with POST /snapshots/{snapshotID}/fork (the `PostSnapshotsSnapshotIDFork` operationId). + PostSnapshotsSnapshotIDFork(ctx context.Context, snapshotID SnapshotID, body PostSnapshotsSnapshotIDForkJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetTeams List teams // // List all teams. @@ -5161,6 +5185,44 @@ func (c *Client) GetSnapshots(ctx context.Context, params *GetSnapshotsParams, r return c.Client.Do(req) } +// PostSnapshotsSnapshotIDForkWithBody Fork snapshot +// +// Create one or more sandboxes from a named snapshot. The snapshot must be owned by the team. Each fork boots independently from the same snapshot and succeeds or fails independently; the outcome of each is reported in its entry of the response list. +// +// Takes any type of body and a specified content type. +// +// Corresponds with POST /snapshots/{snapshotID}/fork (the `PostSnapshotsSnapshotIDFork` operationId). +func (c *Client) PostSnapshotsSnapshotIDForkWithBody(ctx context.Context, snapshotID SnapshotID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostSnapshotsSnapshotIDForkRequestWithBody(c.Server, snapshotID, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +// PostSnapshotsSnapshotIDFork Fork snapshot +// +// Create one or more sandboxes from a named snapshot. The snapshot must be owned by the team. Each fork boots independently from the same snapshot and succeeds or fails independently; the outcome of each is reported in its entry of the response list. +// +// Takes a body of the `application/json` content type. +// +// Corresponds with POST /snapshots/{snapshotID}/fork (the `PostSnapshotsSnapshotIDFork` operationId). +func (c *Client) PostSnapshotsSnapshotIDFork(ctx context.Context, snapshotID SnapshotID, body PostSnapshotsSnapshotIDForkJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostSnapshotsSnapshotIDForkRequest(c.Server, snapshotID, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + // GetTeams List teams // // List all teams. @@ -8514,6 +8576,53 @@ func NewGetSnapshotsRequest(server string, params *GetSnapshotsParams) (*http.Re return req, nil } +// NewPostSnapshotsSnapshotIDForkRequest calls the generic PostSnapshotsSnapshotIDFork builder with application/json body +func NewPostSnapshotsSnapshotIDForkRequest(server string, snapshotID SnapshotID, body PostSnapshotsSnapshotIDForkJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewPostSnapshotsSnapshotIDForkRequestWithBody(server, snapshotID, "application/json", bodyReader) +} + +// NewPostSnapshotsSnapshotIDForkRequestWithBody constructs an http.Request for the PostSnapshotsSnapshotIDFork method, with any body, and a specified content type +func NewPostSnapshotsSnapshotIDForkRequestWithBody(server string, snapshotID SnapshotID, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "snapshotID", snapshotID, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/snapshots/%s/fork", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewGetTeamsRequest constructs an http.Request for the GetTeams method func NewGetTeamsRequest(server string) (*http.Request, error) { var err error @@ -11052,6 +11161,24 @@ type ClientWithResponsesInterface interface { // Corresponds with GET /snapshots (the `GetSnapshots` operationId). GetSnapshotsWithResponse(ctx context.Context, params *GetSnapshotsParams, reqEditors ...RequestEditorFn) (*GetSnapshotsResponse, error) + // PostSnapshotsSnapshotIDForkWithBodyWithResponse Fork snapshot + // + // Create one or more sandboxes from a named snapshot. The snapshot must be owned by the team. Each fork boots independently from the same snapshot and succeeds or fails independently; the outcome of each is reported in its entry of the response list. + // + // Takes any type of body and a specified content type, and returns a wrapper object for the known response body format(s). + // + // Corresponds with POST /snapshots/{snapshotID}/fork (the `PostSnapshotsSnapshotIDFork` operationId). + PostSnapshotsSnapshotIDForkWithBodyWithResponse(ctx context.Context, snapshotID SnapshotID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSnapshotsSnapshotIDForkResponse, error) + + // PostSnapshotsSnapshotIDForkWithResponse Fork snapshot + // + // Create one or more sandboxes from a named snapshot. The snapshot must be owned by the team. Each fork boots independently from the same snapshot and succeeds or fails independently; the outcome of each is reported in its entry of the response list. + // + // Takes a body of the `application/json` content type, and returns a wrapper object for the known response body format(s). + // + // Corresponds with POST /snapshots/{snapshotID}/fork (the `PostSnapshotsSnapshotIDFork` operationId). + PostSnapshotsSnapshotIDForkWithResponse(ctx context.Context, snapshotID SnapshotID, body PostSnapshotsSnapshotIDForkJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSnapshotsSnapshotIDForkResponse, error) + // GetTeamsWithResponse List teams // // List all teams. @@ -15703,6 +15830,75 @@ func (r GetSnapshotsResponse) ContentType() string { return "" } +type PostSnapshotsSnapshotIDForkResponse struct { + Body []byte + HTTPResponse *http.Response + // JSON201 the response for an HTTP 201 `application/json` response + JSON201 *[]SandboxForkResult + // JSON400 the response for an HTTP 400 `application/json` response + JSON400 *N400 + // JSON401 the response for an HTTP 401 `application/json` response + JSON401 *N401 + // JSON404 the response for an HTTP 404 `application/json` response + JSON404 *N404 + // JSON500 the response for an HTTP 500 `application/json` response + JSON500 *N500 +} + +// GetJSON201 returns the response for an HTTP 201 `application/json` response +func (r PostSnapshotsSnapshotIDForkResponse) GetJSON201() *[]SandboxForkResult { + return r.JSON201 +} + +// GetJSON400 returns the response for an HTTP 400 `application/json` response +func (r PostSnapshotsSnapshotIDForkResponse) GetJSON400() *N400 { + return r.JSON400 +} + +// GetJSON401 returns the response for an HTTP 401 `application/json` response +func (r PostSnapshotsSnapshotIDForkResponse) GetJSON401() *N401 { + return r.JSON401 +} + +// GetJSON404 returns the response for an HTTP 404 `application/json` response +func (r PostSnapshotsSnapshotIDForkResponse) GetJSON404() *N404 { + return r.JSON404 +} + +// GetJSON500 returns the response for an HTTP 500 `application/json` response +func (r PostSnapshotsSnapshotIDForkResponse) GetJSON500() *N500 { + return r.JSON500 +} + +// GetBody returns the raw response body bytes +func (r PostSnapshotsSnapshotIDForkResponse) GetBody() []byte { + return r.Body +} + +// Status returns HTTPResponse.Status +func (r PostSnapshotsSnapshotIDForkResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r PostSnapshotsSnapshotIDForkResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostSnapshotsSnapshotIDForkResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + // GetTeamsResponse429Headers the declared response headers of an HTTP 429 response for GetTeams type GetTeamsResponse429Headers struct { RetryAfter *int @@ -19450,6 +19646,36 @@ func (c *ClientWithResponses) GetSnapshotsWithResponse(ctx context.Context, para return ParseGetSnapshotsResponse(rsp) } +// PostSnapshotsSnapshotIDForkWithBodyWithResponse Fork snapshot +// +// Create one or more sandboxes from a named snapshot. The snapshot must be owned by the team. Each fork boots independently from the same snapshot and succeeds or fails independently; the outcome of each is reported in its entry of the response list. +// +// Takes any type of body and a specified content type, and returns a wrapper object for the known response body format(s). +// +// Corresponds with POST /snapshots/{snapshotID}/fork (the `PostSnapshotsSnapshotIDFork` operationId). +func (c *ClientWithResponses) PostSnapshotsSnapshotIDForkWithBodyWithResponse(ctx context.Context, snapshotID SnapshotID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSnapshotsSnapshotIDForkResponse, error) { + rsp, err := c.PostSnapshotsSnapshotIDForkWithBody(ctx, snapshotID, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePostSnapshotsSnapshotIDForkResponse(rsp) +} + +// PostSnapshotsSnapshotIDForkWithResponse Fork snapshot +// +// Create one or more sandboxes from a named snapshot. The snapshot must be owned by the team. Each fork boots independently from the same snapshot and succeeds or fails independently; the outcome of each is reported in its entry of the response list. +// +// Takes a body of the `application/json` content type, and returns a wrapper object for the known response body format(s). +// +// Corresponds with POST /snapshots/{snapshotID}/fork (the `PostSnapshotsSnapshotIDFork` operationId). +func (c *ClientWithResponses) PostSnapshotsSnapshotIDForkWithResponse(ctx context.Context, snapshotID SnapshotID, body PostSnapshotsSnapshotIDForkJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSnapshotsSnapshotIDForkResponse, error) { + rsp, err := c.PostSnapshotsSnapshotIDFork(ctx, snapshotID, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePostSnapshotsSnapshotIDForkResponse(rsp) +} + // GetTeamsWithResponse List teams // // List all teams. @@ -23847,6 +24073,60 @@ func ParseGetSnapshotsResponse(rsp *http.Response) (*GetSnapshotsResponse, error return response, nil } +// ParsePostSnapshotsSnapshotIDForkResponse parses an HTTP response from a PostSnapshotsSnapshotIDForkWithResponse call +func ParsePostSnapshotsSnapshotIDForkResponse(rsp *http.Response) (*PostSnapshotsSnapshotIDForkResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &PostSnapshotsSnapshotIDForkResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: + var dest []SandboxForkResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON201 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest N400 + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401: + var dest N401 + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON401 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + var dest N404 + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON404 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: + var dest N500 + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON500 = &dest + + } + + return response, nil +} + // ParseGetTeamsResponse parses an HTTP response from a GetTeamsWithResponse call func ParseGetTeamsResponse(rsp *http.Response) (*GetTeamsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -26424,6 +26704,9 @@ type ServerInterface interface { // GetSnapshots List snapshots // (GET /snapshots) GetSnapshots(c *gin.Context, params GetSnapshotsParams) + // PostSnapshotsSnapshotIDFork Fork snapshot + // (POST /snapshots/{snapshotID}/fork) + PostSnapshotsSnapshotIDFork(c *gin.Context, snapshotID SnapshotID) // GetTeams List teams // (GET /teams) GetTeams(c *gin.Context) @@ -28062,6 +28345,31 @@ func (siw *ServerInterfaceWrapper) GetSnapshots(c *gin.Context) { siw.Handler.GetSnapshots(c, params) } +// PostSnapshotsSnapshotIDFork operation middleware +func (siw *ServerInterfaceWrapper) PostSnapshotsSnapshotIDFork(c *gin.Context) { + + var err error + _ = err + + // ------------- Path parameter "snapshotID" ------------- + var snapshotID SnapshotID + + err = runtime.BindStyledParameterWithOptions("simple", "snapshotID", c.Param("snapshotID"), &snapshotID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) + if err != nil { + siw.ErrorHandler(c, fmt.Errorf("Invalid format for parameter snapshotID: %w", err), http.StatusBadRequest) + return + } + + for _, middleware := range siw.HandlerMiddlewares { + middleware(c) + if c.IsAborted() { + return + } + } + + siw.Handler.PostSnapshotsSnapshotIDFork(c, snapshotID) +} + // GetTeams operation middleware func (siw *ServerInterfaceWrapper) GetTeams(c *gin.Context) { @@ -29224,6 +29532,7 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options router.POST(options.BaseURL+"/sandboxes/:sandboxID/refreshes", wrapper.PostSandboxesSandboxIDRefreshes) router.POST(options.BaseURL+"/sandboxes/:sandboxID/snapshots", wrapper.PostSandboxesSandboxIDSnapshots) router.GET(options.BaseURL+"/snapshots", wrapper.GetSnapshots) + router.POST(options.BaseURL+"/snapshots/:snapshotID/fork", wrapper.PostSnapshotsSnapshotIDFork) router.POST(options.BaseURL+"/v3/templates", wrapper.PostV3Templates) router.GET(options.BaseURL+"/v2/templates", wrapper.GetV2Templates) router.GET(options.BaseURL+"/templates/:templateID/files/:hash", wrapper.GetTemplatesTemplateIDFilesHash) @@ -29291,395 +29600,401 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/packages/api/internal/handlers/snapshot_fork.go b/packages/api/internal/handlers/snapshot_fork.go new file mode 100644 index 0000000000..df273815d6 --- /dev/null +++ b/packages/api/internal/handlers/snapshot_fork.go @@ -0,0 +1,209 @@ +package handlers + +import ( + "context" + "fmt" + "net/http" + "net/url" + "time" + + "github.com/gin-gonic/gin" + "go.opentelemetry.io/otel/trace" + "golang.org/x/sync/errgroup" + + "github.com/e2b-dev/infra/packages/api/internal/api" + templatecache "github.com/e2b-dev/infra/packages/api/internal/cache/templates" + apiorch "github.com/e2b-dev/infra/packages/api/internal/orchestrator" + "github.com/e2b-dev/infra/packages/api/internal/sandbox" + "github.com/e2b-dev/infra/packages/auth/pkg/auth" + "github.com/e2b-dev/infra/packages/db/queries" + "github.com/e2b-dev/infra/packages/shared/pkg/clusters" + "github.com/e2b-dev/infra/packages/shared/pkg/ginutils" + "github.com/e2b-dev/infra/packages/shared/pkg/id" + sbxlogger "github.com/e2b-dev/infra/packages/shared/pkg/logger/sandbox" + "github.com/e2b-dev/infra/packages/shared/pkg/telemetry" + sharedUtils "github.com/e2b-dev/infra/packages/shared/pkg/utils" +) + +// PostSnapshotsSnapshotIDFork creates count new sandboxes from a named +// snapshot template. No running sandbox is required: the snapshot must exist +// as a persistent snapshot template owned by the team. Each fork boots +// independently from the same snapshot and succeeds or fails independently. +func (a *APIStore) PostSnapshotsSnapshotIDFork(c *gin.Context, rawSnapshotID api.SnapshotID) { + ctx := c.Request.Context() + + teamInfo := auth.MustGetTeamInfo(c) + teamID := teamInfo.Team.ID + + // snapshotID may arrive URL-encoded when the alias contains a slash. + snapshotID, err := url.PathUnescape(rawSnapshotID) + if err != nil { + a.sendAPIStoreError(c, http.StatusBadRequest, "Invalid snapshot ID") + return + } + + span := trace.SpanFromContext(ctx) + traceID := span.SpanContext().TraceID().String() + c.Set("traceID", traceID) + + body, err := ginutils.ParseOptionalBody[api.PostSnapshotsSnapshotIDForkJSONRequestBody](ctx, c) + if err != nil { + a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Error when parsing request: %s", err)) + return + } + + forkTimeout := sandbox.SandboxTimeoutDefault + if body.Timeout != nil { + forkTimeout = time.Duration(*body.Timeout) * time.Second + if forkTimeout > time.Duration(teamInfo.Limits.MaxLengthHours)*time.Hour { + a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Timeout cannot be greater than %d hours", teamInfo.Limits.MaxLengthHours)) + return + } + } + + forkCount := 1 + if body.Count != nil { + forkCount = int(*body.Count) + } + + if forkCount < 1 { + a.sendAPIStoreError(c, http.StatusBadRequest, "Count must be at least 1") + return + } + + if forkCount > maxForkCount { + a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Count cannot be greater than %d", maxForkCount)) + return + } + + if int64(forkCount) > teamInfo.Limits.SandboxConcurrency { + a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Count must not exceed the maximum number of concurrent sandboxes (%d)", teamInfo.Limits.SandboxConcurrency)) + return + } + + // Resolve snapshotID (may be templateID:tag or namespace/alias:tag). + identifier, tag, err := id.ParseName(snapshotID) + if err != nil { + a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Invalid snapshot ID: %s", err)) + return + } + + if err := id.ValidateNamespaceMatchesTeam(identifier, teamInfo.Slug); err != nil { + a.sendAPIStoreError(c, http.StatusBadRequest, err.Error()) + return + } + + aliasInfo, resolveErr := a.templateCache.ResolveAlias(ctx, identifier, teamInfo.Slug) + if resolveErr != nil { + apiErr := templatecache.ErrorToAPIError(resolveErr, identifier) + a.sendAPIStoreError(c, apiErr.Code, apiErr.ClientMsg) + return + } + + if aliasInfo.TeamID != teamID { + a.sendAPIStoreError(c, http.StatusNotFound, fmt.Sprintf("Snapshot '%s' not found", snapshotID)) + return + } + + templateID := aliasInfo.TemplateID + tagStr := id.DefaultTag + if tag != nil { + tagStr = *tag + } + + // Look up the source sandboxID for this snapshot template. + snapTemplates, dbErr := a.sqlcDB.ListTeamSnapshotTemplates(ctx, queries.ListTeamSnapshotTemplatesParams{ + TeamID: teamID, + EnvID: &templateID, + Tag: &tagStr, + CursorTime: time.Now().Add(24 * time.Hour), + CursorID: maxSnapshotTemplateID, + PageLimit: 1, + }) + if dbErr != nil { + telemetry.ReportCriticalError(ctx, "error looking up snapshot template", dbErr) + a.sendAPIStoreError(c, http.StatusInternalServerError, "Error looking up snapshot") + return + } + + if len(snapTemplates) == 0 { + a.sendAPIStoreError(c, http.StatusNotFound, fmt.Sprintf("Snapshot '%s' not found", snapshotID)) + return + } + + // Fetch build data via templateCache. This path uses env_build_assignments + // for the persistent template env — it does not depend on the ephemeral + // snapshot env (source='snapshot') which is soft-deleted when the original + // sandbox is killed. + clusterID := clusters.WithClusterFallback(teamInfo.Team.ClusterID) + env, build, cacheErr := a.templateCache.Get(ctx, templateID, &tagStr, teamID, clusterID) + if cacheErr != nil { + visible := aliasInfo.TeamID == teamID + ref := templatecache.TemplateRef{Identifier: aliasInfo.MatchedIdentifier, Visible: visible} + apiErr := ref.APIError(cacheErr) + a.sendAPIStoreError(c, apiErr.Code, apiErr.ClientMsg) + return + } + + if vErr := sharedUtils.CheckEnvdVersionForSnapshot(sharedUtils.DerefOrDefault(build.EnvdVersion, "")); vErr != nil { + a.sendAPIStoreError(c, http.StatusBadRequest, vErr.Error()) + return + } + + sourceSandboxID := snapTemplates[0].SandboxID + alias := "" + if len(env.Names) > 0 { + alias = env.Names[0] + } + + sbxlogger.E(&sbxlogger.SandboxMetadata{ + TemplateID: templateID, + TeamID: teamID.String(), + }).Debug(ctx, fmt.Sprintf("Forking %d sandbox(es) from snapshot %s (source sandbox %s)", forkCount, snapshotID, sourceSandboxID)) + + // Boot all forks in parallel from the same immutable snapshot checkpoint. + results := make([]api.SandboxForkResult, forkCount) + + wg := errgroup.Group{} + for i := range forkCount { + wg.Go(func() error { + forkedSandboxID := InstanceIDPrefix + id.Generate() + + getSandboxData := func(_ context.Context) (apiorch.SandboxMetadata, *api.APIError) { + return apiorch.SandboxMetadata{ + Build: *build, + TemplateID: env.TemplateID, + BaseTemplateID: env.TemplateID, + Alias: alias, + // SnapshotSandboxID is set so that placement remapping on + // resume-timeout uses the right sandbox ID. + SnapshotSandboxID: sourceSandboxID, + }, nil + } + + forkedSbx, createErr := a.startSandbox( + ctx, + forkedSandboxID, + forkTimeout, + teamInfo, + getSandboxData, + &c.Request.Header, + true, // isResume: restore checkpoint + false, // demandFilesystemBoot: snapshot forks resume the stored memory image + nil, // mcp + ) + if createErr != nil { + telemetry.ReportError(ctx, "error creating sandbox from snapshot fork", createErr.Err, telemetry.WithSandboxID(forkedSandboxID)) + results[i] = api.SandboxForkResult{Error: &api.Error{Code: int32(createErr.Code), Message: createErr.ClientMsg}} + //nolint:nilerr + return nil + } + + results[i] = api.SandboxForkResult{Sandbox: forkedSbx} + return nil + }) + } + _ = wg.Wait() + + c.JSON(http.StatusCreated, results) +} diff --git a/spec/openapi.yml b/spec/openapi.yml index 58a6bc7c22..206fd83f00 100644 --- a/spec/openapi.yml +++ b/spec/openapi.yml @@ -4400,6 +4400,47 @@ paths: "500": $ref: "#/components/responses/500" + /snapshots/{snapshotID}/fork: + post: + summary: Fork snapshot + description: >- + Create one or more sandboxes from a named snapshot. The snapshot must be + owned by the team. Each fork boots independently from the same snapshot + and succeeds or fails independently; the outcome of each is reported in + its entry of the response list. + tags: [snapshots] + security: + - ApiKeyAuth: [] + - AuthProviderBearerAuth: [] + AuthProviderTeamAuth: [] + - AdminApiKeyAuth: [] + AdminTeamAuth: [] + parameters: + - $ref: "#/components/parameters/snapshotID" + requestBody: + required: false + content: + application/json: + schema: + $ref: "#/components/schemas/SandboxForkRequest" + responses: + "201": + description: The forks were attempted; each entry reports one fork's outcome + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/SandboxForkResult" + "400": + $ref: "#/components/responses/400" + "401": + $ref: "#/components/responses/401" + "404": + $ref: "#/components/responses/404" + "500": + $ref: "#/components/responses/500" + /v3/templates: post: summary: Create template (v3)