github.com/kubewharf/katalyst-core@v0.5.3/pkg/agent/sysadvisor/test/sysadvisor_test.go (about) 1 /* 2 Copyright 2022 The Katalyst 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 17 package util 18 19 import ( 20 "context" 21 "io/ioutil" 22 "os" 23 "testing" 24 "time" 25 26 info "github.com/google/cadvisor/info/v1" 27 "github.com/stretchr/testify/assert" 28 "github.com/stretchr/testify/require" 29 "k8s.io/apimachinery/pkg/runtime" 30 dynamicfake "k8s.io/client-go/dynamic/fake" 31 "k8s.io/client-go/kubernetes/fake" 32 33 internalfake "github.com/kubewharf/katalyst-api/pkg/client/clientset/versioned/fake" 34 "github.com/kubewharf/katalyst-core/cmd/katalyst-agent/app/options" 35 "github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor" 36 "github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/metacache" 37 "github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/plugin" 38 metacacheplugin "github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/plugin/metacache" 39 "github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/plugin/qosaware" 40 "github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/types" 41 "github.com/kubewharf/katalyst-core/pkg/client" 42 katalystconfig "github.com/kubewharf/katalyst-core/pkg/config" 43 "github.com/kubewharf/katalyst-core/pkg/metaserver" 44 "github.com/kubewharf/katalyst-core/pkg/metaserver/agent" 45 "github.com/kubewharf/katalyst-core/pkg/metaserver/agent/metric" 46 "github.com/kubewharf/katalyst-core/pkg/metaserver/agent/pod" 47 "github.com/kubewharf/katalyst-core/pkg/metrics" 48 metricspool "github.com/kubewharf/katalyst-core/pkg/metrics/metrics-pool" 49 "github.com/kubewharf/katalyst-core/pkg/util/machine" 50 ) 51 52 func generatePluginConfig(t *testing.T, ckDir, sfDir string) *katalystconfig.Configuration { 53 testConfiguration, err := options.NewOptions().Config() 54 require.NoError(t, err) 55 require.NotNil(t, testConfiguration) 56 57 testConfiguration.QRMServers = []string{} 58 59 testConfiguration.GenericSysAdvisorConfiguration.StateFileDirectory = sfDir 60 testConfiguration.MetaServerConfiguration.CheckpointManagerDir = ckDir 61 62 return testConfiguration 63 } 64 65 func TestAdvisor(t *testing.T) { 66 t.Parallel() 67 68 ckDir, err := ioutil.TempDir("", "checkpoint-TestAdvisor") 69 require.NoError(t, err) 70 defer os.RemoveAll(ckDir) 71 72 sfDir, err := ioutil.TempDir("", "statefile") 73 require.NoError(t, err) 74 defer os.RemoveAll(sfDir) 75 76 conf := generatePluginConfig(t, ckDir, sfDir) 77 78 genericClient := &client.GenericClientSet{ 79 KubeClient: fake.NewSimpleClientset(), 80 InternalClient: internalfake.NewSimpleClientset(), 81 DynamicClient: dynamicfake.NewSimpleDynamicClient(runtime.NewScheme()), 82 } 83 meta, err := metaserver.NewMetaServer(genericClient, metrics.DummyMetrics{}, conf) 84 assert.NoError(t, err) 85 86 cpuTopology, err := machine.GenerateDummyCPUTopology(96, 2, 2) 87 assert.NoError(t, err) 88 89 meta.MetaAgent = &agent.MetaAgent{ 90 KatalystMachineInfo: &machine.KatalystMachineInfo{ 91 CPUTopology: cpuTopology, 92 MachineInfo: &info.MachineInfo{}, 93 }, 94 MetricsFetcher: metric.NewFakeMetricsFetcher(metrics.DummyMetrics{}), 95 } 96 97 fakeMetricsFetcher := metric.NewFakeMetricsFetcher(metrics.DummyMetrics{}).(*metric.FakeMetricsFetcher) 98 assert.NotNil(t, fakeMetricsFetcher) 99 meta.MetricsFetcher = fakeMetricsFetcher 100 meta.PodFetcher = &pod.PodFetcherStub{} 101 102 conf.SysAdvisorPlugins = []string{"-" + types.AdvisorPluginNameInference} 103 advisor, err := sysadvisor.NewAdvisorAgent(conf, struct{}{}, meta, metricspool.DummyMetricsEmitterPool{}) 104 assert.NoError(t, err) 105 106 ctx, cancel := context.WithCancel(context.Background()) 107 108 if advisor != nil { 109 go advisor.Run(ctx) 110 } 111 112 time.Sleep(time.Millisecond * 30) 113 cancel() 114 } 115 116 func TestPlugins(t *testing.T) { 117 t.Parallel() 118 119 type args struct { 120 initFn plugin.AdvisorPluginInitFunc 121 } 122 tests := []struct { 123 name string 124 arg args 125 }{ 126 { 127 name: "test-metacachePlugin", 128 arg: args{ 129 initFn: metacacheplugin.NewMetaCachePlugin, 130 }, 131 }, 132 { 133 name: "test-qosAwarePlugin", 134 arg: args{ 135 initFn: qosaware.NewQoSAwarePlugin, 136 }, 137 }, 138 } 139 140 genericClient := &client.GenericClientSet{ 141 KubeClient: fake.NewSimpleClientset(), 142 InternalClient: internalfake.NewSimpleClientset(), 143 DynamicClient: dynamicfake.NewSimpleDynamicClient(runtime.NewScheme()), 144 } 145 146 ckDir, err := ioutil.TempDir("", "checkpoint-TestPlugins") 147 require.NoError(t, err) 148 defer os.RemoveAll(ckDir) 149 150 sfDir, err := ioutil.TempDir("", "statefile") 151 require.NoError(t, err) 152 defer os.RemoveAll(sfDir) 153 154 ctx, cancel := context.WithCancel(context.Background()) 155 conf := generatePluginConfig(t, ckDir, sfDir) 156 metaServer, err := metaserver.NewMetaServer(genericClient, metrics.DummyMetrics{}, conf) 157 assert.NoError(t, err) 158 159 cpuTopology, err := machine.GenerateDummyCPUTopology(96, 2, 2) 160 assert.NoError(t, err) 161 162 metaServer.MetaAgent = &agent.MetaAgent{ 163 KatalystMachineInfo: &machine.KatalystMachineInfo{ 164 CPUTopology: cpuTopology, 165 MachineInfo: &info.MachineInfo{}, 166 }, 167 MetricsFetcher: metric.NewFakeMetricsFetcher(metrics.DummyMetrics{}), 168 } 169 170 fakeMetricsFetcher := metric.NewFakeMetricsFetcher(metrics.DummyMetrics{}).(*metric.FakeMetricsFetcher) 171 assert.NotNil(t, fakeMetricsFetcher) 172 metaServer.MetricsFetcher = fakeMetricsFetcher 173 metaServer.PodFetcher = &pod.PodFetcherStub{} 174 175 for _, tt := range tests { 176 tt := tt 177 t.Run(tt.name, func(t *testing.T) { 178 t.Parallel() 179 180 metaCache, err := metacache.NewMetaCacheImp(conf, metricspool.DummyMetricsEmitterPool{}, fakeMetricsFetcher) 181 assert.NoError(t, err) 182 assert.NotNil(t, metaCache) 183 184 curPlugin, _ := tt.arg.initFn("test", conf, nil, metricspool.DummyMetricsEmitterPool{}, metaServer, metaCache) 185 err = curPlugin.Init() 186 assert.NotEqual(t, curPlugin.Name(), "") 187 assert.Equal(t, err, nil) 188 go curPlugin.Run(ctx) 189 }) 190 } 191 192 time.Sleep(100 * time.Millisecond) 193 cancel() 194 } 195 196 func TestMetaServer(t *testing.T) { 197 t.Parallel() 198 199 client := &client.GenericClientSet{ 200 KubeClient: fake.NewSimpleClientset(), 201 InternalClient: internalfake.NewSimpleClientset(), 202 DynamicClient: dynamicfake.NewSimpleDynamicClient(runtime.NewScheme()), 203 } 204 205 ckDir, err := ioutil.TempDir("", "checkpoint-TestMetaServer") 206 require.NoError(t, err) 207 defer os.RemoveAll(ckDir) 208 209 sfDir, err := ioutil.TempDir("", "statefile") 210 require.NoError(t, err) 211 defer os.RemoveAll(sfDir) 212 213 conf := generatePluginConfig(t, ckDir, sfDir) 214 meta, err := metaserver.NewMetaServer(client, metrics.DummyMetrics{}, conf) 215 if err == nil { 216 ctx, cancel := context.WithCancel(context.Background()) 217 go meta.Run(ctx) 218 time.Sleep(100 * time.Millisecond) 219 cancel() 220 } 221 }