Use modifier list and discoverModifer

This change uses modifier compositioning and the discoverModifier to
refactor the existing CSV modifier.

This change adds a discoverModifier to the internal/modifier package and
refactors the CSV modifier to use this abstraction.

Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
Evan Lezar 2022-06-02 17:10:31 +02:00
parent 55ac8628c8
commit d66c00dd1d
2 changed files with 12 additions and 24 deletions

View File

@ -24,10 +24,9 @@ import (
"github.com/NVIDIA/nvidia-container-toolkit/internal/cuda" "github.com/NVIDIA/nvidia-container-toolkit/internal/cuda"
"github.com/NVIDIA/nvidia-container-toolkit/internal/discover" "github.com/NVIDIA/nvidia-container-toolkit/internal/discover"
"github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv" "github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv"
"github.com/NVIDIA/nvidia-container-toolkit/internal/edits" "github.com/NVIDIA/nvidia-container-toolkit/internal/modifier"
"github.com/NVIDIA/nvidia-container-toolkit/internal/oci" "github.com/NVIDIA/nvidia-container-toolkit/internal/oci"
"github.com/NVIDIA/nvidia-container-toolkit/internal/requirements" "github.com/NVIDIA/nvidia-container-toolkit/internal/requirements"
"github.com/opencontainers/runtime-spec/specs-go"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -104,33 +103,22 @@ func NewCSVModifier(logger *logrus.Logger, cfg *config.Config, ociSpec oci.Spec)
d := discover.NewList(csvDiscoverer, ldcacheUpdateHook, createSymlinksHook) d := discover.NewList(csvDiscoverer, ldcacheUpdateHook, createSymlinksHook)
return newModifierFromDiscoverer(logger, d) return newCSVModifierFromDiscoverer(logger, d)
} }
// newModifierFromDiscoverer created a modifier that aplies the discovered // newCSVModifierFromDiscoverer is used to test with dependency injection
// modifications to an OCI spec if require by the runtime wrapper. func newCSVModifierFromDiscoverer(logger *logrus.Logger, d discover.Discover) (oci.SpecModifier, error) {
func newModifierFromDiscoverer(logger *logrus.Logger, d discover.Discover) (oci.SpecModifier, error) { discoverModifier, err := modifier.NewModifierFromDiscoverer(logger, d)
m := csvMode{
logger: logger,
discoverer: d,
}
return &m, nil
}
// Modify applies the required modifications to the incomming OCI spec. These modifications
// are applied in-place.
func (m csvMode) Modify(spec *specs.Spec) error {
err := nvidiaContainerRuntimeHookRemover{m.logger}.Modify(spec)
if err != nil { if err != nil {
return fmt.Errorf("failed to remove existing hooks: %v", err) return nil, fmt.Errorf("failed to construct modifier: %v", err)
} }
specEdits, err := edits.NewSpecEdits(m.logger, m.discoverer) modifiers := modifier.Merge(
if err != nil { nvidiaContainerRuntimeHookRemover{logger},
return fmt.Errorf("failed to get required container edits: %v", err) discoverModifier,
} )
return specEdits.Modify(spec) return modifiers, nil
} }
func checkRequirements(logger *logrus.Logger, image *image.CUDA) error { func checkRequirements(logger *logrus.Logger, image *image.CUDA) error {

View File

@ -268,7 +268,7 @@ func TestExperimentalModifier(t *testing.T) {
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.description, func(t *testing.T) { t.Run(tc.description, func(t *testing.T) {
m, err := newModifierFromDiscoverer(logger, tc.discover) m, err := newCSVModifierFromDiscoverer(logger, tc.discover)
require.NoError(t, err) require.NoError(t, err)
err = m.Modify(tc.spec) err = m.Modify(tc.spec)