mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2025-06-26 18:18:24 +00:00
[no-relnote] Update E2E suite
Signed-off-by: Carlos Eduardo Arango Gutierrez <eduardoa@nvidia.com>
This commit is contained in:
parent
51d603aec6
commit
bf29e724f8
@ -1,4 +1,5 @@
|
|||||||
# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
|
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -12,34 +13,14 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
GO_CMD ?= go
|
.PHONY: test-e2e ginkgo
|
||||||
|
|
||||||
include $(CURDIR)/versions.mk
|
GINKGO_ARGS ?=
|
||||||
|
LOG_ARTIFACTS_DIR ?= $(CURDIR)/e2e_logs
|
||||||
|
|
||||||
E2E_RUNTIME ?= docker
|
ginkgo:
|
||||||
|
mkdir -p $(CURDIR)/bin
|
||||||
|
GOBIN=$(CURDIR)/bin go install github.com/onsi/ginkgo/v2/ginkgo@latest
|
||||||
|
|
||||||
E2E_INSTALL_CTK ?= false
|
test-e2e: ginkgo
|
||||||
|
$(CURDIR)/bin/ginkgo $(GINKGO_ARGS) -v --json-report ginkgo.json ./tests/e2e/...
|
||||||
ifeq ($($(DIST)),)
|
|
||||||
DIST ?= ubuntu20.04
|
|
||||||
endif
|
|
||||||
IMAGE_TAG ?= $(VERSION)-$(DIST)
|
|
||||||
IMAGE = $(IMAGE_NAME):$(IMAGE_TAG)
|
|
||||||
|
|
||||||
E2E_SSH_KEY ?=
|
|
||||||
E2E_SSH_USER ?=
|
|
||||||
E2E_SSH_HOST ?=
|
|
||||||
E2E_SSH_PORT ?= 22
|
|
||||||
|
|
||||||
.PHONY: test
|
|
||||||
test:
|
|
||||||
cd $(CURDIR)/tests/e2e && $(GO_CMD) test -v . -args \
|
|
||||||
-ginkgo.focus="$(E2E_RUNTIME)" \
|
|
||||||
-test.timeout=1h \
|
|
||||||
-ginkgo.v \
|
|
||||||
-install-ctk=$(E2E_INSTALL_CTK) \
|
|
||||||
-toolkit-image=$(IMAGE) \
|
|
||||||
-ssh-key=$(E2E_SSH_KEY) \
|
|
||||||
-ssh-user=$(E2E_SSH_USER) \
|
|
||||||
-remote-host=$(E2E_SSH_HOST) \
|
|
||||||
-remote-port=$(E2E_SSH_PORT)
|
|
||||||
|
@ -1,24 +1,28 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
|
* SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
*
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
* you may not use this file except in compliance with the License.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* You may obtain a copy of the License at
|
* you may not use this file except in compliance with the License.
|
||||||
*
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
||||||
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
*
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* See the License for the specific language governing permissions and
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* limitations under the License.
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package e2e
|
package e2e
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"flag"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo/v2"
|
. "github.com/onsi/ginkgo/v2"
|
||||||
@ -31,27 +35,27 @@ var (
|
|||||||
|
|
||||||
installCTK bool
|
installCTK bool
|
||||||
|
|
||||||
image string
|
ImageRepo string
|
||||||
|
ImageTag string
|
||||||
|
|
||||||
sshKey string
|
sshKey string
|
||||||
sshUser string
|
sshUser string
|
||||||
host string
|
host string
|
||||||
sshPort string
|
sshPort string
|
||||||
|
cwd string
|
||||||
|
packagePath string
|
||||||
|
|
||||||
|
runner Runner
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
flag.BoolVar(&installCTK, "install-ctk", false, "Install the NVIDIA Container Toolkit")
|
|
||||||
flag.StringVar(&image, "toolkit-image", "", "Repository of the image to test")
|
|
||||||
flag.StringVar(&sshKey, "ssh-key", "", "SSH key to use for remote login")
|
|
||||||
flag.StringVar(&sshUser, "ssh-user", "", "SSH user to use for remote login")
|
|
||||||
flag.StringVar(&host, "remote-host", "", "Hostname of the remote machine")
|
|
||||||
flag.StringVar(&sshPort, "remote-port", "22", "SSH port to use for remote login")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMain(t *testing.T) {
|
func TestMain(t *testing.T) {
|
||||||
suiteName := "NVIDIA Container Toolkit E2E"
|
suiteName := "E2E NVIDIA Container Toolkit"
|
||||||
|
|
||||||
RegisterFailHandler(Fail)
|
RegisterFailHandler(Fail)
|
||||||
|
|
||||||
|
ctx = context.Background()
|
||||||
|
getTestEnv()
|
||||||
|
|
||||||
RunSpecs(t,
|
RunSpecs(t,
|
||||||
suiteName,
|
suiteName,
|
||||||
)
|
)
|
||||||
@ -59,5 +63,77 @@ func TestMain(t *testing.T) {
|
|||||||
|
|
||||||
// BeforeSuite runs before the test suite
|
// BeforeSuite runs before the test suite
|
||||||
var _ = BeforeSuite(func() {
|
var _ = BeforeSuite(func() {
|
||||||
ctx = context.Background()
|
runner = NewRunner(
|
||||||
|
WithHost(host),
|
||||||
|
WithPort(sshPort),
|
||||||
|
WithSshKey(sshKey),
|
||||||
|
WithSshUser(sshUser),
|
||||||
|
)
|
||||||
|
|
||||||
|
if installCTK {
|
||||||
|
installer, err := NewToolkitInstaller(
|
||||||
|
WithRunner(runner),
|
||||||
|
WithImage(ImageRepo+":"+ImageTag),
|
||||||
|
WithTemplate(dockerInstallTemplate),
|
||||||
|
)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
|
err = installer.Install()
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _, err := runner.Run("docker pull ubuntu")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
|
_, _, err = runner.Run("docker pull nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
|
_, _, err = runner.Run("docker pull nvcr.io/nvidia/cuda:12.8.0-base-ubi8")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// getTestEnv gets the test environment variables
|
||||||
|
func getTestEnv() {
|
||||||
|
defer GinkgoRecover()
|
||||||
|
var err error
|
||||||
|
|
||||||
|
_, thisFile, _, _ := runtime.Caller(0)
|
||||||
|
packagePath = filepath.Dir(thisFile)
|
||||||
|
|
||||||
|
installCTK = getBoolEnvVar("INSTALL_CTK", false)
|
||||||
|
|
||||||
|
ImageRepo = os.Getenv("E2E_IMAGE_REPO")
|
||||||
|
Expect(ImageRepo).NotTo(BeEmpty(), "E2E_IMAGE_REPO environment variable must be set")
|
||||||
|
|
||||||
|
ImageTag = os.Getenv("E2E_IMAGE_TAG")
|
||||||
|
Expect(ImageTag).NotTo(BeEmpty(), "E2E_IMAGE_TAG environment variable must be set")
|
||||||
|
|
||||||
|
sshKey = os.Getenv("SSH_KEY")
|
||||||
|
Expect(sshKey).NotTo(BeEmpty(), "SSH_KEY environment variable must be set")
|
||||||
|
|
||||||
|
sshUser = os.Getenv("SSH_USER")
|
||||||
|
Expect(sshUser).NotTo(BeEmpty(), "SSH_USER environment variable must be set")
|
||||||
|
|
||||||
|
host = os.Getenv("REMOTE_HOST")
|
||||||
|
Expect(host).NotTo(BeEmpty(), "REMOTE_HOST environment variable must be set")
|
||||||
|
|
||||||
|
sshPort = os.Getenv("REMOTE_PORT")
|
||||||
|
Expect(sshPort).NotTo(BeEmpty(), "REMOTE_PORT environment variable must be set")
|
||||||
|
|
||||||
|
// Get current working directory
|
||||||
|
cwd, err = os.Getwd()
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
}
|
||||||
|
|
||||||
|
// getBoolEnvVar returns the boolean value of the environment variable or the default value if not set.
|
||||||
|
func getBoolEnvVar(key string, defaultValue bool) bool {
|
||||||
|
value := os.Getenv(key)
|
||||||
|
if value == "" {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
boolValue, err := strconv.ParseBool(value)
|
||||||
|
if err != nil {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
return boolValue
|
||||||
|
}
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
|
* SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
*
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
* you may not use this file except in compliance with the License.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* You may obtain a copy of the License at
|
* you may not use this file except in compliance with the License.
|
||||||
*
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
||||||
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
*
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* See the License for the specific language governing permissions and
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* limitations under the License.
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package e2e
|
package e2e
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
|
* SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -27,69 +28,50 @@ import (
|
|||||||
|
|
||||||
// Integration tests for Docker runtime
|
// Integration tests for Docker runtime
|
||||||
var _ = Describe("docker", Ordered, ContinueOnFailure, func() {
|
var _ = Describe("docker", Ordered, ContinueOnFailure, func() {
|
||||||
var r Runner
|
|
||||||
|
|
||||||
// Install the NVIDIA Container Toolkit
|
|
||||||
BeforeAll(func(ctx context.Context) {
|
|
||||||
r = NewRunner(
|
|
||||||
WithHost(host),
|
|
||||||
WithPort(sshPort),
|
|
||||||
WithSshKey(sshKey),
|
|
||||||
WithSshUser(sshUser),
|
|
||||||
)
|
|
||||||
if installCTK {
|
|
||||||
installer, err := NewToolkitInstaller(
|
|
||||||
WithRunner(r),
|
|
||||||
WithImage(image),
|
|
||||||
WithTemplate(dockerInstallTemplate),
|
|
||||||
)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
err = installer.Install()
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// GPUs are accessible in a container: Running nvidia-smi -L inside the
|
// GPUs are accessible in a container: Running nvidia-smi -L inside the
|
||||||
// container shows the same output inside the container as outside the
|
// container shows the same output inside the container as outside the
|
||||||
// container. This means that the following commands must all produce
|
// container. This means that the following commands must all produce
|
||||||
// the same output
|
// the same output
|
||||||
When("running nvidia-smi -L", Ordered, func() {
|
When("running nvidia-smi -L", Ordered, func() {
|
||||||
var hostOutput string
|
var hostOutput string
|
||||||
|
var err error
|
||||||
|
|
||||||
BeforeAll(func(ctx context.Context) {
|
BeforeAll(func(ctx context.Context) {
|
||||||
_, _, err := r.Run("docker pull ubuntu")
|
hostOutput, _, err = runner.Run("nvidia-smi -L")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
|
|
||||||
hostOutput, _, err = r.Run("nvidia-smi -L")
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support NVIDIA_VISIBLE_DEVICES", func(ctx context.Context) {
|
It("should support NVIDIA_VISIBLE_DEVICES", func(ctx context.Context) {
|
||||||
containerOutput, _, err := r.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all ubuntu nvidia-smi -L")
|
By("Running docker run with --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all")
|
||||||
|
containerOutput, _, err := runner.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all ubuntu nvidia-smi -L")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(containerOutput).To(Equal(hostOutput))
|
Expect(containerOutput).To(Equal(hostOutput))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support automatic CDI spec generation", func(ctx context.Context) {
|
It("should support automatic CDI spec generation", func(ctx context.Context) {
|
||||||
containerOutput, _, err := r.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all ubuntu nvidia-smi -L")
|
By("Running docker run with --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all")
|
||||||
|
containerOutput, _, err := runner.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all ubuntu nvidia-smi -L")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(containerOutput).To(Equal(hostOutput))
|
Expect(containerOutput).To(Equal(hostOutput))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support automatic CDI spec generation with the --gpus flag", func(ctx context.Context) {
|
It("should support automatic CDI spec generation with the --gpus flag", func(ctx context.Context) {
|
||||||
containerOutput, _, err := r.Run("docker run --rm -i --gpus=all --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all ubuntu nvidia-smi -L")
|
By("Running docker run with --gpus=all --runtime=nvidia --gpus all")
|
||||||
|
containerOutput, _, err := runner.Run("docker run --rm -i --gpus=all --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all ubuntu nvidia-smi -L")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(containerOutput).To(Equal(hostOutput))
|
Expect(containerOutput).To(Equal(hostOutput))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support the --gpus flag using the nvidia-container-runtime", func(ctx context.Context) {
|
It("should support the --gpus flag using the nvidia-container-runtime", func(ctx context.Context) {
|
||||||
containerOutput, _, err := r.Run("docker run --rm -i --runtime=nvidia --gpus all ubuntu nvidia-smi -L")
|
By("Running docker run with --runtime=nvidia --gpus all")
|
||||||
|
containerOutput, _, err := runner.Run("docker run --rm -i --runtime=nvidia --gpus all ubuntu nvidia-smi -L")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(containerOutput).To(Equal(hostOutput))
|
Expect(containerOutput).To(Equal(hostOutput))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support the --gpus flag using the nvidia-container-runtime-hook", func(ctx context.Context) {
|
It("should support the --gpus flag using the nvidia-container-runtime-hook", func(ctx context.Context) {
|
||||||
containerOutput, _, err := r.Run("docker run --rm -i --gpus all ubuntu nvidia-smi -L")
|
By("Running docker run with --gpus all")
|
||||||
|
containerOutput, _, err := runner.Run("docker run --rm -i --gpus all ubuntu nvidia-smi -L")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(containerOutput).To(Equal(hostOutput))
|
Expect(containerOutput).To(Equal(hostOutput))
|
||||||
})
|
})
|
||||||
@ -98,35 +80,34 @@ var _ = Describe("docker", Ordered, ContinueOnFailure, func() {
|
|||||||
// A vectorAdd sample runs in a container with access to all GPUs.
|
// A vectorAdd sample runs in a container with access to all GPUs.
|
||||||
// The following should all produce the same result.
|
// The following should all produce the same result.
|
||||||
When("Running the cuda-vectorAdd sample", Ordered, func() {
|
When("Running the cuda-vectorAdd sample", Ordered, func() {
|
||||||
BeforeAll(func(ctx context.Context) {
|
|
||||||
_, _, err := r.Run("docker pull nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|
||||||
var referenceOutput string
|
var referenceOutput string
|
||||||
|
|
||||||
It("should support NVIDIA_VISIBLE_DEVICES", func(ctx context.Context) {
|
It("should support NVIDIA_VISIBLE_DEVICES", func(ctx context.Context) {
|
||||||
|
By("Running docker run with --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all")
|
||||||
var err error
|
var err error
|
||||||
referenceOutput, _, err = r.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
referenceOutput, _, err = runner.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
Expect(referenceOutput).To(ContainSubstring("Test PASSED"))
|
Expect(referenceOutput).To(ContainSubstring("Test PASSED"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support automatic CDI spec generation", func(ctx context.Context) {
|
It("should support automatic CDI spec generation", func(ctx context.Context) {
|
||||||
out2, _, err := r.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
By("Running docker run with --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all")
|
||||||
|
out2, _, err := runner.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(referenceOutput).To(Equal(out2))
|
Expect(referenceOutput).To(Equal(out2))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support the --gpus flag using the nvidia-container-runtime", func(ctx context.Context) {
|
It("should support the --gpus flag using the nvidia-container-runtime", func(ctx context.Context) {
|
||||||
out3, _, err := r.Run("docker run --rm -i --runtime=nvidia --gpus all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
By("Running docker run with --runtime=nvidia --gpus all")
|
||||||
|
out3, _, err := runner.Run("docker run --rm -i --runtime=nvidia --gpus all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(referenceOutput).To(Equal(out3))
|
Expect(referenceOutput).To(Equal(out3))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support the --gpus flag using the nvidia-container-runtime-hook", func(ctx context.Context) {
|
It("should support the --gpus flag using the nvidia-container-runtime-hook", func(ctx context.Context) {
|
||||||
out4, _, err := r.Run("docker run --rm -i --gpus all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
By("Running docker run with --gpus all")
|
||||||
|
out4, _, err := runner.Run("docker run --rm -i --gpus all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(referenceOutput).To(Equal(out4))
|
Expect(referenceOutput).To(Equal(out4))
|
||||||
})
|
})
|
||||||
@ -136,53 +117,52 @@ var _ = Describe("docker", Ordered, ContinueOnFailure, func() {
|
|||||||
// The following should all produce the same result.
|
// The following should all produce the same result.
|
||||||
When("Running the cuda-deviceQuery sample", Ordered, func() {
|
When("Running the cuda-deviceQuery sample", Ordered, func() {
|
||||||
BeforeAll(func(ctx context.Context) {
|
BeforeAll(func(ctx context.Context) {
|
||||||
_, _, err := r.Run("docker pull nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
_, _, err := runner.Run("docker pull nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
var referenceOutput string
|
var referenceOutput string
|
||||||
|
|
||||||
It("should support NVIDIA_VISIBLE_DEVICES", func(ctx context.Context) {
|
It("should support NVIDIA_VISIBLE_DEVICES", func(ctx context.Context) {
|
||||||
|
By("Running docker run with --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all")
|
||||||
var err error
|
var err error
|
||||||
referenceOutput, _, err = r.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
referenceOutput, _, err = runner.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
Expect(referenceOutput).To(ContainSubstring("Result = PASS"))
|
Expect(referenceOutput).To(ContainSubstring("Result = PASS"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support automatic CDI spec generation", func(ctx context.Context) {
|
It("should support automatic CDI spec generation", func(ctx context.Context) {
|
||||||
out2, _, err := r.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
By("Running docker run with --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all")
|
||||||
|
out2, _, err := runner.Run("docker run --rm -i --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(referenceOutput).To(Equal(out2))
|
Expect(referenceOutput).To(Equal(out2))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support the --gpus flag using the nvidia-container-runtime", func(ctx context.Context) {
|
It("should support the --gpus flag using the nvidia-container-runtime", func(ctx context.Context) {
|
||||||
out3, _, err := r.Run("docker run --rm -i --runtime=nvidia --gpus all nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
By("Running docker run with --runtime=nvidia --gpus all")
|
||||||
|
out3, _, err := runner.Run("docker run --rm -i --runtime=nvidia --gpus all nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(referenceOutput).To(Equal(out3))
|
Expect(referenceOutput).To(Equal(out3))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should support the --gpus flag using the nvidia-container-runtime-hook", func(ctx context.Context) {
|
It("should support the --gpus flag using the nvidia-container-runtime-hook", func(ctx context.Context) {
|
||||||
out4, _, err := r.Run("docker run --rm -i --gpus all nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
By("Running docker run with --gpus all")
|
||||||
|
out4, _, err := runner.Run("docker run --rm -i --gpus all nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda12.5.0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(referenceOutput).To(Equal(out4))
|
Expect(referenceOutput).To(Equal(out4))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Describe("CUDA Forward compatibility", Ordered, func() {
|
When("Testing CUDA Forward compatibility", Ordered, func() {
|
||||||
BeforeAll(func(ctx context.Context) {
|
BeforeAll(func(ctx context.Context) {
|
||||||
_, _, err := r.Run("docker pull nvcr.io/nvidia/cuda:12.8.0-base-ubi8")
|
compatOutput, _, err := runner.Run("docker run --rm -i -e NVIDIA_VISIBLE_DEVICES=void nvcr.io/nvidia/cuda:12.8.0-base-ubi8 bash -c \"ls /usr/local/cuda/compat/libcuda.*.*\"")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|
||||||
BeforeAll(func(ctx context.Context) {
|
|
||||||
compatOutput, _, err := r.Run("docker run --rm -i -e NVIDIA_VISIBLE_DEVICES=void nvcr.io/nvidia/cuda:12.8.0-base-ubi8 bash -c \"ls /usr/local/cuda/compat/libcuda.*.*\"")
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(compatOutput).ToNot(BeEmpty())
|
Expect(compatOutput).ToNot(BeEmpty())
|
||||||
|
|
||||||
compatDriverVersion := strings.TrimPrefix(filepath.Base(compatOutput), "libcuda.so.")
|
compatDriverVersion := strings.TrimPrefix(filepath.Base(compatOutput), "libcuda.so.")
|
||||||
compatMajor := strings.SplitN(compatDriverVersion, ".", 2)[0]
|
compatMajor := strings.SplitN(compatDriverVersion, ".", 2)[0]
|
||||||
|
|
||||||
driverOutput, _, err := r.Run("nvidia-smi -q | grep \"Driver Version\"")
|
driverOutput, _, err := runner.Run("nvidia-smi -q | grep \"Driver Version\"")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
parts := strings.SplitN(driverOutput, ":", 2)
|
parts := strings.SplitN(driverOutput, ":", 2)
|
||||||
Expect(parts).To(HaveLen(2))
|
Expect(parts).To(HaveLen(2))
|
||||||
@ -198,19 +178,22 @@ var _ = Describe("docker", Ordered, ContinueOnFailure, func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
It("should work with the nvidia runtime in legacy mode", func(ctx context.Context) {
|
It("should work with the nvidia runtime in legacy mode", func(ctx context.Context) {
|
||||||
ldconfigOut, _, err := r.Run("docker run --rm -i -e NVIDIA_DISABLE_REQUIRE=true --runtime=nvidia --gpus all nvcr.io/nvidia/cuda:12.8.0-base-ubi8 bash -c \"ldconfig -p | grep libcuda.so.1\"")
|
By("Running docker run with -e NVIDIA_DISABLE_REQUIRE=true --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all")
|
||||||
|
ldconfigOut, _, err := runner.Run("docker run --rm -i -e NVIDIA_DISABLE_REQUIRE=true --runtime=nvidia --gpus all nvcr.io/nvidia/cuda:12.8.0-base-ubi8 bash -c \"ldconfig -p | grep libcuda.so.1\"")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(ldconfigOut).To(ContainSubstring("/usr/local/cuda/compat"))
|
Expect(ldconfigOut).To(ContainSubstring("/usr/local/cuda/compat"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should work with the nvidia runtime in CDI mode", func(ctx context.Context) {
|
It("should work with the nvidia runtime in CDI mode", func(ctx context.Context) {
|
||||||
ldconfigOut, _, err := r.Run("docker run --rm -i -e NVIDIA_DISABLE_REQUIRE=true --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all nvcr.io/nvidia/cuda:12.8.0-base-ubi8 bash -c \"ldconfig -p | grep libcuda.so.1\"")
|
By("Running docker run with -e NVIDIA_DISABLE_REQUIRE=true --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all")
|
||||||
|
ldconfigOut, _, err := runner.Run("docker run --rm -i -e NVIDIA_DISABLE_REQUIRE=true --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=runtime.nvidia.com/gpu=all nvcr.io/nvidia/cuda:12.8.0-base-ubi8 bash -c \"ldconfig -p | grep libcuda.so.1\"")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(ldconfigOut).To(ContainSubstring("/usr/local/cuda/compat"))
|
Expect(ldconfigOut).To(ContainSubstring("/usr/local/cuda/compat"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should NOT work with nvidia-container-runtime-hook", func(ctx context.Context) {
|
It("should NOT work with nvidia-container-runtime-hook", func(ctx context.Context) {
|
||||||
ldconfigOut, _, err := r.Run("docker run --rm -i -e NVIDIA_DISABLE_REQUIRE=true --runtime=runc --gpus all nvcr.io/nvidia/cuda:12.8.0-base-ubi8 bash -c \"ldconfig -p | grep libcuda.so.1\"")
|
By("Running docker run with -e NVIDIA_DISABLE_REQUIRE=true --gpus all")
|
||||||
|
ldconfigOut, _, err := runner.Run("docker run --rm -i -e NVIDIA_DISABLE_REQUIRE=true --runtime=runc --gpus all nvcr.io/nvidia/cuda:12.8.0-base-ubi8 bash -c \"ldconfig -p | grep libcuda.so.1\"")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(ldconfigOut).To(ContainSubstring("/usr/lib64"))
|
Expect(ldconfigOut).To(ContainSubstring("/usr/lib64"))
|
||||||
})
|
})
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
|
* SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
*
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
* you may not use this file except in compliance with the License.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* You may obtain a copy of the License at
|
* you may not use this file except in compliance with the License.
|
||||||
*
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
||||||
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
*
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* See the License for the specific language governing permissions and
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* limitations under the License.
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package e2e
|
package e2e
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
module github.com/NVIDIA/nvidia-container-toolkit/tests
|
module github.com/NVIDIA/nvidia-container-toolkit/tests
|
||||||
|
|
||||||
go 1.23.2
|
go 1.24.1
|
||||||
|
|
||||||
toolchain go1.24.1
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/onsi/ginkgo/v2 v2.23.4
|
github.com/onsi/ginkgo/v2 v2.23.4
|
||||||
|
Loading…
Reference in New Issue
Block a user