buildah/tests/config.bats

420 lines
15 KiB
Bash

#!/usr/bin/env bats
load helpers
@test "config-flags-order-verification" {
run_buildah 125 config cnt1 --author=user1
check_options_flag_err "--author=user1"
run_buildah 125 config cnt1 --arch x86_54
check_options_flag_err "--arch"
run_buildah 125 config cnt1 --created-by buildahcli --cmd "/usr/bin/run.sh" --hostname "localhost1"
check_options_flag_err "--created-by"
run_buildah 125 config cnt1 --annotation=service=cache
check_options_flag_err "--annotation=service=cache"
}
@test "config-flags-verification" {
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --label LABEL $cid
run_buildah config --annotation ANNOTATION $cid
run_buildah 125 config --healthcheck 'AB "CD' $cid
expect_output --substring 'parsing --healthcheck "AB \\"CD": invalid command line string'
run_buildah 125 config --healthcheck-interval ABCD $cid
expect_output --substring 'parsing --healthcheck-interval "ABCD": time: invalid duration "?ABCD"?'
run_buildah 125 config --cmd 'AB "CD' $cid
expect_output --substring 'parsing --cmd "AB \\"CD": invalid command line string'
run_buildah 125 config --env ENV $cid
expect_output --substring 'setting env "ENV": no value given'
run_buildah 125 config --shell 'AB "CD' $cid
expect_output --substring 'parsing --shell "AB \\"CD": invalid command line string'
}
function check_matrix() {
local setting=$1
local expect=$2
# matrix test: all permutations of .Docker.* and .OCIv1.* in all image types
for image in docker oci; do
for which in Docker OCIv1; do
run_buildah inspect --type=image --format "{{.$which.$setting}}" scratch-image-$image
expect_output "$expect"
done
done
}
@test "config entrypoint using single element in JSON array (exec form)" {
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --entrypoint '[ "/ENTRYPOINT" ]' $cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix "Config.Entrypoint" '[/ENTRYPOINT]'
}
@test "config entrypoint using multiple elements in JSON array (exec form)" {
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --entrypoint '[ "/ENTRYPOINT", "ELEMENT2" ]' $cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Config.Entrypoint' '[/ENTRYPOINT ELEMENT2]'
}
@test "config entrypoint using string (shell form)" {
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --entrypoint /ENTRYPOINT $cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Config.Entrypoint' '[/bin/sh -c /ENTRYPOINT]'
}
@test "config set empty entrypoint doesn't wipe cmd" {
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --cmd "command" $cid
run_buildah config --entrypoint "" $cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Config.Cmd' '[command]'
}
@test "config cmd without entrypoint" {
run_buildah from --pull-never $WITH_POLICY_JSON scratch
cid=$output
run_buildah config \
--cmd COMMAND-OR-ARGS \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Config.Cmd' '[COMMAND-OR-ARGS]'
check_matrix 'Config.Entrypoint' '[]'
}
@test "config entrypoint with cmd" {
run_buildah from --pull-never $WITH_POLICY_JSON scratch
cid=$output
run_buildah config \
--entrypoint /ENTRYPOINT \
--cmd COMMAND-OR-ARGS \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Config.Cmd' '[COMMAND-OR-ARGS]'
run_buildah from --pull-never $WITH_POLICY_JSON scratch
cid=$output
run_buildah config \
--entrypoint /ENTRYPOINT \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Config.Cmd' '[]'
run_buildah config \
--entrypoint /ENTRYPOINT \
--cmd COMMAND-OR-ARGS \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Config.Cmd' '[COMMAND-OR-ARGS]'
run_buildah config \
--entrypoint /ENTRYPOINT \
--cmd '[ "/COMMAND", "ARG1", "ARG2"]' \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Config.Cmd' '[/COMMAND ARG1 ARG2]'
}
@test "config remove all" {
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config \
--port 12345 \
--annotation ANNOTATION=VALUE1,VALUE2 \
--env VARIABLE=VALUE1,VALUE2 \
--volume /VOLUME \
--label LABEL=VALUE \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
run_buildah inspect --type=image --format '{{index .ImageAnnotations "ANNOTATION"}}' scratch-image-oci
expect_output "VALUE1,VALUE2"
run_buildah inspect --format '{{index .ImageAnnotations "ANNOTATION"}}' $cid
expect_output "VALUE1,VALUE2"
check_matrix 'Config.ExposedPorts' 'map[12345:{}]'
check_matrix 'Config.Env' '[VARIABLE=VALUE1,VALUE2]'
check_matrix 'Config.Labels.LABEL' 'VALUE'
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config \
--port - \
--annotation - \
--env - \
--volume - \
--label - \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
run_buildah inspect --type=image --format '{{.ImageAnnotations}}' scratch-image-oci
expect_output "map[]"
run_buildah inspect --format '{{.ImageAnnotations}}' $cid
expect_output "map[]"
check_matrix 'Config.ExposedPorts' 'map[]'
check_matrix 'Config.Env' '[]'
check_matrix 'Config.Labels.LABEL' '<no value>'
}
@test "config" {
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config \
--author TESTAUTHOR \
--created-by COINCIDENCE \
--arch amd64 \
--os linux \
--variant abc \
--user likes:things \
--port 12345 \
--env VARIABLE=VALUE1,VALUE2 \
--entrypoint /ENTRYPOINT \
--cmd COMMAND-OR-ARGS \
--comment INFORMATIVE \
--history-comment PROBABLY-EMPTY \
--volume /VOLUME \
--workingdir /tmp \
--label LABEL=VALUE \
--label exec='podman run -it --mount=type=bind,bind-propagation=Z,source=foo,destination=bar /script buz'\
--stop-signal SIGINT \
--annotation ANNOTATION=VALUE1,VALUE2 \
--shell /bin/arbitrarysh \
--domainname mydomain.local \
--hostname cleverhostname \
--healthcheck "CMD /bin/true" \
--healthcheck-start-period 5s \
--healthcheck-interval 6s \
--healthcheck-timeout 7s \
--healthcheck-retries 8 \
--onbuild "RUN touch /foo" \
--os-version "1.0" \
--os-feature dynamic --os-feature - --os-feature removed --os-feature removed- --os-feature win32k \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
check_matrix 'Author' 'TESTAUTHOR'
check_matrix 'Architecture' 'amd64'
check_matrix 'OS' 'linux'
check_matrix 'Variant' 'abc'
check_matrix 'OSVersion' '1.0'
check_matrix 'OSFeatures' '[win32k]'
run_buildah inspect --format '{{.ImageCreatedBy}}' $cid
expect_output "COINCIDENCE"
check_matrix 'Config.Cmd' '[COMMAND-OR-ARGS]'
check_matrix 'Config.Entrypoint' '[/bin/sh -c /ENTRYPOINT]'
check_matrix 'Config.Env' '[VARIABLE=VALUE1,VALUE2]'
check_matrix 'Config.ExposedPorts' 'map[12345:{}]'
check_matrix 'Config.Labels.exec' 'podman run -it --mount=type=bind,bind-propagation=Z,source=foo,destination=bar /script buz'
check_matrix 'Config.Labels.LABEL' 'VALUE'
check_matrix 'Config.StopSignal' 'SIGINT'
check_matrix 'Config.User' 'likes:things'
check_matrix 'Config.Volumes' "map[/VOLUME:{}]"
check_matrix 'Config.WorkingDir' '/tmp'
run_buildah inspect --type=image --format '{{(index .Docker.History 0).Comment}}' scratch-image-docker
expect_output "PROBABLY-EMPTY"
run_buildah inspect --type=image --format '{{(index .OCIv1.History 0).Comment}}' scratch-image-docker
expect_output "PROBABLY-EMPTY"
run_buildah inspect --type=image --format '{{(index .Docker.History 0).Comment}}' scratch-image-oci
expect_output "PROBABLY-EMPTY"
run_buildah inspect --type=image --format '{{(index .OCIv1.History 0).Comment}}' scratch-image-oci
expect_output "PROBABLY-EMPTY"
# The following aren't part of the Docker v2 spec, so they're discarded when we save to Docker format.
run_buildah inspect --type=image --format '{{index .ImageAnnotations "ANNOTATION"}}' scratch-image-oci
expect_output "VALUE1,VALUE2"
run_buildah inspect --format '{{index .ImageAnnotations "ANNOTATION"}}' $cid
expect_output "VALUE1,VALUE2"
run_buildah inspect --type=image --format '{{.Docker.Comment}}' scratch-image-docker
expect_output "INFORMATIVE"
run_buildah inspect --type=image --format '{{.Docker.Config.Domainname}}' scratch-image-docker
expect_output "mydomain.local"
run_buildah inspect --type=image --format '{{.Docker.Config.Hostname}}' scratch-image-docker
expect_output "cleverhostname"
run_buildah inspect --type=image --format '{{.Docker.Config.Shell}}' scratch-image-docker
expect_output "[/bin/arbitrarysh]"
run_buildah inspect -f '{{.Docker.Config.Healthcheck.Test}}' scratch-image-docker
expect_output "[CMD /bin/true]"
run_buildah inspect -f '{{.Docker.Config.Healthcheck.StartPeriod}}' scratch-image-docker
expect_output "5s"
run_buildah inspect -f '{{.Docker.Config.Healthcheck.Interval}}' scratch-image-docker
expect_output "6s"
run_buildah inspect -f '{{.Docker.Config.Healthcheck.Timeout}}' scratch-image-docker
expect_output "7s"
run_buildah inspect -f '{{.Docker.Config.Healthcheck.Retries}}' scratch-image-docker
expect_output "8"
run_buildah inspect -f '{{.Docker.Config.OnBuild}}' scratch-image-docker
expect_output "[RUN touch /foo]"
rm -rf /VOLUME
}
@test "config env using local environment" {
export foo=bar
run_buildah from --pull-never $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --env 'foo' $cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid env-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid env-image-oci
run_buildah inspect --type=image --format '{{.Docker.Config.Env}}' env-image-docker
expect_output --substring "foo=bar"
run_buildah inspect --type=image --format '{{.OCIv1.Config.Env}}' env-image-docker
expect_output --substring "foo=bar"
}
@test "docker formatted builds must inherit healthcheck from base image" {
_prefetch busybox
ctxdir=${TEST_SCRATCH_DIR}/bud
mkdir -p $ctxdir
cat >$ctxdir/Dockerfile <<EOF
FROM busybox
HEALTHCHECK CMD curl --fail http://localhost:3000 || exit 1
EOF
run_buildah build --format docker $WITH_POLICY_JSON -t test ${ctxdir}
cat >$ctxdir/Dockerfile <<EOF
FROM test
RUN echo hello
EOF
run_buildah build --format docker $WITH_POLICY_JSON -t test2 ${ctxdir}
run_buildah inspect --type=image --format '{{.Docker.ContainerConfig.Healthcheck.Test}}' test2
expect_output --substring "localhost:3000"
}
@test "config env using --env expansion" {
run_buildah from --pull-never $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --env 'foo=bar' --env 'foo1=bar1' $cid
run_buildah config --env 'combined=$foo/${foo1}' $cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid env-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid env-image-oci
run_buildah inspect --type=image --format '{{.Docker.Config.Env}}' env-image-docker
expect_output --substring "combined=bar/bar1"
run_buildah inspect --type=image --format '{{.OCIv1.Config.Env}}' env-image-docker
expect_output --substring "combined=bar/bar1"
}
@test "user" {
_prefetch alpine
run_buildah from --quiet --pull $WITH_POLICY_JSON alpine
cid=$output
run_buildah run $cid grep CapBnd /proc/self/status
bndoutput=$output
run_buildah config --user 1000 $cid
run_buildah run $cid id -u
expect_output "1000"
run_buildah run $cid sh -c "grep CapEff /proc/self/status | cut -f2"
expect_output "0000000000000000"
run_buildah run $cid grep CapBnd /proc/self/status
expect_output "$bndoutput"
}
@test "remove configs using '-' syntax" {
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config \
--created-by COINCIDENCE \
--volume /VOLUME \
--env VARIABLE=VALUE1,VALUE2 \
--label LABEL=VALUE \
--port 12345 \
--annotation ANNOTATION=VALUE1,VALUE2 \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
run_buildah inspect --format '{{.ImageCreatedBy}}' $cid
expect_output "COINCIDENCE"
check_matrix 'Config.Volumes' "map[/VOLUME:{}]"
check_matrix 'Config.Env' '[VARIABLE=VALUE1,VALUE2]'
check_matrix 'Config.Labels.LABEL' 'VALUE'
check_matrix 'Config.ExposedPorts' 'map[12345:{}]'
run_buildah inspect --type=image --format '{{index .ImageAnnotations "ANNOTATION"}}' scratch-image-oci
expect_output "VALUE1,VALUE2"
run_buildah inspect --format '{{index .ImageAnnotations "ANNOTATION"}}' $cid
expect_output "VALUE1,VALUE2"
run_buildah config \
--created-by COINCIDENCE \
--volume /VOLUME- \
--env VARIABLE- \
--label LABEL- \
--port 12345- \
--annotation ANNOTATION- \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
run_buildah inspect --format '{{.ImageCreatedBy}}' $cid
expect_output "COINCIDENCE"
check_matrix 'Config.Volumes' 'map[]'
check_matrix 'Config.Env' '[]'
check_matrix 'Config.Labels.LABEL' '<no value>'
check_matrix 'Config.ExposedPorts' 'map[]'
run_buildah inspect --type=image --format '{{index .ImageAnnotations "ANNOTATION"}}' scratch-image-oci
expect_output ""
run_buildah inspect --format '{{index .ImageAnnotations "ANNOTATION"}}' $cid
expect_output ""
run_buildah config \
--created-by COINCIDENCE \
--volume /VOLUME- \
--env VARIABLE=VALUE1,VALUE2 \
--label LABEL=VALUE \
--annotation ANNOTATION=VALUE1,VALUE2 \
$cid
run_buildah commit --format docker $WITH_POLICY_JSON $cid scratch-image-docker
run_buildah commit --format oci $WITH_POLICY_JSON $cid scratch-image-oci
run_buildah inspect --format '{{.ImageCreatedBy}}' $cid
expect_output "COINCIDENCE"
check_matrix 'Config.Volumes' "map[]"
}