Merge pull request #23840 from Luap99/ci-fedora-39

Update to go 1.22
This commit is contained in:
openshift-merge-bot[bot]
2024-09-03 14:14:50 +00:00
committed by GitHub
26 changed files with 29 additions and 67 deletions

View File

@ -146,9 +146,11 @@ build_task:
VM_IMAGE_NAME: ${FEDORA_CACHE_IMAGE_NAME} VM_IMAGE_NAME: ${FEDORA_CACHE_IMAGE_NAME}
CTR_FQIN: ${FEDORA_CONTAINER_FQIN} CTR_FQIN: ${FEDORA_CONTAINER_FQIN}
- env: - env:
DISTRO_NV: ${PRIOR_FEDORA_NAME} # Note, this is changed to FEDORA_NAME temporarily as f39 contains a to old golang
VM_IMAGE_NAME: ${PRIOR_FEDORA_CACHE_IMAGE_NAME} # Once we bump our images to f41/40 this must be turned back to PRIOR_FEDORA_NAME
CTR_FQIN: ${PRIOR_FEDORA_CONTAINER_FQIN} DISTRO_NV: ${FEDORA_NAME}
VM_IMAGE_NAME: ${FEDORA_CACHE_IMAGE_NAME}
CTR_FQIN: ${FEDORA_CONTAINER_FQIN}
CI_DESIRED_DATABASE: boltdb CI_DESIRED_DATABASE: boltdb
CI_DESIRED_STORAGE: vfs CI_DESIRED_STORAGE: vfs
- env: - env:
@ -160,7 +162,6 @@ build_task:
- env: - env:
DISTRO_NV: ${DEBIAN_NAME} DISTRO_NV: ${DEBIAN_NAME}
VM_IMAGE_NAME: ${DEBIAN_CACHE_IMAGE_NAME} VM_IMAGE_NAME: ${DEBIAN_CACHE_IMAGE_NAME}
CI_DESIRED_NETWORK: netavark
env: env:
TEST_FLAVOR: build TEST_FLAVOR: build
clone_script: *full_clone clone_script: *full_clone
@ -656,18 +657,9 @@ container_integration_test_task:
# Docs: ./contrib/cirrus/CIModes.md # Docs: ./contrib/cirrus/CIModes.md
only_if: *only_if_int_test only_if: *only_if_int_test
depends_on: *build depends_on: *build
matrix: &fedora_vm_axis
- env:
DISTRO_NV: ${FEDORA_NAME}
VM_IMAGE_NAME: ${FEDORA_CACHE_IMAGE_NAME}
CTR_FQIN: ${FEDORA_CONTAINER_FQIN}
- env:
DISTRO_NV: ${PRIOR_FEDORA_NAME}
VM_IMAGE_NAME: ${PRIOR_FEDORA_CACHE_IMAGE_NAME}
CTR_FQIN: ${PRIOR_FEDORA_CONTAINER_FQIN}
CI_DESIRED_DATABASE: boltdb
gce_instance: *fastvm gce_instance: *fastvm
env: env:
<<: *stdenvars
TEST_FLAVOR: int TEST_FLAVOR: int
TEST_ENVIRON: container TEST_ENVIRON: container
clone_script: *get_gosrc clone_script: *get_gosrc

View File

@ -8,6 +8,7 @@ linters:
disable: disable:
# too many reports but requires attention # too many reports but requires attention
- depguard - depguard
- intrange # should be turned on but we have to convert each place manually as there is no auto fix function
- tagalign - tagalign
- perfsprint - perfsprint
- typecheck - typecheck
@ -62,6 +63,7 @@ linters:
- exhaustruct - exhaustruct
# deprecated linters # deprecated linters
- execinquery - execinquery
- exportloopref
linters-settings: linters-settings:
errcheck: errcheck:
check-blank: false check-blank: false

View File

