This is an automated email from the ASF dual-hosted git repository.
chenyulin0719 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-k8shim.git
The following commit(s) were added to refs/heads/master by this push:
new abd70117 [YUNIKORN-2503] Use internal annotation prefix for
placeholder pod (#808)
abd70117 is described below
commit abd701175696c5866cd12241089ff7cd85c4a3ac
Author: Yu-Lin Chen <[email protected]>
AuthorDate: Fri May 10 08:51:18 2024 +0000
[YUNIKORN-2503] Use internal annotation prefix for placeholder pod (#808)
Change placeholder pod tag to "internal.yunikorn.apache.org/placeholder".
Old placeholder representations are marked as deprecated and will be
removed in v1.7.0.
Closes: #808
Signed-off-by: Yu-Lin Chen <[email protected]>
---
pkg/cache/placeholder.go | 7 ++--
pkg/cache/placeholder_test.go | 53 ++++++++----------------
pkg/common/constants/constants.go | 10 ++++-
pkg/common/utils/utils.go | 19 ++++++++-
pkg/common/utils/utils_test.go | 29 +++++++++----
test/e2e/framework/helpers/k8s/k8s_utils.go | 36 ++++++++--------
test/e2e/framework/helpers/k8s/pod_annotation.go | 1 -
test/e2e/gang_scheduling/gang_scheduling_test.go | 9 ++--
8 files changed, 90 insertions(+), 74 deletions(-)
diff --git a/pkg/cache/placeholder.go b/pkg/cache/placeholder.go
index 0d1345a0..80562c78 100644
--- a/pkg/cache/placeholder.go
+++ b/pkg/cache/placeholder.go
@@ -50,7 +50,7 @@ func newPlaceholder(placeholderName string, app *Application,
taskGroup TaskGrou
// Here the owner reference is always the originator pod
ownerRefs := app.getPlaceholderOwnerReferences()
annotations := utils.MergeMaps(taskGroup.Annotations, map[string]string{
- constants.AnnotationPlaceholderFlag: "true",
+ constants.AnnotationPlaceholderFlag: constants.True,
constants.AnnotationTaskGroupName: taskGroup.Name,
})
@@ -90,9 +90,8 @@ func newPlaceholder(placeholderName string, app *Application,
taskGroup TaskGrou
Name: placeholderName,
Namespace: app.tags[constants.AppTagNamespace],
Labels: utils.MergeMaps(taskGroup.Labels,
map[string]string{
- constants.LabelApplicationID:
app.GetApplicationID(),
- constants.LabelQueueName: app.GetQueue(),
- constants.LabelPlaceholderFlag: "true",
+ constants.LabelApplicationID:
app.GetApplicationID(),
+ constants.LabelQueueName: app.GetQueue(),
}),
Annotations: annotations,
OwnerReferences: ownerRefs,
diff --git a/pkg/cache/placeholder_test.go b/pkg/cache/placeholder_test.go
index 8dee656b..b6cfed15 100644
--- a/pkg/cache/placeholder_test.go
+++ b/pkg/cache/placeholder_test.go
@@ -97,6 +97,9 @@ func TestNewPlaceholder(t *testing.T) {
testGroups, map[string]string{constants.AppTagNamespace:
namespace, constants.AppTagImagePullSecrets: "secret1,secret2"},
mockedSchedulerAPI)
app.setTaskGroups(taskGroups)
+ marshalledTaskGroups, err := json.Marshal(taskGroups)
+ assert.NilError(t, err, "taskGroups marshalling failed")
+ app.setTaskGroupsDefinition(string(marshalledTaskGroups))
assert.Equal(t, app.placeholderAsk.Resources[siCommon.CPU].Value,
int64(10*500))
assert.Equal(t, app.placeholderAsk.Resources[siCommon.Memory].Value,
int64(10*1024*1000*1000))
@@ -108,12 +111,21 @@ func TestNewPlaceholder(t *testing.T) {
assert.Equal(t, holder.pod.Spec.SchedulerName, constants.SchedulerName)
assert.Equal(t, holder.pod.Name, "ph-name")
assert.Equal(t, holder.pod.Namespace, namespace)
- assert.Equal(t, len(holder.pod.Labels), 5, "unexpected number of
labels")
- assert.Equal(t, holder.pod.Labels[constants.LabelApplicationID], appID)
- assert.Equal(t, holder.pod.Labels[constants.LabelQueueName], queue)
- assert.Equal(t, holder.pod.Labels["placeholder"], "true")
- assert.Equal(t, len(holder.pod.Annotations), 5, "unexpected number of
annotations")
+ assert.DeepEqual(t, holder.pod.Labels, map[string]string{
+ constants.LabelApplicationID: appID,
+ constants.LabelQueueName: queue,
+ "labelKey0": "labelKeyValue0",
+ "labelKey1": "labelKeyValue1",
+ })
+ assert.Equal(t, len(holder.pod.Annotations), 6, "unexpected number of
annotations")
assert.Equal(t,
holder.pod.Annotations[constants.AnnotationTaskGroupName],
app.taskGroups[0].Name)
+ assert.Equal(t,
holder.pod.Annotations[constants.AnnotationPlaceholderFlag], constants.True)
+ assert.Equal(t, holder.pod.Annotations["annotationKey0"],
"annotationValue0")
+ assert.Equal(t, holder.pod.Annotations["annotationKey1"],
"annotationValue1")
+ assert.Equal(t, holder.pod.Annotations["annotationKey2"],
"annotationValue2")
+ var taskGroupsDef []TaskGroup
+ err =
json.Unmarshal([]byte(holder.pod.Annotations[siCommon.DomainYuniKorn+"task-groups"]),
&taskGroupsDef)
+ assert.NilError(t, err, "taskGroupsDef unmarshal failed")
assert.Equal(t,
common.GetPodResource(holder.pod).Resources[siCommon.CPU].Value, int64(500))
assert.Equal(t,
common.GetPodResource(holder.pod).Resources[siCommon.Memory].Value,
int64(1024*1000*1000))
assert.Equal(t,
common.GetPodResource(holder.pod).Resources["pods"].Value, int64(1))
@@ -130,37 +142,6 @@ func TestNewPlaceholder(t *testing.T) {
assert.Equal(t, "", holder.pod.Spec.PriorityClassName)
}
-func TestNewPlaceholderWithLabelsAndAnnotations(t *testing.T) {
- mockedSchedulerAPI := newMockSchedulerAPI()
- app := NewApplication(appID, queue,
- "bob", testGroups, map[string]string{constants.AppTagNamespace:
namespace}, mockedSchedulerAPI)
- app.setTaskGroups(taskGroups)
- marshalledTaskGroups, err := json.Marshal(taskGroups)
- assert.NilError(t, err, "taskGroups marshalling failed")
- app.setTaskGroupsDefinition(string(marshalledTaskGroups))
-
- holder := newPlaceholder("ph-name", app, app.taskGroups[0])
-
- assert.DeepEqual(t, holder.pod.Labels, map[string]string{
- "applicationId": "app01",
- "labelKey0": "labelKeyValue0",
- "labelKey1": "labelKeyValue1",
- "placeholder": "true",
- "queue": "root.default",
- })
-
- assert.Equal(t, len(holder.pod.Annotations), 6)
- assert.Equal(t, holder.pod.Annotations["annotationKey0"],
"annotationValue0")
- assert.Equal(t, holder.pod.Annotations["annotationKey1"],
"annotationValue1")
- assert.Equal(t, holder.pod.Annotations["annotationKey2"],
"annotationValue2")
- var taskGroupsDef []TaskGroup
- err =
json.Unmarshal([]byte(holder.pod.Annotations[siCommon.DomainYuniKorn+"task-groups"]),
&taskGroupsDef)
- assert.NilError(t, err, "taskGroupsDef unmarshal failed")
- var priority *int32
- assert.Equal(t, priority, holder.pod.Spec.Priority)
- assert.Equal(t, "", holder.pod.Spec.PriorityClassName)
-}
-
func TestNewPlaceholderWithNodeSelectors(t *testing.T) {
mockedSchedulerAPI := newMockSchedulerAPI()
app := NewApplication(appID, queue,
diff --git a/pkg/common/constants/constants.go
b/pkg/common/constants/constants.go
index aa70db5f..7a4c415d 100644
--- a/pkg/common/constants/constants.go
+++ b/pkg/common/constants/constants.go
@@ -32,6 +32,7 @@ const DefaultNodeAttributeRackNameKey = "si.io/rackname"
const DefaultNodeInstanceTypeNodeLabelKey = "node.kubernetes.io/instance-type"
const DefaultRackName = "/rack-default"
const DomainYuniKorn = siCommon.DomainYuniKorn
+const DomainYuniKornInternal = siCommon.DomainYuniKornInternal
// Application
const LabelApp = "app"
@@ -65,8 +66,13 @@ const DaemonSetType = "DaemonSet"
const PlaceholderContainerImage = "registry.k8s.io/pause:3.7"
const PlaceholderContainerName = "pause"
const PlaceholderPodRestartPolicy = "Never"
-const LabelPlaceholderFlag = "placeholder"
-const AnnotationPlaceholderFlag = DomainYuniKorn + "placeholder"
+
+// Deprecated: should remove old placeholder flags in 1.7.0
+const OldLabelPlaceholderFlag = "placeholder"
+
+// Deprecated: should remove old placeholder flags in 1.7.0
+const OldAnnotationPlaceholderFlag = DomainYuniKorn + "placeholder"
+const AnnotationPlaceholderFlag = DomainYuniKornInternal + "placeholder"
const AnnotationTaskGroupName = DomainYuniKorn + "task-group-name"
const AnnotationTaskGroups = DomainYuniKorn + "task-groups"
const AnnotationSchedulingPolicyParam = DomainYuniKorn +
"schedulingPolicyParameters"
diff --git a/pkg/common/utils/utils.go b/pkg/common/utils/utils.go
index b0a84470..141b0caf 100644
--- a/pkg/common/utils/utils.go
+++ b/pkg/common/utils/utils.go
@@ -373,10 +373,27 @@ func GetPlaceholderFlagFromPodSpec(pod *v1.Pod) bool {
}
}
- if value := GetPodLabelValue(pod, constants.LabelPlaceholderFlag);
value != "" {
+ // Deprecated: Support for old placeholder flags should be removed in
version 1.7.0.
+ if value := GetPodAnnotationValue(pod,
constants.OldAnnotationPlaceholderFlag); value != "" { // nolint:staticcheck
if v, err := strconv.ParseBool(value); err == nil {
+ log.Log(log.ShimUtils).Warn("Using deprecated
placeholder annotation. The support for old placeholder flag will be removed in
version 1.7.0",
+ zap.String("podName", pod.Name),
+ zap.String("annotation",
constants.OldAnnotationPlaceholderFlag), // nolint:staticcheck
+ zap.String("value", value))
return v
}
}
+
+ // Deprecated: Support for old placeholder flags should be removed in
version 1.7.0.
+ if value := GetPodLabelValue(pod, constants.OldLabelPlaceholderFlag);
value != "" { // nolint:staticcheck
+ if v, err := strconv.ParseBool(value); err == nil {
+ log.Log(log.ShimUtils).Warn("Using deprecated
placeholder label. The support for old placeholder flag will be removed in
version 1.7.0",
+ zap.String("podName", pod.Name),
+ zap.String("label",
constants.OldLabelPlaceholderFlag), // nolint:staticcheck
+ zap.String("value", value))
+ return v
+ }
+ }
+
return false
}
diff --git a/pkg/common/utils/utils_test.go b/pkg/common/utils/utils_test.go
index 9bebae2b..ac689473 100644
--- a/pkg/common/utils/utils_test.go
+++ b/pkg/common/utils/utils_test.go
@@ -983,7 +983,6 @@ func TestGetPlaceholderFlagFromPodSpec(t *testing.T) {
pod *v1.Pod
expectedPlaceholderFlag bool
}{
-
{"Setting by annotation", &v1.Pod{
TypeMeta: metav1.TypeMeta{
Kind: "Pod",
@@ -997,7 +996,20 @@ func TestGetPlaceholderFlagFromPodSpec(t *testing.T) {
},
},
}, true},
- {"Setting by label", &v1.Pod{
+ {"Setting by deprecated annotation", &v1.Pod{
+ TypeMeta: metav1.TypeMeta{
+ Kind: "Pod",
+ APIVersion: "v1",
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "pod-01",
+ UID: "UID-01",
+ Annotations: map[string]string{
+ constants.OldAnnotationPlaceholderFlag:
"true", // nolint:staticcheck
+ },
+ },
+ }, true},
+ {"Setting by deprecated label", &v1.Pod{
TypeMeta: metav1.TypeMeta{
Kind: "Pod",
APIVersion: "v1",
@@ -1006,11 +1018,11 @@ func TestGetPlaceholderFlagFromPodSpec(t *testing.T) {
Name: "pod-01",
UID: "UID-01",
Labels: map[string]string{
- constants.LabelPlaceholderFlag: "true",
+ constants.OldLabelPlaceholderFlag:
"true", // nolint:staticcheck
},
},
}, true},
- {"Setting both annotation and label, annotation has higher
priority", &v1.Pod{
+ {"Set new placeholder annotation and old placeholder
label/annotation together, new annotation has higher priority", &v1.Pod{
TypeMeta: metav1.TypeMeta{
Kind: "Pod",
APIVersion: "v1",
@@ -1018,13 +1030,16 @@ func TestGetPlaceholderFlagFromPodSpec(t *testing.T) {
ObjectMeta: metav1.ObjectMeta{
Name: "pod-01",
UID: "UID-01",
+ Labels: map[string]string{
+ constants.OldLabelPlaceholderFlag:
"false", // nolint:staticcheck
+ },
Annotations: map[string]string{
- constants.AnnotationPlaceholderFlag:
"true",
- constants.LabelPlaceholderFlag:
"false",
+ constants.AnnotationPlaceholderFlag:
"true",
+ constants.OldAnnotationPlaceholderFlag:
"false", // nolint:staticcheck
},
},
}, true},
- {"No setting both annotation and label", &v1.Pod{
+ {"Pod without placeholder annotation", &v1.Pod{
TypeMeta: metav1.TypeMeta{
Kind: "Pod",
APIVersion: "v1",
diff --git a/test/e2e/framework/helpers/k8s/k8s_utils.go
b/test/e2e/framework/helpers/k8s/k8s_utils.go
index b97b35bc..92fb07a8 100644
--- a/test/e2e/framework/helpers/k8s/k8s_utils.go
+++ b/test/e2e/framework/helpers/k8s/k8s_utils.go
@@ -55,6 +55,7 @@ import (
resourcehelper "k8s.io/kubectl/pkg/util/resource"
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
+ "github.com/apache/yunikorn-k8shim/pkg/common/constants"
"github.com/apache/yunikorn-k8shim/pkg/common/utils"
"github.com/apache/yunikorn-k8shim/pkg/locking"
"github.com/apache/yunikorn-k8shim/test/e2e/framework/configmanager"
@@ -1241,12 +1242,12 @@ func (k *KubeCtl) WaitForPlaceholders(namespace string,
podPrefix string, numPod
func (k *KubeCtl) ListPlaceholders(namespace string, podPrefix string)
([]v1.Pod, error) {
pods := make([]v1.Pod, 0)
- podList, lstErr := k.ListPods(namespace, "placeholder=true")
+ podList, lstErr := k.ListPods(namespace, "")
if lstErr != nil {
return pods, lstErr
}
for _, pod := range podList.Items {
- if strings.HasPrefix(pod.Name, podPrefix) {
+ if strings.HasPrefix(pod.Name, podPrefix) &&
pod.Annotations[constants.AnnotationPlaceholderFlag] == constants.True {
pods = append(pods, pod)
}
}
@@ -1263,18 +1264,17 @@ func (k *KubeCtl)
WaitForPlaceholdersStableState(namespace string, podPrefix str
func (k *KubeCtl) isNumPlaceholdersRunning(namespace string, podPrefix string,
num int, podPhase *v1.PodPhase) wait.ConditionFunc {
return func() (bool, error) {
- jobPods, lstErr := k.ListPods(namespace, "placeholder=true")
+ phPods, lstErr := k.ListPlaceholders(namespace, podPrefix)
if lstErr != nil {
return false, lstErr
}
var count int
- for _, pod := range jobPods.Items {
- if strings.HasPrefix(pod.Name, podPrefix) && (podPhase
== nil || *podPhase == pod.Status.Phase) {
+ for _, pod := range phPods {
+ if podPhase == nil || *podPhase == pod.Status.Phase {
count++
}
}
-
return count == num, nil
}
}
@@ -1283,26 +1283,24 @@ func (k *KubeCtl) isNumPlaceholdersRunning(namespace
string, podPrefix string, n
func (k *KubeCtl) arePlaceholdersStable(namespace string, podPrefix string,
samePhases *int,
maxAttempts int, phases map[string]v1.PodPhase) wait.ConditionFunc {
return func() (bool, error) {
- jobPods, lstErr := k.ListPods(namespace, "placeholder=true")
+ jobPods, lstErr := k.ListPlaceholders(namespace, podPrefix)
if lstErr != nil {
return false, lstErr
}
needRetry := false
- for _, pod := range jobPods.Items {
- if strings.HasPrefix(pod.Name, podPrefix) {
- currentPhase := pod.Status.Phase
- prevPhase, ok := phases[pod.Name]
- if !ok {
- phases[pod.Name] = currentPhase
- needRetry = true
- continue
- }
- if prevPhase != currentPhase {
- needRetry = true
- }
+ for _, pod := range jobPods {
+ currentPhase := pod.Status.Phase
+ prevPhase, ok := phases[pod.Name]
+ if !ok {
phases[pod.Name] = currentPhase
+ needRetry = true
+ continue
+ }
+ if prevPhase != currentPhase {
+ needRetry = true
}
+ phases[pod.Name] = currentPhase
}
if needRetry {
diff --git a/test/e2e/framework/helpers/k8s/pod_annotation.go
b/test/e2e/framework/helpers/k8s/pod_annotation.go
index b8153e5b..27087606 100644
--- a/test/e2e/framework/helpers/k8s/pod_annotation.go
+++ b/test/e2e/framework/helpers/k8s/pod_annotation.go
@@ -33,7 +33,6 @@ type PodAnnotation struct {
const (
TaskGroupName = constants.DomainYuniKorn + "task-group-name"
TaskGroups = constants.DomainYuniKorn + "task-groups"
- PlaceHolder = constants.DomainYuniKorn + "placeholder"
SchedulingPolicyParams = constants.DomainYuniKorn +
"schedulingPolicyParameters"
MaxCPU = constants.DomainYuniKorn + "namespace.max.cpu"
diff --git a/test/e2e/gang_scheduling/gang_scheduling_test.go
b/test/e2e/gang_scheduling/gang_scheduling_test.go
index 8fd4ecec..7169a45b 100644
--- a/test/e2e/gang_scheduling/gang_scheduling_test.go
+++ b/test/e2e/gang_scheduling/gang_scheduling_test.go
@@ -144,14 +144,15 @@ var _ = Describe("", func() {
// Wait for placeholders to become running
stateRunning := v1.PodRunning
By("Wait for all placeholders running")
- phErr := kClient.WaitForPlaceholders(ns, "tg-"+appID+"-", 15,
2*time.Minute, &stateRunning)
+ phPodPrefix := "tg-" + appID + "-"
+ phErr := kClient.WaitForPlaceholders(ns, phPodPrefix, 15,
2*time.Minute, &stateRunning)
Ω(phErr).NotTo(HaveOccurred())
// Check placeholder node distribution is same as real pods'
- phPods, phListErr := kClient.ListPods(ns, "placeholder=true")
+ phPods, phListErr := kClient.ListPlaceholders(ns, phPodPrefix)
Ω(phListErr).NotTo(HaveOccurred())
taskGroupNodes := map[string]map[string]int{}
- for _, ph := range phPods.Items {
+ for _, ph := range phPods {
tg, ok :=
ph.Annotations[constants.AnnotationTaskGroupName]
if !ok {
continue
@@ -174,7 +175,7 @@ var _ = Describe("", func() {
}
By("Wait for all placeholders terminated")
- phTermErr := kClient.WaitForPlaceholders(ns, "tg-"+appID+"-",
0, 3*time.Minute, nil)
+ phTermErr := kClient.WaitForPlaceholders(ns, phPodPrefix, 0,
3*time.Minute, nil)
Ω(phTermErr).NotTo(HaveOccurred())
// Check real gang members now running on same node distribution
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]