X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/10bfcf75847ada2dee77a276b4cc912b43acc936..3bfa2cd709a860d161326e66b8bf511f650d3f0e:/lib/config/load.go diff --git a/lib/config/load.go b/lib/config/load.go index 248960beb9..b4a34335b6 100644 --- a/lib/config/load.go +++ b/lib/config/load.go @@ -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 {