17417: Merge branch 'main' into 17417-add-arm64
[arvados.git] / lib / config / load.go
index 248960beb99f875620dca5ee7738f8575877c57d..b4a34335b6ddc060984b4b12bfa137a88c54ab87 100644 (file)
@@ -6,6 +6,7 @@ package config
 
 import (
        "bytes"
+       _ "embed"
        "encoding/json"
        "errors"
        "flag"
@@ -14,6 +15,7 @@ import (
        "io/ioutil"
        "os"
        "regexp"
+       "strconv"
        "strings"
 
        "git.arvados.org/arvados.git/sdk/go/arvados"
@@ -22,6 +24,9 @@ import (
        "github.com/sirupsen/logrus"
 )
 
+//go:embed config.default.yml
+var DefaultYAML []byte
+
 var ErrNoClustersDefined = errors.New("config does not define any clusters")
 
 type Loader struct {
@@ -295,9 +300,11 @@ func (ldr *Loader) Load() (*arvados.Config, error) {
                        ldr.checkToken(fmt.Sprintf("Clusters.%s.SystemRootToken", id), cc.SystemRootToken),
                        ldr.checkToken(fmt.Sprintf("Clusters.%s.Collections.BlobSigningKey", id), cc.Collections.BlobSigningKey),
                        checkKeyConflict(fmt.Sprintf("Clusters.%s.PostgreSQL.Connection", id), cc.PostgreSQL.Connection),
+                       ldr.checkEnum("Containers.LocalKeepLogsToContainerLog", cc.Containers.LocalKeepLogsToContainerLog, "none", "all", "errors"),
                        ldr.checkEmptyKeepstores(cc),
                        ldr.checkUnlistedKeepstores(cc),
                        ldr.checkStorageClasses(cc),
+                       ldr.checkCUDAVersions(cc),
                        // TODO: check non-empty Rendezvous on
                        // services other than Keepstore
                } {
@@ -338,6 +345,15 @@ func (ldr *Loader) checkToken(label, token string) error {
        return nil
 }
 
+func (ldr *Loader) checkEnum(label, value string, accepted ...string) error {
+       for _, s := range accepted {
+               if s == value {
+                       return nil
+               }
+       }
+       return fmt.Errorf("%s: unacceptable value %q: must be one of %q", label, value, accepted)
+}
+
 func (ldr *Loader) setImplicitStorageClasses(cfg *arvados.Config) error {
 cluster:
        for id, cc := range cfg.Clusters {
@@ -389,6 +405,24 @@ func (ldr *Loader) checkStorageClasses(cc arvados.Cluster) error {
        return nil
 }
 
+func (ldr *Loader) checkCUDAVersions(cc arvados.Cluster) error {
+       for _, it := range cc.InstanceTypes {
+               if it.CUDA.DeviceCount == 0 {
+                       continue
+               }
+
+               _, err := strconv.ParseFloat(it.CUDA.DriverVersion, 64)
+               if err != nil {
+                       return fmt.Errorf("InstanceType %q has invalid CUDA.DriverVersion %q, expected format X.Y (%v)", it.Name, it.CUDA.DriverVersion, err)
+               }
+               _, err = strconv.ParseFloat(it.CUDA.HardwareCapability, 64)
+               if err != nil {
+                       return fmt.Errorf("InstanceType %q has invalid CUDA.HardwareCapability %q, expected format X.Y (%v)", it.Name, it.CUDA.HardwareCapability, err)
+               }
+       }
+       return nil
+}
+
 func checkKeyConflict(label string, m map[string]string) error {
        saw := map[string]bool{}
        for k := range m {