From eff568e4966d2250fe10a8c8c546f04a42c569ab Mon Sep 17 00:00:00 2001 From: nolancon Date: Thu, 31 Jan 2019 11:52:05 +0000 Subject: [PATCH 1/5] Add Policies Strict and Preferred for Topology Manager --- .../cm/topologymanager/policy_preferred.go | 43 ++++++++++++++++ .../cm/topologymanager/policy_strict.go | 51 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 pkg/kubelet/cm/topologymanager/policy_preferred.go create mode 100644 pkg/kubelet/cm/topologymanager/policy_strict.go diff --git a/pkg/kubelet/cm/topologymanager/policy_preferred.go b/pkg/kubelet/cm/topologymanager/policy_preferred.go new file mode 100644 index 0000000000..6db6fb5641 --- /dev/null +++ b/pkg/kubelet/cm/topologymanager/policy_preferred.go @@ -0,0 +1,43 @@ +/* +Copyright 2015 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. +*/ + +package topologymanager + +import ( + "k8s.io/kubernetes/pkg/kubelet/lifecycle" +) + +type preferredPolicy struct{} + +var _ Policy = &preferredPolicy{} + +// PolicyPreferred policy name. +const PolicyPreferred policyName = "preferred" + +// NewPreferredPolicy returns preferred policy. +func NewPreferredPolicy() Policy { + return &preferredPolicy{} +} + +func (p *preferredPolicy) Name() string { + return string(PolicyPreferred) +} + +func (p *preferredPolicy) CanAdmitPodResult(result TopologyHints) lifecycle.PodAdmitResult { + return lifecycle.PodAdmitResult{ + Admit: true, + } +} diff --git a/pkg/kubelet/cm/topologymanager/policy_strict.go b/pkg/kubelet/cm/topologymanager/policy_strict.go new file mode 100644 index 0000000000..9e3cc6a51e --- /dev/null +++ b/pkg/kubelet/cm/topologymanager/policy_strict.go @@ -0,0 +1,51 @@ +/* +Copyright 2015 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. +*/ + +package topologymanager + +import ( + "k8s.io/kubernetes/pkg/kubelet/lifecycle" +) + +type strictPolicy struct{} + +var _ Policy = &strictPolicy{} + +// PolicyStrict policy name. +const PolicyStrict policyName = "strict" + +// NewStrictPolicy returns strict policy. +func NewStrictPolicy() Policy { + return &strictPolicy{} +} + +func (p *strictPolicy) Name() string { + return string(PolicyStrict) +} + +func (p *strictPolicy) CanAdmitPodResult(result TopologyHints) lifecycle.PodAdmitResult { + affinity := result.Affinity + if !affinity { + return lifecycle.PodAdmitResult{ + Admit: false, + Reason: "Topology Affinity Error", + Message: "Resources cannot be allocated with Topology Locality", + } + } + return lifecycle.PodAdmitResult{ + Admit: true, + } +} From 4e503597b88ddd49cd522b7e87cb098640020a6d Mon Sep 17 00:00:00 2001 From: Sreemanti Ghosh Date: Thu, 28 Feb 2019 17:10:43 +0000 Subject: [PATCH 2/5] Unit test for Topology Manager policy_strict and policy_preferred --- .../topologymanager/policy_preferred_test.go | 52 ++++++++++++++++ .../cm/topologymanager/policy_strict_test.go | 61 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 pkg/kubelet/cm/topologymanager/policy_preferred_test.go create mode 100644 pkg/kubelet/cm/topologymanager/policy_strict_test.go diff --git a/pkg/kubelet/cm/topologymanager/policy_preferred_test.go b/pkg/kubelet/cm/topologymanager/policy_preferred_test.go new file mode 100644 index 0000000000..0cb0f220e0 --- /dev/null +++ b/pkg/kubelet/cm/topologymanager/policy_preferred_test.go @@ -0,0 +1,52 @@ +/* +Copyright 2019 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. +*/ + +package topologymanager + +import ( + "testing" +) + +func TestCanAdmitPodResult1(t *testing.T) { + tcases := []struct { + name string + affinity bool + expected bool + }{ + { + name: "Affinity is set to false in topology hints", + affinity: false, + expected: true, + }, + { + name: "Affinity is set to true in topology hints", + affinity: true, + expected: true, + }, + } + + for _, tc := range tcases { + policy := NewPreferredPolicy() + hints := TopologyHints{ + Affinity: tc.affinity, + } + result := policy.CanAdmitPodResult(hints) + + if result.Admit != tc.expected { + t.Errorf("Expected Admit field in result to be %t, got %t", tc.expected, result.Admit) + } + } +} diff --git a/pkg/kubelet/cm/topologymanager/policy_strict_test.go b/pkg/kubelet/cm/topologymanager/policy_strict_test.go new file mode 100644 index 0000000000..227f342dc4 --- /dev/null +++ b/pkg/kubelet/cm/topologymanager/policy_strict_test.go @@ -0,0 +1,61 @@ +/* +Copyright 2019 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. +*/ + +package topologymanager + +import ( + "testing" +) + +func TestCanAdmitPodResult(t *testing.T) { + tcases := []struct { + name string + affinity bool + expected bool + }{ + { + name: "Affinity is set to false in topology hints", + affinity: false, + expected: false, + }, + { + name: "Affinity is set to true in topology hints", + affinity: true, + expected: true, + }, + } + + for _, tc := range tcases { + policy := NewStrictPolicy() + hints := TopologyHints{ + Affinity: tc.affinity, + } + result := policy.CanAdmitPodResult(hints) + + if result.Admit != tc.expected { + t.Errorf("Expected Admit field in result to be %t, got %t", tc.expected, result.Admit) + } + + if tc.expected == false { + if len(result.Reason) == 0 { + t.Errorf("Expected Reason field to be not empty") + } + if len(result.Message) == 0 { + t.Errorf("Expected Message field to be not empty") + } + } + } +} From e82fa41fb2c91ec285bd1324aaa76f386c1ce36b Mon Sep 17 00:00:00 2001 From: nolancon Date: Wed, 8 May 2019 08:45:42 +0100 Subject: [PATCH 3/5] More Intuitive TopologyHints - topology manager policies --- pkg/kubelet/cm/topologymanager/policy_preferred.go | 2 +- pkg/kubelet/cm/topologymanager/policy_strict.go | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pkg/kubelet/cm/topologymanager/policy_preferred.go b/pkg/kubelet/cm/topologymanager/policy_preferred.go index 6db6fb5641..04b2588b62 100644 --- a/pkg/kubelet/cm/topologymanager/policy_preferred.go +++ b/pkg/kubelet/cm/topologymanager/policy_preferred.go @@ -36,7 +36,7 @@ func (p *preferredPolicy) Name() string { return string(PolicyPreferred) } -func (p *preferredPolicy) CanAdmitPodResult(result TopologyHints) lifecycle.PodAdmitResult { +func (p *preferredPolicy) CanAdmitPodResult(admit bool) lifecycle.PodAdmitResult { return lifecycle.PodAdmitResult{ Admit: true, } diff --git a/pkg/kubelet/cm/topologymanager/policy_strict.go b/pkg/kubelet/cm/topologymanager/policy_strict.go index 9e3cc6a51e..1484988500 100644 --- a/pkg/kubelet/cm/topologymanager/policy_strict.go +++ b/pkg/kubelet/cm/topologymanager/policy_strict.go @@ -36,9 +36,8 @@ func (p *strictPolicy) Name() string { return string(PolicyStrict) } -func (p *strictPolicy) CanAdmitPodResult(result TopologyHints) lifecycle.PodAdmitResult { - affinity := result.Affinity - if !affinity { +func (p *strictPolicy) CanAdmitPodResult(admit bool) lifecycle.PodAdmitResult { + if !admit { return lifecycle.PodAdmitResult{ Admit: false, Reason: "Topology Affinity Error", From ef9baf313db02e2d71445c827702e9e03d7a6e3c Mon Sep 17 00:00:00 2001 From: nolancon Date: Mon, 13 May 2019 04:23:22 +0100 Subject: [PATCH 4/5] Update unit tests for TopologyHints - Topology Manager Policies --- .../cm/topologymanager/policy_preferred_test.go | 12 +++++------- pkg/kubelet/cm/topologymanager/policy_strict_test.go | 12 +++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/pkg/kubelet/cm/topologymanager/policy_preferred_test.go b/pkg/kubelet/cm/topologymanager/policy_preferred_test.go index 0cb0f220e0..04fb436cc5 100644 --- a/pkg/kubelet/cm/topologymanager/policy_preferred_test.go +++ b/pkg/kubelet/cm/topologymanager/policy_preferred_test.go @@ -23,27 +23,25 @@ import ( func TestCanAdmitPodResult1(t *testing.T) { tcases := []struct { name string - affinity bool + admit bool expected bool }{ { name: "Affinity is set to false in topology hints", - affinity: false, + admit: false, expected: true, }, { name: "Affinity is set to true in topology hints", - affinity: true, + admit: true, expected: true, }, } for _, tc := range tcases { policy := NewPreferredPolicy() - hints := TopologyHints{ - Affinity: tc.affinity, - } - result := policy.CanAdmitPodResult(hints) + admit := tc.admit + result := policy.CanAdmitPodResult(admit) if result.Admit != tc.expected { t.Errorf("Expected Admit field in result to be %t, got %t", tc.expected, result.Admit) diff --git a/pkg/kubelet/cm/topologymanager/policy_strict_test.go b/pkg/kubelet/cm/topologymanager/policy_strict_test.go index 227f342dc4..63ddd43ca1 100644 --- a/pkg/kubelet/cm/topologymanager/policy_strict_test.go +++ b/pkg/kubelet/cm/topologymanager/policy_strict_test.go @@ -23,27 +23,25 @@ import ( func TestCanAdmitPodResult(t *testing.T) { tcases := []struct { name string - affinity bool + admit bool expected bool }{ { name: "Affinity is set to false in topology hints", - affinity: false, + admit: false, expected: false, }, { name: "Affinity is set to true in topology hints", - affinity: true, + admit: true, expected: true, }, } for _, tc := range tcases { policy := NewStrictPolicy() - hints := TopologyHints{ - Affinity: tc.affinity, - } - result := policy.CanAdmitPodResult(hints) + admit := tc.admit + result := policy.CanAdmitPodResult(admit) if result.Admit != tc.expected { t.Errorf("Expected Admit field in result to be %t, got %t", tc.expected, result.Admit) From 0244c0e65890fc97d7b723963b44b1c3c1c87355 Mon Sep 17 00:00:00 2001 From: nolancon Date: Thu, 30 May 2019 05:39:21 +0100 Subject: [PATCH 5/5] remove dependency on implementation from policy preferred and strict update build --- pkg/kubelet/cm/topologymanager/BUILD | 13 ++++++++++++- pkg/kubelet/cm/topologymanager/policy_preferred.go | 2 +- pkg/kubelet/cm/topologymanager/policy_strict.go | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/cm/topologymanager/BUILD b/pkg/kubelet/cm/topologymanager/BUILD index cdd0dbce85..7a639ac996 100644 --- a/pkg/kubelet/cm/topologymanager/BUILD +++ b/pkg/kubelet/cm/topologymanager/BUILD @@ -1,9 +1,11 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ "policy.go", + "policy_preferred.go", + "policy_strict.go", "topology_manager.go", ], importpath = "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager", @@ -31,3 +33,12 @@ filegroup( tags = ["automanaged"], visibility = ["//visibility:public"], ) + +go_test( + name = "go_default_test", + srcs = [ + "policy_preferred_test.go", + "policy_strict_test.go", + ], + embed = [":go_default_library"], +) diff --git a/pkg/kubelet/cm/topologymanager/policy_preferred.go b/pkg/kubelet/cm/topologymanager/policy_preferred.go index 04b2588b62..36d7f3e4bf 100644 --- a/pkg/kubelet/cm/topologymanager/policy_preferred.go +++ b/pkg/kubelet/cm/topologymanager/policy_preferred.go @@ -25,7 +25,7 @@ type preferredPolicy struct{} var _ Policy = &preferredPolicy{} // PolicyPreferred policy name. -const PolicyPreferred policyName = "preferred" +const PolicyPreferred string = "preferred" // NewPreferredPolicy returns preferred policy. func NewPreferredPolicy() Policy { diff --git a/pkg/kubelet/cm/topologymanager/policy_strict.go b/pkg/kubelet/cm/topologymanager/policy_strict.go index 1484988500..530e7d22a0 100644 --- a/pkg/kubelet/cm/topologymanager/policy_strict.go +++ b/pkg/kubelet/cm/topologymanager/policy_strict.go @@ -25,7 +25,7 @@ type strictPolicy struct{} var _ Policy = &strictPolicy{} // PolicyStrict policy name. -const PolicyStrict policyName = "strict" +const PolicyStrict string = "strict" // NewStrictPolicy returns strict policy. func NewStrictPolicy() Policy {