/** # 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 ( "fmt" "tags.cncf.io/container-device-interface/specs-go" ) type simplify struct{} var _ Transformer = (*simplify)(nil) // NewSimplifier creates a simplifier transformer. // This transoformer ensures that entities in the spec are deduplicated and that common edits are removed from device-specific edits. func NewSimplifier() Transformer { return Merge( dedupe{}, simplify{}, sorter{}, ) } // Transform simplifies the supplied spec. // Edits that are present in the common edits are removed from device-specific edits. func (s simplify) Transform(spec *specs.Spec) error { if spec == nil { return nil } dedupe := dedupe{} if err := dedupe.Transform(spec); err != nil { return err } commonEntityIDs, err := (*containerEdits)(&spec.ContainerEdits).getEntityIds() if err != nil { return err } toRemove := newRemover(commonEntityIDs...) var updatedDevices []specs.Device for _, device := range spec.Devices { deviceAsSpec := specs.Spec{ ContainerEdits: device.ContainerEdits, } err := toRemove.Transform(&deviceAsSpec) if err != nil { return fmt.Errorf("failed to transform device edits: %w", err) } if !(containerEdits)(deviceAsSpec.ContainerEdits).IsEmpty() { // Devices with empty edits are invalid. // We only update the container edits for the device if this would // result in a valid device. device.ContainerEdits = deviceAsSpec.ContainerEdits } updatedDevices = append(updatedDevices, device) } spec.Devices = updatedDevices return nil }