Dragonfly2
1348 строк · 37.5 Кб
1/*
2* Copyright 2022 The Dragonfly Authors
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17package config18
19import (20"errors"21"net"22"os"23"path/filepath"24"testing"25"time"26
27"github.com/stretchr/testify/assert"28"go.uber.org/mock/gomock"29"google.golang.org/grpc"30"google.golang.org/grpc/codes"31"google.golang.org/grpc/health"32healthpb "google.golang.org/grpc/health/grpc_health_v1"33"google.golang.org/grpc/resolver"34"google.golang.org/grpc/status"35
36managerv1 "d7y.io/api/v2/pkg/apis/manager/v1"37
38"d7y.io/dragonfly/v2/pkg/rpc/manager/client/mocks"39)
40
41func TestDynconfigManager_GetResolveSchedulerAddrs(t *testing.T) {42grpcServer := grpc.NewServer()43healthpb.RegisterHealthServer(grpcServer, health.NewServer())44l, err := net.Listen("tcp", ":3000")45if err != nil {46t.Fatal(err)47}48defer l.Close()49
50go func() {51if err := grpcServer.Serve(l); err != nil {52panic(err)53}54}()55defer grpcServer.Stop()56
57mockCacheDir := t.TempDir()58mockCachePath := filepath.Join(mockCacheDir, cacheFileName)59tests := []struct {60name string61config *DaemonOption62data *DynconfigData63sleep func()64cleanFileCache func(t *testing.T)65mock func(m *mocks.MockV1MockRecorder, data *DynconfigData)66expect func(t *testing.T, dynconfig Dynconfig, data *DynconfigData)67}{68{69name: "get cache scheduler ip addrs",70config: &DaemonOption{71Scheduler: SchedulerOption{72Manager: ManagerOption{73RefreshInterval: 10 * time.Second,74},75},76Host: HostOption{77Hostname: "foo",78},79ObjectStorage: ObjectStorageOption{80Enable: true,81},82},83data: &DynconfigData{84Schedulers: []*managerv1.Scheduler{85{86Ip: "127.0.0.1",87Port: 3000,88},89},90},91sleep: func() {},92cleanFileCache: func(t *testing.T) {93if err := os.Remove(mockCachePath); err != nil {94t.Fatal(err)95}96},97mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {98gomock.InOrder(99m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{100Schedulers: []*managerv1.Scheduler{101{102Ip: data.Schedulers[0].Ip,103Port: data.Schedulers[0].Port,104},105},106}, nil).Times(1),107m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),108)109},110expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {111assert := assert.New(t)112result, err := dynconfig.GetResolveSchedulerAddrs()113assert.NoError(err)114assert.EqualValues(result, []resolver.Address{{ServerName: "127.0.0.1", Addr: "127.0.0.1:3000"}})115},116},117{118name: "get scheduler ip addrs",119config: &DaemonOption{120Scheduler: SchedulerOption{121Manager: ManagerOption{122RefreshInterval: 10 * time.Millisecond,123},124},125Host: HostOption{126Hostname: "foo",127},128ObjectStorage: ObjectStorageOption{129Enable: true,130},131},132data: &DynconfigData{133Schedulers: []*managerv1.Scheduler{134{135Ip: "127.0.0.1",136Port: 3000,137},138},139},140sleep: func() {141time.Sleep(100 * time.Millisecond)142},143cleanFileCache: func(t *testing.T) {144if err := os.Remove(mockCachePath); err != nil {145t.Fatal(err)146}147},148mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {149gomock.InOrder(150m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),151m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),152m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{153Schedulers: []*managerv1.Scheduler{154{155Ip: data.Schedulers[0].Ip,156Port: data.Schedulers[0].Port,157},158},159}, nil).Times(1),160m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),161)162},163expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {164assert := assert.New(t)165result, err := dynconfig.GetResolveSchedulerAddrs()166assert.NoError(err)167assert.EqualValues(result, []resolver.Address{{ServerName: "127.0.0.1", Addr: "127.0.0.1:3000"}})168},169},170{171name: "get scheduler host addrs",172config: &DaemonOption{173Scheduler: SchedulerOption{174Manager: ManagerOption{175RefreshInterval: 10 * time.Millisecond,176},177},178Host: HostOption{179Hostname: "foo",180},181ObjectStorage: ObjectStorageOption{182Enable: true,183},184},185data: &DynconfigData{186Schedulers: []*managerv1.Scheduler{187{188Ip: "101.1.1.1",189Hostname: "localhost",190Port: 3000,191},192},193},194sleep: func() {195time.Sleep(100 * time.Millisecond)196},197cleanFileCache: func(t *testing.T) {198if err := os.Remove(mockCachePath); err != nil {199t.Fatal(err)200}201},202mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {203gomock.InOrder(204m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),205m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),206m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{207Schedulers: []*managerv1.Scheduler{208{209Ip: data.Schedulers[0].Ip,210Hostname: data.Schedulers[0].Hostname,211Port: data.Schedulers[0].Port,212},213},214}, nil).Times(1),215m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),216)217},218expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {219assert := assert.New(t)220result, err := dynconfig.GetResolveSchedulerAddrs()221assert.NoError(err)222assert.EqualValues(result, []resolver.Address{{ServerName: "localhost", Addr: "localhost:3000"}})223},224},225{226name: "scheduler addrs can not reachable",227config: &DaemonOption{228Scheduler: SchedulerOption{229Manager: ManagerOption{230RefreshInterval: 10 * time.Millisecond,231},232},233Host: HostOption{234Hostname: "foo",235},236ObjectStorage: ObjectStorageOption{237Enable: true,238},239},240data: &DynconfigData{241Schedulers: []*managerv1.Scheduler{242{243Ip: "127.0.0.1",244Port: 3003,245},246},247},248sleep: func() {249time.Sleep(100 * time.Millisecond)250},251cleanFileCache: func(t *testing.T) {252if err := os.Remove(mockCachePath); err != nil {253t.Fatal(err)254}255},256mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {257gomock.InOrder(258m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),259m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),260m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{261Schedulers: []*managerv1.Scheduler{262{263Ip: data.Schedulers[0].Ip,264Port: data.Schedulers[0].Port,265},266},267}, nil).Times(1),268m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),269)270},271expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {272assert := assert.New(t)273_, err := dynconfig.GetResolveSchedulerAddrs()274assert.EqualError(err, "can not found available scheduler addresses")275},276},277{278name: "data has duplicate scheduler addrs",279config: &DaemonOption{280Scheduler: SchedulerOption{281Manager: ManagerOption{282RefreshInterval: 10 * time.Millisecond,283},284},285Host: HostOption{286Hostname: "foo",287},288ObjectStorage: ObjectStorageOption{289Enable: true,290},291},292data: &DynconfigData{293Schedulers: []*managerv1.Scheduler{294{295Ip: "127.0.0.1",296Port: 3000,297},298{299Ip: "127.0.0.1",300Port: 3000,301},302},303},304sleep: func() {305time.Sleep(100 * time.Millisecond)306},307cleanFileCache: func(t *testing.T) {308if err := os.Remove(mockCachePath); err != nil {309t.Fatal(err)310}311},312mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {313gomock.InOrder(314m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),315m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),316m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{317Schedulers: []*managerv1.Scheduler{318{319Ip: data.Schedulers[0].Ip,320Port: data.Schedulers[0].Port,321},322},323}, nil).Times(1),324m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),325)326},327expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {328assert := assert.New(t)329result, err := dynconfig.GetResolveSchedulerAddrs()330assert.NoError(err)331assert.EqualValues(result, []resolver.Address{{ServerName: "127.0.0.1", Addr: "127.0.0.1:3000"}})332},333},334{335name: "list schedulers error",336config: &DaemonOption{337Scheduler: SchedulerOption{338Manager: ManagerOption{339RefreshInterval: 10 * time.Millisecond,340},341},342Host: HostOption{343Hostname: "foo",344},345ObjectStorage: ObjectStorageOption{346Enable: true,347},348},349data: &DynconfigData{350Schedulers: []*managerv1.Scheduler{351{352Ip: "127.0.0.1",353Port: 3000,354},355},356},357sleep: func() {358time.Sleep(100 * time.Millisecond)359},360cleanFileCache: func(t *testing.T) {361if err := os.Remove(mockCachePath); err != nil {362t.Fatal(err)363}364},365mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {366gomock.InOrder(367m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{368Schedulers: []*managerv1.Scheduler{369{370Ip: data.Schedulers[0].Ip,371Port: data.Schedulers[0].Port,372},373},374}, nil).Times(1),375m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),376m.ListSchedulers(gomock.Any(), gomock.Any()).Return(nil, errors.New("foo")).Times(1),377)378},379expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {380assert := assert.New(t)381result, err := dynconfig.GetResolveSchedulerAddrs()382assert.NoError(err)383assert.EqualValues(result, []resolver.Address{{ServerName: "127.0.0.1", Addr: "127.0.0.1:3000"}})384},385},386{387name: "scheduler addrs is empty",388config: &DaemonOption{389Scheduler: SchedulerOption{390Manager: ManagerOption{391RefreshInterval: 10 * time.Millisecond,392},393},394Host: HostOption{395Hostname: "foo",396},397ObjectStorage: ObjectStorageOption{398Enable: true,399},400},401data: &DynconfigData{402Schedulers: []*managerv1.Scheduler(nil),403},404sleep: func() {405time.Sleep(100 * time.Millisecond)406},407cleanFileCache: func(t *testing.T) {408if err := os.Remove(mockCachePath); err != nil {409t.Fatal(err)410}411},412mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {413gomock.InOrder(414m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),415m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),416m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),417m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),418)419},420expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {421assert := assert.New(t)422_, err := dynconfig.GetResolveSchedulerAddrs()423assert.EqualError(err, "schedulers not found")424},425},426}427
428for _, tc := range tests {429t.Run(tc.name, func(t *testing.T) {430ctl := gomock.NewController(t)431defer ctl.Finish()432
433mockManagerClient := mocks.NewMockV1(ctl)434tc.mock(mockManagerClient.EXPECT(), tc.data)435dynconfig, err := NewDynconfig(436ManagerSourceType, tc.config,437WithCacheDir(mockCacheDir),438WithManagerClient(mockManagerClient),439)440if err != nil {441t.Fatal(err)442}443
444tc.sleep()445tc.expect(t, dynconfig, tc.data)446tc.cleanFileCache(t)447})448}449}
450
451func TestDynconfigManager_Get(t *testing.T) {452mockCacheDir := t.TempDir()453mockCachePath := filepath.Join(mockCacheDir, cacheFileName)454tests := []struct {455name string456config *DaemonOption457data *DynconfigData458sleep func()459cleanFileCache func(t *testing.T)460mock func(m *mocks.MockV1MockRecorder, data *DynconfigData)461expect func(t *testing.T, dynconfig Dynconfig, data *DynconfigData)462}{463{464name: "get dynconfig cache data",465config: &DaemonOption{466Scheduler: SchedulerOption{467Manager: ManagerOption{468RefreshInterval: 10 * time.Second,469},470},471Host: HostOption{472Hostname: "foo",473},474ObjectStorage: ObjectStorageOption{475Enable: true,476},477},478data: &DynconfigData{479Schedulers: []*managerv1.Scheduler{480{481Hostname: "foo",482},483},484ObjectStorage: &managerv1.ObjectStorage{485Name: "foo",486},487},488sleep: func() {},489cleanFileCache: func(t *testing.T) {490if err := os.Remove(mockCachePath); err != nil {491t.Fatal(err)492}493},494mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {495gomock.InOrder(496m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{497Schedulers: []*managerv1.Scheduler{498{499Hostname: data.Schedulers[0].Hostname,500},501},502}, nil).Times(1),503m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{504Name: data.ObjectStorage.Name,505}, nil).Times(1),506)507},508expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {509assert := assert.New(t)510result, err := dynconfig.Get()511assert.NoError(err)512assert.EqualValues(result, data)513},514},515{516name: "get dynconfig data",517config: &DaemonOption{518Scheduler: SchedulerOption{519Manager: ManagerOption{520RefreshInterval: 10 * time.Millisecond,521},522},523Host: HostOption{524Hostname: "foo",525},526ObjectStorage: ObjectStorageOption{527Enable: true,528},529},530data: &DynconfigData{531Schedulers: []*managerv1.Scheduler{532{533Hostname: "foo",534},535},536ObjectStorage: &managerv1.ObjectStorage{537Name: "foo",538},539},540sleep: func() {541time.Sleep(100 * time.Millisecond)542},543cleanFileCache: func(t *testing.T) {544if err := os.Remove(mockCachePath); err != nil {545t.Fatal(err)546}547},548mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {549gomock.InOrder(550m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),551m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),552m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{553Schedulers: []*managerv1.Scheduler{554{555Hostname: data.Schedulers[0].Hostname,556},557},558}, nil).Times(1),559m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{560Name: data.ObjectStorage.Name,561}, nil).Times(1),562)563},564expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {565assert := assert.New(t)566result, err := dynconfig.Get()567assert.NoError(err)568assert.EqualValues(result, data)569},570},571{572name: "disable object storage",573config: &DaemonOption{574Scheduler: SchedulerOption{575Manager: ManagerOption{576RefreshInterval: 10 * time.Millisecond,577},578},579Host: HostOption{580Hostname: "foo",581},582ObjectStorage: ObjectStorageOption{583Enable: false,584},585},586data: &DynconfigData{587Schedulers: []*managerv1.Scheduler{588{589Hostname: "foo",590},591},592},593sleep: func() {594time.Sleep(100 * time.Millisecond)595},596cleanFileCache: func(t *testing.T) {597if err := os.Remove(mockCachePath); err != nil {598t.Fatal(err)599}600},601mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {602gomock.InOrder(603m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),604m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{605Schedulers: []*managerv1.Scheduler{606{607Hostname: data.Schedulers[0].Hostname,608},609},610}, nil).Times(1),611)612},613expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {614assert := assert.New(t)615result, err := dynconfig.Get()616assert.NoError(err)617assert.EqualValues(result, data)618},619},620{621name: "list schedulers error",622config: &DaemonOption{623Scheduler: SchedulerOption{624Manager: ManagerOption{625RefreshInterval: 10 * time.Millisecond,626},627},628Host: HostOption{629Hostname: "foo",630},631ObjectStorage: ObjectStorageOption{632Enable: true,633},634},635data: &DynconfigData{636Schedulers: []*managerv1.Scheduler{637{638Hostname: "foo",639},640},641ObjectStorage: &managerv1.ObjectStorage{642Name: "foo",643},644},645sleep: func() {646time.Sleep(100 * time.Millisecond)647},648cleanFileCache: func(t *testing.T) {649if err := os.Remove(mockCachePath); err != nil {650t.Fatal(err)651}652},653mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {654gomock.InOrder(655m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{656Schedulers: []*managerv1.Scheduler{657{658Hostname: data.Schedulers[0].Hostname,659},660},661}, nil).Times(1),662m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{663Name: data.ObjectStorage.Name,664}, nil).Times(1),665m.ListSchedulers(gomock.Any(), gomock.Any()).Return(nil, errors.New("foo")).Times(1),666)667},668expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {669assert := assert.New(t)670result, err := dynconfig.Get()671assert.NoError(err)672assert.EqualValues(result, data)673},674},675{676name: "get object storage error",677config: &DaemonOption{678Scheduler: SchedulerOption{679Manager: ManagerOption{680RefreshInterval: 10 * time.Millisecond,681},682},683Host: HostOption{684Hostname: "foo",685},686ObjectStorage: ObjectStorageOption{687Enable: true,688},689},690data: &DynconfigData{691Schedulers: []*managerv1.Scheduler{692{693Hostname: "foo",694},695},696ObjectStorage: &managerv1.ObjectStorage{697Name: "foo",698},699},700sleep: func() {701time.Sleep(100 * time.Millisecond)702},703cleanFileCache: func(t *testing.T) {704if err := os.Remove(mockCachePath); err != nil {705t.Fatal(err)706}707},708mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {709gomock.InOrder(710m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{711Schedulers: []*managerv1.Scheduler{712{713Hostname: data.Schedulers[0].Hostname,714},715},716}, nil).Times(1),717m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{718Name: data.ObjectStorage.Name,719}, nil).Times(1),720m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),721m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(nil, errors.New("foo")).Times(1),722)723},724expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {725assert := assert.New(t)726result, err := dynconfig.Get()727assert.NoError(err)728assert.EqualValues(result, data)729},730},731{732name: "object storage is not found",733config: &DaemonOption{734Scheduler: SchedulerOption{735Manager: ManagerOption{736RefreshInterval: 10 * time.Millisecond,737},738},739Host: HostOption{740Hostname: "foo",741},742ObjectStorage: ObjectStorageOption{743Enable: true,744},745},746data: &DynconfigData{747Schedulers: []*managerv1.Scheduler{748{749Hostname: "foo",750},751},752ObjectStorage: &managerv1.ObjectStorage{753Name: "foo",754},755},756sleep: func() {757time.Sleep(100 * time.Millisecond)758},759cleanFileCache: func(t *testing.T) {760if err := os.Remove(mockCachePath); err != nil {761t.Fatal(err)762}763},764mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {765gomock.InOrder(766m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{767Schedulers: []*managerv1.Scheduler{768{769Hostname: data.Schedulers[0].Hostname,770},771},772}, nil).Times(1),773m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{774Name: data.ObjectStorage.Name,775}, nil).Times(1),776m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{777Schedulers: []*managerv1.Scheduler{778{779Hostname: data.Schedulers[0].Hostname,780},781},782}, nil).Times(1),783m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(nil, status.Error(codes.NotFound, "")).Times(1),784)785},786expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {787assert := assert.New(t)788result, err := dynconfig.Get()789assert.NoError(err)790assert.EqualValues(result, &DynconfigData{791Schedulers: []*managerv1.Scheduler{792{793Hostname: data.Schedulers[0].Hostname,794},795},796ObjectStorage: &managerv1.ObjectStorage{797Name: data.ObjectStorage.Name,798},799})800},801},802{803name: "resource is empty",804config: &DaemonOption{805Scheduler: SchedulerOption{806Manager: ManagerOption{807RefreshInterval: 10 * time.Millisecond,808},809},810Host: HostOption{811Hostname: "foo",812},813ObjectStorage: ObjectStorageOption{814Enable: true,815},816},817data: &DynconfigData{818Schedulers: []*managerv1.Scheduler(nil),819ObjectStorage: &managerv1.ObjectStorage{},820},821sleep: func() {822time.Sleep(100 * time.Millisecond)823},824cleanFileCache: func(t *testing.T) {825if err := os.Remove(mockCachePath); err != nil {826t.Fatal(err)827}828},829mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {830gomock.InOrder(831m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),832m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),833m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),834m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),835)836},837expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {838assert := assert.New(t)839result, err := dynconfig.Get()840assert.NoError(err)841assert.EqualValues(result, data)842},843},844}845
846for _, tc := range tests {847t.Run(tc.name, func(t *testing.T) {848ctl := gomock.NewController(t)849defer ctl.Finish()850
851mockManagerClient := mocks.NewMockV1(ctl)852tc.mock(mockManagerClient.EXPECT(), tc.data)853dynconfig, err := NewDynconfig(854ManagerSourceType, tc.config,855WithCacheDir(mockCacheDir),856WithManagerClient(mockManagerClient),857)858if err != nil {859t.Fatal(err)860}861
862tc.sleep()863tc.expect(t, dynconfig, tc.data)864tc.cleanFileCache(t)865})866}867}
868
869func TestDynconfigManager_GetSchedulers(t *testing.T) {870mockCacheDir := t.TempDir()871mockCachePath := filepath.Join(mockCacheDir, cacheFileName)872tests := []struct {873name string874config *DaemonOption875data *DynconfigData876sleep func()877cleanFileCache func(t *testing.T)878mock func(m *mocks.MockV1MockRecorder, data *DynconfigData)879expect func(t *testing.T, dynconfig Dynconfig, data *DynconfigData)880}{881{882name: "get cache schedulers",883config: &DaemonOption{884Scheduler: SchedulerOption{885Manager: ManagerOption{886RefreshInterval: 10 * time.Second,887},888},889Host: HostOption{890Hostname: "foo",891},892ObjectStorage: ObjectStorageOption{893Enable: true,894},895},896data: &DynconfigData{897Schedulers: []*managerv1.Scheduler{898{899Hostname: "foo",900},901},902},903sleep: func() {},904cleanFileCache: func(t *testing.T) {905if err := os.Remove(mockCachePath); err != nil {906t.Fatal(err)907}908},909mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {910gomock.InOrder(911m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{912Schedulers: []*managerv1.Scheduler{913{914Hostname: data.Schedulers[0].Hostname,915},916},917}, nil).Times(1),918m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),919)920},921expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {922assert := assert.New(t)923result, err := dynconfig.GetSchedulers()924assert.NoError(err)925assert.EqualValues(result, data.Schedulers)926},927},928{929name: "get schedulers",930config: &DaemonOption{931Scheduler: SchedulerOption{932Manager: ManagerOption{933RefreshInterval: 10 * time.Millisecond,934},935},936Host: HostOption{937Hostname: "foo",938},939ObjectStorage: ObjectStorageOption{940Enable: true,941},942},943data: &DynconfigData{944Schedulers: []*managerv1.Scheduler{945{946Hostname: "foo",947},948},949},950sleep: func() {951time.Sleep(100 * time.Millisecond)952},953cleanFileCache: func(t *testing.T) {954if err := os.Remove(mockCachePath); err != nil {955t.Fatal(err)956}957},958mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {959gomock.InOrder(960m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),961m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),962m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{963Schedulers: []*managerv1.Scheduler{964{965Hostname: data.Schedulers[0].Hostname,966},967},968}, nil).Times(1),969m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),970)971},972expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {973assert := assert.New(t)974result, err := dynconfig.GetSchedulers()975assert.NoError(err)976assert.EqualValues(result, data.Schedulers)977},978},979{980name: "list schedulers error",981config: &DaemonOption{982Scheduler: SchedulerOption{983Manager: ManagerOption{984RefreshInterval: 10 * time.Millisecond,985},986},987Host: HostOption{988Hostname: "foo",989},990ObjectStorage: ObjectStorageOption{991Enable: true,992},993},994data: &DynconfigData{995Schedulers: []*managerv1.Scheduler{996{997Hostname: "foo",998},999},1000},1001sleep: func() {1002time.Sleep(100 * time.Millisecond)1003},1004cleanFileCache: func(t *testing.T) {1005if err := os.Remove(mockCachePath); err != nil {1006t.Fatal(err)1007}1008},1009mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {1010gomock.InOrder(1011m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{1012Schedulers: []*managerv1.Scheduler{1013{1014Hostname: data.Schedulers[0].Hostname,1015},1016},1017}, nil).Times(1),1018m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),1019m.ListSchedulers(gomock.Any(), gomock.Any()).Return(nil, errors.New("foo")).Times(1),1020)1021},1022expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {1023assert := assert.New(t)1024result, err := dynconfig.GetSchedulers()1025assert.NoError(err)1026assert.EqualValues(result, data.Schedulers)1027},1028},1029{1030name: "schedulers is empty",1031config: &DaemonOption{1032Scheduler: SchedulerOption{1033Manager: ManagerOption{1034RefreshInterval: 10 * time.Millisecond,1035},1036},1037Host: HostOption{1038Hostname: "foo",1039},1040ObjectStorage: ObjectStorageOption{1041Enable: true,1042},1043},1044data: &DynconfigData{1045Schedulers: []*managerv1.Scheduler(nil),1046},1047sleep: func() {1048time.Sleep(100 * time.Millisecond)1049},1050cleanFileCache: func(t *testing.T) {1051if err := os.Remove(mockCachePath); err != nil {1052t.Fatal(err)1053}1054},1055mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {1056gomock.InOrder(1057m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1058m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),1059m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1060m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),1061)1062},1063expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {1064assert := assert.New(t)1065_, err := dynconfig.GetSchedulers()1066assert.Error(err)1067},1068},1069}1070
1071for _, tc := range tests {1072t.Run(tc.name, func(t *testing.T) {1073ctl := gomock.NewController(t)1074defer ctl.Finish()1075
1076mockManagerClient := mocks.NewMockV1(ctl)1077tc.mock(mockManagerClient.EXPECT(), tc.data)1078dynconfig, err := NewDynconfig(1079ManagerSourceType, tc.config,1080WithCacheDir(mockCacheDir),1081WithManagerClient(mockManagerClient),1082)1083if err != nil {1084t.Fatal(err)1085}1086
1087tc.sleep()1088tc.expect(t, dynconfig, tc.data)1089tc.cleanFileCache(t)1090})1091}1092}
1093
1094func TestDynconfigManager_GetObjectStorage(t *testing.T) {1095mockCacheDir := t.TempDir()1096mockCachePath := filepath.Join(mockCacheDir, cacheFileName)1097tests := []struct {1098name string1099config *DaemonOption1100data *DynconfigData1101sleep func()1102cleanFileCache func(t *testing.T)1103mock func(m *mocks.MockV1MockRecorder, data *DynconfigData)1104expect func(t *testing.T, dynconfig Dynconfig, data *DynconfigData)1105}{1106{1107name: "get cache object storage",1108config: &DaemonOption{1109Scheduler: SchedulerOption{1110Manager: ManagerOption{1111RefreshInterval: 10 * time.Second,1112},1113},1114Host: HostOption{1115Hostname: "foo",1116},1117ObjectStorage: ObjectStorageOption{1118Enable: true,1119},1120},1121data: &DynconfigData{1122ObjectStorage: &managerv1.ObjectStorage{1123Name: "foo",1124},1125},1126sleep: func() {},1127cleanFileCache: func(t *testing.T) {1128if err := os.Remove(mockCachePath); err != nil {1129t.Fatal(err)1130}1131},1132mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {1133gomock.InOrder(1134m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1135m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{1136Name: data.ObjectStorage.Name,1137}, nil).Times(1),1138)1139},1140expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {1141assert := assert.New(t)1142result, err := dynconfig.GetObjectStorage()1143assert.NoError(err)1144assert.EqualValues(result, data.ObjectStorage)1145},1146},1147{1148name: "get object storage",1149config: &DaemonOption{1150Scheduler: SchedulerOption{1151Manager: ManagerOption{1152RefreshInterval: 10 * time.Millisecond,1153},1154},1155Host: HostOption{1156Hostname: "foo",1157},1158ObjectStorage: ObjectStorageOption{1159Enable: true,1160},1161},1162data: &DynconfigData{1163ObjectStorage: &managerv1.ObjectStorage{1164Name: "foo",1165},1166},1167sleep: func() {1168time.Sleep(100 * time.Millisecond)1169},1170cleanFileCache: func(t *testing.T) {1171if err := os.Remove(mockCachePath); err != nil {1172t.Fatal(err)1173}1174},1175mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {1176gomock.InOrder(1177m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1178m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),1179m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1180m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{1181Name: data.ObjectStorage.Name,1182}, nil).Times(1),1183)1184},1185expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {1186assert := assert.New(t)1187result, err := dynconfig.GetObjectStorage()1188assert.NoError(err)1189assert.EqualValues(result, data.ObjectStorage)1190},1191},1192{1193name: "get object storage error",1194config: &DaemonOption{1195Scheduler: SchedulerOption{1196Manager: ManagerOption{1197RefreshInterval: 10 * time.Millisecond,1198},1199},1200Host: HostOption{1201Hostname: "foo",1202},1203ObjectStorage: ObjectStorageOption{1204Enable: true,1205},1206},1207data: &DynconfigData{1208ObjectStorage: &managerv1.ObjectStorage{1209Name: "foo",1210},1211},1212sleep: func() {1213time.Sleep(100 * time.Millisecond)1214},1215cleanFileCache: func(t *testing.T) {1216if err := os.Remove(mockCachePath); err != nil {1217t.Fatal(err)1218}1219},1220mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {1221gomock.InOrder(1222m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1223m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{1224Name: data.ObjectStorage.Name,1225}, nil).Times(1),1226m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1227m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(nil, errors.New("foo")).Times(1),1228)1229},1230expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {1231assert := assert.New(t)1232result, err := dynconfig.GetObjectStorage()1233assert.NoError(err)1234assert.EqualValues(result, data.ObjectStorage)1235},1236},1237{1238name: "object storage is not found",1239config: &DaemonOption{1240Scheduler: SchedulerOption{1241Manager: ManagerOption{1242RefreshInterval: 10 * time.Millisecond,1243},1244},1245Host: HostOption{1246Hostname: "foo",1247},1248ObjectStorage: ObjectStorageOption{1249Enable: true,1250},1251},1252data: &DynconfigData{1253ObjectStorage: &managerv1.ObjectStorage{1254Name: "foo",1255},1256},1257sleep: func() {1258time.Sleep(100 * time.Millisecond)1259},1260cleanFileCache: func(t *testing.T) {1261if err := os.Remove(mockCachePath); err != nil {1262t.Fatal(err)1263}1264},1265mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {1266gomock.InOrder(1267m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1268m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{1269Name: data.ObjectStorage.Name,1270}, nil).Times(1),1271m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1272m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(nil, status.Error(codes.NotFound, "")).Times(1),1273)1274},1275expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {1276assert := assert.New(t)1277result, err := dynconfig.GetObjectStorage()1278assert.NoError(err)1279assert.EqualValues(result, &managerv1.ObjectStorage{1280Name: data.ObjectStorage.Name,1281})1282},1283},1284{1285name: "object storage is empty",1286config: &DaemonOption{1287Scheduler: SchedulerOption{1288Manager: ManagerOption{1289RefreshInterval: 10 * time.Millisecond,1290},1291},1292Host: HostOption{1293Hostname: "foo",1294},1295ObjectStorage: ObjectStorageOption{1296Enable: true,1297},1298},1299data: &DynconfigData{1300ObjectStorage: &managerv1.ObjectStorage{},1301},1302sleep: func() {1303time.Sleep(100 * time.Millisecond)1304},1305cleanFileCache: func(t *testing.T) {1306if err := os.Remove(mockCachePath); err != nil {1307t.Fatal(err)1308}1309},1310mock: func(m *mocks.MockV1MockRecorder, data *DynconfigData) {1311gomock.InOrder(1312m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1313m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),1314m.ListSchedulers(gomock.Any(), gomock.Any()).Return(&managerv1.ListSchedulersResponse{}, nil).Times(1),1315m.GetObjectStorage(gomock.Any(), gomock.Any()).Return(&managerv1.ObjectStorage{}, nil).Times(1),1316)1317},1318expect: func(t *testing.T, dynconfig Dynconfig, data *DynconfigData) {1319assert := assert.New(t)1320result, err := dynconfig.GetObjectStorage()1321assert.NoError(err)1322assert.EqualValues(result, data.ObjectStorage)1323},1324},1325}1326
1327for _, tc := range tests {1328t.Run(tc.name, func(t *testing.T) {1329ctl := gomock.NewController(t)1330defer ctl.Finish()1331
1332mockManagerClient := mocks.NewMockV1(ctl)1333tc.mock(mockManagerClient.EXPECT(), tc.data)1334dynconfig, err := NewDynconfig(1335ManagerSourceType, tc.config,1336WithCacheDir(mockCacheDir),1337WithManagerClient(mockManagerClient),1338)1339if err != nil {1340t.Fatal(err)1341}1342
1343tc.sleep()1344tc.expect(t, dynconfig, tc.data)1345tc.cleanFileCache(t)1346})1347}1348}
1349