dragonfly/scheduler/config/config.go

350 lines
8.9 KiB
Go

/*
* Copyright 2020 The Dragonfly Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package config
import (
"time"
"github.com/pkg/errors"
"d7y.io/dragonfly/v2/cmd/dependency/base"
"d7y.io/dragonfly/v2/pkg/util/hostutils"
"d7y.io/dragonfly/v2/pkg/util/net/iputils"
)
type Config struct {
// Base options
base.Options `yaml:",inline" mapstructure:",squash"`
// Scheduler configuration
Scheduler *SchedulerConfig `yaml:"scheduler" mapstructure:"scheduler"`
// Server configuration
Server *ServerConfig `yaml:"server" mapstructure:"server"`
// Dynconfig configuration
DynConfig *DynConfig `yaml:"dynConfig" mapstructure:"dynConfig"`
// Manager configuration
Manager *ManagerConfig `yaml:"manager" mapstructure:"manager"`
// CDN configuration
CDN *CDNConfig `yaml:"cdn" mapstructure:"cdn"`
// Host configuration
Host *HostConfig `yaml:"host" mapstructure:"host"`
// Job configuration
Job *JobConfig `yaml:"job" mapstructure:"job"`
// Metrics configuration
Metrics *MetricsConfig `yaml:"metrics" mapstructure:"metrics"`
}
// New default configuration
func New() *Config {
return &Config{
Server: &ServerConfig{
IP: iputils.IPv4,
Host: hostutils.FQDNHostname,
Port: 8002,
},
Scheduler: &SchedulerConfig{
Algorithm: "default",
BackSourceCount: 3,
RetryBackSourceLimit: 5,
RetryLimit: 10,
RetryInterval: 50 * time.Millisecond,
GC: &GCConfig{
PeerGCInterval: 10 * time.Minute,
PeerTTL: 24 * time.Hour,
TaskGCInterval: 10 * time.Minute,
TaskTTL: 24 * time.Hour,
HostGCInterval: 30 * time.Minute,
HostTTL: 48 * time.Hour,
},
},
DynConfig: &DynConfig{
RefreshInterval: 1 * time.Minute,
},
Host: &HostConfig{},
Manager: &ManagerConfig{
SchedulerClusterID: 1,
KeepAlive: KeepAliveConfig{
Interval: 5 * time.Second,
},
},
CDN: &CDNConfig{
Enable: true,
},
Job: &JobConfig{
Enable: true,
GlobalWorkerNum: 10,
SchedulerWorkerNum: 10,
LocalWorkerNum: 10,
Redis: &RedisConfig{
Port: 6379,
BrokerDB: 1,
BackendDB: 2,
},
},
Metrics: &MetricsConfig{
Enable: false,
EnablePeerHost: false,
},
}
}
// Validate config parameters
func (c *Config) Validate() error {
if c.Server.IP == "" {
return errors.New("server requires parameter ip")
}
if c.Server.Host == "" {
return errors.New("server requires parameter host")
}
if c.Server.Port <= 0 {
return errors.New("server requires parameter port")
}
if c.Scheduler.Algorithm == "" {
return errors.New("scheduler requires parameter algorithm")
}
if c.Scheduler.RetryLimit <= 0 {
return errors.New("scheduler requires parameter retryLimit")
}
if c.Scheduler.RetryInterval <= 0 {
return errors.New("scheduler requires parameter retryInterval")
}
if c.Scheduler.GC.PeerGCInterval <= 0 {
return errors.New("scheduler requires parameter peerGCInterval")
}
if c.Scheduler.GC.PeerTTL <= 0 {
return errors.New("scheduler requires parameter peerTTL")
}
if c.Scheduler.GC.TaskGCInterval <= 0 {
return errors.New("scheduler requires parameter taskGCInterval")
}
if c.Scheduler.GC.TaskTTL <= 0 {
return errors.New("scheduler requires parameter taskTTL")
}
if c.DynConfig.RefreshInterval <= 0 {
return errors.New("dynconfig requires parameter refreshInterval")
}
if c.Manager.Addr == "" {
return errors.New("manager requires parameter addr")
}
if c.Manager.SchedulerClusterID == 0 {
return errors.New("manager requires parameter schedulerClusterID")
}
if c.Manager.KeepAlive.Interval <= 0 {
return errors.New("manager requires parameter keepAlive interval")
}
if c.Job.Enable {
if c.Job.GlobalWorkerNum == 0 {
return errors.New("job requires parameter globalWorkerNum")
}
if c.Job.SchedulerWorkerNum == 0 {
return errors.New("job requires parameter schedulerWorkerNum")
}
if c.Job.LocalWorkerNum == 0 {
return errors.New("job requires parameter localWorkerNum")
}
if c.Job.Redis.Host == "" {
return errors.New("job requires parameter redis host")
}
if c.Job.Redis.Port <= 0 {
return errors.New("job requires parameter redis port")
}
if c.Job.Redis.BrokerDB <= 0 {
return errors.New("job requires parameter redis brokerDB")
}
if c.Job.Redis.BackendDB <= 0 {
return errors.New("job requires parameter redis backendDB")
}
}
if c.Metrics.Enable {
if c.Metrics.Addr == "" {
return errors.New("metrics requires parameter addr")
}
}
return nil
}
type ServerConfig struct {
// Server ip
IP string `yaml:"ip" mapstructure:"ip"`
// Server hostname
Host string `yaml:"host" mapstructure:"host"`
// Server port
Port int `yaml:"port" mapstructure:"port"`
// Server dynamic config cache directory
CacheDir string `yaml:"cacheDir" mapstructure:"cacheDir"`
// Server log directory
LogDir string `yaml:"logDir" mapstructure:"logDir"`
}
type SchedulerConfig struct {
// Scheduling algorithm used by the scheduler
Algorithm string `yaml:"algorithm" mapstructure:"algorithm"`
// Single task allows the client to back-to-source count
BackSourceCount int `yaml:"backSourceCount" mapstructure:"backSourceCount"`
// Retry scheduling back-to-source limit times
RetryBackSourceLimit int `yaml:"retryBackSourceLimit" mapstructure:"retryBackSourceLimit"`
// Retry scheduling limit times
RetryLimit int `yaml:"retryLimit" mapstructure:"retryLimit"`
// Retry scheduling interval
RetryInterval time.Duration `yaml:"retryInterval" mapstructure:"retryInterval"`
// Task and peer gc configuration
GC *GCConfig `yaml:"gc" mapstructure:"gc"`
}
type GCConfig struct {
// Peer gc interval
PeerGCInterval time.Duration `yaml:"peerGCInterval" mapstructure:"peerGCInterval"`
// Peer time to live
PeerTTL time.Duration `yaml:"peerTTL" mapstructure:"peerTTL"`
// Task gc interval
TaskGCInterval time.Duration `yaml:"taskGCInterval" mapstructure:"taskGCInterval"`
// Task time to live
TaskTTL time.Duration `yaml:"taskTTL" mapstructure:"taskTTL"`
// Host gc interval
HostGCInterval time.Duration `yaml:"hostGCInterval" mapstructure:"hostGCInterval"`
// Host time to live
HostTTL time.Duration `yaml:"hostTTL" mapstructure:"hostTTL"`
}
type DynConfig struct {
// RefreshInterval is refresh interval for manager cache.
RefreshInterval time.Duration `yaml:"refreshInterval" mapstructure:"refreshInterval"`
// CDNDir is cdn dir path.
CDNDir string `yaml:"cdnDir" mapstructure:"cdnDir"`
}
type HostConfig struct {
// IDC for scheduler
IDC string `mapstructure:"idc" yaml:"idc"`
// NetTopology for scheduler
NetTopology string `mapstructure:"netTopology" yaml:"netTopology"`
// Location for scheduler
Location string `mapstructure:"location" yaml:"location"`
}
type ManagerConfig struct {
// Addr is manager address.
Addr string `yaml:"addr" mapstructure:"addr"`
// SchedulerClusterID is scheduler cluster id.
SchedulerClusterID uint `yaml:"schedulerClusterID" mapstructure:"schedulerClusterID"`
// KeepAlive configuration
KeepAlive KeepAliveConfig `yaml:"keepAlive" mapstructure:"keepAlive"`
}
type CDNConfig struct {
// Enable is to enable cdn as P2P peer
Enable bool `yaml:"enable" mapstructure:"enable"`
}
type KeepAliveConfig struct {
// Keep alive interval
Interval time.Duration `yaml:"interval" mapstructure:"interval"`
}
type JobConfig struct {
// Enable job service
Enable bool `yaml:"enable" mapstructure:"enable"`
// Number of workers in global queue
GlobalWorkerNum uint `yaml:"globalWorkerNum" mapstructure:"globalWorkerNum"`
// Number of workers in scheduler queue
SchedulerWorkerNum uint `yaml:"schedulerWorkerNum" mapstructure:"schedulerWorkerNum"`
// Number of workers in local queue
LocalWorkerNum uint `yaml:"localWorkerNum" mapstructure:"localWorkerNum"`
// Redis configuration
Redis *RedisConfig `yaml:"redis" mapstructure:"redis"`
}
type RedisConfig struct {
// Server hostname
Host string `yaml:"host" mapstructure:"host"`
// Server port
Port int `yaml:"port" mapstructure:"port"`
// Server password
Password string `yaml:"password" mapstructure:"password"`
// Broker database name
BrokerDB int `yaml:"brokerDB" mapstructure:"brokerDB"`
// Backend database name
BackendDB int `yaml:"backendDB" mapstructure:"backendDB"`
}
type MetricsConfig struct {
// Enable metrics service
Enable bool `yaml:"enable" mapstructure:"enable"`
// Metrics service address
Addr string `yaml:"addr" mapstructure:"addr"`
// Enable peer host metrics
EnablePeerHost bool `yaml:"enablePeerHost" mapstructure:"enablePeerHost"`
}