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..bce1da4bb22 --- /dev/null +++ b/pkg/scheduler/framework/autoscaler_contract/framework_contract_test.go @@ -0,0 +1,56 @@ +/* +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) { + var f interface{} + if f, _ = runtime.NewFramework(nil, nil, nil); f != nil { + _, ok := f.(framework.Framework) + assert.True(t, ok) + } +} + +func TestNewCycleState(t *testing.T) { + var state interface{} = framework.NewCycleState() + _, ok := state.(*framework.CycleState) + 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 new file mode 100644 index 00000000000..28fa206b508 --- /dev/null +++ b/pkg/scheduler/framework/autoscaler_contract/lister_contract_test.go @@ -0,0 +1,63 @@ +/* +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 +}