This commit is contained in:
@@ -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')
|
||||
})
|
||||
|
||||
@@ -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'])
|
||||
})
|
||||
Reference in New Issue
Block a user