@ -32,8 +32,12 @@ jobs:
message: "Ephemeral COPR build failed. @containers/packit-build please check." message: "Ephemeral COPR build failed. @containers/packit-build please check."
enable_net: true enable_net: true
targets: targets:
fedora-all-x86_64: {} fedora-development-x86_64: {}
fedora-all-aarch64: {} fedora-development-aarch64: {}
fedora-latest-x86_64: {}
fedora-latest-aarch64: {}
fedora-latest-stable-x86_64: {}
fedora-latest-stable-aarch64: {}
fedora-eln-x86_64: fedora-eln-x86_64:
additional_repos: additional_repos:
- "https://kojipkgs.fedoraproject.org/repos/eln-build/latest/x86_64/" - "https://kojipkgs.fedoraproject.org/repos/eln-build/latest/x86_64/"
@ -52,14 +56,15 @@ jobs:
- centos-stream-10-x86_64 - centos-stream-10-x86_64
- centos-stream-10-aarch64 - centos-stream-10-aarch64
- job: copr_build # Disabled until there is go 1.22 in epel-9
trigger: pull_request # - job: copr_build
packages: [podman-rhel] # trigger: pull_request
notifications: *packit_build_failure_notification # packages: [podman-rhel]
enable_net: true # notifications: *packit_build_failure_notification
targets: # enable_net: true
- epel-9-x86_64 # targets:
- epel-9-aarch64 # - epel-9-x86_64
# - epel-9-aarch64
# Run on commit to main branch # Run on commit to main branch
- job: copr_build - job: copr_build

View File

@ -43,11 +43,13 @@ get_env_key() {
python -c "$script" python -c "$script"
} }
# Only need to check CI-stuffs on a single build-task, there's only ever # Only need to check CI-stuffs on a single build-task, there's
# one prior-fedora task so use that one. # generally one latest fedora task so use that one. In some cases
# when we have to drop testing for the prior fedora task we may
# run twice on current fedora but this is not a problem.
# Envars all defined by CI config. # Envars all defined by CI config.
# shellcheck disable=SC2154 # shellcheck disable=SC2154
if [[ "${DISTRO_NV}" == "$PRIOR_FEDORA_NAME" ]]; then if [[ "${DISTRO_NV}" == "$FEDORA_NAME" ]]; then
msg "Checking shell scripts" msg "Checking shell scripts"
showrun ooe.sh dnf install -y ShellCheck # small/quick addition showrun ooe.sh dnf install -y ShellCheck # small/quick addition
showrun shellcheck --format=tty \ showrun shellcheck --format=tty \

2
go.mod
View File

