feat: cluster scopes add hostname regexes for client matchs cluster by hostname (#3083)
Signed-off-by: Gaius <gaius.qi@gmail.com>
This commit is contained in:
parent
9020a23357
commit
eefd59ca49
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
|
@ -46,13 +47,16 @@ const (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// cidrAffinityWeight is CIDR affinity weight.
|
// cidrAffinityWeight is CIDR affinity weight.
|
||||||
cidrAffinityWeight float64 = 0.4
|
cidrAffinityWeight float64 = 0.3
|
||||||
|
|
||||||
|
// hostnameAffinityWeight is hostname affinity weight.
|
||||||
|
hostnameAffinityWeight = 0.3
|
||||||
|
|
||||||
// idcAffinityWeight is IDC affinity weight.
|
// idcAffinityWeight is IDC affinity weight.
|
||||||
idcAffinityWeight float64 = 0.35
|
idcAffinityWeight float64 = 0.25
|
||||||
|
|
||||||
// locationAffinityWeight is location affinity weight.
|
// locationAffinityWeight is location affinity weight.
|
||||||
locationAffinityWeight = 0.24
|
locationAffinityWeight = 0.14
|
||||||
|
|
||||||
// clusterTypeWeight is cluster type weight.
|
// clusterTypeWeight is cluster type weight.
|
||||||
clusterTypeWeight float64 = 0.01
|
clusterTypeWeight float64 = 0.01
|
||||||
|
|
@ -73,9 +77,10 @@ const (
|
||||||
|
|
||||||
// Scheduler cluster scopes.
|
// Scheduler cluster scopes.
|
||||||
type Scopes struct {
|
type Scopes struct {
|
||||||
IDC string `mapstructure:"idc"`
|
IDC string `mapstructure:"idc"`
|
||||||
Location string `mapstructure:"location"`
|
Location string `mapstructure:"location"`
|
||||||
CIDRs []string `mapstructure:"cidrs"`
|
CIDRs []string `mapstructure:"cidrs"`
|
||||||
|
Hostnames []string `mapstructure:"hostnames"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Searcher interface {
|
type Searcher interface {
|
||||||
|
|
@ -150,6 +155,7 @@ func FilterSchedulerClusters(conditions map[string]string, schedulerClusters []m
|
||||||
// Evaluate the degree of matching between scheduler cluster and dfdaemon.
|
// Evaluate the degree of matching between scheduler cluster and dfdaemon.
|
||||||
func Evaluate(ip, hostname string, conditions map[string]string, scopes Scopes, cluster models.SchedulerCluster, log *zap.SugaredLogger) float64 {
|
func Evaluate(ip, hostname string, conditions map[string]string, scopes Scopes, cluster models.SchedulerCluster, log *zap.SugaredLogger) float64 {
|
||||||
return cidrAffinityWeight*calculateCIDRAffinityScore(ip, scopes.CIDRs, log) +
|
return cidrAffinityWeight*calculateCIDRAffinityScore(ip, scopes.CIDRs, log) +
|
||||||
|
hostnameAffinityWeight*calculateHostnameAffinityScore(hostname, scopes.Hostnames, log) +
|
||||||
idcAffinityWeight*calculateIDCAffinityScore(conditions[ConditionIDC], scopes.IDC) +
|
idcAffinityWeight*calculateIDCAffinityScore(conditions[ConditionIDC], scopes.IDC) +
|
||||||
locationAffinityWeight*calculateMultiElementAffinityScore(conditions[ConditionLocation], scopes.Location) +
|
locationAffinityWeight*calculateMultiElementAffinityScore(conditions[ConditionLocation], scopes.Location) +
|
||||||
clusterTypeWeight*calculateClusterTypeScore(cluster)
|
clusterTypeWeight*calculateClusterTypeScore(cluster)
|
||||||
|
|
@ -186,6 +192,31 @@ func calculateCIDRAffinityScore(ip string, cidrs []string, log *zap.SugaredLogge
|
||||||
return maxScore
|
return maxScore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// calculateHostnameAffinityScore 0.0~1.0 larger and better.
|
||||||
|
func calculateHostnameAffinityScore(hostname string, hostnames []string, log *zap.SugaredLogger) float64 {
|
||||||
|
if hostname == "" {
|
||||||
|
return minScore
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(hostnames) == 0 {
|
||||||
|
return minScore
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range hostnames {
|
||||||
|
regex, err := regexp.Compile(v)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if regex.MatchString(hostname) {
|
||||||
|
return maxScore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return minScore
|
||||||
|
}
|
||||||
|
|
||||||
// calculateIDCAffinityScore 0.0~1.0 larger and better.
|
// calculateIDCAffinityScore 0.0~1.0 larger and better.
|
||||||
func calculateIDCAffinityScore(dst, src string) float64 {
|
func calculateIDCAffinityScore(dst, src string) float64 {
|
||||||
if dst == "" || src == "" {
|
if dst == "" || src == "" {
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,40 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) {
|
||||||
assert.Equal(len(data), 2)
|
assert.Equal(len(data), 2)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "match according to hostname condition",
|
||||||
|
schedulerClusters: []models.SchedulerCluster{
|
||||||
|
{
|
||||||
|
Name: "foo",
|
||||||
|
Scopes: map[string]any{
|
||||||
|
"hostnames": []string{"f.*"},
|
||||||
|
},
|
||||||
|
Schedulers: []models.Scheduler{
|
||||||
|
{
|
||||||
|
Hostname: "foo",
|
||||||
|
State: "active",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "bar",
|
||||||
|
Scopes: map[string]any{},
|
||||||
|
Schedulers: []models.Scheduler{
|
||||||
|
{
|
||||||
|
Hostname: "bar",
|
||||||
|
State: "active",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
conditions: map[string]string{},
|
||||||
|
expect: func(t *testing.T, data []models.SchedulerCluster, err error) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
assert.Equal(data[0].Name, "foo")
|
||||||
|
assert.Equal(data[1].Name, "bar")
|
||||||
|
assert.Equal(len(data), 2)
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "match according to idc and location conditions",
|
name: "match according to idc and location conditions",
|
||||||
schedulerClusters: []models.SchedulerCluster{
|
schedulerClusters: []models.SchedulerCluster{
|
||||||
|
|
@ -266,9 +300,10 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Name: "foo",
|
Name: "foo",
|
||||||
Scopes: map[string]any{
|
Scopes: map[string]any{
|
||||||
"idc": "IDC-1",
|
"idc": "IDC-1",
|
||||||
"location": "LOCATION-2",
|
"location": "LOCATION-2",
|
||||||
"cidrs": []string{"128.168.1.0/24"},
|
"cidrs": []string{"128.168.1.0/24"},
|
||||||
|
"hostnames": []string{"b.*"},
|
||||||
},
|
},
|
||||||
Schedulers: []models.Scheduler{
|
Schedulers: []models.Scheduler{
|
||||||
{
|
{
|
||||||
|
|
@ -280,9 +315,10 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Name: "bar",
|
Name: "bar",
|
||||||
Scopes: map[string]any{
|
Scopes: map[string]any{
|
||||||
"idc": "IDC-1",
|
"idc": "IDC-1",
|
||||||
"location": "LOCATION-1",
|
"location": "LOCATION-1",
|
||||||
"cidrs": []string{"128.168.1.0/24"},
|
"cidrs": []string{"128.168.1.0/24"},
|
||||||
|
"hostnames": []string{"c.*"},
|
||||||
},
|
},
|
||||||
Schedulers: []models.Scheduler{
|
Schedulers: []models.Scheduler{
|
||||||
{
|
{
|
||||||
|
|
@ -294,9 +330,10 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Name: "baz",
|
Name: "baz",
|
||||||
Scopes: map[string]any{
|
Scopes: map[string]any{
|
||||||
"idc": "IDC-1",
|
"idc": "IDC-1",
|
||||||
"location": "LOCATION-1|LOCATION-2",
|
"location": "LOCATION-1|LOCATION-2",
|
||||||
"cidrs": []string{"128.168.1.0/24"},
|
"cidrs": []string{"128.168.1.0/24"},
|
||||||
|
"hostnames": []string{"f.*"},
|
||||||
},
|
},
|
||||||
Schedulers: []models.Scheduler{
|
Schedulers: []models.Scheduler{
|
||||||
{
|
{
|
||||||
|
|
@ -308,9 +345,10 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Name: "bax",
|
Name: "bax",
|
||||||
Scopes: map[string]any{
|
Scopes: map[string]any{
|
||||||
"idc": "IDC-1",
|
"idc": "IDC-1",
|
||||||
"location": "LOCATION-2",
|
"location": "LOCATION-2",
|
||||||
"cidrs": []string{"128.168.1.0/24"},
|
"cidrs": []string{"128.168.1.0/24"},
|
||||||
|
"hostnames": []string{"d.*"},
|
||||||
},
|
},
|
||||||
Schedulers: []models.Scheduler{
|
Schedulers: []models.Scheduler{
|
||||||
{
|
{
|
||||||
|
|
@ -323,9 +361,10 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Name: "bac",
|
Name: "bac",
|
||||||
Scopes: map[string]any{
|
Scopes: map[string]any{
|
||||||
"idc": "IDC-1",
|
"idc": "IDC-1",
|
||||||
"location": "LOCATION-2",
|
"location": "LOCATION-2",
|
||||||
"cidrs": []string{"128.168.1.0/24"},
|
"cidrs": []string{"128.168.1.0/24"},
|
||||||
|
"hostnames": []string{"e.*"},
|
||||||
},
|
},
|
||||||
Schedulers: []models.Scheduler{
|
Schedulers: []models.Scheduler{
|
||||||
{
|
{
|
||||||
|
|
@ -337,9 +376,10 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Name: "bae",
|
Name: "bae",
|
||||||
Scopes: map[string]any{
|
Scopes: map[string]any{
|
||||||
"idc": "IDC-1",
|
"idc": "IDC-1",
|
||||||
"location": "LOCATION-2",
|
"location": "LOCATION-2",
|
||||||
"cidrs": []string{"128.168.1.0/24"},
|
"cidrs": []string{"128.168.1.0/24"},
|
||||||
|
"hostnames": []string{"a.*"},
|
||||||
},
|
},
|
||||||
Schedulers: []models.Scheduler{
|
Schedulers: []models.Scheduler{
|
||||||
{
|
{
|
||||||
|
|
@ -352,9 +392,10 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Name: "bat",
|
Name: "bat",
|
||||||
Scopes: map[string]any{
|
Scopes: map[string]any{
|
||||||
"idc": "IDC-1",
|
"idc": "IDC-1",
|
||||||
"location": "LOCATION-2",
|
"location": "LOCATION-2",
|
||||||
"cidrs": []string{"192.168.1.0/24"},
|
"cidrs": []string{"192.168.1.0/24"},
|
||||||
|
"hostnames": []string{"g.*"},
|
||||||
},
|
},
|
||||||
Schedulers: []models.Scheduler{
|
Schedulers: []models.Scheduler{
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,8 @@ type SchedulerClusterClientConfig struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type SchedulerClusterScopes struct {
|
type SchedulerClusterScopes struct {
|
||||||
IDC string `yaml:"idc" mapstructure:"idc" json:"idc" binding:"omitempty"`
|
IDC string `yaml:"idc" mapstructure:"idc" json:"idc" binding:"omitempty"`
|
||||||
Location string `yaml:"location" mapstructure:"location" json:"location" binding:"omitempty"`
|
Location string `yaml:"location" mapstructure:"location" json:"location" binding:"omitempty"`
|
||||||
CIDRs []string `yaml:"cidrs" mapstructure:"cidrs" json:"cidrs" binding:"omitempty"`
|
CIDRs []string `yaml:"cidrs" mapstructure:"cidrs" json:"cidrs" binding:"omitempty"`
|
||||||
|
Hostnames []string `yaml:"hostnames" mapstructure:"hostnames" json:"hostnames" binding:"omitempty"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue