/* * # 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 ( "encoding/json" "github.com/container-orchestrated-devices/container-device-interface/specs-go" ) type containerEdits specs.ContainerEdits // IsEmpty returns true if the edits are empty. func (e containerEdits) IsEmpty() bool { // Devices with empty edits are invalid if len(e.DeviceNodes) > 0 { return false } if len(e.Env) > 0 { return false } if len(e.Hooks) > 0 { return false } if len(e.Mounts) > 0 { return false } return true } func (e *containerEdits) getEntityIds() ([]string, error) { if e == nil { return nil, nil } uniqueIDs := make(map[string]bool) deviceNodes, err := e.getDeviceNodeIDs() if err != nil { return nil, err } for k := range deviceNodes { uniqueIDs[k] = true } envs, err := e.getEnvIDs() if err != nil { return nil, err } for k := range envs { uniqueIDs[k] = true } hooks, err := e.getHookIDs() if err != nil { return nil, err } for k := range hooks { uniqueIDs[k] = true } mounts, err := e.getMountIDs() if err != nil { return nil, err } for k := range mounts { uniqueIDs[k] = true } var ids []string for k := range uniqueIDs { ids = append(ids, k) } return ids, nil } func (e *containerEdits) getDeviceNodeIDs() (map[string]bool, error) { deviceIDs := make(map[string]bool) for _, entity := range e.DeviceNodes { id, err := deviceNode(*entity).id() if err != nil { return nil, err } deviceIDs[id] = true } return deviceIDs, nil } func (e *containerEdits) getEnvIDs() (map[string]bool, error) { envIDs := make(map[string]bool) for _, entity := range e.Env { id, err := env(entity).id() if err != nil { return nil, err } envIDs[id] = true } return envIDs, nil } func (e *containerEdits) getHookIDs() (map[string]bool, error) { hookIDs := make(map[string]bool) for _, entity := range e.Hooks { id, err := hook(*entity).id() if err != nil { return nil, err } hookIDs[id] = true } return hookIDs, nil } func (e *containerEdits) getMountIDs() (map[string]bool, error) { mountIDs := make(map[string]bool) for _, entity := range e.Mounts { id, err := mount(*entity).id() if err != nil { return nil, err } mountIDs[id] = true } return mountIDs, nil } type deviceNode specs.DeviceNode func (dn deviceNode) id() (string, error) { b, err := json.Marshal(dn) return string(b), err } type env string func (e env) id() (string, error) { return string(e), nil } type mount specs.Mount func (m mount) id() (string, error) { b, err := json.Marshal(m) return string(b), err } type hook specs.Hook func (m hook) id() (string, error) { b, err := json.Marshal(m) return string(b), err }