mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2024-11-25 21:39:10 +00:00
583793b7ae
This change adds a Requirements abstraction that can be used to check an images' NVIDIA_REQUIRE_* envvars against the host properties such as CUDA version or architecture. Signed-off-by: Evan Lezar <elezar@nvidia.com>
77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
/**
|
|
# 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 constraints
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// binary represents a binary operation. This can be used to compare a specified
|
|
// property to a value
|
|
type binary struct {
|
|
left Property
|
|
operator string
|
|
right string
|
|
}
|
|
|
|
// String returns the string representation of the binary comparator
|
|
func (c binary) String() string {
|
|
return fmt.Sprintf("%v%v%v", c.left.Name(), c.operator, c.right)
|
|
}
|
|
|
|
// Assert compares the property to the required value using the supplied comparator
|
|
func (c binary) Assert() error {
|
|
satisfied, err := c.eval()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if satisfied {
|
|
return nil
|
|
}
|
|
|
|
// error_setx(err, "unsatisfied condition: %s, please update your driver to a newer version, or use an earlier cuda container", predicate_format);
|
|
return fmt.Errorf("unsatisfied condition: %v (%v)", c.String(), c.left.String())
|
|
}
|
|
|
|
func (c binary) eval() (bool, error) {
|
|
if c.left == nil {
|
|
return true, nil
|
|
}
|
|
|
|
compare, err := c.left.CompareTo(c.right)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
switch string(c.operator) {
|
|
case equal:
|
|
return compare == 0, nil
|
|
case notEqual:
|
|
return compare != 0, nil
|
|
case less:
|
|
return compare < 0, nil
|
|
case lessEqual:
|
|
return compare <= 0, nil
|
|
case greater:
|
|
return compare > 0, nil
|
|
case greaterEqual:
|
|
return compare >= 0, nil
|
|
}
|
|
|
|
return false, fmt.Errorf("invalid operator %v", c.operator)
|
|
}
|