Further Podman Support work
Release rolling / release (push) Has been cancelled

This commit is contained in:
Raven Scott
2026-07-16 05:33:32 -04:00
parent 8e6a0505a9
commit f9d16b7cf8
22 changed files with 645 additions and 109 deletions
+7 -2
View File
@@ -108,8 +108,13 @@ test('resolveContainerSocket CONTAINER_HOST wins when no DOCKER_HOST', (t) => {
})
test('resolveComposeCli picks podman for podman engine', (t) => {
t.alike(resolveComposeCli('podman'), { cmd: 'podman', prefix: ['compose'] })
t.alike(resolveComposeCli('docker'), { cmd: 'docker', prefix: ['compose'] })
const pod = resolveComposeCli('podman')
t.is(pod.cmd, 'podman')
t.alike(pod.prefix, ['compose'])
t.ok(pod.envExtra?.DOCKER_HOST?.startsWith('unix://'))
const dock = resolveComposeCli('docker')
t.is(dock.cmd, 'docker')
t.alike(dock.prefix, ['compose'])
t.is(engineDisplayName('podman'), 'Podman')
t.is(engineDisplayName('docker'), 'Docker')
})
+88
View File
@@ -0,0 +1,88 @@
import test from 'brittle'
import {
engineKindFromVersion,
envSwarmEnabled,
envPluginsEnabled,
getEngineFeatures,
} from '../server/services/engine-features.js'
import {
parseContainerCliCommand,
preferredCliBinary,
} from '../server/handlers/docker-cli.js'
import { composeLabelsFrom } from '../server/utils/composeManager.js'
test('engineKindFromVersion detects podman from version blob', (t) => {
t.is(
engineKindFromVersion({ Platform: { Name: 'linux/amd64/podman-5.0' } }, 'docker'),
'podman'
)
t.is(
engineKindFromVersion(
{ Components: [{ Name: 'Podman Engine', Version: '5.0' }] },
'unknown'
),
'podman'
)
t.is(engineKindFromVersion({ Platform: { Name: 'Docker Engine - Community' } }, 'unknown'), 'docker')
})
test('getEngineFeatures disables swarm/plugins for podman kind', (t) => {
// Force via version refinement even if socket was classified docker
const f = getEngineFeatures({
version: { Platform: { Name: 'podman' }, ApiVersion: '1.41' },
})
t.is(f.engine, 'podman')
t.is(f.swarm, false)
t.is(f.plugins, false)
t.ok(f.containers)
t.ok(f.compose)
t.ok(f.stacks)
t.ok(f.unsupported.includes('swarm'))
t.ok(f.unsupported.includes('plugins'))
})
test('envSwarmEnabled respects ENABLE_SWARM=0', (t) => {
const prev = process.env.ENABLE_SWARM
process.env.ENABLE_SWARM = '0'
t.is(envSwarmEnabled(), false)
process.env.ENABLE_SWARM = '1'
t.is(envSwarmEnabled(), true)
if (prev === undefined) delete process.env.ENABLE_SWARM
else process.env.ENABLE_SWARM = prev
})
test('envPluginsEnabled defaults off', (t) => {
const prev = process.env.ENABLE_PLUGINS
delete process.env.ENABLE_PLUGINS
t.is(envPluginsEnabled(), false)
if (prev !== undefined) process.env.ENABLE_PLUGINS = prev
})
test('composeLabelsFrom accepts podman labels', (t) => {
t.alike(
composeLabelsFrom({
'io.podman.compose.project': 'web',
'io.podman.compose.service': 'api',
}),
{ project: 'web', service: 'api' }
)
t.alike(
composeLabelsFrom({
'com.docker.compose.project': 'web',
'com.docker.compose.service': 'api',
}),
{ project: 'web', service: 'api' }
)
})
test('parseContainerCliCommand rewrites for preferred engine', (t) => {
// preferredCliBinary matches live engine of this process
const pref = preferredCliBinary()
t.ok(pref === 'docker' || pref === 'podman')
const parsed = parseContainerCliCommand('docker ps -a')
t.ok(parsed.executable === 'docker' || parsed.executable === 'podman')
t.alike(parsed.cmdArgs, ['ps', '-a'])
const bare = parseContainerCliCommand('ps -a')
t.is(bare.executable, pref)
t.alike(bare.cmdArgs, ['ps', '-a'])
})