139 lines
5.0 KiB
PowerShell
139 lines
5.0 KiB
PowerShell
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$PackageRoot,
|
|
[string]$OutputRoot = "D:\NDC_MISSIONCORE\runtime\derived\e39-refinement",
|
|
[string]$ContainerImage = "nvcr.io/nvidia/tritonserver:26.06-py3@sha256:58df7489c3f2276f9591d500a012dee03e23d35543ce3c390b4c001e6bf90794",
|
|
[ValidateRange(1, 1000)]
|
|
[int]$FreeGiBFloor = 300
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
$ProgressPreference = "SilentlyContinue"
|
|
|
|
function Assert-LastExitCode([string]$Operation) {
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "$Operation failed with exit code $LASTEXITCODE"
|
|
}
|
|
}
|
|
|
|
function Resolve-DDirectory([string]$Path, [string]$Label) {
|
|
$item = Get-Item -LiteralPath (Resolve-Path -LiteralPath $Path).Path -Force
|
|
$root = [IO.Path]::GetPathRoot($item.FullName).TrimEnd("\")
|
|
if (
|
|
-not $item.PSIsContainer -or
|
|
($item.Attributes -band [IO.FileAttributes]::ReparsePoint) -or
|
|
$root -ine "D:"
|
|
) {
|
|
throw "$Label must be a real D: directory"
|
|
}
|
|
return $item.FullName
|
|
}
|
|
|
|
function Convert-ToDockerPath([string]$Path) {
|
|
return $Path.Replace("\", "/")
|
|
}
|
|
|
|
function Assert-FreeSpace([string]$Phase) {
|
|
$free = [int64](Get-PSDrive -Name D).Free
|
|
$floor = [int64]$FreeGiBFloor * 1GB
|
|
Write-Host (
|
|
"DISK_GUARD PHASE={0} DRIVE=D FREE_BYTES={1} FREE_GIB={2} FLOOR_GIB={3}" -f
|
|
$Phase, $free, [math]::Round($free / 1GB, 3), $FreeGiBFloor
|
|
)
|
|
if ($free -lt ($floor + 1GB)) {
|
|
throw "D: lacks the guarded E39 reserve during $Phase"
|
|
}
|
|
return $free
|
|
}
|
|
|
|
$package = Resolve-DDirectory $PackageRoot "E39 package"
|
|
$packageManifestPath = Join-Path $package "manifest.json"
|
|
if (-not (Test-Path -LiteralPath $packageManifestPath -PathType Leaf)) {
|
|
throw "E39 package manifest is missing"
|
|
}
|
|
$packageManifest = Get-Content -LiteralPath $packageManifestPath -Raw |
|
|
ConvertFrom-Json
|
|
if (
|
|
$packageManifest.schema_version -ne "missioncore.e39-worker-package/v1" -or
|
|
$packageManifest.package_id -ne (Split-Path $package -Leaf) -or
|
|
$packageManifest.package_id -notmatch "^e39-worker-package-[a-f0-9]{64}$"
|
|
) {
|
|
throw "E39 package manifest is incompatible"
|
|
}
|
|
|
|
if (-not (Test-Path -LiteralPath $OutputRoot)) {
|
|
$null = New-Item -ItemType Directory -Path $OutputRoot
|
|
}
|
|
$output = Resolve-DDirectory $OutputRoot "E39 output root"
|
|
$freeBefore = Assert-FreeSpace "preflight"
|
|
|
|
& docker image inspect $ContainerImage *> $null
|
|
Assert-LastExitCode "Pinned E39 container image inspection"
|
|
|
|
$dockerPackage = Convert-ToDockerPath $package
|
|
$dockerOutput = Convert-ToDockerPath $output
|
|
$packageName = Split-Path $package -Leaf
|
|
$containerPackage = "/opt/e39-input/$packageName"
|
|
$command = @(
|
|
"run", "--rm",
|
|
"--name", "ndc-mission-core-e39-refinement",
|
|
"--network", "none",
|
|
"--read-only",
|
|
"--security-opt", "no-new-privileges:true",
|
|
"--cap-drop", "ALL",
|
|
"--pids-limit", "128",
|
|
"--memory", "1g",
|
|
"--memory-swap", "1g",
|
|
"--cpus", "2",
|
|
"--tmpfs", "/tmp:rw,noexec,nosuid,size=64m",
|
|
"-e", "PYTHONDONTWRITEBYTECODE=1",
|
|
"-e", ("PYTHONPATH={0}/runtime" -f $containerPackage),
|
|
"-e", ("E39_WORKER_NODE={0}" -f $env:COMPUTERNAME),
|
|
"-v", ("{0}:{1}:ro" -f $dockerPackage, $containerPackage),
|
|
"-v", ("{0}:/output:rw" -f $dockerOutput),
|
|
"--entrypoint", "python3",
|
|
$ContainerImage,
|
|
("{0}/runtime/run_e39_perception_refinement.py" -f $containerPackage),
|
|
"--package", $containerPackage,
|
|
"--output-root", "/output"
|
|
)
|
|
|
|
Write-Output ("PACKAGE_ID={0}" -f $packageManifest.package_id)
|
|
Write-Output ("PACKAGE_IDENTITY_SHA256={0}" -f $packageManifest.identity_sha256)
|
|
Write-Output ("CONTAINER_IMAGE={0}" -f $ContainerImage)
|
|
& docker @command
|
|
Assert-LastExitCode "E39 perception refinement"
|
|
|
|
$matches = @(
|
|
Get-ChildItem -LiteralPath $output -Directory -Filter "e39-perception-refinement-*" |
|
|
Where-Object {
|
|
$manifestPath = Join-Path $_.FullName "manifest.json"
|
|
if (-not (Test-Path -LiteralPath $manifestPath -PathType Leaf)) {
|
|
return $false
|
|
}
|
|
$manifest = Get-Content -LiteralPath $manifestPath -Raw |
|
|
ConvertFrom-Json
|
|
return (
|
|
$manifest.schema_version -eq
|
|
"missioncore.e39-perception-refinement/v1" -and
|
|
$manifest.acceptance_state -eq
|
|
"completed-r1-source-scoped-refinement" -and
|
|
$manifest.identity.execution.worker_node -eq $env:COMPUTERNAME
|
|
)
|
|
}
|
|
)
|
|
if ($matches.Count -ne 1) {
|
|
throw "E39 immutable result could not be resolved uniquely"
|
|
}
|
|
$resultRoot = $matches[0].FullName
|
|
$resultManifest = Get-Content -LiteralPath (
|
|
Join-Path $resultRoot "manifest.json"
|
|
) -Raw | ConvertFrom-Json
|
|
$freeAfter = Assert-FreeSpace "completed"
|
|
Write-Output ("RESULT_ROOT={0}" -f $resultRoot)
|
|
Write-Output ("RESULT_ID={0}" -f $resultManifest.result_id)
|
|
Write-Output ("QUALITY_GATE_PASSED={0}" -f $resultManifest.quality_gate_passed)
|
|
Write-Output ("DISK_FREE_BYTES_BEFORE={0}" -f $freeBefore)
|
|
Write-Output ("DISK_FREE_BYTES_AFTER={0}" -f $freeAfter)
|