Skip to content

Commit

Permalink
pod mutate patch affinity
Browse files Browse the repository at this point in the history
Signed-off-by: min.jia <jiamin13579@126.com>
  • Loading branch information
jiamin13579 committed Mar 20, 2023
1 parent f599c48 commit 1cf8fbd
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
27 changes: 27 additions & 0 deletions pkg/webhooks/admission/pods/mutate/mutate_pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,11 @@ func createPatch(pod *v1.Pod) ([]byte, error) {
patch = append(patch, *patchLabel)
}

patchAffinity := patchAffinity(pod, resourceGroup)
if patchAffinity != nil {
patch = append(patch, *patchAffinity)
}

patchToleration := patchTaintToleration(pod, resourceGroup)
if patchToleration != nil {
patch = append(patch, *patchToleration)
Expand Down Expand Up @@ -156,6 +161,28 @@ func patchLabels(pod *v1.Pod, resGroupConfig wkconfig.ResGroupConfig) *patchOper
return &patchOperation{Op: "add", Path: "/spec/nodeSelector", Value: nodeSelector}
}

// patchAffinity patch affinity
func patchAffinity(pod *v1.Pod, resGroupConfig wkconfig.ResGroupConfig) *patchOperation {
if resGroupConfig.Affinity == "" {
return nil
}

if pod.Spec.Affinity != nil {
klog.V(5).Infof("pod affinity exist: %s", pod.Name)
return nil
}

var affinity v1.Affinity
err := json.Unmarshal([]byte(resGroupConfig.Affinity), &affinity)
if err != nil {
fmt.Println("Failed to unmarshal JSON:", err)
klog.V(3).Infof("Failed to unmarshal JSON: %s", err)
return nil
}

return &patchOperation{Op: "add", Path: "/spec/affinity", Value: affinity}
}

// patchTaintToleration patch taint toleration
func patchTaintToleration(pod *v1.Pod, resGroupConfig wkconfig.ResGroupConfig) *patchOperation {
if len(resGroupConfig.Tolerations) == 0 {
Expand Down
9 changes: 9 additions & 0 deletions pkg/webhooks/admission/pods/mutate/mutate_pod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ import (
)

func TestMutatePods(t *testing.T) {
affinityJsonStr := `{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/os","operator":"In","values":["linux"]}]}]}}}`
var affinity v1.Affinity
json.Unmarshal([]byte(affinityJsonStr), &affinity)

admissionConfigData := &webconfig.AdmissionConfiguration{
ResGroupsConfig: []webconfig.ResGroupConfig{
Expand All @@ -48,6 +51,7 @@ func TestMutatePods(t *testing.T) {
Effect: v1.TaintEffectNoSchedule,
},
},
Affinity: affinityJsonStr,
Labels: map[string]string{
"volcano.sh/nodetype": "management",
},
Expand Down Expand Up @@ -105,6 +109,11 @@ func TestMutatePods(t *testing.T) {
"volcano.sh/nodetype": "management",
},
},
{
Op: "add",
Path: "/spec/affinity",
Value: affinity,
},
{
Op: "add",
Path: "/spec/tolerations",
Expand Down
1 change: 1 addition & 0 deletions pkg/webhooks/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ type ResGroupConfig struct {
SchedulerName string `yaml:"schedulerName"`
Tolerations []v1.Toleration `yaml:"tolerations"`
Labels map[string]string `yaml:"labels"`
Affinity string `yaml:"affinity"`
}

// AdmissionConfiguration defines the configuration of admission.
Expand Down

0 comments on commit 1cf8fbd

Please sign in to comment.