github.com/kubewharf/katalyst-core@v0.5.3/pkg/agent/qrm-plugins/io/staticpolicy/policy_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 staticpolicy
    18  
    19  import (
    20  	"context"
    21  	"fmt"
    22  	"reflect"
    23  	"testing"
    24  
    25  	"github.com/stretchr/testify/assert"
    26  	"github.com/stretchr/testify/require"
    27  	"k8s.io/apimachinery/pkg/runtime"
    28  	pluginapi "k8s.io/kubelet/pkg/apis/resourceplugin/v1alpha1"
    29  
    30  	katalystbase "github.com/kubewharf/katalyst-core/cmd/base"
    31  	"github.com/kubewharf/katalyst-core/cmd/katalyst-agent/app/agent"
    32  	"github.com/kubewharf/katalyst-core/cmd/katalyst-agent/app/agent/qrm"
    33  	"github.com/kubewharf/katalyst-core/cmd/katalyst-agent/app/options"
    34  	"github.com/kubewharf/katalyst-core/pkg/config"
    35  	"github.com/kubewharf/katalyst-core/pkg/metaserver"
    36  	metaserveragent "github.com/kubewharf/katalyst-core/pkg/metaserver/agent"
    37  	"github.com/kubewharf/katalyst-core/pkg/metaserver/agent/pod"
    38  	"github.com/kubewharf/katalyst-core/pkg/metaserver/external"
    39  	"github.com/kubewharf/katalyst-core/pkg/metrics"
    40  	"github.com/kubewharf/katalyst-core/pkg/util/machine"
    41  )
    42  
    43  func generateTestConfiguration(t *testing.T) *config.Configuration {
    44  	testConfiguration, err := options.NewOptions().Config()
    45  	require.NoError(t, err)
    46  	require.NotNil(t, testConfiguration)
    47  	return testConfiguration
    48  }
    49  
    50  func makeMetaServer() *metaserver.MetaServer {
    51  	cpuTopology, _ := machine.GenerateDummyCPUTopology(16, 2, 4)
    52  
    53  	return &metaserver.MetaServer{
    54  		MetaAgent: &metaserveragent.MetaAgent{
    55  			KatalystMachineInfo: &machine.KatalystMachineInfo{
    56  				CPUTopology:      cpuTopology,
    57  				ExtraNetworkInfo: &machine.ExtraNetworkInfo{},
    58  			},
    59  		},
    60  		ExternalManager: external.InitExternalManager(&pod.PodFetcherStub{}),
    61  	}
    62  }
    63  
    64  func makeTestGenericContext(t *testing.T) *agent.GenericContext {
    65  	genericCtx, err := katalystbase.GenerateFakeGenericContext([]runtime.Object{})
    66  	assert.NoError(t, err)
    67  
    68  	return &agent.GenericContext{
    69  		GenericContext: genericCtx,
    70  		MetaServer:     makeMetaServer(),
    71  		PluginManager:  nil,
    72  	}
    73  }
    74  
    75  func TestNewStaticPolicy(t *testing.T) {
    76  	t.Parallel()
    77  
    78  	agentCtx := makeTestGenericContext(t)
    79  	conf := generateTestConfiguration(t)
    80  
    81  	type args struct {
    82  		agentCtx  *agent.GenericContext
    83  		conf      *config.Configuration
    84  		in2       interface{}
    85  		agentName string
    86  	}
    87  	tests := []struct {
    88  		name    string
    89  		args    args
    90  		want    bool
    91  		want1   agent.Component
    92  		wantErr bool
    93  	}{
    94  		{
    95  			name: "new static policy",
    96  			args: args{
    97  				agentCtx:  agentCtx,
    98  				conf:      conf,
    99  				agentName: qrm.QRMPluginNameIO,
   100  			},
   101  			want:    true,
   102  			wantErr: false,
   103  		},
   104  	}
   105  	for _, tt := range tests {
   106  		tt := tt
   107  		t.Run(tt.name, func(t *testing.T) {
   108  			t.Parallel()
   109  
   110  			got, got1, err := NewStaticPolicy(tt.args.agentCtx, tt.args.conf, tt.args.in2, tt.args.agentName)
   111  			if (err != nil) != tt.wantErr {
   112  				t.Errorf("NewStaticPolicy() error = %v, wantErr %v", err, tt.wantErr)
   113  				return
   114  			}
   115  
   116  			if got != tt.want {
   117  				t.Errorf("NewStaticPolicy() got = %v, want %v", got, tt.want)
   118  			}
   119  
   120  			assert.NotNilf(t, got1, "got nil policy object")
   121  		})
   122  	}
   123  }
   124  
   125  func TestStaticPolicy_Start(t *testing.T) {
   126  	t.Parallel()
   127  
   128  	type fields struct {
   129  		name       string
   130  		stopCh     chan struct{}
   131  		started    bool
   132  		emitter    metrics.MetricEmitter
   133  		metaServer *metaserver.MetaServer
   134  		agentCtx   *agent.GenericContext
   135  	}
   136  	tests := []struct {
   137  		name    string
   138  		fields  fields
   139  		wantErr bool
   140  	}{
   141  		{
   142  			name: "start static policy",
   143  			fields: fields{
   144  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   145  				stopCh:     make(chan struct{}),
   146  				started:    false,
   147  				emitter:    metrics.DummyMetrics{},
   148  				metaServer: makeMetaServer(),
   149  				agentCtx:   makeTestGenericContext(t),
   150  			},
   151  			wantErr: false,
   152  		},
   153  	}
   154  	for _, tt := range tests {
   155  		tt := tt
   156  		t.Run(tt.name, func(t *testing.T) {
   157  			t.Parallel()
   158  
   159  			p := &StaticPolicy{
   160  				name:       tt.fields.name,
   161  				stopCh:     tt.fields.stopCh,
   162  				started:    tt.fields.started,
   163  				emitter:    tt.fields.emitter,
   164  				metaServer: tt.fields.metaServer,
   165  				agentCtx:   tt.fields.agentCtx,
   166  			}
   167  			if err := p.Start(); (err != nil) != tt.wantErr {
   168  				t.Errorf("StaticPolicy.Start() error = %v, wantErr %v", err, tt.wantErr)
   169  			}
   170  		})
   171  	}
   172  }
   173  
   174  func TestStaticPolicy_Stop(t *testing.T) {
   175  	t.Parallel()
   176  
   177  	type fields struct {
   178  		name       string
   179  		stopCh     chan struct{}
   180  		started    bool
   181  		emitter    metrics.MetricEmitter
   182  		metaServer *metaserver.MetaServer
   183  		agentCtx   *agent.GenericContext
   184  	}
   185  	tests := []struct {
   186  		name    string
   187  		fields  fields
   188  		wantErr bool
   189  	}{
   190  		{
   191  			name: "stop static policy",
   192  			fields: fields{
   193  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   194  				stopCh:     make(chan struct{}),
   195  				started:    true,
   196  				emitter:    metrics.DummyMetrics{},
   197  				metaServer: makeMetaServer(),
   198  				agentCtx:   makeTestGenericContext(t),
   199  			},
   200  			wantErr: false,
   201  		},
   202  	}
   203  	for _, tt := range tests {
   204  		tt := tt
   205  		t.Run(tt.name, func(t *testing.T) {
   206  			t.Parallel()
   207  
   208  			p := &StaticPolicy{
   209  				name:       tt.fields.name,
   210  				stopCh:     tt.fields.stopCh,
   211  				started:    tt.fields.started,
   212  				emitter:    tt.fields.emitter,
   213  				metaServer: tt.fields.metaServer,
   214  				agentCtx:   tt.fields.agentCtx,
   215  			}
   216  			if err := p.Stop(); (err != nil) != tt.wantErr {
   217  				t.Errorf("StaticPolicy.Stop() error = %v, wantErr %v", err, tt.wantErr)
   218  			}
   219  		})
   220  	}
   221  }
   222  
   223  func TestStaticPolicy_Name(t *testing.T) {
   224  	t.Parallel()
   225  
   226  	type fields struct {
   227  		name       string
   228  		stopCh     chan struct{}
   229  		started    bool
   230  		emitter    metrics.MetricEmitter
   231  		metaServer *metaserver.MetaServer
   232  		agentCtx   *agent.GenericContext
   233  	}
   234  	tests := []struct {
   235  		name   string
   236  		fields fields
   237  		want   string
   238  	}{
   239  		{
   240  			name: "get policy name",
   241  			fields: fields{
   242  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   243  				stopCh:     make(chan struct{}),
   244  				started:    true,
   245  				emitter:    metrics.DummyMetrics{},
   246  				metaServer: makeMetaServer(),
   247  				agentCtx:   makeTestGenericContext(t),
   248  			},
   249  			want: fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   250  		},
   251  	}
   252  	for _, tt := range tests {
   253  		tt := tt
   254  		t.Run(tt.name, func(t *testing.T) {
   255  			t.Parallel()
   256  
   257  			p := &StaticPolicy{
   258  				name:       tt.fields.name,
   259  				stopCh:     tt.fields.stopCh,
   260  				started:    tt.fields.started,
   261  				emitter:    tt.fields.emitter,
   262  				metaServer: tt.fields.metaServer,
   263  				agentCtx:   tt.fields.agentCtx,
   264  			}
   265  			if got := p.Name(); got != tt.want {
   266  				t.Errorf("StaticPolicy.Name() = %v, want %v", got, tt.want)
   267  			}
   268  		})
   269  	}
   270  }
   271  
   272  func TestStaticPolicy_ResourceName(t *testing.T) {
   273  	t.Parallel()
   274  
   275  	type fields struct {
   276  		name       string
   277  		stopCh     chan struct{}
   278  		started    bool
   279  		emitter    metrics.MetricEmitter
   280  		metaServer *metaserver.MetaServer
   281  		agentCtx   *agent.GenericContext
   282  	}
   283  	tests := []struct {
   284  		name   string
   285  		fields fields
   286  		want   string
   287  	}{
   288  		{
   289  			name: "get policy name",
   290  			fields: fields{
   291  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   292  				stopCh:     make(chan struct{}),
   293  				started:    true,
   294  				emitter:    metrics.DummyMetrics{},
   295  				metaServer: makeMetaServer(),
   296  				agentCtx:   makeTestGenericContext(t),
   297  			},
   298  			want: "",
   299  		},
   300  	}
   301  	for _, tt := range tests {
   302  		tt := tt
   303  		t.Run(tt.name, func(t *testing.T) {
   304  			t.Parallel()
   305  			p := &StaticPolicy{
   306  				name:       tt.fields.name,
   307  				stopCh:     tt.fields.stopCh,
   308  				started:    tt.fields.started,
   309  				emitter:    tt.fields.emitter,
   310  				metaServer: tt.fields.metaServer,
   311  				agentCtx:   tt.fields.agentCtx,
   312  			}
   313  			if got := p.ResourceName(); got != tt.want {
   314  				t.Errorf("StaticPolicy.ResourceName() = %v, want %v", got, tt.want)
   315  			}
   316  		})
   317  	}
   318  }
   319  
   320  func TestStaticPolicy_GetTopologyHints(t *testing.T) {
   321  	t.Parallel()
   322  
   323  	type fields struct {
   324  		name       string
   325  		stopCh     chan struct{}
   326  		started    bool
   327  		emitter    metrics.MetricEmitter
   328  		metaServer *metaserver.MetaServer
   329  		agentCtx   *agent.GenericContext
   330  	}
   331  	type args struct {
   332  		in0 context.Context
   333  		req *pluginapi.ResourceRequest
   334  	}
   335  	tests := []struct {
   336  		name     string
   337  		fields   fields
   338  		args     args
   339  		wantResp *pluginapi.ResourceHintsResponse
   340  		wantErr  bool
   341  	}{
   342  		{
   343  			name: "get topology hints",
   344  			fields: fields{
   345  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   346  				stopCh:     make(chan struct{}),
   347  				started:    true,
   348  				emitter:    metrics.DummyMetrics{},
   349  				metaServer: makeMetaServer(),
   350  				agentCtx:   makeTestGenericContext(t),
   351  			},
   352  			args: args{
   353  				in0: context.Background(),
   354  				req: &pluginapi.ResourceRequest{},
   355  			},
   356  			wantResp: &pluginapi.ResourceHintsResponse{},
   357  			wantErr:  false,
   358  		},
   359  	}
   360  	for _, tt := range tests {
   361  		tt := tt
   362  		t.Run(tt.name, func(t *testing.T) {
   363  			t.Parallel()
   364  
   365  			p := &StaticPolicy{
   366  				name:       tt.fields.name,
   367  				stopCh:     tt.fields.stopCh,
   368  				started:    tt.fields.started,
   369  				emitter:    tt.fields.emitter,
   370  				metaServer: tt.fields.metaServer,
   371  				agentCtx:   tt.fields.agentCtx,
   372  			}
   373  			gotResp, err := p.GetTopologyHints(tt.args.in0, tt.args.req)
   374  			if (err != nil) != tt.wantErr {
   375  				t.Errorf("StaticPolicy.GetTopologyHints() error = %v, wantErr %v", err, tt.wantErr)
   376  				return
   377  			}
   378  			if !reflect.DeepEqual(gotResp, tt.wantResp) {
   379  				t.Errorf("StaticPolicy.GetTopologyHints() = %v, want %v", gotResp, tt.wantResp)
   380  			}
   381  		})
   382  	}
   383  }
   384  
   385  func TestStaticPolicy_RemovePod(t *testing.T) {
   386  	t.Parallel()
   387  
   388  	type fields struct {
   389  		name       string
   390  		stopCh     chan struct{}
   391  		started    bool
   392  		emitter    metrics.MetricEmitter
   393  		metaServer *metaserver.MetaServer
   394  		agentCtx   *agent.GenericContext
   395  	}
   396  	type args struct {
   397  		in0 context.Context
   398  		req *pluginapi.RemovePodRequest
   399  	}
   400  	tests := []struct {
   401  		name    string
   402  		fields  fields
   403  		args    args
   404  		want    *pluginapi.RemovePodResponse
   405  		wantErr bool
   406  	}{
   407  		{
   408  			name: "remove pod",
   409  			fields: fields{
   410  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   411  				stopCh:     make(chan struct{}),
   412  				started:    true,
   413  				emitter:    metrics.DummyMetrics{},
   414  				metaServer: makeMetaServer(),
   415  				agentCtx:   makeTestGenericContext(t),
   416  			},
   417  			args: args{
   418  				in0: context.Background(),
   419  				req: &pluginapi.RemovePodRequest{},
   420  			},
   421  			want:    &pluginapi.RemovePodResponse{},
   422  			wantErr: false,
   423  		},
   424  	}
   425  	for _, tt := range tests {
   426  		tt := tt
   427  		t.Run(tt.name, func(t *testing.T) {
   428  			t.Parallel()
   429  
   430  			p := &StaticPolicy{
   431  				name:       tt.fields.name,
   432  				stopCh:     tt.fields.stopCh,
   433  				started:    tt.fields.started,
   434  				emitter:    tt.fields.emitter,
   435  				metaServer: tt.fields.metaServer,
   436  				agentCtx:   tt.fields.agentCtx,
   437  			}
   438  			got, err := p.RemovePod(tt.args.in0, tt.args.req)
   439  			if (err != nil) != tt.wantErr {
   440  				t.Errorf("StaticPolicy.RemovePod() error = %v, wantErr %v", err, tt.wantErr)
   441  				return
   442  			}
   443  			if !reflect.DeepEqual(got, tt.want) {
   444  				t.Errorf("StaticPolicy.RemovePod() = %v, want %v", got, tt.want)
   445  			}
   446  		})
   447  	}
   448  }
   449  
   450  func TestStaticPolicy_GetResourcesAllocation(t *testing.T) {
   451  	t.Parallel()
   452  
   453  	type fields struct {
   454  		name       string
   455  		stopCh     chan struct{}
   456  		started    bool
   457  		emitter    metrics.MetricEmitter
   458  		metaServer *metaserver.MetaServer
   459  		agentCtx   *agent.GenericContext
   460  	}
   461  	type args struct {
   462  		in0 context.Context
   463  		in1 *pluginapi.GetResourcesAllocationRequest
   464  	}
   465  	tests := []struct {
   466  		name    string
   467  		fields  fields
   468  		args    args
   469  		want    *pluginapi.GetResourcesAllocationResponse
   470  		wantErr bool
   471  	}{
   472  		{
   473  			name: "get resources allocation",
   474  			fields: fields{
   475  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   476  				stopCh:     make(chan struct{}),
   477  				started:    true,
   478  				emitter:    metrics.DummyMetrics{},
   479  				metaServer: makeMetaServer(),
   480  				agentCtx:   makeTestGenericContext(t),
   481  			},
   482  			args: args{
   483  				in0: context.Background(),
   484  				in1: &pluginapi.GetResourcesAllocationRequest{},
   485  			},
   486  			want:    &pluginapi.GetResourcesAllocationResponse{},
   487  			wantErr: false,
   488  		},
   489  	}
   490  	for _, tt := range tests {
   491  		tt := tt
   492  		t.Run(tt.name, func(t *testing.T) {
   493  			t.Parallel()
   494  
   495  			p := &StaticPolicy{
   496  				name:       tt.fields.name,
   497  				stopCh:     tt.fields.stopCh,
   498  				started:    tt.fields.started,
   499  				emitter:    tt.fields.emitter,
   500  				metaServer: tt.fields.metaServer,
   501  				agentCtx:   tt.fields.agentCtx,
   502  			}
   503  			got, err := p.GetResourcesAllocation(tt.args.in0, tt.args.in1)
   504  			if (err != nil) != tt.wantErr {
   505  				t.Errorf("StaticPolicy.GetResourcesAllocation() error = %v, wantErr %v", err, tt.wantErr)
   506  				return
   507  			}
   508  			if !reflect.DeepEqual(got, tt.want) {
   509  				t.Errorf("StaticPolicy.GetResourcesAllocation() = %v, want %v", got, tt.want)
   510  			}
   511  		})
   512  	}
   513  }
   514  
   515  func TestStaticPolicy_GetTopologyAwareResources(t *testing.T) {
   516  	t.Parallel()
   517  
   518  	type fields struct {
   519  		name       string
   520  		stopCh     chan struct{}
   521  		started    bool
   522  		emitter    metrics.MetricEmitter
   523  		metaServer *metaserver.MetaServer
   524  		agentCtx   *agent.GenericContext
   525  	}
   526  	type args struct {
   527  		in0 context.Context
   528  		in1 *pluginapi.GetTopologyAwareResourcesRequest
   529  	}
   530  	tests := []struct {
   531  		name    string
   532  		fields  fields
   533  		args    args
   534  		want    *pluginapi.GetTopologyAwareResourcesResponse
   535  		wantErr bool
   536  	}{
   537  		{
   538  			name: "get topology-aware resources",
   539  			fields: fields{
   540  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   541  				stopCh:     make(chan struct{}),
   542  				started:    true,
   543  				emitter:    metrics.DummyMetrics{},
   544  				metaServer: makeMetaServer(),
   545  				agentCtx:   makeTestGenericContext(t),
   546  			},
   547  			args: args{
   548  				in0: context.Background(),
   549  				in1: &pluginapi.GetTopologyAwareResourcesRequest{},
   550  			},
   551  			want:    &pluginapi.GetTopologyAwareResourcesResponse{},
   552  			wantErr: false,
   553  		},
   554  	}
   555  	for _, tt := range tests {
   556  		tt := tt
   557  		t.Run(tt.name, func(t *testing.T) {
   558  			t.Parallel()
   559  
   560  			p := &StaticPolicy{
   561  				name:       tt.fields.name,
   562  				stopCh:     tt.fields.stopCh,
   563  				started:    tt.fields.started,
   564  				emitter:    tt.fields.emitter,
   565  				metaServer: tt.fields.metaServer,
   566  				agentCtx:   tt.fields.agentCtx,
   567  			}
   568  			got, err := p.GetTopologyAwareResources(tt.args.in0, tt.args.in1)
   569  			if (err != nil) != tt.wantErr {
   570  				t.Errorf("StaticPolicy.GetTopologyAwareResources() error = %v, wantErr %v", err, tt.wantErr)
   571  				return
   572  			}
   573  			if !reflect.DeepEqual(got, tt.want) {
   574  				t.Errorf("StaticPolicy.GetTopologyAwareResources() = %v, want %v", got, tt.want)
   575  			}
   576  		})
   577  	}
   578  }
   579  
   580  func TestStaticPolicy_GetTopologyAwareAllocatableResources(t *testing.T) {
   581  	t.Parallel()
   582  
   583  	type fields struct {
   584  		name       string
   585  		stopCh     chan struct{}
   586  		started    bool
   587  		emitter    metrics.MetricEmitter
   588  		metaServer *metaserver.MetaServer
   589  		agentCtx   *agent.GenericContext
   590  	}
   591  	type args struct {
   592  		in0 context.Context
   593  		in1 *pluginapi.GetTopologyAwareAllocatableResourcesRequest
   594  	}
   595  	tests := []struct {
   596  		name    string
   597  		fields  fields
   598  		args    args
   599  		want    *pluginapi.GetTopologyAwareAllocatableResourcesResponse
   600  		wantErr bool
   601  	}{
   602  		{
   603  			name: "get topology-aware allocatable resources",
   604  			fields: fields{
   605  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   606  				stopCh:     make(chan struct{}),
   607  				started:    true,
   608  				emitter:    metrics.DummyMetrics{},
   609  				metaServer: makeMetaServer(),
   610  				agentCtx:   makeTestGenericContext(t),
   611  			},
   612  			args: args{
   613  				in0: context.Background(),
   614  				in1: &pluginapi.GetTopologyAwareAllocatableResourcesRequest{},
   615  			},
   616  			want:    &pluginapi.GetTopologyAwareAllocatableResourcesResponse{},
   617  			wantErr: false,
   618  		},
   619  	}
   620  	for _, tt := range tests {
   621  		tt := tt
   622  		t.Run(tt.name, func(t *testing.T) {
   623  			t.Parallel()
   624  
   625  			p := &StaticPolicy{
   626  				name:       tt.fields.name,
   627  				stopCh:     tt.fields.stopCh,
   628  				started:    tt.fields.started,
   629  				emitter:    tt.fields.emitter,
   630  				metaServer: tt.fields.metaServer,
   631  				agentCtx:   tt.fields.agentCtx,
   632  			}
   633  			got, err := p.GetTopologyAwareAllocatableResources(tt.args.in0, tt.args.in1)
   634  			if (err != nil) != tt.wantErr {
   635  				t.Errorf("StaticPolicy.GetTopologyAwareAllocatableResources() error = %v, wantErr %v", err, tt.wantErr)
   636  				return
   637  			}
   638  			if !reflect.DeepEqual(got, tt.want) {
   639  				t.Errorf("StaticPolicy.GetTopologyAwareAllocatableResources() = %v, want %v", got, tt.want)
   640  			}
   641  		})
   642  	}
   643  }
   644  
   645  func TestStaticPolicy_GetResourcePluginOptions(t *testing.T) {
   646  	t.Parallel()
   647  
   648  	type fields struct {
   649  		name       string
   650  		stopCh     chan struct{}
   651  		started    bool
   652  		emitter    metrics.MetricEmitter
   653  		metaServer *metaserver.MetaServer
   654  		agentCtx   *agent.GenericContext
   655  	}
   656  	type args struct {
   657  		in0 context.Context
   658  		in1 *pluginapi.Empty
   659  	}
   660  	tests := []struct {
   661  		name    string
   662  		fields  fields
   663  		args    args
   664  		want    *pluginapi.ResourcePluginOptions
   665  		wantErr bool
   666  	}{
   667  		{
   668  			name: "test get resource plugin options",
   669  			fields: fields{
   670  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   671  				stopCh:     make(chan struct{}),
   672  				started:    true,
   673  				emitter:    metrics.DummyMetrics{},
   674  				metaServer: makeMetaServer(),
   675  				agentCtx:   makeTestGenericContext(t),
   676  			},
   677  			args: args{
   678  				in0: context.Background(),
   679  				in1: &pluginapi.Empty{},
   680  			},
   681  			want: &pluginapi.ResourcePluginOptions{
   682  				PreStartRequired:      false,
   683  				WithTopologyAlignment: false,
   684  				NeedReconcile:         false,
   685  			},
   686  			wantErr: false,
   687  		},
   688  	}
   689  	for _, tt := range tests {
   690  		tt := tt
   691  		t.Run(tt.name, func(t *testing.T) {
   692  			t.Parallel()
   693  
   694  			p := &StaticPolicy{
   695  				name:       tt.fields.name,
   696  				stopCh:     tt.fields.stopCh,
   697  				started:    tt.fields.started,
   698  				emitter:    tt.fields.emitter,
   699  				metaServer: tt.fields.metaServer,
   700  				agentCtx:   tt.fields.agentCtx,
   701  			}
   702  			got, err := p.GetResourcePluginOptions(tt.args.in0, tt.args.in1)
   703  			if (err != nil) != tt.wantErr {
   704  				t.Errorf("StaticPolicy.GetResourcePluginOptions() error = %v, wantErr %v", err, tt.wantErr)
   705  				return
   706  			}
   707  			if !reflect.DeepEqual(got, tt.want) {
   708  				t.Errorf("StaticPolicy.GetResourcePluginOptions() = %v, want %v", got, tt.want)
   709  			}
   710  		})
   711  	}
   712  }
   713  
   714  func TestStaticPolicy_Allocate(t *testing.T) {
   715  	t.Parallel()
   716  
   717  	type fields struct {
   718  		name       string
   719  		stopCh     chan struct{}
   720  		started    bool
   721  		emitter    metrics.MetricEmitter
   722  		metaServer *metaserver.MetaServer
   723  		agentCtx   *agent.GenericContext
   724  	}
   725  	type args struct {
   726  		in0 context.Context
   727  		req *pluginapi.ResourceRequest
   728  	}
   729  	tests := []struct {
   730  		name     string
   731  		fields   fields
   732  		args     args
   733  		wantResp *pluginapi.ResourceAllocationResponse
   734  		wantErr  bool
   735  	}{
   736  		{
   737  			name: "test allocate",
   738  			fields: fields{
   739  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   740  				stopCh:     make(chan struct{}),
   741  				started:    true,
   742  				emitter:    metrics.DummyMetrics{},
   743  				metaServer: makeMetaServer(),
   744  				agentCtx:   makeTestGenericContext(t),
   745  			},
   746  			args: args{
   747  				in0: context.Background(),
   748  				req: &pluginapi.ResourceRequest{
   749  					PodNamespace:  "test",
   750  					PodName:       "test",
   751  					ContainerName: "test",
   752  				},
   753  			},
   754  			wantResp: &pluginapi.ResourceAllocationResponse{
   755  				PodNamespace:  "test",
   756  				PodName:       "test",
   757  				ContainerName: "test",
   758  			},
   759  			wantErr: false,
   760  		},
   761  	}
   762  	for _, tt := range tests {
   763  		tt := tt
   764  		t.Run(tt.name, func(t *testing.T) {
   765  			t.Parallel()
   766  
   767  			p := &StaticPolicy{
   768  				name:       tt.fields.name,
   769  				stopCh:     tt.fields.stopCh,
   770  				started:    tt.fields.started,
   771  				emitter:    tt.fields.emitter,
   772  				metaServer: tt.fields.metaServer,
   773  				agentCtx:   tt.fields.agentCtx,
   774  			}
   775  			gotResp, err := p.Allocate(tt.args.in0, tt.args.req)
   776  			if (err != nil) != tt.wantErr {
   777  				t.Errorf("StaticPolicy.Allocate() error = %v, wantErr %v", err, tt.wantErr)
   778  				return
   779  			}
   780  			if !reflect.DeepEqual(gotResp, tt.wantResp) {
   781  				t.Errorf("StaticPolicy.Allocate() = %v, want %v", gotResp, tt.wantResp)
   782  			}
   783  		})
   784  	}
   785  }
   786  
   787  func TestStaticPolicy_PreStartContainer(t *testing.T) {
   788  	t.Parallel()
   789  
   790  	type fields struct {
   791  		name       string
   792  		stopCh     chan struct{}
   793  		started    bool
   794  		emitter    metrics.MetricEmitter
   795  		metaServer *metaserver.MetaServer
   796  		agentCtx   *agent.GenericContext
   797  	}
   798  	type args struct {
   799  		in0 context.Context
   800  		in1 *pluginapi.PreStartContainerRequest
   801  	}
   802  	tests := []struct {
   803  		name    string
   804  		fields  fields
   805  		args    args
   806  		want    *pluginapi.PreStartContainerResponse
   807  		wantErr bool
   808  	}{
   809  		{
   810  			name: "test pre-start container",
   811  			fields: fields{
   812  				name:       fmt.Sprintf("%s_%s", qrm.QRMPluginNameIO, IOResourcePluginPolicyNameStatic),
   813  				stopCh:     make(chan struct{}),
   814  				started:    true,
   815  				emitter:    metrics.DummyMetrics{},
   816  				metaServer: makeMetaServer(),
   817  				agentCtx:   makeTestGenericContext(t),
   818  			},
   819  			args: args{
   820  				in0: context.Background(),
   821  				in1: &pluginapi.PreStartContainerRequest{},
   822  			},
   823  			want:    &pluginapi.PreStartContainerResponse{},
   824  			wantErr: false,
   825  		},
   826  	}
   827  	for _, tt := range tests {
   828  		tt := tt
   829  		t.Run(tt.name, func(t *testing.T) {
   830  			t.Parallel()
   831  
   832  			p := &StaticPolicy{
   833  				name:       tt.fields.name,
   834  				stopCh:     tt.fields.stopCh,
   835  				started:    tt.fields.started,
   836  				emitter:    tt.fields.emitter,
   837  				metaServer: tt.fields.metaServer,
   838  				agentCtx:   tt.fields.agentCtx,
   839  			}
   840  			got, err := p.PreStartContainer(tt.args.in0, tt.args.in1)
   841  			if (err != nil) != tt.wantErr {
   842  				t.Errorf("StaticPolicy.PreStartContainer() error = %v, wantErr %v", err, tt.wantErr)
   843  				return
   844  			}
   845  			if !reflect.DeepEqual(got, tt.want) {
   846  				t.Errorf("StaticPolicy.PreStartContainer() = %v, want %v", got, tt.want)
   847  			}
   848  		})
   849  	}
   850  }