@ -2,7 +2,7 @@ module github.com/containers/podman/v5
// Warning: Ensure the "go" and "toolchain" versions match exactly to prevent unwanted auto-updates // Warning: Ensure the "go" and "toolchain" versions match exactly to prevent unwanted auto-updates
go 1.21.0 go 1.22.0
require ( require (
github.com/BurntSushi/toml v1.4.0 github.com/BurntSushi/toml v1.4.0

View File

@ -2227,7 +2227,6 @@ func (c *Container) postDeleteHooks(ctx context.Context) error {
return err return err
} }
for i, hook := range extensionHooks { for i, hook := range extensionHooks {
hook := hook
logrus.Debugf("container %s: invoke poststop hook %d, path %s", c.ID(), i, hook.Path) logrus.Debugf("container %s: invoke poststop hook %d, path %s", c.ID(), i, hook.Path)
var stderr, stdout bytes.Buffer var stderr, stdout bytes.Buffer
hookErr, err := exec.RunWithOptions( hookErr, err := exec.RunWithOptions(

View File

@ -596,7 +596,6 @@ func (p *Pod) podWithContainers(ctx context.Context, containers []*Container, po
// Deduplicate volumes, so if containers in the pod share a volume, it's only // Deduplicate volumes, so if containers in the pod share a volume, it's only
// listed in the volumes section once // listed in the volumes section once
for _, vol := range volumes { for _, vol := range volumes {
vol := vol
deDupPodVolumes[vol.Name] = &vol deDupPodVolumes[vol.Name] = &vol
} }
} }

View File

@ -93,7 +93,6 @@ func TestGetTailLog(t *testing.T) {
}, },
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
dir := t.TempDir() dir := t.TempDir()
file := filepath.Join(dir, "log") file := filepath.Join(dir, "log")

View File

@ -232,7 +232,6 @@ func Test_ocicniPortsToNetTypesPorts(t *testing.T) {
}, },
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
result := ocicniPortsToNetTypesPorts(tt.arg) result := ocicniPortsToNetTypesPorts(tt.arg)
assert.Equal(t, tt.want, result, "ports do not match") assert.Equal(t, tt.want, result, "ports do not match")

View File

@ -150,7 +150,6 @@ data:
} }
for _, test := range tests { for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
buf := bytes.NewReader([]byte(test.configMapContent)) buf := bytes.NewReader([]byte(test.configMapContent))
cm, err := readConfigMapFromFile(buf) cm, err := readConfigMapFromFile(buf)
@ -196,7 +195,6 @@ kind: Pod
} }
for _, test := range tests { for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
kind, err := getKubeKind([]byte(test.kubeYAML)) kind, err := getKubeKind([]byte(test.kubeYAML))
if test.expectError { if test.expectError {
@ -268,7 +266,6 @@ items:
} }
for _, test := range tests { for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
docs, err := splitMultiDocYAML([]byte(test.kubeYAML)) docs, err := splitMultiDocYAML([]byte(test.kubeYAML))
if test.expectError { if test.expectError {

View File

@ -43,7 +43,6 @@ func TestCause(t *testing.T) {
expectedErr: fmt.Errorf("0: %w", errors.New("error")), expectedErr: fmt.Errorf("0: %w", errors.New("error")),
}, },
} { } {
tc := tc
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
t.Parallel() t.Parallel()
err := Cause(tc.err()) err := Cause(tc.err())

View File

@ -44,7 +44,6 @@ func newFarmWithBuilders(_ context.Context, name string, cons []config.Connectio
) )
// Set up the remote connections to handle the builds // Set up the remote connections to handle the builds
for _, con := range cons { for _, con := range cons {
con := con
builderGroup.Go(func() error { builderGroup.Go(func() error {
fmt.Printf("Connecting to %q\n", con.Name) fmt.Printf("Connecting to %q\n", con.Name)
engine, err := infra.NewImageEngine(&entities.PodmanConfig{ engine, err := infra.NewImageEngine(&entities.PodmanConfig{
@ -115,7 +114,6 @@ func (f *Farm) Status(ctx context.Context) (map[string]error, error) {
statusGroup multierror.Group statusGroup multierror.Group
) )
for _, engine := range f.builders { for _, engine := range f.builders {
engine := engine
statusGroup.Go(func() error { statusGroup.Go(func() error {
logrus.Debugf("getting status of %q", engine.FarmNodeName(ctx)) logrus.Debugf("getting status of %q", engine.FarmNodeName(ctx))
defer logrus.Debugf("got status of %q", engine.FarmNodeName(ctx)) defer logrus.Debugf("got status of %q", engine.FarmNodeName(ctx))
@ -159,7 +157,6 @@ func (f *Farm) NativePlatforms(ctx context.Context) ([]string, error) {
nativeGroup multierror.Group nativeGroup multierror.Group
) )
for _, engine := range f.builders { for _, engine := range f.builders {
engine := engine
nativeGroup.Go(func() error { nativeGroup.Go(func() error {
logrus.Debugf("getting native platform of %q\n", engine.FarmNodeName(ctx)) logrus.Debugf("getting native platform of %q\n", engine.FarmNodeName(ctx))
defer logrus.Debugf("got native platform of %q", engine.FarmNodeName(ctx)) defer logrus.Debugf("got native platform of %q", engine.FarmNodeName(ctx))
@ -199,7 +196,6 @@ func (f *Farm) EmulatedPlatforms(ctx context.Context) ([]string, error) {
emulatedGroup multierror.Group emulatedGroup multierror.Group
) )
for _, engine := range f.builders { for _, engine := range f.builders {
engine := engine
emulatedGroup.Go(func() error { emulatedGroup.Go(func() error {
logrus.Debugf("getting emulated platforms of %q", engine.FarmNodeName(ctx)) logrus.Debugf("getting emulated platforms of %q", engine.FarmNodeName(ctx))
defer logrus.Debugf("got emulated platforms of %q", engine.FarmNodeName(ctx)) defer logrus.Debugf("got emulated platforms of %q", engine.FarmNodeName(ctx))
@ -260,7 +256,6 @@ func (f *Farm) Schedule(ctx context.Context, platforms []string) (Schedule, erro
// Make notes of which platforms we can build for natively, and which // Make notes of which platforms we can build for natively, and which
// ones we can build for using emulation. // ones we can build for using emulation.
for name, engine := range f.builders { for name, engine := range f.builders {
name, engine := name, engine
infoGroup.Go(func() error { infoGroup.Go(func() error {
inspect, err := engine.FarmNodeInspect(ctx) inspect, err := engine.FarmNodeInspect(ctx)
if err != nil { if err != nil {
@ -377,7 +372,6 @@ func (f *Farm) Build(ctx context.Context, schedule Schedule, options entities.Bu
builder entities.ImageEngine builder entities.ImageEngine
} }
for platform, builder := range schedule.platformBuilders { for platform, builder := range schedule.platformBuilders {
platform, builder := platform, builder
outReader, outWriter := io.Pipe() outReader, outWriter := io.Pipe()
errReader, errWriter := io.Pipe() errReader, errWriter := io.Pipe()
go func() { go func() {

View File

@ -64,7 +64,6 @@ func (l *listLocal) build(ctx context.Context, images map[entities.BuildReport]e
) )
refs := []string{} refs := []string{}
for image, engine := range images { for image, engine := range images {
image, engine := image, engine
pushGroup.Go(func() error { pushGroup.Go(func() error {
logrus.Infof("pushing image %s", image.ID) logrus.Infof("pushing image %s", image.ID)
defer logrus.Infof("pushed image %s", image.ID) defer logrus.Infof("pushed image %s", image.ID)
@ -91,7 +90,6 @@ func (l *listLocal) build(ctx context.Context, images map[entities.BuildReport]e
if engine.FarmNodeName(ctx) == entities.LocalFarmImageBuilderName { if engine.FarmNodeName(ctx) == entities.LocalFarmImageBuilderName {
continue continue
} }
image, engine := image, engine
rmGroup.Go(func() error { rmGroup.Go(func() error {
_, err := engine.Remove(ctx, []string{image.ID}, entities.ImageRemoveOptions{}) _, err := engine.Remove(ctx, []string{image.ID}, entities.ImageRemoveOptions{})
if len(err) > 0 { if len(err) > 0 {

View File

@ -119,7 +119,6 @@ func TestNewMachineFile(t *testing.T) {
}, },
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, err := NewMachineFile(tt.args.path, tt.args.symlink) got, err := NewMachineFile(tt.args.path, tt.args.symlink)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {

View File

@ -224,7 +224,6 @@ func TestConfigMapVolumes(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
result, err := VolumeFromConfigMap(test.volume.ConfigMap, test.configmaps) result, err := VolumeFromConfigMap(test.volume.ConfigMap, test.configmaps)
if test.errorMessage == "" { if test.errorMessage == "" {
@ -434,7 +433,6 @@ func TestEnvVarsFrom(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
result, err := envVarsFrom(test.envFrom, &test.options) result, err := envVarsFrom(test.envFrom, &test.options)
assert.Equal(t, err == nil, test.succeed) assert.Equal(t, err == nil, test.succeed)
@ -1027,7 +1025,6 @@ func TestEnvVarValue(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
result, err := envVarValue(test.envVar, &test.options) result, err := envVarValue(test.envVar, &test.options)
assert.Equal(t, err == nil, test.succeed) assert.Equal(t, err == nil, test.succeed)
@ -1270,7 +1267,6 @@ func TestHttpLivenessProbe(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
err := setupLivenessProbe(&test.specGenerator, test.container, test.restartPolicy) err := setupLivenessProbe(&test.specGenerator, test.container, test.restartPolicy)
if err == nil { if err == nil {
@ -1393,7 +1389,6 @@ func TestTCPLivenessProbe(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
err := setupLivenessProbe(&test.specGenerator, test.container, test.restartPolicy) err := setupLivenessProbe(&test.specGenerator, test.container, test.restartPolicy)
assert.Equal(t, err == nil, test.succeed) assert.Equal(t, err == nil, test.succeed)

View File

@ -212,7 +212,6 @@ func ParsePortMapping(portMappings []types.PortMapping, exposePorts map[uint16][
for hostIP, protoMap := range portMap { for hostIP, protoMap := range portMap {
for protocol, ports := range protoMap { for protocol, ports := range protoMap {
ports := ports
if len(ports) == 0 { if len(ports) == 0 {
continue continue
} }

View File

@ -433,7 +433,6 @@ func TestParsePortMappingWithHostPort(t *testing.T) {
}, },
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, err := ParsePortMapping(tt.arg, tt.arg2) got, err := ParsePortMapping(tt.arg, tt.arg2)
assert.NoError(t, err, "error is not nil") assert.NoError(t, err, "error is not nil")
@ -668,7 +667,6 @@ func TestParsePortMappingWithoutHostPort(t *testing.T) {
}, },
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, err := ParsePortMapping(tt.arg, tt.arg2) got, err := ParsePortMapping(tt.arg, tt.arg2)
assert.NoError(t, err, "error is not nil") assert.NoError(t, err, "error is not nil")
@ -847,7 +845,6 @@ func TestParsePortMappingMixedHostPort(t *testing.T) {
}, },
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, err := ParsePortMapping(tt.arg, nil) got, err := ParsePortMapping(tt.arg, nil)
assert.NoError(t, err, "error is not nil") assert.NoError(t, err, "error is not nil")
@ -982,7 +979,6 @@ func TestParsePortMappingError(t *testing.T) {
}, },
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
_, err := ParsePortMapping(tt.arg, nil) _, err := ParsePortMapping(tt.arg, nil)
assert.EqualError(t, err, tt.err, "error does not match") assert.EqualError(t, err, tt.err, "error does not match")

View File

@ -239,7 +239,6 @@ func TestParseNetworkFlag(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, got1, got2, err := ParseNetworkFlag(tt.args) got, got1, got2, err := ParseNetworkFlag(tt.args)
if tt.err != "" { if tt.err != "" {

View File

@ -71,7 +71,6 @@ func TestMatchLabelFilters(t *testing.T) {
}, },
} }
for _, tt := range tests { for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
if got := filters.MatchLabelFilters(tt.args.filterValues, tt.args.labels); got != tt.want { if got := filters.MatchLabelFilters(tt.args.filterValues, tt.args.labels); got != tt.want {
t.Errorf("MatchLabelFilters() = %v, want %v", got, tt.want) t.Errorf("MatchLabelFilters() = %v, want %v", got, tt.want)

View File

@ -1118,9 +1118,6 @@ var _ = Describe("Podman checkpoint", func() {
share, share,
) )
share := share // copy into local scope, for use inside function
index := index
It(testName, func() { It(testName, func() {
podName := "test_pod" podName := "test_pod"

View File

@ -217,7 +217,6 @@ var _ = Describe("Podman healthcheck run", func() {
// Run this test with and without healthcheck events, even without events // Run this test with and without healthcheck events, even without events
// podman inspect and ps should still show accurate healthcheck results. // podman inspect and ps should still show accurate healthcheck results.
for _, hcEvent := range []bool{true, false} { for _, hcEvent := range []bool{true, false} {
hcEvent := hcEvent
testName := "hc_events=" + strconv.FormatBool(hcEvent) testName := "hc_events=" + strconv.FormatBool(hcEvent)
It("podman healthcheck single healthy result changes failed to healthy "+testName, func() { It("podman healthcheck single healthy result changes failed to healthy "+testName, func() {
if !hcEvent { if !hcEvent {

View File

@ -35,8 +35,6 @@ var _ = Describe("Podman logs", func() {
}) })
for _, log := range []string{"k8s-file", "journald", "json-file"} { for _, log := range []string{"k8s-file", "journald", "json-file"} {
// This is important to move the 'log' var to the correct scope under Ginkgo flow.
log := log
// Flake prevention: journalctl makes no timeliness guarantees // Flake prevention: journalctl makes no timeliness guarantees
logTimeout := time.Millisecond logTimeout := time.Millisecond

View File

@ -549,7 +549,6 @@ var _ = Describe("Podman network", func() {
}) })
for _, opt := range []string{"-o=parent=lo", "--interface-name=lo"} { for _, opt := range []string{"-o=parent=lo", "--interface-name=lo"} {
opt := opt
It(fmt.Sprintf("podman network create/remove macvlan as driver (-d) with %s", opt), func() { It(fmt.Sprintf("podman network create/remove macvlan as driver (-d) with %s", opt), func() {
net := "macvlan" + stringid.GenerateRandomID() net := "macvlan" + stringid.GenerateRandomID()
nc := podmanTest.Podman([]string{"network", "create", "-d", "macvlan", opt, net}) nc := podmanTest.Podman([]string{"network", "create", "-d", "macvlan", opt, net})

View File

@ -417,7 +417,6 @@ var _ = Describe("Podman pod create", func() {
tests := []string{"", "none"} tests := []string{"", "none"}
for _, test := range tests { for _, test := range tests {
test := test
It("podman pod create --share="+test+" should not create an infra ctr", func() { It("podman pod create --share="+test+" should not create an infra ctr", func() {
session := podmanTest.Podman([]string{"pod", "create", "--share", test}) session := podmanTest.Podman([]string{"pod", "create", "--share", test})
session.WaitWithDefaultTimeout() session.WaitWithDefaultTimeout()

View File

@ -62,7 +62,6 @@ var _ = Describe("Podman run memory", func() {
}) })
for _, limit := range []string{"0", "15", "100"} { for _, limit := range []string{"0", "15", "100"} {
limit := limit // Keep this value in a proper scope
testName := fmt.Sprintf("podman run memory-swappiness test(%s)", limit) testName := fmt.Sprintf("podman run memory-swappiness test(%s)", limit)
It(testName, func() { It(testName, func() {
SkipIfCgroupV2("memory-swappiness not supported on cgroupV2") SkipIfCgroupV2("memory-swappiness not supported on cgroupV2")

View File

@ -548,7 +548,6 @@ EXPOSE 2004-2005/tcp`, ALPINE)
}) })
for _, local := range []bool{true, false} { for _, local := range []bool{true, false} {
local := local
testName := "HostIP" testName := "HostIP"
if local { if local {
testName = "127.0.0.1" testName = "127.0.0.1"