(req WorkspaceSessionRequest)
| 154 | } |
| 155 | |
| 156 | func (s Service) CreateSessionFromWorkspace(req WorkspaceSessionRequest) (string, error) { |
| 157 | if req.TaskPath == "" { |
| 158 | return "", fmt.Errorf("task path is required") |
| 159 | } |
| 160 | if req.WorkspacePath == "" { |
| 161 | return "", fmt.Errorf("workspace path is required") |
| 162 | } |
| 163 | task, raw, err := LoadTask(req.TaskPath) |
| 164 | if err != nil { |
| 165 | return "", err |
| 166 | } |
| 167 | runID := req.RunID |
| 168 | if runID == "" { |
| 169 | runID = task.RunID |
| 170 | } |
| 171 | if runID == "" { |
| 172 | runID = ids.New("run") |
| 173 | } |
| 174 | sessionID := ids.New("sbx") |
| 175 | leaseID := ids.New("lease") |
| 176 | now := time.Now().UTC().Format(time.RFC3339Nano) |
| 177 | if _, err := s.DB.Exec(`INSERT INTO leases (id, run_id, task_path, task_yaml, status, created_at, updated_at) |
| 178 | VALUES (?, ?, ?, ?, 'allocated', ?, ?)`, leaseID, runID, req.TaskPath, string(raw), now, now); err != nil { |
| 179 | return "", err |
| 180 | } |
| 181 | decision, err := (scheduler.Scheduler{DB: s.DB}).Admit(scheduler.Request{ |
| 182 | RunID: runID, |
| 183 | SessionID: sessionID, |
| 184 | Runtime: s.runtimeName(), |
| 185 | RiskTier: task.RiskTier, |
| 186 | CPURequest: task.CPURequest, |
| 187 | MemoryMB: task.MemoryMB, |
| 188 | SnapshotID: req.ParentSnapshotID, |
| 189 | }) |
| 190 | if err != nil { |
| 191 | return "", err |
| 192 | } |
| 193 | if !decision.Admitted { |
| 194 | return "", fmt.Errorf("admission rejected: reject_reason=%s effective_cpu=%.3f debt=%.3f burst_risk=%s overcommit_ratio=%.2f queue_pressure=%s memory_pressure=%s memory_allocated_mb=%d memory_request_mb=%d memory_capacity_mb=%d", |
| 195 | decision.RejectReason, decision.EffectiveCPU, decision.ActiveCPUDebt, decision.BurstRisk, decision.OvercommitRatio, decision.QueuePressure, decision.MemoryPressure, decision.MemoryAllocatedMB, decision.MemoryRequestMB, decision.MemoryCapacityMB) |
| 196 | } |
| 197 | var egressProxy egress.ProxyInfo |
| 198 | if s.isDockerRuntime() { |
| 199 | egressProxy, err = (egress.Service{DB: s.DB, Paths: s.Paths}).EnsureSessionProxy(runID, sessionID) |
| 200 | if err != nil { |
| 201 | return "", err |
| 202 | } |
| 203 | } |
| 204 | start := time.Now() |
| 205 | containerID, err := s.createRuntimeSession(runtimeplane.CreateSessionRequest{ |
| 206 | SessionID: sessionID, |
| 207 | LeaseID: leaseID, |
| 208 | RunID: runID, |
| 209 | Image: task.Image, |
| 210 | WorkspaceHostPath: req.WorkspacePath, |
| 211 | MemoryMB: task.MemoryMB, |
| 212 | CPURequest: task.CPURequest, |
| 213 | NetworkMode: task.NetworkMode, |
no test coverage detected