From eb45ff70cde6ccfb076b23597cb26d96624e2842 Mon Sep 17 00:00:00 2001 From: Eran Kampf <205185+ekampf@users.noreply.github.com> Date: Tue, 23 Jul 2024 09:11:14 -0700 Subject: [PATCH 1/2] Add support for configuring topologySpreadConstraints (#49) * Add support for configuring topologySpreadConstraints * Bump chart version to 0.1.26 --------- Co-authored-by: Kevin Frommelt --- stable/connector/Chart.yaml | 2 +- stable/connector/README.md | 1 + stable/connector/templates/deployment.yaml | 4 ++ stable/connector/values.yaml | 5 ++ test/golden/topology.golden.yaml | 73 ++++++++++++++++++++++ test/golden/topology.yaml | 11 ++++ 6 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 test/golden/topology.golden.yaml create mode 100644 test/golden/topology.yaml diff --git a/stable/connector/Chart.yaml b/stable/connector/Chart.yaml index 2cd0590..b320476 100644 --- a/stable/connector/Chart.yaml +++ b/stable/connector/Chart.yaml @@ -4,4 +4,4 @@ home: https://www.twingate.com description: Twingate Connector helm chart icon: https://www.twingate.com/twingate.png name: connector -version: 0.1.25 +version: 0.1.26 diff --git a/stable/connector/README.md b/stable/connector/README.md index 03e2ad9..4993b3c 100644 --- a/stable/connector/README.md +++ b/stable/connector/README.md @@ -80,6 +80,7 @@ The following table lists the configurable parameters of the Twingate chart and | `priorityClassName` | String to added priorityClass for pod assignment | `nil` | | `nodeSelector` | node labels for pod assignment | `{}` (The value is evaluated as a template) | | `tolerations` | Tolerations for pod assignment | `[]` (The value is evaluated as a template) | +| `topologySpreadConstraints` | Topology spread constraints for pod assignment | `[]` (The value is evaluated as a template) | | `resources` | Resource requests and limits | `{}` (The value is evaluated as a template) | | `additionalLabels` | Additional labels for the deployment | `{}` (The value is evaluated as a template) | | `podAnnotations` | Map of annotations to add to pods | `{}` | diff --git a/stable/connector/templates/deployment.yaml b/stable/connector/templates/deployment.yaml index 67a9194..932e733 100644 --- a/stable/connector/templates/deployment.yaml +++ b/stable/connector/templates/deployment.yaml @@ -96,6 +96,10 @@ spec: tolerations: {{- toYaml . | nindent 8 }} {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} {{- if .Values.priorityClassName }} priorityClassName: {{ .Values.priorityClassName | quote }} {{- end }} diff --git a/stable/connector/values.yaml b/stable/connector/values.yaml index 40afcd7..fb038c5 100644 --- a/stable/connector/values.yaml +++ b/stable/connector/values.yaml @@ -41,6 +41,11 @@ nodeSelector: {} ## tolerations: [] +## topologySpreadConstraints Topology spread constraints for pod +## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/ +## +topologySpreadConstraints: [] + ## affinity for pod assignment ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity ## Note: podAffinityPreset, podAntiAffinityPreset, and nodeAffinityPreset will be ignored when it's set diff --git a/test/golden/topology.golden.yaml b/test/golden/topology.golden.yaml new file mode 100644 index 0000000..72338f9 --- /dev/null +++ b/test/golden/topology.golden.yaml @@ -0,0 +1,73 @@ +--- +# Source: connector/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + name: test-connector + labels: + app.kubernetes.io/name: connector + helm.sh/chart: connector-major.minor.patch-test + app.kubernetes.io/instance: test + app.kubernetes.io/version: "latest" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: + TWINGATE_ACCESS_TOKEN: "QUNDRVNTX1RPS0VO" + TWINGATE_REFRESH_TOKEN: "UkVGUkVTSF9UT0tFTg==" +--- +# Source: connector/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: test-connector + labels: + app.kubernetes.io/name: connector + helm.sh/chart: connector-major.minor.patch-test + app.kubernetes.io/instance: test + app.kubernetes.io/version: "latest" + app.kubernetes.io/managed-by: Helm +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: connector + app.kubernetes.io/instance: test + template: + metadata: + labels: + app.kubernetes.io/name: connector + app.kubernetes.io/instance: test + spec: + containers: + - name: connector + image: "twingate/connector:1" + imagePullPolicy: Always + envFrom: + - secretRef: + name: test-connector + optional: false + env: + - name: TWINGATE_LABEL_DEPLOYED_BY + value: helm + - name: TWINGATE_LABEL_HELM_CHART + value: connector-major.minor.patch-test + - name: TWINGATE_URL + value: "https://test-tenant.twingate.com" + - name: TWINGATE_LOG_LEVEL + value: "3" + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + runAsNonRoot: true + runAsUser: 65532 + resources: + requests: + cpu: 50m + memory: 200Mi + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/name: connector + maxSkew: 1 + topologyKey: kubernetes.io/hostname diff --git a/test/golden/topology.yaml b/test/golden/topology.yaml new file mode 100644 index 0000000..1599605 --- /dev/null +++ b/test/golden/topology.yaml @@ -0,0 +1,11 @@ +topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/name: connector + maxSkew: 1 + topologyKey: kubernetes.io/hostname + +connector: + network: "test-tenant" + accessToken: "ACCESS_TOKEN" + refreshToken: "REFRESH_TOKEN" From 8f902130a39496df1f1aa50d9d6d7721c74fc9b7 Mon Sep 17 00:00:00 2001 From: twingate-build-bot Date: Tue, 23 Jul 2024 16:13:05 +0000 Subject: [PATCH 2/2] publish 389 --- index.yaml | 192 ++++++++++++++++++++++++++++++++++ packages/connector-0.1.26.tgz | Bin 0 -> 5539 bytes 2 files changed, 192 insertions(+) create mode 100644 index.yaml create mode 100644 packages/connector-0.1.26.tgz diff --git a/index.yaml b/index.yaml new file mode 100644 index 0000000..73eeb13 --- /dev/null +++ b/index.yaml @@ -0,0 +1,192 @@ +apiVersion: v1 +entries: + connector: + - apiVersion: v1 + appVersion: latest + created: "2024-07-23T16:13:05.854478418Z" + description: Twingate Connector helm chart + digest: f5998a69c99879413d99e9d5a9470cad6907a897fffbfe9d58d40dd1c7d7dbb3 + home: https://www.twingate.com + icon: https://www.twingate.com/twingate.png + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.26.tgz + version: 0.1.26 + - apiVersion: v1 + appVersion: latest + created: "2024-06-11T15:53:12.408518685Z" + description: Twingate Connector helm chart + digest: 93d3ace13a3becd36bff707235ca9c7948382c3a67a7cd096a186b048bf78163 + home: https://www.twingate.com + icon: https://www.twingate.com/twingate.png + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.25.tgz + version: 0.1.25 + - apiVersion: v1 + appVersion: latest + created: "2024-06-11T05:40:02.441706024Z" + description: Twingate Connector helm chart + digest: a734031f6421083fc63ace53924ed349a88f1016123773b10b6c43f1de1ebcc5 + home: https://www.twingate.com + icon: https://www.twingate.com/twingate.png + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.24.tgz + version: 0.1.24 + - apiVersion: v1 + appVersion: latest + created: "2023-12-20T18:03:46.812556341Z" + description: Twingate Connector helm chart + digest: 859f8b9be9e6129f3c7fdcf197129525e5dd83c9d396744a501af0aecf8d17f1 + home: https://www.twingate.com + icon: https://www.twingate.com/twingate.png + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.23.tgz + version: 0.1.23 + - apiVersion: v1 + appVersion: latest + created: "2023-09-11T17:05:07.861777017Z" + description: Twingate Connector helm chart + digest: 1f13149b70ce886d1670c005a0853be581e68e81553e32cbdc32e70e4df02b03 + home: https://www.twingate.com + icon: https://www.twingate.com/twingate.png + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.22.tgz + version: 0.1.22 + - apiVersion: v1 + appVersion: latest + created: "2023-09-07T23:29:24.322329463Z" + description: Twingate Connector helm chart + digest: 0ef16e163ef90d9e6b523279df00b88307fbb77504bfacdf1584c9d3c67728c0 + home: https://www.twingate.com + icon: https://www.twingate.com/twingate.png + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.21.tgz + version: 0.1.21 + - apiVersion: v1 + appVersion: latest + created: "2023-08-25T05:01:00.702065089Z" + description: Twingate Connector helm chart + digest: 926016f8e52026a1c3b450c7b4dc0660c6909e469383d7e6c5655d0d21de698f + home: https://www.twingate.com + icon: https://www.twingate.com/twingate.png + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.20.tgz + version: 0.1.20 + - apiVersion: v1 + appVersion: latest + created: "2023-08-14T22:49:08.358363332Z" + description: Twingate Connector helm chart + digest: 57a15f0b7533ca8c9ff8e3a180defbeb12c314716c1871cfcfd6ef6cb5e6252c + home: https://www.twingate.com + icon: https://www.twingate.com/twingate.png + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.19.tgz + version: 0.1.19 + - apiVersion: v1 + appVersion: latest + created: "2023-07-31T15:59:00.114856576Z" + description: Twingate Connector helm chart + digest: 79b863c61e8f6766cc7611dd3017ecb82a92d935b647357799ddea00791d37f7 + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.18.tgz + version: 0.1.18 + - apiVersion: v1 + appVersion: latest + created: "2023-07-28T22:01:46.580635997Z" + description: Twingate Connector helm chart + digest: 9ec38e5396d8ea804daa923500969ee25ed4dd6325b8eebd30f6eb9c8cdd34f4 + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.17.tgz + version: 0.1.17 + - apiVersion: v1 + appVersion: latest + created: "2023-06-05T01:45:14.85107974Z" + description: Twingate Connector helm chart + digest: 2728c6bcc9e8f9f79c38da06935a554e7f23575c1d1f9da882c7e08f3404aeb3 + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.16.tgz + version: 0.1.16 + - apiVersion: v1 + appVersion: latest + created: "2023-05-30T15:42:08.25908964Z" + description: Twingate Connector helm chart + digest: 0bdd619a0a66c6c12167717fa9f9ae143e3367e9fee9ac83e3f1d2a964caada7 + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.15.tgz + version: 0.1.15 + - apiVersion: v1 + appVersion: latest + created: "2023-05-15T22:24:13.815966128Z" + description: Twingate Connector helm chart + digest: edb9b79c6bd250fa82c17ad1023472a45aa023bb4c0bbf808bab0f065952007f + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.14.tgz + version: 0.1.14 + - apiVersion: v1 + appVersion: latest + created: "2022-10-03T21:00:38.668519433Z" + description: Twingate Connector helm chart + digest: cd667b14eede671eb1fd4fe22b716c2ce2ee68104c9c5be01181dec486af7100 + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.13.tgz + version: 0.1.13 + - apiVersion: v1 + appVersion: latest + created: "2022-07-06T17:41:51.672421099Z" + description: Twingate Connector helm chart + digest: bb3e01cadf2123eead1ac0c6efc69e08e80612535c49fe737b151bad8210b840 + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.12.tgz + version: 0.1.12 + - apiVersion: v1 + appVersion: latest + created: "2022-07-06T17:14:04.135784651Z" + description: Twingate Connector helm chart + digest: 8b3682202a5c7f18812e324cc876355c99e6dba888ee435b0e7fbd3822612682 + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.11.tgz + version: 0.1.11 + - apiVersion: v1 + appVersion: latest + created: "2021-12-15T20:45:25.693118238Z" + description: Twingate Connector helm chart + digest: 38f00e914b99e661c2b60d4bdc9b1be6a818920b2daaeec15ea25d46b076e48d + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.10.tgz + version: 0.1.10 + - apiVersion: v1 + appVersion: latest + created: "2021-12-09T04:58:11.393000932Z" + description: Twingate Connector helm chart + digest: 6608e29b7c9e5499947c08c62ebecd44dc66721398fcc8248deb6b3aaf649ccb + home: https://www.twingate.com + name: connector + urls: + - https://twingate.github.io/helm-charts/packages/connector-0.1.9.tgz + version: 0.1.9 +generated: "2024-07-23T16:13:05.853589721Z" diff --git a/packages/connector-0.1.26.tgz b/packages/connector-0.1.26.tgz new file mode 100644 index 0000000000000000000000000000000000000000..724935c503c820350efe82eca649dd966b737c62 GIT binary patch literal 5539 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