diff --git a/manager/rpcserver/manager_server_v1.go b/manager/rpcserver/manager_server_v1.go index 22391351027..0f2fe3de0db 100644 --- a/manager/rpcserver/manager_server_v1.go +++ b/manager/rpcserver/manager_server_v1.go @@ -478,7 +478,7 @@ func (s *managerServerV1) ListSchedulers(ctx context.Context, req *managerv1.Lis candidateSchedulerClusters []models.SchedulerCluster err error ) - candidateSchedulerClusters, err = s.searcher.FindSchedulerClusters(ctx, schedulerClusters, req.Hostname, req.Ip, req.HostInfo) + candidateSchedulerClusters, err = s.searcher.FindSchedulerClusters(ctx, schedulerClusters, req.Hostname, req.Ip, req.HostInfo, log) if err != nil { log.Error(err) metrics.SearchSchedulerClusterFailureCount.WithLabelValues(req.Version, req.Commit).Inc() diff --git a/manager/rpcserver/manager_server_v2.go b/manager/rpcserver/manager_server_v2.go index f9aa30f70b1..e540f1e0ddc 100644 --- a/manager/rpcserver/manager_server_v2.go +++ b/manager/rpcserver/manager_server_v2.go @@ -477,7 +477,7 @@ func (s *managerServerV2) ListSchedulers(ctx context.Context, req *managerv2.Lis candidateSchedulerClusters []models.SchedulerCluster err error ) - candidateSchedulerClusters, err = s.searcher.FindSchedulerClusters(ctx, schedulerClusters, req.Hostname, req.Ip, req.HostInfo) + candidateSchedulerClusters, err = s.searcher.FindSchedulerClusters(ctx, schedulerClusters, req.Hostname, req.Ip, req.HostInfo, log) if err != nil { log.Error(err) metrics.SearchSchedulerClusterFailureCount.WithLabelValues(req.Version, req.Commit).Inc() diff --git a/manager/searcher/mocks/searcher_mock.go b/manager/searcher/mocks/searcher_mock.go index 75efee3939c..2ff0cd8d5e5 100644 --- a/manager/searcher/mocks/searcher_mock.go +++ b/manager/searcher/mocks/searcher_mock.go @@ -8,6 +8,7 @@ import ( context "context" reflect "reflect" + logger "d7y.io/dragonfly/v2/internal/dflog" models "d7y.io/dragonfly/v2/manager/models" gomock "github.com/golang/mock/gomock" ) @@ -36,16 +37,16 @@ func (m *MockSearcher) EXPECT() *MockSearcherMockRecorder { } // FindSchedulerClusters mocks base method. -func (m *MockSearcher) FindSchedulerClusters(ctx context.Context, schedulerClusters []models.SchedulerCluster, ip, hostname string, conditions map[string]string) ([]models.SchedulerCluster, error) { +func (m *MockSearcher) FindSchedulerClusters(ctx context.Context, schedulerClusters []models.SchedulerCluster, ip, hostname string, conditions map[string]string, log *logger.SugaredLoggerOnWith) ([]models.SchedulerCluster, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindSchedulerClusters", ctx, schedulerClusters, ip, hostname, conditions) + ret := m.ctrl.Call(m, "FindSchedulerClusters", ctx, schedulerClusters, ip, hostname, conditions, log) ret0, _ := ret[0].([]models.SchedulerCluster) ret1, _ := ret[1].(error) return ret0, ret1 } // FindSchedulerClusters indicates an expected call of FindSchedulerClusters. -func (mr *MockSearcherMockRecorder) FindSchedulerClusters(ctx, schedulerClusters, ip, hostname, conditions interface{}) *gomock.Call { +func (mr *MockSearcherMockRecorder) FindSchedulerClusters(ctx, schedulerClusters, ip, hostname, conditions, log interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindSchedulerClusters", reflect.TypeOf((*MockSearcher)(nil).FindSchedulerClusters), ctx, schedulerClusters, ip, hostname, conditions) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindSchedulerClusters", reflect.TypeOf((*MockSearcher)(nil).FindSchedulerClusters), ctx, schedulerClusters, ip, hostname, conditions, log) } diff --git a/manager/searcher/searcher.go b/manager/searcher/searcher.go index 02d72d5f288..27b6dfa44be 100644 --- a/manager/searcher/searcher.go +++ b/manager/searcher/searcher.go @@ -85,7 +85,8 @@ type Scopes struct { type Searcher interface { // FindSchedulerClusters finds scheduler clusters that best matches the evaluation. - FindSchedulerClusters(ctx context.Context, schedulerClusters []models.SchedulerCluster, ip, hostname string, conditions map[string]string) ([]models.SchedulerCluster, error) + FindSchedulerClusters(ctx context.Context, schedulerClusters []models.SchedulerCluster, ip, hostname string, + conditions map[string]string, log *logger.SugaredLoggerOnWith) ([]models.SchedulerCluster, error) } type searcher struct { @@ -104,7 +105,8 @@ func New(pluginDir string) Searcher { } // FindSchedulerClusters finds scheduler clusters that best matches the evaluation. -func (s *searcher) FindSchedulerClusters(ctx context.Context, schedulerClusters []models.SchedulerCluster, ip, hostname string, conditions map[string]string) ([]models.SchedulerCluster, error) { +func (s *searcher) FindSchedulerClusters(ctx context.Context, schedulerClusters []models.SchedulerCluster, ip, hostname string, + conditions map[string]string, log *logger.SugaredLoggerOnWith) ([]models.SchedulerCluster, error) { if len(schedulerClusters) <= 0 { return nil, errors.New("empty scheduler clusters") } @@ -119,16 +121,16 @@ func (s *searcher) FindSchedulerClusters(ctx context.Context, schedulerClusters func(i, j int) bool { var si, sj Scopes if err := mapstructure.Decode(clusters[i].Scopes, &si); err != nil { - logger.Errorf("cluster %s decode scopes failed: %v", clusters[i].Name, err) + log.Errorf("cluster %s decode scopes failed: %v", clusters[i].Name, err) return false } if err := mapstructure.Decode(clusters[j].Scopes, &sj); err != nil { - logger.Errorf("cluster %s decode scopes failed: %v", clusters[i].Name, err) + log.Errorf("cluster %s decode scopes failed: %v", clusters[i].Name, err) return false } - return Evaluate(ip, hostname, conditions, si, clusters[i]) > Evaluate(ip, hostname, conditions, sj, clusters[j]) + return Evaluate(ip, hostname, conditions, si, clusters[i], log) > Evaluate(ip, hostname, conditions, sj, clusters[j], log) }, ) @@ -177,9 +179,9 @@ func FilterSchedulerClusters(conditions map[string]string, schedulerClusters []m } // Evaluate the degree of matching between scheduler cluster and dfdaemon. -func Evaluate(ip, hostname string, conditions map[string]string, scopes Scopes, cluster models.SchedulerCluster) float64 { +func Evaluate(ip, hostname string, conditions map[string]string, scopes Scopes, cluster models.SchedulerCluster, log *logger.SugaredLoggerOnWith) float64 { return securityDomainAffinityWeight*calculateSecurityDomainAffinityScore(conditions[ConditionSecurityDomain], cluster.SecurityGroup.SecurityRules) + - cidrAffinityWeight*calculateCIDRAffinityScore(ip, scopes.CIDRs) + + cidrAffinityWeight*calculateCIDRAffinityScore(ip, scopes.CIDRs, log) + idcAffinityWeight*calculateIDCAffinityScore(conditions[ConditionIDC], scopes.IDC) + locationAffinityWeight*calculateMultiElementAffinityScore(conditions[ConditionLocation], scopes.Location) + clusterTypeWeight*calculateClusterTypeScore(cluster) @@ -199,18 +201,18 @@ func calculateSecurityDomainAffinityScore(securityDomain string, securityRules [ } // calculateCIDRAffinityScore 0.0~1.0 larger and better. -func calculateCIDRAffinityScore(ip string, cidrs []string) float64 { +func calculateCIDRAffinityScore(ip string, cidrs []string, log *logger.SugaredLoggerOnWith) float64 { // Construct CIDR ranger. ranger := cidranger.NewPCTrieRanger() for _, cidr := range cidrs { _, network, err := net.ParseCIDR(cidr) if err != nil { - logger.Error(err) + log.Error(err) continue } if err := ranger.Insert(cidranger.NewBasicRangerEntry(*network)); err != nil { - logger.Error(err) + log.Error(err) continue } } @@ -218,7 +220,7 @@ func calculateCIDRAffinityScore(ip string, cidrs []string) float64 { // Determine whether an IP is contained in the constructed networks ranger. contains, err := ranger.Contains(net.ParseIP(ip)) if err != nil { - logger.Error(err) + log.Error(err) return minScore } diff --git a/manager/searcher/searcher_test.go b/manager/searcher/searcher_test.go index af822186929..77c7159f61c 100644 --- a/manager/searcher/searcher_test.go +++ b/manager/searcher/searcher_test.go @@ -22,6 +22,7 @@ import ( "github.com/stretchr/testify/assert" + logger "d7y.io/dragonfly/v2/internal/dflog" "d7y.io/dragonfly/v2/manager/models" ) @@ -751,7 +752,7 @@ func TestSearcher_FindSchedulerClusters(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { searcher := New(pluginDir) - clusters, found := searcher.FindSchedulerClusters(context.Background(), tc.schedulerClusters, "128.168.1.0", "foo", tc.conditions) + clusters, found := searcher.FindSchedulerClusters(context.Background(), tc.schedulerClusters, "128.168.1.0", "foo", tc.conditions, &logger.SugaredLoggerOnWith{}) tc.expect(t, clusters, found) }) } diff --git a/manager/searcher/testdata/main.go b/manager/searcher/testdata/main.go index 7f5faf59de4..4c4e2a5dd1c 100644 --- a/manager/searcher/testdata/main.go +++ b/manager/searcher/testdata/main.go @@ -21,6 +21,7 @@ import ( "fmt" "os" + logger "d7y.io/dragonfly/v2/internal/dflog" "d7y.io/dragonfly/v2/manager/models" "d7y.io/dragonfly/v2/manager/searcher" ) @@ -32,7 +33,7 @@ func main() { os.Exit(1) } - clusters, err := s.FindSchedulerClusters(context.Background(), []models.SchedulerCluster{}, "127.0.0.1", "foo", map[string]string{}) + clusters, err := s.FindSchedulerClusters(context.Background(), []models.SchedulerCluster{}, "127.0.0.1", "foo", map[string]string{}, &logger.SugaredLoggerOnWith{}) if err != nil { fmt.Println("scheduler cluster not found") os.Exit(1) diff --git a/manager/searcher/testdata/plugin/searcher.go b/manager/searcher/testdata/plugin/searcher.go index d238b7da1a1..53194e71f43 100644 --- a/manager/searcher/testdata/plugin/searcher.go +++ b/manager/searcher/testdata/plugin/searcher.go @@ -19,12 +19,14 @@ package main import ( "context" + logger "d7y.io/dragonfly/v2/internal/dflog" "d7y.io/dragonfly/v2/manager/models" ) type searcher struct{} -func (s *searcher) FindSchedulerClusters(ctx context.Context, schedulerClusters []models.SchedulerCluster, hostname, ip string, conditions map[string]string) ([]models.SchedulerCluster, error) { +func (s *searcher) FindSchedulerClusters(ctx context.Context, schedulerClusters []models.SchedulerCluster, hostname, ip string, + conditions map[string]string, log *logger.SugaredLoggerOnWith) ([]models.SchedulerCluster, error) { return []models.SchedulerCluster{{Name: "foo"}}, nil }