Skip to content
Snippets Groups Projects
Commit e273b833 authored by Travis Ralston's avatar Travis Ralston
Browse files

Fix config inheritance using maps

Objects get default values, which override the things we don't want...
parent 874a8cd2
No related branches found
No related tags found
No related merge requests found
...@@ -25,7 +25,6 @@ var singletonLock = &sync.Once{} ...@@ -25,7 +25,6 @@ var singletonLock = &sync.Once{}
var domains = make(map[string]*DomainRepoConfig) var domains = make(map[string]*DomainRepoConfig)
func reloadConfig() (*MainRepoConfig, map[string]*DomainRepoConfig, error) { func reloadConfig() (*MainRepoConfig, map[string]*DomainRepoConfig, error) {
c := NewDefaultMainConfig()
domainConfs := make(map[string]*DomainRepoConfig) domainConfs := make(map[string]*DomainRepoConfig)
// Write a default config if the one given doesn't exist // Write a default config if the one given doesn't exist
...@@ -33,7 +32,7 @@ func reloadConfig() (*MainRepoConfig, map[string]*DomainRepoConfig, error) { ...@@ -33,7 +32,7 @@ func reloadConfig() (*MainRepoConfig, map[string]*DomainRepoConfig, error) {
exists := err == nil || !os.IsNotExist(err) exists := err == nil || !os.IsNotExist(err)
if !exists { if !exists {
fmt.Println("Generating new configuration...") fmt.Println("Generating new configuration...")
configBytes, err := yaml.Marshal(c) configBytes, err := yaml.Marshal(NewDefaultMainConfig())
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
...@@ -78,7 +77,12 @@ func reloadConfig() (*MainRepoConfig, map[string]*DomainRepoConfig, error) { ...@@ -78,7 +77,12 @@ func reloadConfig() (*MainRepoConfig, map[string]*DomainRepoConfig, error) {
pathsOrdered = append(pathsOrdered, Path) pathsOrdered = append(pathsOrdered, Path)
} }
// Note: the rest of this relies on maps before finalizing on objects because when
// the yaml is parsed it causes default values for the types to land in the overridden
// config. We don't want this, so we use maps which inherently override only what is
// present then we convert that overtop of a default object we create.
pendingDomainConfigs := make(map[string][][]byte) pendingDomainConfigs := make(map[string][][]byte)
cMap := make(map[string]interface{})
for _, p := range pathsOrdered { for _, p := range pathsOrdered {
logrus.Info("Loading config file: ", p) logrus.Info("Loading config file: ", p)
...@@ -121,50 +125,61 @@ func reloadConfig() (*MainRepoConfig, map[string]*DomainRepoConfig, error) { ...@@ -121,50 +125,61 @@ func reloadConfig() (*MainRepoConfig, map[string]*DomainRepoConfig, error) {
} }
// Not a domain config - parse into regular config // Not a domain config - parse into regular config
err = yaml.Unmarshal(buffer, &c) err = yaml.Unmarshal(buffer, &cMap)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
} }
newDomainConfig := func() DomainRepoConfig { c := NewDefaultMainConfig()
dc := NewDefaultDomainConfig() err = mapToObjYaml(cMap, &c)
dc.DataStores = c.DataStores if err != nil {
dc.Archiving = c.Archiving return nil, nil, err
dc.Uploads = c.Uploads
dc.Identicons = c.Identicons
dc.Quarantine = c.Quarantine
dc.TimeoutSeconds = c.TimeoutSeconds
dc.Downloads = c.Downloads.DownloadsConfig
dc.Thumbnails = c.Thumbnails.ThumbnailsConfig
dc.UrlPreviews = c.UrlPreviews.UrlPreviewsConfig
return dc
} }
// Start building domain configs // Start building domain configs
dMaps := make(map[string]map[string]interface{})
for _, d := range c.Homeservers { for _, d := range c.Homeservers {
dc := newDomainConfig() dc := DomainConfigFrom(c)
domainConfs[d.Name] = &dc dc.Name = d.Name
domainConfs[d.Name].Name = d.Name dc.ClientServerApi = d.ClientServerApi
domainConfs[d.Name].ClientServerApi = d.ClientServerApi dc.BackoffAt = d.BackoffAt
domainConfs[d.Name].BackoffAt = d.BackoffAt dc.AdminApiKind = d.AdminApiKind
domainConfs[d.Name].AdminApiKind = d.AdminApiKind
m, err := objToMapYaml(dc)
if err != nil {
return nil, nil, err
}
dMaps[d.Name] = m
} }
for hs, bs := range pendingDomainConfigs { for hs, bs := range pendingDomainConfigs {
if _, ok := domainConfs[hs]; !ok { if _, ok := dMaps[hs]; !ok {
dc := newDomainConfig() dc := DomainConfigFrom(c)
domainConfs[hs] = &dc dc.Name = hs
domainConfs[hs].Name = hs
m, err := objToMapYaml(dc)
if err != nil {
return nil, nil, err
}
dMaps[hs] = m
} }
for _, b := range bs { for _, b := range bs {
err = yaml.Unmarshal(b, domainConfs[hs]) m := dMaps[hs]
err = yaml.Unmarshal(b, &m)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
} }
c := DomainRepoConfig{}
err = mapToObjYaml(dMaps[hs], &c)
if err != nil {
return nil, nil, err
}
// For good measure... // For good measure...
domainConfs[hs] = &c
domainConfs[hs].Name = hs domainConfs[hs].Name = hs
} }
...@@ -198,6 +213,21 @@ func GetDomain(domain string) *DomainRepoConfig { ...@@ -198,6 +213,21 @@ func GetDomain(domain string) *DomainRepoConfig {
return domains[domain] return domains[domain]
} }
func DomainConfigFrom(c MainRepoConfig) DomainRepoConfig {
// HACK: We should be better at this kind of inheritance
dc := NewDefaultDomainConfig()
dc.DataStores = c.DataStores
dc.Archiving = c.Archiving
dc.Uploads = c.Uploads
dc.Identicons = c.Identicons
dc.Quarantine = c.Quarantine
dc.TimeoutSeconds = c.TimeoutSeconds
dc.Downloads = c.Downloads.DownloadsConfig
dc.Thumbnails = c.Thumbnails.ThumbnailsConfig
dc.UrlPreviews = c.UrlPreviews.UrlPreviewsConfig
return dc
}
func UniqueDatastores() []DatastoreConfig { func UniqueDatastores() []DatastoreConfig {
confs := make([]DatastoreConfig, 0) confs := make([]DatastoreConfig, 0)
......
package config
import (
"gopkg.in/yaml.v2"
)
func mapToObjYaml(input map[string]interface{}, ref interface{}) error {
encoded, err := yaml.Marshal(input)
if err != nil {
return err
}
err = yaml.Unmarshal(encoded, ref)
return err
}
func objToMapYaml(input interface{}) (map[string]interface{}, error) {
encoded, err := yaml.Marshal(input)
if err != nil {
return nil, err
}
m := make(map[string]interface{})
err = yaml.Unmarshal(encoded, &m)
return m, err
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment