X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/9f06f5b2e5f5549c61458db7f401fc2e2dc7dd0b..927524f1be454de021180b74999d682780b8cb6b:/lib/config/load.go diff --git a/lib/config/load.go b/lib/config/load.go index 169b252a0e..956a47b1a4 100644 --- a/lib/config/load.go +++ b/lib/config/load.go @@ -269,6 +269,7 @@ func (ldr *Loader) Load() (*arvados.Config, error) { ldr.loadOldKeepBalanceConfig, ) } + loadFuncs = append(loadFuncs, ldr.setImplicitStorageClasses) for _, f := range loadFuncs { err = f(&cfg) if err != nil { @@ -294,8 +295,10 @@ 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), // TODO: check non-empty Rendezvous on // services other than Keepstore } { @@ -336,6 +339,66 @@ 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 { + if len(cc.StorageClasses) > 0 { + continue cluster + } + for _, vol := range cc.Volumes { + if len(vol.StorageClasses) > 0 { + continue cluster + } + } + // No explicit StorageClasses config info at all; fill + // in implicit defaults. + for id, vol := range cc.Volumes { + vol.StorageClasses = map[string]bool{"default": true} + cc.Volumes[id] = vol + } + cc.StorageClasses = map[string]arvados.StorageClassConfig{"default": {Default: true}} + cfg.Clusters[id] = cc + } + return nil +} + +func (ldr *Loader) checkStorageClasses(cc arvados.Cluster) error { + classOnVolume := map[string]bool{} + for volid, vol := range cc.Volumes { + if len(vol.StorageClasses) == 0 { + return fmt.Errorf("%s: volume has no StorageClasses listed", volid) + } + for classid := range vol.StorageClasses { + if _, ok := cc.StorageClasses[classid]; !ok { + return fmt.Errorf("%s: volume refers to storage class %q that is not defined in StorageClasses", volid, classid) + } + classOnVolume[classid] = true + } + } + haveDefault := false + for classid, sc := range cc.StorageClasses { + if !classOnVolume[classid] && len(cc.Volumes) > 0 { + ldr.Logger.Warnf("there are no volumes providing storage class %q", classid) + } + if sc.Default { + haveDefault = true + } + } + if !haveDefault { + return fmt.Errorf("there is no default storage class (at least one entry in StorageClasses must have Default: true)") + } + return nil +} + func checkKeyConflict(label string, m map[string]string) error { saw := map[string]bool{} for k := range m {