Skip to content

Commit

Permalink
Refactor global plugin registry
Browse files Browse the repository at this point in the history
The global registry enabled concurrent map writes to the instance map,
which causes a panic.
  • Loading branch information
Nuckal777 committed Feb 21, 2022
1 parent 79ce6d0 commit e0b82d7
Showing 1 changed file with 11 additions and 13 deletions.
24 changes: 11 additions & 13 deletions controllers/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,6 @@ import (
"github.com/sapcc/maintenance-controller/state"
)

var Registry plugin.Registry

func init() {
Registry = plugin.NewRegistry()
addPluginsToRegistry(&Registry)
}

type ProfileDescriptor struct {
Name string `config:"name" validate:"required"`
Operational StateDescriptor
Expand Down Expand Up @@ -72,6 +65,8 @@ type Config struct {
NotificationInterval time.Duration
// Profiles contains all known profiles
Profiles map[string]state.Profile
// Contains reference to all plugins and their instances
Registry plugin.Registry
}

// LoadConfig (re-)initializes the config with values provided by the given ucfg.Config.
Expand All @@ -81,22 +76,25 @@ func LoadConfig(config *ucfg.Config) (*Config, error) {
if err != nil {
return nil, err
}
err = Registry.LoadInstances(&global.Instances)
registry := plugin.NewRegistry()
addPluginsToRegistry(&registry)
err = registry.LoadInstances(&global.Instances)
if err != nil {
return nil, err
}
profileMap, err := loadProfiles(global.Profiles)
profileMap, err := loadProfiles(global.Profiles, &registry)
if err != nil {
return nil, err
}
return &Config{
RequeueInterval: global.Intervals.Notify,
NotificationInterval: global.Intervals.Requeue,
Profiles: profileMap,
Registry: registry,
}, nil
}

func loadProfiles(profiles []ProfileDescriptor) (map[string]state.Profile, error) {
func loadProfiles(profiles []ProfileDescriptor, registry *plugin.Registry) (map[string]state.Profile, error) {
profileMap := make(map[string]state.Profile)
// add an empty default profile
profileMap[constants.DefaultProfileName] = state.Profile{
Expand All @@ -108,15 +106,15 @@ func loadProfiles(profiles []ProfileDescriptor) (map[string]state.Profile, error
},
}
for _, profile := range profiles {
operationalChain, err := loadPluginChains(profile.Operational, &Registry)
operationalChain, err := loadPluginChains(profile.Operational, registry)
if err != nil {
return nil, err
}
requiredChain, err := loadPluginChains(profile.MaintenanceRequired, &Registry)
requiredChain, err := loadPluginChains(profile.MaintenanceRequired, registry)
if err != nil {
return nil, err
}
maintenanceChain, err := loadPluginChains(profile.InMaintenance, &Registry)
maintenanceChain, err := loadPluginChains(profile.InMaintenance, registry)
if err != nil {
return nil, err
}
Expand Down

0 comments on commit e0b82d7

Please sign in to comment.