From c8360913eefc5789f4867bbc40ae90fda89e861e Mon Sep 17 00:00:00 2001 From: kerthcet Date: Tue, 19 Jul 2022 18:16:56 +0800 Subject: [PATCH 1/2] Feat: add framework interface detector tests Signed-off-by: kerthcet --- .../framework/autoscaler_contract/OWNERS | 7 ++ .../framework_contract_test.go | 57 +++++++++++++++++ .../lister_contract_test.go | 64 +++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 pkg/scheduler/framework/autoscaler_contract/OWNERS create mode 100644 pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go create mode 100644 pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go diff --git a/pkg/scheduler/framework/autoscaler_contract/OWNERS b/pkg/scheduler/framework/autoscaler_contract/OWNERS new file mode 100644 index 00000000000..8cee6ce90e2 --- /dev/null +++ b/pkg/scheduler/framework/autoscaler_contract/OWNERS @@ -0,0 +1,7 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: + - sig-scheduling-maintainers +reviewers: + - sig-autoscaling-maintainers + - x13n diff --git a/pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go b/pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go new file mode 100644 index 00000000000..099a2e5476f --- /dev/null +++ b/pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go @@ -0,0 +1,57 @@ +/* +Copyright 2022 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// This file helps to detect whether we changed the interface of Framework. +// This is important for projects under `github.com/kubernetes*` orgs +// who import the Framework to not breaking their codes, e.g. cluster-autoscaler. + +package contract + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + v1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/pkg/scheduler/framework" + "k8s.io/kubernetes/pkg/scheduler/framework/runtime" +) + +type frameworkContract interface { + RunPreFilterPlugins(ctx context.Context, state *framework.CycleState, pod *v1.Pod) (*framework.PreFilterResult, *framework.Status) + RunFilterPlugins(context.Context, *framework.CycleState, *v1.Pod, *framework.NodeInfo) framework.PluginToStatus +} + +func TestFrameworkContract(t *testing.T) { + var f framework.Framework + var c frameworkContract = f + assert.Nil(t, c) +} + +func TestNewFramework(t *testing.T) { + stopCh := make(<-chan struct{}) + var f interface{} + if f, _ = runtime.NewFramework(nil, nil, stopCh); f != nil { + _, ok := f.(framework.Framework) + assert.Equal(t, true, ok) + } +} + +func TestNewCycleState(t *testing.T) { + var state interface{} = framework.NewCycleState() + _, ok := state.(*framework.CycleState) + assert.Equal(t, true, ok) +} diff --git a/pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go b/pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go new file mode 100644 index 00000000000..167bc2919c6 --- /dev/null +++ b/pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go @@ -0,0 +1,64 @@ +/* +Copyright 2022 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// This file helps to detect whether we changed the interface of Listers. +// This is important for downstream projects who import the Listers to not +// breaking their codes. + +package contract + +import ( + "k8s.io/kubernetes/pkg/scheduler/framework" +) + +var _ framework.NodeInfoLister = &nodeInfoListerContract{} +var _ framework.StorageInfoLister = &storageInfoListerContract{} +var _ framework.SharedLister = &shareListerContract{} + +type nodeInfoListerContract struct { +} + +func (c *nodeInfoListerContract) List() ([]*framework.NodeInfo, error) { + return nil, nil +} + +func (c *nodeInfoListerContract) HavePodsWithAffinityList() ([]*framework.NodeInfo, error) { + return nil, nil +} + +func (c *nodeInfoListerContract) HavePodsWithRequiredAntiAffinityList() ([]*framework.NodeInfo, error) { + return nil, nil +} + +func (c *nodeInfoListerContract) Get(_ string) (*framework.NodeInfo, error) { + return nil, nil +} + +type storageInfoListerContract struct{} + +func (c *storageInfoListerContract) IsPVCUsedByPods(_ string) bool { + return false +} + +type shareListerContract struct{} + +func (c *shareListerContract) NodeInfos() framework.NodeInfoLister { + return nil +} + +func (c *shareListerContract) StorageInfos() framework.StorageInfoLister { + return nil +} From a86bffedcfc1908098a3f07467682944db4a8269 Mon Sep 17 00:00:00 2001 From: kerthcet Date: Wed, 20 Jul 2022 10:30:08 +0800 Subject: [PATCH 2/2] address comments Signed-off-by: kerthcet --- .../autoscaler_contract/framework_contract_test.go | 7 +++---- .../framework/autoscaler_contract/lister_contract_test.go | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go b/pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go index 099a2e5476f..bce1da4bb22 100644 --- a/pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go +++ b/pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go @@ -42,16 +42,15 @@ func TestFrameworkContract(t *testing.T) { } func TestNewFramework(t *testing.T) { - stopCh := make(<-chan struct{}) var f interface{} - if f, _ = runtime.NewFramework(nil, nil, stopCh); f != nil { + if f, _ = runtime.NewFramework(nil, nil, nil); f != nil { _, ok := f.(framework.Framework) - assert.Equal(t, true, ok) + assert.True(t, ok) } } func TestNewCycleState(t *testing.T) { var state interface{} = framework.NewCycleState() _, ok := state.(*framework.CycleState) - assert.Equal(t, true, ok) + assert.True(t, ok) } diff --git a/pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go b/pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go index 167bc2919c6..28fa206b508 100644 --- a/pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go +++ b/pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go @@ -28,8 +28,7 @@ var _ framework.NodeInfoLister = &nodeInfoListerContract{} var _ framework.StorageInfoLister = &storageInfoListerContract{} var _ framework.SharedLister = &shareListerContract{} -type nodeInfoListerContract struct { -} +type nodeInfoListerContract struct{} func (c *nodeInfoListerContract) List() ([]*framework.NodeInfo, error) { return nil, nil