| 74 | } |
| 75 | |
| 76 | func (s Service) CreateSession(leaseID string) (string, error) { |
| 77 | var runID, taskPath string |
| 78 | if err := s.DB.QueryRow(`SELECT run_id, task_path FROM leases WHERE id = ?`, leaseID).Scan(&runID, &taskPath); err != nil { |
| 79 | return "", err |
| 80 | } |
| 81 | task, _, err := LoadTask(taskPath) |
| 82 | if err != nil { |
| 83 | return "", err |
| 84 | } |
| 85 | sessionID := ids.New("sbx") |
| 86 | workspace := filepath.Join(s.Paths.Workspaces, sessionID) |
| 87 | templateName := templateNameFromTaskPath(taskPath) |
| 88 | warmHit := false |
| 89 | if item, ok, hitErr := (warm.Service{DB: s.DB, Paths: s.Paths}).Hit(templateName, sessionID, 250, task.MemoryMB); hitErr != nil { |
| 90 | return "", hitErr |
| 91 | } else if ok { |
| 92 | workspace = item.WorkspacePath |
| 93 | warmHit = true |
| 94 | } |
| 95 | if !warmHit { |
| 96 | if err := os.MkdirAll(workspace, 0o755); err != nil { |
| 97 | return "", err |
| 98 | } |
| 99 | } |
| 100 | decision, err := (scheduler.Scheduler{DB: s.DB}).Admit(scheduler.Request{ |
| 101 | RunID: runID, |
| 102 | SessionID: sessionID, |
| 103 | Runtime: "docker", |
| 104 | RiskTier: task.RiskTier, |
| 105 | CPURequest: task.CPURequest, |
| 106 | MemoryMB: task.MemoryMB, |
| 107 | }) |
| 108 | if err != nil { |
| 109 | return "", err |
| 110 | } |
| 111 | if !decision.Admitted { |
| 112 | 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", |
| 113 | decision.RejectReason, decision.EffectiveCPU, decision.ActiveCPUDebt, decision.BurstRisk, decision.OvercommitRatio, decision.QueuePressure, decision.MemoryPressure, decision.MemoryAllocatedMB, decision.MemoryRequestMB, decision.MemoryCapacityMB) |
| 114 | } |
| 115 | var egressProxy egress.ProxyInfo |
| 116 | if s.isDockerRuntime() { |
| 117 | egressProxy, err = (egress.Service{DB: s.DB, Paths: s.Paths}).EnsureSessionProxy(runID, sessionID) |
| 118 | if err != nil { |
| 119 | return "", err |
| 120 | } |
| 121 | } |
| 122 | start := time.Now() |
| 123 | containerID, err := s.createRuntimeSession(runtimeplane.CreateSessionRequest{ |
| 124 | SessionID: sessionID, |
| 125 | LeaseID: leaseID, |
| 126 | RunID: runID, |
| 127 | Image: task.Image, |
| 128 | WorkspaceHostPath: workspace, |
| 129 | MemoryMB: task.MemoryMB, |
| 130 | CPURequest: task.CPURequest, |
| 131 | NetworkMode: task.NetworkMode, |
| 132 | ProxyURL: egressProxy.ContainerProxyURL, |
| 133 | NoProxy: "localhost,127.0.0.1,::1", |