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  }