diff options
Diffstat (limited to 'weed/worker/tasks/registry.go')
| -rw-r--r-- | weed/worker/tasks/registry.go | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/weed/worker/tasks/registry.go b/weed/worker/tasks/registry.go new file mode 100644 index 000000000..105055128 --- /dev/null +++ b/weed/worker/tasks/registry.go @@ -0,0 +1,110 @@ +package tasks + +import ( + "sync" + + "github.com/seaweedfs/seaweedfs/weed/glog" + "github.com/seaweedfs/seaweedfs/weed/worker/types" +) + +var ( + globalRegistry *TaskRegistry + globalTypesRegistry *types.TaskRegistry + globalUIRegistry *types.UIRegistry + registryOnce sync.Once + typesRegistryOnce sync.Once + uiRegistryOnce sync.Once +) + +// GetGlobalRegistry returns the global task registry (singleton) +func GetGlobalRegistry() *TaskRegistry { + registryOnce.Do(func() { + globalRegistry = NewTaskRegistry() + glog.V(1).Infof("Created global task registry") + }) + return globalRegistry +} + +// GetGlobalTypesRegistry returns the global types registry (singleton) +func GetGlobalTypesRegistry() *types.TaskRegistry { + typesRegistryOnce.Do(func() { + globalTypesRegistry = types.NewTaskRegistry() + glog.V(1).Infof("Created global types registry") + }) + return globalTypesRegistry +} + +// GetGlobalUIRegistry returns the global UI registry (singleton) +func GetGlobalUIRegistry() *types.UIRegistry { + uiRegistryOnce.Do(func() { + globalUIRegistry = types.NewUIRegistry() + glog.V(1).Infof("Created global UI registry") + }) + return globalUIRegistry +} + +// AutoRegister registers a task directly with the global registry +func AutoRegister(taskType types.TaskType, factory types.TaskFactory) { + registry := GetGlobalRegistry() + registry.Register(taskType, factory) + glog.V(1).Infof("Auto-registered task type: %s", taskType) +} + +// AutoRegisterTypes registers a task with the global types registry +func AutoRegisterTypes(registerFunc func(*types.TaskRegistry)) { + registry := GetGlobalTypesRegistry() + registerFunc(registry) + glog.V(1).Infof("Auto-registered task with types registry") +} + +// AutoRegisterUI registers a UI provider with the global UI registry +func AutoRegisterUI(registerFunc func(*types.UIRegistry)) { + registry := GetGlobalUIRegistry() + registerFunc(registry) + glog.V(1).Infof("Auto-registered task UI provider") +} + +// SetDefaultCapabilitiesFromRegistry sets the default worker capabilities +// based on all registered task types +func SetDefaultCapabilitiesFromRegistry() { + typesRegistry := GetGlobalTypesRegistry() + + var capabilities []types.TaskType + for taskType := range typesRegistry.GetAllDetectors() { + capabilities = append(capabilities, taskType) + } + + // Set the default capabilities in the types package + types.SetDefaultCapabilities(capabilities) + + glog.V(1).Infof("Set default worker capabilities from registry: %v", capabilities) +} + +// BuildMaintenancePolicyFromTasks creates a maintenance policy with default configurations +// from all registered tasks using their UI providers +func BuildMaintenancePolicyFromTasks() *types.MaintenancePolicy { + policy := types.NewMaintenancePolicy() + + // Get all registered task types from the UI registry + uiRegistry := GetGlobalUIRegistry() + + for taskType, provider := range uiRegistry.GetAllProviders() { + // Get the default configuration from the UI provider + defaultConfig := provider.GetCurrentConfig() + + // Set the configuration in the policy + policy.SetTaskConfig(taskType, defaultConfig) + + glog.V(3).Infof("Added default config for task type %s to policy", taskType) + } + + glog.V(2).Infof("Built maintenance policy with %d task configurations", len(policy.TaskConfigs)) + return policy +} + +// SetMaintenancePolicyFromTasks sets the default maintenance policy from registered tasks +func SetMaintenancePolicyFromTasks() { + // This function can be called to initialize the policy from registered tasks + // For now, we'll just log that this should be called by the integration layer + glog.V(1).Infof("SetMaintenancePolicyFromTasks called - policy should be built by the integration layer") +} |
