registration.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package base
  2. import (
  3. "fmt"
  4. "github.com/seaweedfs/seaweedfs/weed/admin/config"
  5. "github.com/seaweedfs/seaweedfs/weed/glog"
  6. "github.com/seaweedfs/seaweedfs/weed/pb/worker_pb"
  7. "github.com/seaweedfs/seaweedfs/weed/worker/tasks"
  8. "github.com/seaweedfs/seaweedfs/weed/worker/types"
  9. )
  10. // GenericFactory creates task instances using a TaskDefinition
  11. type GenericFactory struct {
  12. *tasks.BaseTaskFactory
  13. taskDef *TaskDefinition
  14. }
  15. // NewGenericFactory creates a generic task factory
  16. func NewGenericFactory(taskDef *TaskDefinition) *GenericFactory {
  17. return &GenericFactory{
  18. BaseTaskFactory: tasks.NewBaseTaskFactory(
  19. taskDef.Type,
  20. taskDef.Capabilities,
  21. taskDef.Description,
  22. ),
  23. taskDef: taskDef,
  24. }
  25. }
  26. // Create creates a task instance using the task definition
  27. func (f *GenericFactory) Create(params *worker_pb.TaskParams) (types.Task, error) {
  28. if f.taskDef.CreateTask == nil {
  29. return nil, fmt.Errorf("no task creation function defined for %s", f.taskDef.Type)
  30. }
  31. return f.taskDef.CreateTask(params)
  32. }
  33. // Type returns the task type
  34. func (f *GenericFactory) Type() string {
  35. return string(f.taskDef.Type)
  36. }
  37. // Description returns a description of what this task does
  38. func (f *GenericFactory) Description() string {
  39. return f.taskDef.Description
  40. }
  41. // Capabilities returns the task capabilities
  42. func (f *GenericFactory) Capabilities() []string {
  43. return f.taskDef.Capabilities
  44. }
  45. // GenericSchemaProvider provides config schema from TaskDefinition
  46. type GenericSchemaProvider struct {
  47. taskDef *TaskDefinition
  48. }
  49. // GetConfigSchema returns the schema from task definition
  50. func (p *GenericSchemaProvider) GetConfigSchema() *tasks.TaskConfigSchema {
  51. return &tasks.TaskConfigSchema{
  52. TaskName: string(p.taskDef.Type),
  53. DisplayName: p.taskDef.DisplayName,
  54. Description: p.taskDef.Description,
  55. Icon: p.taskDef.Icon,
  56. Schema: config.Schema{
  57. Fields: p.taskDef.ConfigSpec.Fields,
  58. },
  59. }
  60. }
  61. // GenericUIProvider provides UI functionality from TaskDefinition
  62. type GenericUIProvider struct {
  63. taskDef *TaskDefinition
  64. }
  65. // GetTaskType returns the task type
  66. func (ui *GenericUIProvider) GetTaskType() types.TaskType {
  67. return ui.taskDef.Type
  68. }
  69. // GetDisplayName returns the human-readable name
  70. func (ui *GenericUIProvider) GetDisplayName() string {
  71. return ui.taskDef.DisplayName
  72. }
  73. // GetDescription returns a description of what this task does
  74. func (ui *GenericUIProvider) GetDescription() string {
  75. return ui.taskDef.Description
  76. }
  77. // GetIcon returns the icon CSS class for this task type
  78. func (ui *GenericUIProvider) GetIcon() string {
  79. return ui.taskDef.Icon
  80. }
  81. // GetCurrentConfig returns current config as TaskConfig
  82. func (ui *GenericUIProvider) GetCurrentConfig() types.TaskConfig {
  83. return ui.taskDef.Config
  84. }
  85. // ApplyTaskPolicy applies protobuf TaskPolicy configuration
  86. func (ui *GenericUIProvider) ApplyTaskPolicy(policy *worker_pb.TaskPolicy) error {
  87. return ui.taskDef.Config.FromTaskPolicy(policy)
  88. }
  89. // ApplyTaskConfig applies TaskConfig interface configuration
  90. func (ui *GenericUIProvider) ApplyTaskConfig(config types.TaskConfig) error {
  91. taskPolicy := config.ToTaskPolicy()
  92. return ui.taskDef.Config.FromTaskPolicy(taskPolicy)
  93. }
  94. // RegisterTask registers a complete task definition with all registries
  95. func RegisterTask(taskDef *TaskDefinition) {
  96. // Validate task definition
  97. if err := validateTaskDefinition(taskDef); err != nil {
  98. glog.Errorf("Invalid task definition for %s: %v", taskDef.Type, err)
  99. return
  100. }
  101. // Create and register factory
  102. factory := NewGenericFactory(taskDef)
  103. tasks.AutoRegister(taskDef.Type, factory)
  104. // Create and register detector/scheduler
  105. detector := NewGenericDetector(taskDef)
  106. scheduler := NewGenericScheduler(taskDef)
  107. tasks.AutoRegisterTypes(func(registry *types.TaskRegistry) {
  108. registry.RegisterTask(detector, scheduler)
  109. })
  110. // Create and register schema provider
  111. schemaProvider := &GenericSchemaProvider{taskDef: taskDef}
  112. tasks.RegisterTaskConfigSchema(string(taskDef.Type), schemaProvider)
  113. // Create and register UI provider
  114. uiProvider := &GenericUIProvider{taskDef: taskDef}
  115. tasks.AutoRegisterUI(func(uiRegistry *types.UIRegistry) {
  116. baseUIProvider := tasks.NewBaseUIProvider(
  117. taskDef.Type,
  118. taskDef.DisplayName,
  119. taskDef.Description,
  120. taskDef.Icon,
  121. schemaProvider.GetConfigSchema,
  122. uiProvider.GetCurrentConfig,
  123. uiProvider.ApplyTaskPolicy,
  124. uiProvider.ApplyTaskConfig,
  125. )
  126. uiRegistry.RegisterUI(baseUIProvider)
  127. })
  128. glog.V(1).Infof("Registered complete task definition: %s", taskDef.Type)
  129. }
  130. // validateTaskDefinition ensures the task definition is complete
  131. func validateTaskDefinition(taskDef *TaskDefinition) error {
  132. if taskDef.Type == "" {
  133. return fmt.Errorf("task type is required")
  134. }
  135. if taskDef.Name == "" {
  136. return fmt.Errorf("task name is required")
  137. }
  138. if taskDef.Config == nil {
  139. return fmt.Errorf("task config is required")
  140. }
  141. if taskDef.CreateTask == nil {
  142. return fmt.Errorf("task creation function is required")
  143. }
  144. return nil
  145. }