Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
636e982e
Commit
636e982e
authored
Feb 23, 2016
by
Harry Zhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement checking in predicates
parent
b90550de
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
98 additions
and
14 deletions
+98
-14
codeinspector.go
pkg/util/codeinspector/codeinspector.go
+23
-3
predicates.go
plugin/pkg/scheduler/algorithm/predicates/predicates.go
+4
-4
predicates_test.go
plugin/pkg/scheduler/algorithm/predicates/predicates_test.go
+47
-0
priorities_test.go
plugin/pkg/scheduler/algorithm/priorities/priorities_test.go
+24
-7
No files found.
pkg/util/codeinspector/codeinspector.go
View file @
636e982e
...
@@ -21,11 +21,13 @@ import (
...
@@ -21,11 +21,13 @@ import (
"go/ast"
"go/ast"
"go/parser"
"go/parser"
"go/token"
"go/token"
"io/ioutil"
"strings"
"unicode"
"unicode"
)
)
// Get all public functions (not methods) from a golang source file.
// Get
PublicFunctions lists
all public functions (not methods) from a golang source file.
func
GetPulicFunctions
(
filePath
string
)
([]
string
,
error
)
{
func
GetPu
b
licFunctions
(
filePath
string
)
([]
string
,
error
)
{
var
functionNames
[]
string
var
functionNames
[]
string
// Create the AST by parsing src.
// Create the AST by parsing src.
...
@@ -52,9 +54,27 @@ func GetPulicFunctions(filePath string) ([]string, error) {
...
@@ -52,9 +54,27 @@ func GetPulicFunctions(filePath string) ([]string, error) {
return
functionNames
,
nil
return
functionNames
,
nil
}
}
//
Check
if a given string is a public function name.
//
isPublic checks
if a given string is a public function name.
func
isPublic
(
myString
string
)
bool
{
func
isPublic
(
myString
string
)
bool
{
a
:=
[]
rune
(
myString
)
a
:=
[]
rune
(
myString
)
a
[
0
]
=
unicode
.
ToUpper
(
a
[
0
])
a
[
0
]
=
unicode
.
ToUpper
(
a
[
0
])
return
myString
==
string
(
a
)
return
myString
==
string
(
a
)
}
}
// GetSourceCodeFiles lists golang source code files from directory, excluding sub-directory and tests files.
func
GetSourceCodeFiles
(
dir
string
)
([]
string
,
error
)
{
files
,
err
:=
ioutil
.
ReadDir
(
dir
)
if
err
!=
nil
{
return
nil
,
err
}
var
filenames
[]
string
for
_
,
file
:=
range
files
{
if
strings
.
HasSuffix
(
file
.
Name
(),
".go"
)
&&
!
strings
.
HasSuffix
(
file
.
Name
(),
"_test.go"
)
{
filenames
=
append
(
filenames
,
file
.
Name
())
}
}
return
filenames
,
nil
}
plugin/pkg/scheduler/algorithm/predicates/predicates.go
View file @
636e982e
...
@@ -469,9 +469,9 @@ func NewSelectorMatchPredicate(info NodeInfo) algorithm.FitPredicate {
...
@@ -469,9 +469,9 @@ func NewSelectorMatchPredicate(info NodeInfo) algorithm.FitPredicate {
return
selector
.
PodSelectorMatches
return
selector
.
PodSelectorMatches
}
}
//
N
odeMatchesNodeSelectorTerms checks if a node's labels satisfy a list of node selector terms,
//
n
odeMatchesNodeSelectorTerms checks if a node's labels satisfy a list of node selector terms,
// terms are ORed, and an emtpy a list of terms will match nothing.
// terms are ORed, and an emtpy a list of terms will match nothing.
func
N
odeMatchesNodeSelectorTerms
(
node
*
api
.
Node
,
nodeSelectorTerms
[]
api
.
NodeSelectorTerm
)
bool
{
func
n
odeMatchesNodeSelectorTerms
(
node
*
api
.
Node
,
nodeSelectorTerms
[]
api
.
NodeSelectorTerm
)
bool
{
for
_
,
req
:=
range
nodeSelectorTerms
{
for
_
,
req
:=
range
nodeSelectorTerms
{
nodeSelector
,
err
:=
api
.
NodeSelectorRequirementsAsSelector
(
req
.
MatchExpressions
)
nodeSelector
,
err
:=
api
.
NodeSelectorRequirementsAsSelector
(
req
.
MatchExpressions
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -524,14 +524,14 @@ func PodMatchesNodeLabels(pod *api.Pod, node *api.Node) bool {
...
@@ -524,14 +524,14 @@ func PodMatchesNodeLabels(pod *api.Pod, node *api.Node) bool {
// if nodeAffinity.RequiredDuringSchedulingRequiredDuringExecution != nil {
// if nodeAffinity.RequiredDuringSchedulingRequiredDuringExecution != nil {
// nodeSelectorTerms := nodeAffinity.RequiredDuringSchedulingRequiredDuringExecution.NodeSelectorTerms
// nodeSelectorTerms := nodeAffinity.RequiredDuringSchedulingRequiredDuringExecution.NodeSelectorTerms
// glog.V(10).Infof("Match for RequiredDuringSchedulingRequiredDuringExecution node selector terms %+v", nodeSelectorTerms)
// glog.V(10).Infof("Match for RequiredDuringSchedulingRequiredDuringExecution node selector terms %+v", nodeSelectorTerms)
// nodeAffinityMatches =
N
odeMatchesNodeSelectorTerms(node, nodeSelectorTerms)
// nodeAffinityMatches =
n
odeMatchesNodeSelectorTerms(node, nodeSelectorTerms)
// }
// }
// Match node selector for requiredDuringSchedulingIgnoredDuringExecution.
// Match node selector for requiredDuringSchedulingIgnoredDuringExecution.
if
nodeAffinity
.
RequiredDuringSchedulingIgnoredDuringExecution
!=
nil
{
if
nodeAffinity
.
RequiredDuringSchedulingIgnoredDuringExecution
!=
nil
{
nodeSelectorTerms
:=
nodeAffinity
.
RequiredDuringSchedulingIgnoredDuringExecution
.
NodeSelectorTerms
nodeSelectorTerms
:=
nodeAffinity
.
RequiredDuringSchedulingIgnoredDuringExecution
.
NodeSelectorTerms
glog
.
V
(
10
)
.
Infof
(
"Match for RequiredDuringSchedulingIgnoredDuringExecution node selector terms %+v"
,
nodeSelectorTerms
)
glog
.
V
(
10
)
.
Infof
(
"Match for RequiredDuringSchedulingIgnoredDuringExecution node selector terms %+v"
,
nodeSelectorTerms
)
nodeAffinityMatches
=
nodeAffinityMatches
&&
N
odeMatchesNodeSelectorTerms
(
node
,
nodeSelectorTerms
)
nodeAffinityMatches
=
nodeAffinityMatches
&&
n
odeMatchesNodeSelectorTerms
(
node
,
nodeSelectorTerms
)
}
}
}
}
...
...
plugin/pkg/scheduler/algorithm/predicates/predicates_test.go
View file @
636e982e
...
@@ -18,11 +18,13 @@ package predicates
...
@@ -18,11 +18,13 @@ package predicates
import
(
import
(
"fmt"
"fmt"
"os/exec"
"reflect"
"reflect"
"testing"
"testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/util/codeinspector"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm"
"k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache"
"k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache"
)
)
...
@@ -1408,3 +1410,48 @@ func TestEBSVolumeCountConflicts(t *testing.T) {
...
@@ -1408,3 +1410,48 @@ func TestEBSVolumeCountConflicts(t *testing.T) {
}
}
}
}
}
}
func
TestPredicatesRegistered
(
t
*
testing
.
T
)
{
var
functionNames
[]
string
// Files and directories which predicates may be referenced
targetFiles
:=
[]
string
{
"./../../algorithmprovider/defaults/defaults.go"
,
// Default algorithm
"./../../factory/plugins.go"
,
// Registered in init()
"./../../../../../pkg/"
,
// kubernetes/pkg, often used by kubelet or controller
}
// List all golang source files under ./predicates/, excluding test files and sub-directories.
files
,
err
:=
codeinspector
.
GetSourceCodeFiles
(
"."
)
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v when listing files in current directory"
,
err
)
}
// Get all public predicates in files.
for
_
,
filePath
:=
range
files
{
functions
,
err
:=
codeinspector
.
GetPublicFunctions
(
filePath
)
if
err
==
nil
{
functionNames
=
append
(
functionNames
,
functions
...
)
}
else
{
t
.
Errorf
(
"unexpected error when parsing %s"
,
filePath
)
}
}
// Check if all public predicates are referenced in target files.
for
_
,
functionName
:=
range
functionNames
{
args
:=
[]
string
{
"-rl"
,
functionName
}
args
=
append
(
args
,
targetFiles
...
)
err
:=
exec
.
Command
(
"grep"
,
args
...
)
.
Run
()
if
err
!=
nil
{
switch
err
.
Error
()
{
case
"exit status 2"
:
t
.
Errorf
(
"unexpected error when checking %s"
,
functionName
)
case
"exit status 1"
:
t
.
Errorf
(
"predicate %s is implemented as public but seems not registered or used in any other place"
,
functionName
)
}
}
}
}
plugin/pkg/scheduler/algorithm/priorities/priorities_test.go
View file @
636e982e
...
@@ -887,13 +887,25 @@ func makeImageNode(node string, status api.NodeStatus) api.Node {
...
@@ -887,13 +887,25 @@ func makeImageNode(node string, status api.NodeStatus) api.Node {
}
}
}
}
func
TestPriorit
y
Registered
(
t
*
testing
.
T
)
{
func
TestPriorit
ies
Registered
(
t
*
testing
.
T
)
{
var
functionNames
[]
string
var
functionNames
[]
string
files
:=
[]
string
{
"priorities.go"
,
"node_affinity.go"
,
"selector_spreading.go"
}
// Files and directories which priorities may be referenced
targetFiles
:=
[]
string
{
"./../../algorithmprovider/defaults/defaults.go"
,
// Default algorithm
"./../../factory/plugins.go"
,
// Registered in init()
}
// List all golang source files under ./priorities/, excluding test files and sub-directories.
files
,
err
:=
codeinspector
.
GetSourceCodeFiles
(
"."
)
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v when listing files in current directory"
,
err
)
}
// Get all public priorities in files.
for
_
,
filePath
:=
range
files
{
for
_
,
filePath
:=
range
files
{
functions
,
err
:=
codeinspector
.
GetPulicFunctions
(
filePath
)
functions
,
err
:=
codeinspector
.
GetPu
b
licFunctions
(
filePath
)
if
err
==
nil
{
if
err
==
nil
{
functionNames
=
append
(
functionNames
,
functions
...
)
functionNames
=
append
(
functionNames
,
functions
...
)
}
else
{
}
else
{
...
@@ -901,14 +913,19 @@ func TestPriorityRegistered(t *testing.T) {
...
@@ -901,14 +913,19 @@ func TestPriorityRegistered(t *testing.T) {
}
}
}
}
for
_
,
funcionName
:=
range
functionNames
{
// Check if all public priorities are referenced in target files.
err
:=
exec
.
Command
(
"grep"
,
"-rl"
,
funcionName
,
"./../../algorithmprovider/defaults/defaults.go"
,
"./../../factory/plugins.go"
)
.
Run
()
for
_
,
functionName
:=
range
functionNames
{
args
:=
[]
string
{
"-rl"
,
functionName
}
args
=
append
(
args
,
targetFiles
...
)
err
:=
exec
.
Command
(
"grep"
,
args
...
)
.
Run
()
if
err
!=
nil
{
if
err
!=
nil
{
switch
err
.
Error
()
{
switch
err
.
Error
()
{
case
"exit status 2"
:
case
"exit status 2"
:
t
.
Errorf
(
"unexpected error when checking %s"
,
funcionName
)
t
.
Errorf
(
"unexpected error when checking %s"
,
func
t
ionName
)
case
"exit status 1"
:
case
"exit status 1"
:
t
.
Errorf
(
"priority %s is implemented but seems not registered in any place"
,
funcionName
)
t
.
Errorf
(
"priority %s is implemented as public but seems not registered or used in any other place"
,
functionName
)
}
}
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment