From 0dd398d88472cc1fbac92e78f3688c7b4f9f18f2 Mon Sep 17 00:00:00 2001 From: Stavros kois Date: Mon, 6 Feb 2023 14:18:20 +0200 Subject: [PATCH] session affinity --- .../tests/service/cluster_ip_test.yaml | 10 ++++ .../tests/service/external_ip_test.yaml | 24 +++++----- .../tests/service/external_name_test.yaml | 10 ++++ .../tests/service/load_balancer_test.yaml | 10 ++++ .../tests/service/node_port_test.yaml | 10 ++++ .../tests/service/validation_test.yaml | 47 +++++++++++++++++++ .../1.0.0/templates/classes/_service.tpl | 4 +- .../service/serviceTypeConfig/_ipFamily.tpl | 2 +- .../serviceTypeConfig/_sessionAffinity.tpl | 42 +++++++++++++++++ 9 files changed, 143 insertions(+), 16 deletions(-) create mode 100644 library/common/1.0.0/templates/lib/service/serviceTypeConfig/_sessionAffinity.tpl diff --git a/library/common-test/tests/service/cluster_ip_test.yaml b/library/common-test/tests/service/cluster_ip_test.yaml index 67cafbd3e3..9fd84aa738 100644 --- a/library/common-test/tests/service/cluster_ip_test.yaml +++ b/library/common-test/tests/service/cluster_ip_test.yaml @@ -43,6 +43,8 @@ tests: some_family: IPv6 some_ip: 172.16.20.35 some_other_ip: 10.200.34.53 + some_affinity: ClientIP + some_timeout: 100 service: my-service: enabled: true @@ -57,6 +59,10 @@ tests: externalIPs: - "{{ .Values.some_other_ip }}" - 10.200.34.54 + sessionAffinity: "{{ .Values.some_affinity }}" + sessionAffinityConfig: + clientIP: + timeoutSeconds: "{{ .Values.some_timeout }}" ports: port-name: enabled: true @@ -82,3 +88,7 @@ tests: externalIPs: - 10.200.34.53 - 10.200.34.54 + sessionAffinity: ClientIP + sessionAffinityConfig: + clientIP: + timeoutSeconds: 100 diff --git a/library/common-test/tests/service/external_ip_test.yaml b/library/common-test/tests/service/external_ip_test.yaml index b4cc261a76..8985820540 100644 --- a/library/common-test/tests/service/external_ip_test.yaml +++ b/library/common-test/tests/service/external_ip_test.yaml @@ -14,14 +14,8 @@ tests: port-name: enabled: true primary: true - workload: - my-workload: - enabled: true - primary: true - type: Deployment - podSpec: {} asserts: - - documentIndex: &serviceDoc 1 + - documentIndex: &serviceDoc 0 isKind: of: Service - documentIndex: *serviceDoc @@ -41,6 +35,8 @@ tests: set: some_policy: Local some_ip: 10.200.34.53 + some_affinity: ClientIP + some_timeout: 100 service: my-service: enabled: true @@ -51,16 +47,14 @@ tests: externalIPs: - "{{ .Values.some_ip }}" - 10.200.34.54 + sessionAffinity: "{{ .Values.some_affinity }}" + sessionAffinityConfig: + clientIP: + timeoutSeconds: "{{ .Values.some_timeout }}" ports: port-name: enabled: true primary: true - workload: - my-workload: - enabled: true - primary: true - type: Deployment - podSpec: {} asserts: - documentIndex: *serviceDoc equal: @@ -71,3 +65,7 @@ tests: externalIPs: - 10.200.34.53 - 10.200.34.54 + sessionAffinity: ClientIP + sessionAffinityConfig: + clientIP: + timeoutSeconds: 100 diff --git a/library/common-test/tests/service/external_name_test.yaml b/library/common-test/tests/service/external_name_test.yaml index 2a8cda8f6e..99bfadb1d0 100644 --- a/library/common-test/tests/service/external_name_test.yaml +++ b/library/common-test/tests/service/external_name_test.yaml @@ -39,6 +39,8 @@ tests: some_other_ip: 10.200.34.53 some_name: my-external-name some_policy: Local + some_affinity: ClientIP + some_timeout: 100 service: my-service: enabled: true @@ -51,6 +53,10 @@ tests: externalIPs: - "{{ .Values.some_other_ip }}" - 10.200.34.54 + sessionAffinity: "{{ .Values.some_affinity }}" + sessionAffinityConfig: + clientIP: + timeoutSeconds: "{{ .Values.some_timeout }}" ports: port-name: enabled: true @@ -68,3 +74,7 @@ tests: externalIPs: - 10.200.34.53 - 10.200.34.54 + sessionAffinity: ClientIP + sessionAffinityConfig: + clientIP: + timeoutSeconds: 100 diff --git a/library/common-test/tests/service/load_balancer_test.yaml b/library/common-test/tests/service/load_balancer_test.yaml index 790cfe40d1..6e8f7e702c 100644 --- a/library/common-test/tests/service/load_balancer_test.yaml +++ b/library/common-test/tests/service/load_balancer_test.yaml @@ -45,6 +45,8 @@ tests: some_policy: Local some_range: 11.100.200.0/24 some_family: IPv6 + some_affinity: ClientIP + some_timeout: 100 service: my-service: enabled: true @@ -64,6 +66,10 @@ tests: externalIPs: - "{{ .Values.some_extra_ip }}" - 10.200.34.54 + sessionAffinity: "{{ .Values.some_affinity }}" + sessionAffinityConfig: + clientIP: + timeoutSeconds: "{{ .Values.some_timeout }}" ports: port-name: enabled: true @@ -94,3 +100,7 @@ tests: externalIPs: - 10.200.34.53 - 10.200.34.54 + sessionAffinity: ClientIP + sessionAffinityConfig: + clientIP: + timeoutSeconds: 100 diff --git a/library/common-test/tests/service/node_port_test.yaml b/library/common-test/tests/service/node_port_test.yaml index 9d25add334..af14f4da29 100644 --- a/library/common-test/tests/service/node_port_test.yaml +++ b/library/common-test/tests/service/node_port_test.yaml @@ -43,6 +43,8 @@ tests: some_family: IPv6 some_policy: Local some_other_ip: 10.200.34.53 + some_affinity: ClientIP + some_timeout: 100 service: my-service: enabled: true @@ -58,6 +60,10 @@ tests: externalIPs: - "{{ .Values.some_other_ip }}" - 10.200.34.54 + sessionAffinity: "{{ .Values.some_affinity }}" + sessionAffinityConfig: + clientIP: + timeoutSeconds: "{{ .Values.some_timeout }}" ports: port-name: enabled: true @@ -84,3 +90,7 @@ tests: externalIPs: - 10.200.34.53 - 10.200.34.54 + sessionAffinity: ClientIP + sessionAffinityConfig: + clientIP: + timeoutSeconds: 100 diff --git a/library/common-test/tests/service/validation_test.yaml b/library/common-test/tests/service/validation_test.yaml index 21cb6dfa24..afea156591 100644 --- a/library/common-test/tests/service/validation_test.yaml +++ b/library/common-test/tests/service/validation_test.yaml @@ -315,3 +315,50 @@ tests: asserts: - failedTemplate: errorMessage: Service - Expected non-empty on ExternalName service type. + + - it: should fail with invalid sessionAffinity + set: + service: + service-name1: + enabled: true + primary: true + type: ClusterIP + sessionAffinity: not-an-affinity + ports: + port-name1: + enabled: true + primary: true + workload: + some-pod-name: + enabled: true + primary: true + type: Deployment + podSpec: {} + asserts: + - failedTemplate: + errorMessage: Service - Expected to be one of [ClientIP, None], but got [not-an-affinity] + + - it: should fail with invalid timeoutSeconds in sessionAffinityConfig + set: + service: + service-name1: + enabled: true + primary: true + type: ClusterIP + sessionAffinity: ClientIP + sessionAffinityConfig: + clientIP: + timeoutSeconds: -1 + ports: + port-name1: + enabled: true + primary: true + workload: + some-pod-name: + enabled: true + primary: true + type: Deployment + podSpec: {} + asserts: + - failedTemplate: + errorMessage: Service - Expected to be between [0 - 86400], but got [-1] diff --git a/library/common/1.0.0/templates/classes/_service.tpl b/library/common/1.0.0/templates/classes/_service.tpl index ac42b1af2f..da9aefe49e 100644 --- a/library/common/1.0.0/templates/classes/_service.tpl +++ b/library/common/1.0.0/templates/classes/_service.tpl @@ -89,7 +89,7 @@ spec: externalIPs: {{- . | nindent 2 }} {{- end -}} - {{/* TODO: sessionAffinity */}} + {{- include "ix.v1.common.lib.service.sessionAffinity" (dict "rootCtx" $rootCtx "objectData" $objectData) | trim | nindent 2 }} ports: {{/* TODO: ports */}} {{- if not (mustHas $svcType $specialTypes) }} @@ -97,6 +97,6 @@ selector: {{- include "ix.v1.common.lib.metadata.selectorLabels" (dict "rootCtx" $rootCtx "podName" $podValues.shortName) | trim | nindent 2 }} {{- end -}} {{- if eq $svcType "ExternalIP" -}} - {{/* TODO: endpoints for externalIP */}} + {{/* TODO: endpointsslice for externalIP */}} {{- end -}} {{- end -}} diff --git a/library/common/1.0.0/templates/lib/service/serviceTypeConfig/_ipFamily.tpl b/library/common/1.0.0/templates/lib/service/serviceTypeConfig/_ipFamily.tpl index ed264518d4..dad8f21cf5 100644 --- a/library/common/1.0.0/templates/lib/service/serviceTypeConfig/_ipFamily.tpl +++ b/library/common/1.0.0/templates/lib/service/serviceTypeConfig/_ipFamily.tpl @@ -7,7 +7,7 @@ objectData: The service object data {{- define "ix.v1.common.lib.service.ipFamily" -}} {{- $rootCtx := .rootCtx -}} - {{- $objectData := .objectData }} + {{- $objectData := .objectData -}} {{- with $objectData.ipFamilyPolicy -}} {{- $famPolicy := tpl . $rootCtx -}} diff --git a/library/common/1.0.0/templates/lib/service/serviceTypeConfig/_sessionAffinity.tpl b/library/common/1.0.0/templates/lib/service/serviceTypeConfig/_sessionAffinity.tpl new file mode 100644 index 0000000000..2acb79fbc8 --- /dev/null +++ b/library/common/1.0.0/templates/lib/service/serviceTypeConfig/_sessionAffinity.tpl @@ -0,0 +1,42 @@ +{{/* Service - Session Affinity */}} +{{/* Call this template: +{{ include "ix.v1.common.lib.service.sessionAffinity" (dict "rootCtx" $rootCtx "objectData" $objectData) -}} +rootCtx: The root context of the service +objectData: The service object data +*/}} + +{{- define "ix.v1.common.lib.service.sessionAffinity" -}} + {{- $rootCtx := .rootCtx -}} + {{- $objectData := .objectData -}} + + {{- with $objectData.sessionAffinity -}} + {{- $affinity := tpl . $rootCtx -}} + {{- $affinities := (list "ClientIP" "None") -}} + {{- if not (mustHas $affinity $affinities) -}} + {{- fail (printf "Service - Expected to be one of [%s], but got [%s]" (join ", " $affinities) $affinity) -}} + {{- end }} +sessionAffinity: {{ $affinity }} + {{- if eq $affinity "ClientIP" -}} + {{- with $objectData.sessionAffinityConfig -}} + {{- with .clientIP -}} + + {{- $timeout := .timeoutSeconds -}} + {{- if kindIs "string" $timeout -}} + {{- $timeout = tpl $timeout $rootCtx -}} + {{- end -}} + + {{- $timeout = int $timeout -}} + {{- if and $timeout (mustHas (kindOf $timeout) (list "float64" "int")) -}} + {{- if or (lt $timeout 0) (gt $timeout 86400) -}} + {{- fail (printf "Service - Expected to be between [0 - 86400], but got [%v]" $timeout) -}} + {{- end }} +sessionAffinityConfig: + clientIP: + timeoutSeconds: {{ $timeout }} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} + +{{- end -}}