diff --git a/weed/admin/plugin/workers/erasure_coding/schema.go b/weed/admin/plugin/workers/erasure_coding/schema.go new file mode 100644 index 000000000..fb2d0371f --- /dev/null +++ b/weed/admin/plugin/workers/erasure_coding/schema.go @@ -0,0 +1,205 @@ +package erasure_coding + +import ( + "encoding/json" + + "github.com/seaweedfs/seaweedfs/weed/pb/plugin_pb" +) + +// ConfigurationSchema defines the schema for EC plugin configuration +type ConfigurationSchema struct { + AdminConfig AdminConfigSchema `json:"admin_config"` + WorkerConfig WorkerConfigSchema `json:"worker_config"` +} + +// AdminConfigSchema defines admin-side configuration +type AdminConfigSchema struct { + DetectionInterval ConfigField `json:"detection_interval"` + MaxConcurrentJobs ConfigField `json:"max_concurrent_jobs"` + JobTimeout ConfigField `json:"job_timeout"` + HealthCheckInterval ConfigField `json:"health_check_interval"` + RetryPolicy ConfigField `json:"retry_policy"` +} + +// WorkerConfigSchema defines worker-side configuration +type WorkerConfigSchema struct { + StripeSize ConfigField `json:"stripe_size"` + EncodeCopies ConfigField `json:"encode_copies"` + RackAwareness ConfigField `json:"rack_awareness"` + DataCenterAwareness ConfigField `json:"datacenter_awareness"` + MinVolumeSize ConfigField `json:"min_volume_size"` + MaxVolumeSize ConfigField `json:"max_volume_size"` + PreferredDataNodes ConfigField `json:"preferred_data_nodes"` +} + +// ConfigField describes a configuration field +type ConfigField struct { + Name string `json:"name"` + Description string `json:"description"` + Type string `json:"type"` + Required bool `json:"required"` + Default interface{} `json:"default,omitempty"` + Min interface{} `json:"min,omitempty"` + Max interface{} `json:"max,omitempty"` + Options []interface{} `json:"options,omitempty"` + Unit string `json:"unit,omitempty"` +} + +// GetConfigurationSchema returns the schema for EC plugin configuration +func GetConfigurationSchema() *plugin_pb.PluginConfig { + schema := ConfigurationSchema{ + AdminConfig: AdminConfigSchema{ + DetectionInterval: ConfigField{ + Name: "detection_interval", + Description: "Time between EC detection scans", + Type: "duration", + Required: true, + Default: "1h", + Min: "5m", + Max: "24h", + Unit: "seconds", + }, + MaxConcurrentJobs: ConfigField{ + Name: "max_concurrent_jobs", + Description: "Maximum concurrent EC encoding jobs", + Type: "integer", + Required: true, + Default: 5, + Min: 1, + Max: 20, + }, + JobTimeout: ConfigField{ + Name: "job_timeout", + Description: "Timeout for individual EC jobs", + Type: "duration", + Required: true, + Default: "12h", + Min: "1h", + Max: "48h", + Unit: "seconds", + }, + HealthCheckInterval: ConfigField{ + Name: "health_check_interval", + Description: "Health check interval", + Type: "duration", + Required: true, + Default: "30s", + Min: "5s", + Max: "5m", + Unit: "seconds", + }, + RetryPolicy: ConfigField{ + Name: "retry_policy", + Description: "Retry policy for failed jobs", + Type: "string", + Required: true, + Default: "exponential", + Options: []interface{}{"linear", "exponential", "none"}, + }, + }, + WorkerConfig: WorkerConfigSchema{ + StripeSize: ConfigField{ + Name: "stripe_size", + Description: "Size of each stripe in MB", + Type: "integer", + Required: true, + Default: 10, + Min: 1, + Max: 100, + Unit: "MB", + }, + EncodeCopies: ConfigField{ + Name: "encode_copies", + Description: "Number of copies to keep after encoding", + Type: "integer", + Required: true, + Default: 1, + Min: 1, + Max: 3, + }, + RackAwareness: ConfigField{ + Name: "rack_awareness", + Description: "Enable rack-aware stripe distribution", + Type: "boolean", + Required: true, + Default: true, + }, + DataCenterAwareness: ConfigField{ + Name: "datacenter_awareness", + Description: "Enable data center aware stripe distribution", + Type: "boolean", + Required: true, + Default: false, + }, + MinVolumeSize: ConfigField{ + Name: "min_volume_size", + Description: "Minimum volume size to consider for EC", + Type: "integer", + Required: true, + Default: 1000, + Min: 100, + Unit: "MB", + }, + MaxVolumeSize: ConfigField{ + Name: "max_volume_size", + Description: "Maximum volume size to consider for EC", + Type: "integer", + Required: true, + Default: 10000, + Max: 100000, + Unit: "MB", + }, + PreferredDataNodes: ConfigField{ + Name: "preferred_data_nodes", + Description: "Comma-separated list of preferred data nodes", + Type: "string", + Required: false, + }, + }, + } + + data, _ := json.MarshalIndent(schema, "", " ") + + return &plugin_pb.PluginConfig{ + PluginId: "erasure-coding-plugin", + Properties: map[string]string{ + "schema": string(data), + "detection_interval": "1h", + "max_concurrent_jobs": "5", + "job_timeout": "12h", + "health_check_interval": "30s", + "retry_policy": "exponential", + "stripe_size": "10", + "encode_copies": "1", + "rack_awareness": "true", + "datacenter_awareness": "false", + "min_volume_size": "1000", + "max_volume_size": "10000", + "preferred_data_nodes": "", + }, + } +} + +// DefaultAdminConfig returns default admin configuration +func DefaultAdminConfig() map[string]string { + return map[string]string{ + "detection_interval": "1h", + "max_concurrent_jobs": "5", + "job_timeout": "12h", + "health_check_interval": "30s", + "retry_policy": "exponential", + } +} + +// DefaultWorkerConfig returns default worker configuration +func DefaultWorkerConfig() map[string]string { + return map[string]string{ + "stripe_size": "10", + "encode_copies": "1", + "rack_awareness": "true", + "datacenter_awareness": "false", + "min_volume_size": "1000", + "max_volume_size": "10000", + "preferred_data_nodes": "", + } +}