2022-09-29 12:39:56 +00:00
|
|
|
/**
|
|
|
|
# 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 image
|
|
|
|
|
2023-08-10 12:15:24 +00:00
|
|
|
import (
|
|
|
|
"sort"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2022-09-29 12:39:56 +00:00
|
|
|
// DriverCapability represents the possible values of NVIDIA_DRIVER_CAPABILITIES
|
|
|
|
type DriverCapability string
|
|
|
|
|
|
|
|
// Constants for the supported driver capabilities
|
|
|
|
const (
|
|
|
|
DriverCapabilityAll DriverCapability = "all"
|
2023-08-10 12:15:24 +00:00
|
|
|
DriverCapabilityNone DriverCapability = "none"
|
2022-09-29 12:39:56 +00:00
|
|
|
DriverCapabilityCompat32 DriverCapability = "compat32"
|
|
|
|
DriverCapabilityCompute DriverCapability = "compute"
|
|
|
|
DriverCapabilityDisplay DriverCapability = "display"
|
|
|
|
DriverCapabilityGraphics DriverCapability = "graphics"
|
|
|
|
DriverCapabilityNgx DriverCapability = "ngx"
|
|
|
|
DriverCapabilityUtility DriverCapability = "utility"
|
|
|
|
DriverCapabilityVideo DriverCapability = "video"
|
|
|
|
)
|
|
|
|
|
2023-08-10 12:15:24 +00:00
|
|
|
var (
|
|
|
|
driverCapabilitiesNone = NewDriverCapabilities()
|
|
|
|
driverCapabilitiesAll = NewDriverCapabilities("all")
|
|
|
|
|
|
|
|
// DefaultDriverCapabilities sets the value for driver capabilities if no value is set.
|
|
|
|
DefaultDriverCapabilities = NewDriverCapabilities("utility,compute")
|
|
|
|
// SupportedDriverCapabilities defines the set of all supported driver capabilities.
|
|
|
|
SupportedDriverCapabilities = NewDriverCapabilities("compute,compat32,graphics,utility,video,display,ngx")
|
|
|
|
)
|
|
|
|
|
|
|
|
// NewDriverCapabilities creates a set of driver capabilities from the specified capabilities
|
|
|
|
func NewDriverCapabilities(capabilities ...string) DriverCapabilities {
|
|
|
|
dc := make(DriverCapabilities)
|
|
|
|
for _, capability := range capabilities {
|
|
|
|
for _, c := range strings.Split(capability, ",") {
|
|
|
|
trimmed := strings.TrimSpace(c)
|
|
|
|
if trimmed == "" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
dc[DriverCapability(trimmed)] = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return dc
|
|
|
|
}
|
|
|
|
|
2022-09-29 12:39:56 +00:00
|
|
|
// DriverCapabilities represents the NVIDIA_DRIVER_CAPABILITIES set for the specified image.
|
|
|
|
type DriverCapabilities map[DriverCapability]bool
|
|
|
|
|
|
|
|
// Has check whether the specified capability is selected.
|
|
|
|
func (c DriverCapabilities) Has(capability DriverCapability) bool {
|
2023-08-10 12:15:24 +00:00
|
|
|
if c.IsAll() {
|
2022-09-29 12:39:56 +00:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
return c[capability]
|
|
|
|
}
|
|
|
|
|
2023-08-25 14:14:06 +00:00
|
|
|
// Any checks whether any of the specified capabilities are set
|
2022-09-29 12:39:56 +00:00
|
|
|
func (c DriverCapabilities) Any(capabilities ...DriverCapability) bool {
|
2023-08-10 12:15:24 +00:00
|
|
|
if c.IsAll() {
|
|
|
|
return true
|
|
|
|
}
|
2022-09-29 12:39:56 +00:00
|
|
|
for _, cap := range capabilities {
|
|
|
|
if c.Has(cap) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
2023-08-10 12:15:24 +00:00
|
|
|
|
|
|
|
// List returns the list of driver capabilities.
|
|
|
|
// The list is sorted.
|
|
|
|
func (c DriverCapabilities) List() []string {
|
|
|
|
var capabilities []string
|
|
|
|
for capability := range c {
|
|
|
|
capabilities = append(capabilities, string(capability))
|
|
|
|
}
|
|
|
|
sort.Strings(capabilities)
|
|
|
|
return capabilities
|
|
|
|
}
|
|
|
|
|
|
|
|
// String returns the string repesentation of the driver capabilities.
|
|
|
|
func (c DriverCapabilities) String() string {
|
|
|
|
if c.IsAll() {
|
|
|
|
return "all"
|
|
|
|
}
|
|
|
|
return strings.Join(c.List(), ",")
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsAll indicates whether the set of capabilities is `all`
|
|
|
|
func (c DriverCapabilities) IsAll() bool {
|
|
|
|
return c[DriverCapabilityAll]
|
|
|
|
}
|
|
|
|
|
|
|
|
// Intersection returns a new set which includes the item in BOTH d and s2.
|
|
|
|
// For example: d = {a1, a2} s2 = {a2, a3} s1.Intersection(s2) = {a2}
|
|
|
|
func (c DriverCapabilities) Intersection(s2 DriverCapabilities) DriverCapabilities {
|
|
|
|
if s2.IsAll() {
|
|
|
|
return c
|
|
|
|
}
|
|
|
|
if c.IsAll() {
|
|
|
|
return s2
|
|
|
|
}
|
|
|
|
|
|
|
|
intersection := make(DriverCapabilities)
|
|
|
|
for capability := range s2 {
|
|
|
|
if c[capability] {
|
|
|
|
intersection[capability] = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return intersection
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsSuperset returns true if and only if d is a superset of s2.
|
|
|
|
func (c DriverCapabilities) IsSuperset(s2 DriverCapabilities) bool {
|
|
|
|
if c.IsAll() {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
for capability := range s2 {
|
|
|
|
if !c[capability] {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|