2const getErrorStringWithLogs = (err: unknown): string => { 3 const errStr = String(err) 5 const logs = e?.uniqDebugH?.logs || '' 6 const spawnOut = [e?.dumpDebugH?.stdout, e?.dumpDebugH?.stderr].filter(Boolean).join('\n') 7 return errStr + '\n' + logs + '\n' + spawnOut 10export const isRegistryDiskFullError = (err: unknown): boolean => { 11 const combined = getErrorStringWithLogs(err) 12 // Kaniko error format: "Err:28" (POSIX ENOSPC) 13 if (combined.includes('Err:28')) return true 14 // Generic disk full messages 15 if (combined.includes('no space left on device')) return true 16 if (combined.includes('ENOSPC')) return true 17 // Docker registry specific 18 if (combined.includes('UNKNOWN: unknown error') && combined.includes('mkdir')) return true 19 // zot returns 500 on ENOSPC; docker client surfaces the lost upload session, not "no space" 20 if (combined.includes('blob upload unknown') || combined.includes('blob upload invalid')) return true 24export const isRegistryNotFoundError = (err: unknown): boolean => { 25 const combined = getErrorStringWithLogs(err) 26 // Nginx 404 when registry deployment doesn't exist 27 if (combined.includes('404 Not Found')) return true 28 if (combined.includes('unexpected status code 404')) return true 29 // Registry API not available 30 if (combined.includes('connection refused')) return true 31 if (combined.includes('no such host')) return true 35export const parseKanikoFailure = (logs: string): {hint: string} | null => { 36 if (logs.includes('Err:28') || logs.includes('no space left on device') || logs.includes('ENOSPC')) { 37 return {hint: 'Docker registry disk full — run `ptnode <registry-ep> --steps=dockreg gc`'} 39 if (logs.includes('ENOENT') && logs.includes('.pnpm-store')) { 40 return {hint: 'pnpm-store cache corruption — delete the kanikocache PVC and retry: ptnode <cluster-epCli> <cluster> delete pvc kanikocache-localctx'} 43 if (logs.includes('UNAUTHORIZED') || logs.includes('401')) { 44 return {hint: 'Docker registry authentication failed - check regcred secret'} 47 if (logs.includes('connection refused') || logs.includes('no such host')) { 48 return {hint: 'Docker registry unreachable - check network/DNS'}