Implement check for priority

pull/6/head
harry 2016-02-22 15:30:31 +08:00 committed by Harry Zhang
parent f4de3ea676
commit b90550de25
2 changed files with 89 additions and 0 deletions

View File

@ -0,0 +1,60 @@
/*
Copyright 2016 The Kubernetes Authors All rights reserved.
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.
*/
package codeinspector
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
"unicode"
)
// Get all public functions (not methods) from a golang source file.
func GetPulicFunctions(filePath string) ([]string, error) {
var functionNames []string
// Create the AST by parsing src.
fset := token.NewFileSet() // positions are relative to fset
f, err := parser.ParseFile(fset, filePath, nil, 0)
if err != nil {
return nil, fmt.Errorf("failed parse file to list functions: %v", err)
}
// Inspect the AST and print all identifiers and literals.
ast.Inspect(f, func(n ast.Node) bool {
var s string
switch x := n.(type) {
case *ast.FuncDecl:
s = x.Name.Name
// It's a function (not method), and is public, record it.
if x.Recv == nil && isPublic(s) {
functionNames = append(functionNames, s)
}
}
return true
})
return functionNames, nil
}
// Check if a given string is a public function name.
func isPublic(myString string) bool {
a := []rune(myString)
a[0] = unicode.ToUpper(a[0])
return myString == string(a)
}

View File

@ -17,6 +17,7 @@ limitations under the License.
package priorities
import (
"os/exec"
"reflect"
"sort"
"strconv"
@ -25,6 +26,7 @@ import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/util/codeinspector"
"k8s.io/kubernetes/plugin/pkg/scheduler"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
priorityutil "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/priorities/util"
@ -884,3 +886,30 @@ func makeImageNode(node string, status api.NodeStatus) api.Node {
Status: status,
}
}
func TestPriorityRegistered(t *testing.T) {
var functionNames []string
files := []string{"priorities.go", "node_affinity.go", "selector_spreading.go"}
for _, filePath := range files {
functions, err := codeinspector.GetPulicFunctions(filePath)
if err == nil {
functionNames = append(functionNames, functions...)
} else {
t.Errorf("unexpected error when parsing %s", filePath)
}
}
for _, funcionName := range functionNames {
err := exec.Command("grep", "-rl", funcionName, "./../../algorithmprovider/defaults/defaults.go", "./../../factory/plugins.go").Run()
if err != nil {
switch err.Error() {
case "exit status 2":
t.Errorf("unexpected error when checking %s", funcionName)
case "exit status 1":
t.Errorf("priority %s is implemented but seems not registered in any place", funcionName)
}
}
}
}