diff --git a/cmd/api/api/builds.go b/cmd/api/api/builds.go index a9e67a14..5478edeb 100644 --- a/cmd/api/api/builds.go +++ b/cmd/api/api/builds.go @@ -43,7 +43,7 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe // Parse multipart form fields var sourceData []byte var baseImageDigest, cacheScope, dockerfile, globalCacheKey, imageName string - var timeoutSeconds int + var timeoutSeconds, memoryMB, cpus int var isAdminBuild bool var secrets []builds.SecretRef @@ -106,6 +106,28 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe if v, err := strconv.Atoi(string(data)); err == nil { timeoutSeconds = v } + case "memory_mb": + data, err := io.ReadAll(part) + if err != nil { + return oapi.CreateBuild400JSONResponse{ + Code: "invalid_request", + Message: "failed to read memory_mb field", + }, nil + } + if v, err := strconv.Atoi(string(data)); err == nil { + memoryMB = v + } + case "cpus": + data, err := io.ReadAll(part) + if err != nil { + return oapi.CreateBuild400JSONResponse{ + Code: "invalid_request", + Message: "failed to read cpus field", + }, nil + } + if v, err := strconv.Atoi(string(data)); err == nil { + cpus = v + } case "secrets": data, err := io.ReadAll(part) if err != nil { @@ -183,10 +205,18 @@ func (s *ApiService) CreateBuild(ctx context.Context, request oapi.CreateBuildRe ImageName: imageName, } - // Apply timeout if provided - if timeoutSeconds > 0 { + // Apply build policy if any field was provided + if timeoutSeconds > 0 || memoryMB > 0 || cpus > 0 { domainReq.BuildPolicy = &builds.BuildPolicy{ TimeoutSeconds: timeoutSeconds, + MemoryMB: memoryMB, + CPUs: cpus, + } + if err := domainReq.BuildPolicy.Validate(); err != nil { + return oapi.CreateBuild400JSONResponse{ + Code: "invalid_request", + Message: err.Error(), + }, nil } } diff --git a/lib/builds/types.go b/lib/builds/types.go index 3fde87cf..7de9d876 100644 --- a/lib/builds/types.go +++ b/lib/builds/types.go @@ -2,7 +2,10 @@ // inside ephemeral Cloud Hypervisor microVMs for multi-tenant isolation. package builds -import "time" +import ( + "fmt" + "time" +) // Build status constants const ( @@ -211,6 +214,13 @@ type BuildResult struct { DurationMS int64 `json:"duration_ms"` } +const ( + // MaxBuildCPUs is the maximum number of vCPUs for a builder VM + MaxBuildCPUs = 8 + // MaxBuildMemoryMB is the maximum memory in MB for a builder VM (16GB) + MaxBuildMemoryMB = 16384 +) + // DefaultBuildPolicy returns the default build policy func DefaultBuildPolicy() BuildPolicy { return BuildPolicy{ @@ -224,16 +234,28 @@ func DefaultBuildPolicy() BuildPolicy { // ApplyDefaults fills in default values for a build policy func (p *BuildPolicy) ApplyDefaults() { defaults := DefaultBuildPolicy() - if p.TimeoutSeconds == 0 { + if p.TimeoutSeconds <= 0 { p.TimeoutSeconds = defaults.TimeoutSeconds } - if p.MemoryMB == 0 { + if p.MemoryMB <= 0 { p.MemoryMB = defaults.MemoryMB } - if p.CPUs == 0 { + if p.CPUs <= 0 { p.CPUs = defaults.CPUs } if p.NetworkMode == "" { p.NetworkMode = defaults.NetworkMode } } + +// Validate checks that the build policy values are within allowed limits. +// Returns an error if any value exceeds the maximum. +func (p *BuildPolicy) Validate() error { + if p.CPUs > MaxBuildCPUs { + return fmt.Errorf("cpus exceeds maximum of %d", MaxBuildCPUs) + } + if p.MemoryMB > MaxBuildMemoryMB { + return fmt.Errorf("memory_mb exceeds maximum of %d MB", MaxBuildMemoryMB) + } + return nil +} diff --git a/lib/oapi/oapi.go b/lib/oapi/oapi.go index d9f642c2..00aa62e9 100644 --- a/lib/oapi/oapi.go +++ b/lib/oapi/oapi.go @@ -845,6 +845,9 @@ type CreateBuildMultipartBody struct { // CacheScope Tenant-specific cache key prefix CacheScope *string `json:"cache_scope,omitempty"` + // Cpus Number of vCPUs for builder VM (default 2) + Cpus *int `json:"cpus,omitempty"` + // Dockerfile Dockerfile content. Required if not included in the source tarball. Dockerfile *string `json:"dockerfile,omitempty"` @@ -861,6 +864,9 @@ type CreateBuildMultipartBody struct { // Admin builds can populate the shared global cache that all tenant builds read from. IsAdminBuild *string `json:"is_admin_build,omitempty"` + // MemoryMb Memory limit for builder VM in MB (default 2048) + MemoryMb *int `json:"memory_mb,omitempty"` + // Secrets JSON array of secret references to inject during build. // Each object has "id" (required) for use with --mount=type=secret,id=... // Example: [{"id": "npm_token"}, {"id": "github_token"}] @@ -10748,177 +10754,178 @@ func (sh *strictHandler) GetVolume(w http.ResponseWriter, r *http.Request, id st // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "8fXH/w0AAP//BoNb0R/rAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/openapi.yaml b/openapi.yaml index 2e6977fd..8e60ee13 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -2440,6 +2440,12 @@ paths: timeout_seconds: type: integer description: Build timeout (default 600) + memory_mb: + type: integer + description: Memory limit for builder VM in MB (default 2048) + cpus: + type: integer + description: Number of vCPUs for builder VM (default 2) image_name: type: string description: |