diff --git a/pkg/nvcdi/transform/no-op.go b/pkg/nvcdi/transform/no-op.go new file mode 100644 index 00000000..7985f195 --- /dev/null +++ b/pkg/nvcdi/transform/no-op.go @@ -0,0 +1,35 @@ +/** +# Copyright (c) NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +**/ + +package transform + +import ( + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type noop struct{} + +var _ Transformer = (*noop)(nil) + +// NewNoopTransformer returns a no-op transformer +func NewNoopTransformer() Transformer { + return noop{} +} + +// Transform is a no-op +func (n noop) Transform(spec *specs.Spec) error { + return nil +} diff --git a/pkg/nvcdi/transform/root.go b/pkg/nvcdi/transform/root.go index 6910ad2e..53bcf2a4 100644 --- a/pkg/nvcdi/transform/root.go +++ b/pkg/nvcdi/transform/root.go @@ -32,8 +32,13 @@ type rootTransformer struct { var _ Transformer = (*rootTransformer)(nil) // NewRootTransformer creates a new transformer for modifying -// the root for paths in a CDI spec. +// the root for paths in a CDI spec. If both roots are identical, +// this tranformer is a no-op. func NewRootTransformer(root string, targetRoot string) Transformer { + if root == targetRoot { + return NewNoopTransformer() + } + t := rootTransformer{ root: root, targetRoot: targetRoot, @@ -69,10 +74,23 @@ func (t rootTransformer) applyToEdits(edits *specs.ContainerEdits) error { for i, hook := range edits.Hooks { hook.Path = t.transformPath(hook.Path) - // TODO: The args need more attention. For the hooks that create symlinks we would have to transform these too. var args []string for _, arg := range hook.Args { - args = append(args, t.transformPath(arg)) + if !strings.Contains(arg, "::") { + args = append(args, t.transformPath(arg)) + continue + } + + // For the 'create-symlinks' hook, special care is taken for the + // '--link' flag argument which takes the form ::. + // Both paths, the target and link paths, are transformed. + split := strings.Split(arg, "::") + if len(split) != 2 { + return fmt.Errorf("unexpected number of '::' separators in hook argument") + } + split[0] = t.transformPath(split[0]) + split[1] = t.transformPath(split[1]) + args = append(args, strings.Join(split, "::")) } hook.Args = args edits.Hooks[i] = hook diff --git a/pkg/nvcdi/transform/root_test.go b/pkg/nvcdi/transform/root_test.go index 1689d5b1..519c9eae 100644 --- a/pkg/nvcdi/transform/root_test.go +++ b/pkg/nvcdi/transform/root_test.go @@ -98,18 +98,54 @@ func TestRootTransformer(t *testing.T) { spec: &specs.Spec{ ContainerEdits: specs.ContainerEdits{ Hooks: []*specs.Hook{ - {Path: "/root/usr/bin/nvidia-ctk"}, - {Path: "/target-root/usr/bin/nvidia-ctk"}, - {Path: "/different-root/usr/bin/nvidia-ctk"}, + { + Path: "/root/usr/bin/nvidia-ctk", + Args: []string{ + "--link", + "/root/path/to/target::/root/path/to/link", + }, + }, + { + Path: "/target-root/usr/bin/nvidia-ctk", + Args: []string{ + "--link", + "/target-root/path/to/target::/target-root/path/to/link", + }, + }, + { + Path: "/different-root/usr/bin/nvidia-ctk", + Args: []string{ + "--link", + "/different-root/path/to/target::/different-root/path/to/link", + }, + }, }, }, }, expectedSpec: &specs.Spec{ ContainerEdits: specs.ContainerEdits{ Hooks: []*specs.Hook{ - {Path: "/target-root/usr/bin/nvidia-ctk"}, - {Path: "/target-root/usr/bin/nvidia-ctk"}, - {Path: "/different-root/usr/bin/nvidia-ctk"}, + { + Path: "/target-root/usr/bin/nvidia-ctk", + Args: []string{ + "--link", + "/target-root/path/to/target::/target-root/path/to/link", + }, + }, + { + Path: "/target-root/usr/bin/nvidia-ctk", + Args: []string{ + "--link", + "/target-root/path/to/target::/target-root/path/to/link", + }, + }, + { + Path: "/different-root/usr/bin/nvidia-ctk", + Args: []string{ + "--link", + "/different-root/path/to/target::/different-root/path/to/link", + }, + }, }, }, },