diff --git a/internal/modifier/discover.go b/internal/modifier/discover.go new file mode 100644 index 00000000..475b7469 --- /dev/null +++ b/internal/modifier/discover.go @@ -0,0 +1,53 @@ +/** +# Copyright (c) 2022, 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 modifier + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/edits" + "github.com/NVIDIA/nvidia-container-toolkit/internal/oci" + "github.com/opencontainers/runtime-spec/specs-go" + "github.com/sirupsen/logrus" +) + +type discoverModifier struct { + logger *logrus.Logger + discoverer discover.Discover +} + +// NewModifierFromDiscoverer creates a modifier that applies the discovered +// modifications to an OCI spec if required by the runtime wrapper. +func NewModifierFromDiscoverer(logger *logrus.Logger, d discover.Discover) (oci.SpecModifier, error) { + m := discoverModifier{ + logger: logger, + discoverer: d, + } + return &m, nil +} + +// Modify applies the modifications required by discoverer to the incomming OCI spec. +// These modifications are applied in-place. +func (m discoverModifier) Modify(spec *specs.Spec) error { + specEdits, err := edits.NewSpecEdits(m.logger, m.discoverer) + if err != nil { + return fmt.Errorf("failed to get required container edits: %v", err) + } + + return specEdits.Modify(spec) +} diff --git a/internal/modifier/list.go b/internal/modifier/list.go new file mode 100644 index 00000000..16061219 --- /dev/null +++ b/internal/modifier/list.go @@ -0,0 +1,54 @@ +/** +# Copyright (c) 2022, 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 modifier + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/internal/oci" + "github.com/opencontainers/runtime-spec/specs-go" +) + +type list struct { + modifiers []oci.SpecModifier +} + +// Merge merges a set of OCI specification modifiers as a list. +// This can be used to compose modifiers. +func Merge(modifiers ...oci.SpecModifier) oci.SpecModifier { + var filteredModifiers []oci.SpecModifier + for _, m := range modifiers { + if m == nil { + continue + } + filteredModifiers = append(filteredModifiers, m) + } + + return list{ + modifiers: filteredModifiers, + } +} + +// Modify applies a list of modifiers in sequence and returns on any errors encountered. +func (m list) Modify(spec *specs.Spec) error { + for _, mm := range m.modifiers { + err := mm.Modify(spec) + if err != nil { + return err + } + } + + return nil +}