diff --git a/.github/workflows/pull_request_docs.yaml b/.github/workflows/pull_request_docs.yaml index 0dd9745..c907ee5 100644 --- a/.github/workflows/pull_request_docs.yaml +++ b/.github/workflows/pull_request_docs.yaml @@ -16,16 +16,17 @@ on: jobs: qa: - uses: stakater/.github/.github/workflows/pull_request_doc_qa.yaml@v0.0.131 + uses: stakater/.github/.github/workflows/pull_request_doc_qa.yaml@v0.0.134 with: MD_CONFIG: .github/md_config.json DOC_SRC: docs MD_LINT_CONFIG: .markdownlint.yaml build: - uses: stakater/.github/.github/workflows/pull_request_container_build.yaml@v0.0.131 + uses: stakater/.github/.github/workflows/pull_request_container_build.yaml@v0.0.134 with: DOCKER_FILE_PATH: Dockerfile-docs CONTAINER_REGISTRY_URL: ghcr.io/stakater + PUSH_IMAGE: false secrets: CONTAINER_REGISTRY_USERNAME: ${{ github.actor }} CONTAINER_REGISTRY_PASSWORD: ${{ secrets.GHCR_TOKEN }} diff --git a/.vale.ini b/.vale.ini index 6ebe6f0..3e2f315 100644 --- a/.vale.ini +++ b/.vale.ini @@ -1,7 +1,7 @@ StylesPath = styles MinAlertLevel = warning -Packages = https://github.com/stakater/vale-package/releases/download/v0.0.62/Stakater.zip +Packages = https://github.com/stakater/vale-package/releases/download/v0.0.77/Stakater.zip Vocab = Stakater # Only check MarkDown files diff --git a/Dockerfile b/Dockerfile index 0b4876c..57a3999 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ ARG BUILDER_IMAGE ARG BASE_IMAGE # Build the manager binary -FROM --platform=${BUILDPLATFORM} ${BUILDER_IMAGE:-golang:1.24.2} AS builder +FROM --platform=${BUILDPLATFORM} ${BUILDER_IMAGE:-golang:1.24.4} AS builder ARG TARGETOS ARG TARGETARCH diff --git a/README.md b/README.md index 84def75..23e4042 100644 --- a/README.md +++ b/README.md @@ -189,7 +189,7 @@ metadata: Reloader can optionally **send alerts** whenever it triggers a rolling upgrade for a workload (e.g., `Deployment`, `StatefulSet`, etc.). -These alerts are sent to a configured **webhook endpoint**, which can be a generic receiver or services like Slack or Microsoft Teams. +These alerts are sent to a configured **webhook endpoint**, which can be a generic receiver or services like Slack, Microsoft Teams or Google Chat. To enable this feature, update the `reloader.env.secret` section in your `values.yaml` (when installing via Helm): @@ -198,7 +198,7 @@ reloader: env: secret: ALERT_ON_RELOAD: "true" # Enable alerting (default: false) - ALERT_SINK: "slack" # Options: slack, teams, webhook (default: webhook) + ALERT_SINK: "slack" # Options: slack, teams, gchat or webhook (default: webhook) ALERT_WEBHOOK_URL: "" # Required if ALERT_ON_RELOAD is true ALERT_ADDITIONAL_INFO: "Triggered by Reloader in staging environment" ``` diff --git a/deployments/kubernetes/chart/reloader/Chart.yaml b/deployments/kubernetes/chart/reloader/Chart.yaml index 188244c..699f4ba 100644 --- a/deployments/kubernetes/chart/reloader/Chart.yaml +++ b/deployments/kubernetes/chart/reloader/Chart.yaml @@ -1,8 +1,8 @@ apiVersion: v1 name: reloader description: Reloader chart that runs on kubernetes -version: 2.1.3 -appVersion: v1.4.2 +version: 2.1.4 +appVersion: v1.4.4 keywords: - Reloader - kubernetes diff --git a/deployments/kubernetes/chart/reloader/templates/clusterrole.yaml b/deployments/kubernetes/chart/reloader/templates/clusterrole.yaml index 9cd3ec5..9f655aa 100644 --- a/deployments/kubernetes/chart/reloader/templates/clusterrole.yaml +++ b/deployments/kubernetes/chart/reloader/templates/clusterrole.yaml @@ -11,10 +11,10 @@ metadata: labels: {{ include "reloader-labels.chart" . | indent 4 }} {{- if .Values.reloader.rbac.labels }} -{{ toYaml .Values.reloader.rbac.labels | indent 4 }} +{{ tpl (toYaml .Values.reloader.rbac.labels) . | indent 4 }} {{- end }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 4 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 4 }} {{- end }} name: {{ template "reloader-fullname" . }}-role rules: diff --git a/deployments/kubernetes/chart/reloader/templates/clusterrolebinding.yaml b/deployments/kubernetes/chart/reloader/templates/clusterrolebinding.yaml index 0730dba..137b5a8 100644 --- a/deployments/kubernetes/chart/reloader/templates/clusterrolebinding.yaml +++ b/deployments/kubernetes/chart/reloader/templates/clusterrolebinding.yaml @@ -11,10 +11,10 @@ metadata: labels: {{ include "reloader-labels.chart" . | indent 4 }} {{- if .Values.reloader.rbac.labels }} -{{ toYaml .Values.reloader.rbac.labels | indent 4 }} +{{ tpl (toYaml .Values.reloader.rbac.labels) . | indent 4 }} {{- end }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 4 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 4 }} {{- end }} name: {{ template "reloader-fullname" . }}-role-binding roleRef: diff --git a/deployments/kubernetes/chart/reloader/templates/deployment.yaml b/deployments/kubernetes/chart/reloader/templates/deployment.yaml index 23d6447..31f3843 100644 --- a/deployments/kubernetes/chart/reloader/templates/deployment.yaml +++ b/deployments/kubernetes/chart/reloader/templates/deployment.yaml @@ -4,15 +4,15 @@ metadata: annotations: {{ include "reloader-helm3.annotations" . | indent 4 }} {{- if .Values.reloader.deployment.annotations }} -{{ toYaml .Values.reloader.deployment.annotations | indent 4 }} +{{ tpl (toYaml .Values.reloader.deployment.annotations) . | indent 4 }} {{- end }} labels: {{ include "reloader-labels.chart" . | indent 4 }} {{- if .Values.reloader.deployment.labels }} -{{ toYaml .Values.reloader.deployment.labels | indent 4 }} +{{ tpl (toYaml .Values.reloader.deployment.labels) . | indent 4 }} {{- end }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 4 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 4 }} {{- end }} name: {{ template "reloader-fullname" . }} namespace: {{ .Values.namespace | default .Release.Namespace }} @@ -28,21 +28,21 @@ spec: app: {{ template "reloader-fullname" . }} release: {{ .Release.Name | quote }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 6 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 6 }} {{- end }} template: metadata: {{- if .Values.reloader.deployment.pod.annotations }} annotations: -{{ toYaml .Values.reloader.deployment.pod.annotations | indent 8 }} +{{ tpl (toYaml .Values.reloader.deployment.pod.annotations) . | indent 8 }} {{- end }} labels: {{ include "reloader-labels.chart" . | indent 8 }} {{- if .Values.reloader.deployment.labels }} -{{ toYaml .Values.reloader.deployment.labels | indent 8 }} +{{ tpl (toYaml .Values.reloader.deployment.labels) . | indent 8 }} {{- end }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 8 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 8 }} {{- end }} spec: {{- with .Values.global.imagePullSecrets }} diff --git a/deployments/kubernetes/chart/reloader/templates/networkpolicy.yaml b/deployments/kubernetes/chart/reloader/templates/networkpolicy.yaml index ca5f224..cf4d0f1 100644 --- a/deployments/kubernetes/chart/reloader/templates/networkpolicy.yaml +++ b/deployments/kubernetes/chart/reloader/templates/networkpolicy.yaml @@ -7,7 +7,7 @@ metadata: labels: {{ include "reloader-labels.chart" . | indent 4 }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 4 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 4 }} {{- end }} name: {{ template "reloader-fullname" . }} namespace: {{ .Values.namespace | default .Release.Namespace }} @@ -17,7 +17,7 @@ spec: app: {{ template "reloader-fullname" . }} release: {{ .Release.Name | quote }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 6 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 6 }} {{- end }} policyTypes: - Ingress diff --git a/deployments/kubernetes/chart/reloader/templates/role.yaml b/deployments/kubernetes/chart/reloader/templates/role.yaml index 13ac4bb..a031e3e 100644 --- a/deployments/kubernetes/chart/reloader/templates/role.yaml +++ b/deployments/kubernetes/chart/reloader/templates/role.yaml @@ -11,10 +11,10 @@ metadata: labels: {{ include "reloader-labels.chart" . | indent 4 }} {{- if .Values.reloader.rbac.labels }} -{{ toYaml .Values.reloader.rbac.labels | indent 4 }} +{{ tpl (toYaml .Values.reloader.rbac.labels) . | indent 4 }} {{- end }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 4 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 4 }} {{- end }} name: {{ template "reloader-fullname" . }}-role namespace: {{ .Values.namespace | default .Release.Namespace }} diff --git a/deployments/kubernetes/chart/reloader/templates/rolebinding.yaml b/deployments/kubernetes/chart/reloader/templates/rolebinding.yaml index abeb721..dccff31 100644 --- a/deployments/kubernetes/chart/reloader/templates/rolebinding.yaml +++ b/deployments/kubernetes/chart/reloader/templates/rolebinding.yaml @@ -11,10 +11,10 @@ metadata: labels: {{ include "reloader-labels.chart" . | indent 4 }} {{- if .Values.reloader.rbac.labels }} -{{ toYaml .Values.reloader.rbac.labels | indent 4 }} +{{ tpl (toYaml .Values.reloader.rbac.labels) . | indent 4 }} {{- end }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 4 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 4 }} {{- end }} name: {{ template "reloader-fullname" . }}-role-binding namespace: {{ .Values.namespace | default .Release.Namespace }} diff --git a/deployments/kubernetes/chart/reloader/templates/service.yaml b/deployments/kubernetes/chart/reloader/templates/service.yaml index 95a8150..57bf63c 100644 --- a/deployments/kubernetes/chart/reloader/templates/service.yaml +++ b/deployments/kubernetes/chart/reloader/templates/service.yaml @@ -5,22 +5,22 @@ metadata: annotations: {{ include "reloader-helm3.annotations" . | indent 4 }} {{- if .Values.reloader.service.annotations }} -{{ toYaml .Values.reloader.service.annotations | indent 4 }} +{{ tpl (toYaml .Values.reloader.service.annotations) . | indent 4 }} {{- end }} labels: {{ include "reloader-labels.chart" . | indent 4 }} {{- if .Values.reloader.service.labels }} -{{ toYaml .Values.reloader.service.labels | indent 4 }} +{{ tpl (toYaml .Values.reloader.service.labels) . | indent 4 }} {{- end }} name: {{ template "reloader-fullname" . }} namespace: {{ .Values.namespace | default .Release.Namespace }} spec: selector: {{- if .Values.reloader.deployment.labels }} -{{ toYaml .Values.reloader.deployment.labels | indent 4 }} +{{ tpl (toYaml .Values.reloader.deployment.labels) . | indent 4 }} {{- end }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 4 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 4 }} {{- end }} ports: - port: {{ .Values.reloader.service.port }} diff --git a/deployments/kubernetes/chart/reloader/templates/serviceaccount.yaml b/deployments/kubernetes/chart/reloader/templates/serviceaccount.yaml index 27909ed..7bc5ccb 100644 --- a/deployments/kubernetes/chart/reloader/templates/serviceaccount.yaml +++ b/deployments/kubernetes/chart/reloader/templates/serviceaccount.yaml @@ -11,15 +11,15 @@ metadata: annotations: {{ include "reloader-helm3.annotations" . | indent 4 }} {{- if .Values.reloader.serviceAccount.annotations }} -{{ toYaml .Values.reloader.serviceAccount.annotations | indent 4 }} +{{ tpl (toYaml .Values.reloader.serviceAccount.annotations) . | indent 4 }} {{- end }} labels: {{ include "reloader-labels.chart" . | indent 4 }} {{- if .Values.reloader.serviceAccount.labels }} -{{ toYaml .Values.reloader.serviceAccount.labels | indent 4 }} +{{ tpl (toYaml .Values.reloader.serviceAccount.labels) . | indent 4 }} {{- end }} {{- if .Values.reloader.matchLabels }} -{{ toYaml .Values.reloader.matchLabels | indent 4 }} +{{ tpl (toYaml .Values.reloader.matchLabels) . | indent 4 }} {{- end }} name: {{ template "reloader-serviceAccountName" . }} namespace: {{ .Values.namespace | default .Release.Namespace }} diff --git a/deployments/kubernetes/chart/reloader/values.yaml b/deployments/kubernetes/chart/reloader/values.yaml index 67db457..ae3610f 100644 --- a/deployments/kubernetes/chart/reloader/values.yaml +++ b/deployments/kubernetes/chart/reloader/values.yaml @@ -17,7 +17,7 @@ fullnameOverride: "" image: name: stakater/reloader repository: ghcr.io/stakater/reloader - tag: v1.4.2 + tag: v1.4.4 # digest: sha256:1234567 pullPolicy: IfNotPresent @@ -106,7 +106,7 @@ reloader: labels: provider: stakater group: com.stakater.platform - version: v1.4.2 + version: v1.4.4 # Support for extra environment variables. env: # Open supports Key value pair as environment variables. diff --git a/docs/Alerting.md b/docs/Alerting.md index 43eefe5..bb4fbbe 100644 --- a/docs/Alerting.md +++ b/docs/Alerting.md @@ -8,7 +8,7 @@ In-order to enable this feature, you need to update the `reloader.env.secret` se ```yaml ALERT_ON_RELOAD: [ true/false ] Default: false - ALERT_SINK: [ slack/teams/webhook ] Default: webhook + ALERT_SINK: [ slack/teams/gchat/webhook ] Default: webhook ALERT_WEBHOOK_URL: Required if ALERT_ON_RELOAD is true ALERT_ADDITIONAL_INFO: Any additional information to be added to alert ``` diff --git a/go.mod b/go.mod index c1f570f..c630aac 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/stakater/Reloader -go 1.24.2 +go 1.24.4 require ( github.com/argoproj/argo-rollouts v1.8.2 @@ -38,7 +38,6 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.18.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect diff --git a/go.sum b/go.sum index f16d180..126602f 100644 --- a/go.sum +++ b/go.sum @@ -76,12 +76,8 @@ github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/openshift/api v0.0.0-20250331192611-6179881b782d h1:Vadr+xFmNi6RzWRTJtqMQJv1hiUe7as1rV2svKQffoY= -github.com/openshift/api v0.0.0-20250331192611-6179881b782d/go.mod h1:yk60tHAmHhtVpJQo3TwVYq2zpuP70iJIFDCmeKMIzPw= github.com/openshift/api v0.0.0-20250411135543-10a8fa583797 h1:8x3G8QOZqo2bRAL8JFlPz/odqQECI/XmlZeRwnFxJ8I= github.com/openshift/api v0.0.0-20250411135543-10a8fa583797/go.mod h1:yk60tHAmHhtVpJQo3TwVYq2zpuP70iJIFDCmeKMIzPw= -github.com/openshift/client-go v0.0.0-20250330132942-bc2e3c2af6e1 h1:9SaT0p5FsRDvz4STV1VnxMyfXXzAXv1PubZ0nczzDYk= -github.com/openshift/client-go v0.0.0-20250330132942-bc2e3c2af6e1/go.mod h1:6a0Hj32FrkokKMeTck1uStmNV0wHYv46dHWAWER5iis= github.com/openshift/client-go v0.0.0-20250402181141-b3bad3b645f2 h1:bPXR0R8zp1o12nSUphN26hSM+OKYq5pMorbDCpApzDQ= github.com/openshift/client-go v0.0.0-20250402181141-b3bad3b645f2/go.mod h1:dT1cJyVTperQ53GvVRa+GZ27r02fDZy2k5j+9QoQsCo= github.com/parnurzeal/gorequest v0.3.0 h1:SoFyqCDC9COr1xuS6VA8fC8RU7XyrJZN2ona1kEX7FI= @@ -91,12 +87,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= -github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= @@ -137,12 +129,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= -golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -152,18 +140,12 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= diff --git a/internal/pkg/alerts/alert.go b/internal/pkg/alerts/alert.go index 43b4c06..5791448 100644 --- a/internal/pkg/alerts/alert.go +++ b/internal/pkg/alerts/alert.go @@ -35,6 +35,8 @@ func SendWebhookAlert(msg string) { sendSlackAlert(webhook_url, webhook_proxy, msg) } else if alert_sink == "teams" { sendTeamsAlert(webhook_url, webhook_proxy, msg) + } else if alert_sink == "gchat" { + sendGoogleChatAlert(webhook_url, webhook_proxy, msg) } else { msg = strings.Replace(msg, "*", "", -1) sendRawWebhookAlert(webhook_url, webhook_proxy, msg) @@ -98,6 +100,29 @@ func sendTeamsAlert(webhookUrl string, proxy string, msg string) []error { return nil } +// function to send alert to Google Chat webhook +func sendGoogleChatAlert(webhookUrl string, proxy string, msg string) []error { + payload := map[string]interface{}{ + "text": msg, + } + + request := gorequest.New().Proxy(proxy) + resp, _, err := request. + Post(webhookUrl). + RedirectPolicy(redirectPolicy). + Send(payload). + End() + + if err != nil { + return err + } + if resp.StatusCode != 200 { + return []error{fmt.Errorf("error sending msg. status: %v", resp.Status)} + } + + return nil +} + // function to send alert to webhook service as text func sendRawWebhookAlert(webhookUrl string, proxy string, msg string) []error { request := gorequest.New().Proxy(proxy) diff --git a/internal/pkg/callbacks/rolling_upgrade.go b/internal/pkg/callbacks/rolling_upgrade.go index 77d7982..81c0b65 100644 --- a/internal/pkg/callbacks/rolling_upgrade.go +++ b/internal/pkg/callbacks/rolling_upgrade.go @@ -17,7 +17,6 @@ import ( patchtypes "k8s.io/apimachinery/pkg/types" argorolloutv1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" - openshiftv1 "github.com/openshift/api/apps/v1" ) // ItemFunc is a generic function to return a specific resource in given namespace @@ -232,36 +231,6 @@ func GetStatefulSetItems(clients kube.Clients, namespace string) []runtime.Objec return items } -// GetDeploymentConfigItem returns the deploymentConfig in given namespace -func GetDeploymentConfigItem(clients kube.Clients, name string, namespace string) (runtime.Object, error) { - deploymentConfig, err := clients.OpenshiftAppsClient.AppsV1().DeploymentConfigs(namespace).Get(context.TODO(), name, meta_v1.GetOptions{}) - if err != nil { - logrus.Errorf("Failed to get deploymentConfig %v", err) - return nil, err - } - - return deploymentConfig, nil -} - -// GetDeploymentConfigItems returns the deploymentConfigs in given namespace -func GetDeploymentConfigItems(clients kube.Clients, namespace string) []runtime.Object { - deploymentConfigs, err := clients.OpenshiftAppsClient.AppsV1().DeploymentConfigs(namespace).List(context.TODO(), meta_v1.ListOptions{}) - if err != nil { - logrus.Errorf("Failed to list deploymentConfigs %v", err) - } - - items := make([]runtime.Object, len(deploymentConfigs.Items)) - // Ensure we always have pod annotations to add to - for i, v := range deploymentConfigs.Items { - if v.Spec.Template.ObjectMeta.Annotations == nil { - deploymentConfigs.Items[i].Spec.Template.ObjectMeta.Annotations = make(map[string]string) - } - items[i] = &deploymentConfigs.Items[i] - } - - return items -} - // GetRolloutItem returns the rollout in given namespace func GetRolloutItem(clients kube.Clients, name string, namespace string) (runtime.Object, error) { rollout, err := clients.ArgoRolloutClient.ArgoprojV1alpha1().Rollouts(namespace).Get(context.TODO(), name, meta_v1.GetOptions{}) @@ -332,14 +301,6 @@ func GetStatefulSetAnnotations(item runtime.Object) map[string]string { return item.(*appsv1.StatefulSet).ObjectMeta.Annotations } -// GetDeploymentConfigAnnotations returns the annotations of given deploymentConfig -func GetDeploymentConfigAnnotations(item runtime.Object) map[string]string { - if item.(*openshiftv1.DeploymentConfig).ObjectMeta.Annotations == nil { - item.(*openshiftv1.DeploymentConfig).ObjectMeta.Annotations = make(map[string]string) - } - return item.(*openshiftv1.DeploymentConfig).ObjectMeta.Annotations -} - // GetRolloutAnnotations returns the annotations of given rollout func GetRolloutAnnotations(item runtime.Object) map[string]string { if item.(*argorolloutv1alpha1.Rollout).ObjectMeta.Annotations == nil { @@ -388,14 +349,6 @@ func GetStatefulSetPodAnnotations(item runtime.Object) map[string]string { return item.(*appsv1.StatefulSet).Spec.Template.ObjectMeta.Annotations } -// GetDeploymentConfigPodAnnotations returns the pod's annotations of given deploymentConfig -func GetDeploymentConfigPodAnnotations(item runtime.Object) map[string]string { - if item.(*openshiftv1.DeploymentConfig).Spec.Template.ObjectMeta.Annotations == nil { - item.(*openshiftv1.DeploymentConfig).Spec.Template.ObjectMeta.Annotations = make(map[string]string) - } - return item.(*openshiftv1.DeploymentConfig).Spec.Template.ObjectMeta.Annotations -} - // GetRolloutPodAnnotations returns the pod's annotations of given rollout func GetRolloutPodAnnotations(item runtime.Object) map[string]string { if item.(*argorolloutv1alpha1.Rollout).Spec.Template.ObjectMeta.Annotations == nil { @@ -429,11 +382,6 @@ func GetStatefulSetContainers(item runtime.Object) []v1.Container { return item.(*appsv1.StatefulSet).Spec.Template.Spec.Containers } -// GetDeploymentConfigContainers returns the containers of given deploymentConfig -func GetDeploymentConfigContainers(item runtime.Object) []v1.Container { - return item.(*openshiftv1.DeploymentConfig).Spec.Template.Spec.Containers -} - // GetRolloutContainers returns the containers of given rollout func GetRolloutContainers(item runtime.Object) []v1.Container { return item.(*argorolloutv1alpha1.Rollout).Spec.Template.Spec.Containers @@ -464,11 +412,6 @@ func GetStatefulSetInitContainers(item runtime.Object) []v1.Container { return item.(*appsv1.StatefulSet).Spec.Template.Spec.InitContainers } -// GetDeploymentConfigInitContainers returns the containers of given deploymentConfig -func GetDeploymentConfigInitContainers(item runtime.Object) []v1.Container { - return item.(*openshiftv1.DeploymentConfig).Spec.Template.Spec.InitContainers -} - // GetRolloutInitContainers returns the containers of given rollout func GetRolloutInitContainers(item runtime.Object) []v1.Container { return item.(*argorolloutv1alpha1.Rollout).Spec.Template.Spec.InitContainers @@ -575,19 +518,6 @@ func PatchStatefulSet(clients kube.Clients, namespace string, resource runtime.O return err } -// UpdateDeploymentConfig performs rolling upgrade on deploymentConfig -func UpdateDeploymentConfig(clients kube.Clients, namespace string, resource runtime.Object) error { - deploymentConfig := resource.(*openshiftv1.DeploymentConfig) - _, err := clients.OpenshiftAppsClient.AppsV1().DeploymentConfigs(namespace).Update(context.TODO(), deploymentConfig, meta_v1.UpdateOptions{FieldManager: "Reloader"}) - return err -} - -func PatchDeploymentConfig(clients kube.Clients, namespace string, resource runtime.Object, patchType patchtypes.PatchType, bytes []byte) error { - deploymentConfig := resource.(*openshiftv1.DeploymentConfig) - _, err := clients.OpenshiftAppsClient.AppsV1().DeploymentConfigs(namespace).Patch(context.TODO(), deploymentConfig.Name, patchType, bytes, meta_v1.PatchOptions{FieldManager: "Reloader"}) - return err -} - // UpdateRollout performs rolling upgrade on rollout func UpdateRollout(clients kube.Clients, namespace string, resource runtime.Object) error { rollout := resource.(*argorolloutv1alpha1.Rollout) @@ -631,11 +561,6 @@ func GetStatefulSetVolumes(item runtime.Object) []v1.Volume { return item.(*appsv1.StatefulSet).Spec.Template.Spec.Volumes } -// GetDeploymentConfigVolumes returns the Volumes of given deploymentConfig -func GetDeploymentConfigVolumes(item runtime.Object) []v1.Volume { - return item.(*openshiftv1.DeploymentConfig).Spec.Template.Spec.Volumes -} - // GetRolloutVolumes returns the Volumes of given rollout func GetRolloutVolumes(item runtime.Object) []v1.Volume { return item.(*argorolloutv1alpha1.Rollout).Spec.Template.Spec.Volumes diff --git a/internal/pkg/controller/controller_test.go b/internal/pkg/controller/controller_test.go index ccef5df..0876b2c 100644 --- a/internal/pkg/controller/controller_test.go +++ b/internal/pkg/controller/controller_test.go @@ -68,64 +68,6 @@ func TestMain(m *testing.M) { os.Exit(retCode) } -// Perform rolling upgrade on deploymentConfig and create pod annotation var upon updating the configmap -func TestControllerUpdatingConfigmapShouldCreatePodAnnotationInDeploymentConfig(t *testing.T) { - options.ReloadStrategy = constants.AnnotationsReloadStrategy - - // Don't run test on non-openshift environment - if !kube.IsOpenshift { - return - } - - // Creating configmap - configmapName := configmapNamePrefix + "-update-" + testutil.RandSeq(5) - configmapClient, err := testutil.CreateConfigMap(clients.KubernetesClient, namespace, configmapName, "www.google.com") - if err != nil { - t.Errorf("Error while creating the configmap %v", err) - } - - // Creating deployment - _, err = testutil.CreateDeploymentConfig(clients.OpenshiftAppsClient, configmapName, namespace, true) - if err != nil { - t.Errorf("Error in deploymentConfig creation: %v", err) - } - - // Updating configmap for first time - updateErr := testutil.UpdateConfigMap(configmapClient, namespace, configmapName, "", "www.stakater.com") - if updateErr != nil { - t.Errorf("Configmap was not updated") - } - - // Verifying deployment update - logrus.Infof("Verifying pod annotation has been created") - shaData := testutil.ConvertResourceToSHA(testutil.ConfigmapResourceType, namespace, configmapName, "www.stakater.com") - config := util.Config{ - Namespace: namespace, - ResourceName: configmapName, - SHAValue: shaData, - Annotation: options.ConfigmapUpdateOnChangeAnnotation, - } - deploymentConfigFuncs := handler.GetDeploymentConfigRollingUpgradeFuncs() - updated := testutil.VerifyResourceAnnotationUpdate(clients, config, deploymentConfigFuncs) - if !updated { - t.Errorf("DeploymentConfig was not updated") - } - time.Sleep(sleepDuration) - - // Deleting deployment - err = testutil.DeleteDeploymentConfig(clients.OpenshiftAppsClient, namespace, configmapName) - if err != nil { - logrus.Errorf("Error while deleting the deploymentConfig %v", err) - } - - // Deleting configmap - err = testutil.DeleteConfigMap(clients.KubernetesClient, namespace, configmapName) - if err != nil { - logrus.Errorf("Error while deleting the configmap %v", err) - } - time.Sleep(sleepDuration) -} - // Perform rolling upgrade on deployment and create pod annotation var upon updating the configmap func TestControllerUpdatingConfigmapShouldCreatePodAnnotationInDeployment(t *testing.T) { options.ReloadStrategy = constants.AnnotationsReloadStrategy @@ -1078,64 +1020,6 @@ func TestControllerUpdatingSecretShouldCreatePodAnnotationInStatefulSet(t *testi time.Sleep(sleepDuration) } -// Perform rolling upgrade on deploymentConfig and create env var upon updating the configmap -func TestControllerUpdatingConfigmapShouldCreateEnvInDeploymentConfig(t *testing.T) { - options.ReloadStrategy = constants.EnvVarsReloadStrategy - - // Don't run test on non-openshift environment - if !kube.IsOpenshift { - return - } - - // Creating configmap - configmapName := configmapNamePrefix + "-update-" + testutil.RandSeq(5) - configmapClient, err := testutil.CreateConfigMap(clients.KubernetesClient, namespace, configmapName, "www.google.com") - if err != nil { - t.Errorf("Error while creating the configmap %v", err) - } - - // Creating deployment - _, err = testutil.CreateDeploymentConfig(clients.OpenshiftAppsClient, configmapName, namespace, true) - if err != nil { - t.Errorf("Error in deploymentConfig creation: %v", err) - } - - // Updating configmap for first time - updateErr := testutil.UpdateConfigMap(configmapClient, namespace, configmapName, "", "www.stakater.com") - if updateErr != nil { - t.Errorf("Configmap was not updated") - } - - // Verifying deployment update - logrus.Infof("Verifying env var has been created") - shaData := testutil.ConvertResourceToSHA(testutil.ConfigmapResourceType, namespace, configmapName, "www.stakater.com") - config := util.Config{ - Namespace: namespace, - ResourceName: configmapName, - SHAValue: shaData, - Annotation: options.ConfigmapUpdateOnChangeAnnotation, - } - deploymentConfigFuncs := handler.GetDeploymentConfigRollingUpgradeFuncs() - updated := testutil.VerifyResourceEnvVarUpdate(clients, config, constants.ConfigmapEnvVarPostfix, deploymentConfigFuncs) - if !updated { - t.Errorf("DeploymentConfig was not updated") - } - time.Sleep(sleepDuration) - - // Deleting deployment - err = testutil.DeleteDeploymentConfig(clients.OpenshiftAppsClient, namespace, configmapName) - if err != nil { - logrus.Errorf("Error while deleting the deploymentConfig %v", err) - } - - // Deleting configmap - err = testutil.DeleteConfigMap(clients.KubernetesClient, namespace, configmapName) - if err != nil { - logrus.Errorf("Error while deleting the configmap %v", err) - } - time.Sleep(sleepDuration) -} - // Perform rolling upgrade on deployment and create env var upon updating the configmap func TestControllerUpdatingConfigmapShouldCreateEnvInDeployment(t *testing.T) { options.ReloadStrategy = constants.EnvVarsReloadStrategy diff --git a/internal/pkg/handler/upgrade.go b/internal/pkg/handler/upgrade.go index 508f926..b87a859 100644 --- a/internal/pkg/handler/upgrade.go +++ b/internal/pkg/handler/upgrade.go @@ -22,9 +22,11 @@ import ( "github.com/stakater/Reloader/internal/pkg/util" "github.com/stakater/Reloader/pkg/kube" v1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" patchtypes "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/record" "k8s.io/client-go/util/retry" ) @@ -119,24 +121,6 @@ func GetStatefulSetRollingUpgradeFuncs() callbacks.RollingUpgradeFuncs { } } -// GetDeploymentConfigRollingUpgradeFuncs returns all callback funcs for a deploymentConfig -func GetDeploymentConfigRollingUpgradeFuncs() callbacks.RollingUpgradeFuncs { - return callbacks.RollingUpgradeFuncs{ - ItemFunc: callbacks.GetDeploymentConfigItem, - ItemsFunc: callbacks.GetDeploymentConfigItems, - AnnotationsFunc: callbacks.GetDeploymentConfigAnnotations, - PodAnnotationsFunc: callbacks.GetDeploymentConfigPodAnnotations, - ContainersFunc: callbacks.GetDeploymentConfigContainers, - InitContainersFunc: callbacks.GetDeploymentConfigInitContainers, - UpdateFunc: callbacks.UpdateDeploymentConfig, - PatchFunc: callbacks.PatchDeploymentConfig, - PatchTemplatesFunc: callbacks.GetPatchTemplates, - VolumesFunc: callbacks.GetDeploymentConfigVolumes, - ResourceType: "DeploymentConfig", - SupportsPatch: true, - } -} - // GetArgoRolloutRollingUpgradeFuncs returns all callback funcs for a rollout func GetArgoRolloutRollingUpgradeFuncs() callbacks.RollingUpgradeFuncs { return callbacks.RollingUpgradeFuncs{ @@ -210,13 +194,6 @@ func doRollingUpgrade(config util.Config, collectors metrics.Collectors, recorde return err } - if kube.IsOpenshift { - err = rollingUpgrade(clients, config, GetDeploymentConfigRollingUpgradeFuncs(), collectors, recorder, invoke) - if err != nil { - return err - } - } - if options.IsArgoRollouts == "true" { err = rollingUpgrade(clients, config, GetArgoRolloutRollingUpgradeFuncs(), collectors, recorder, invoke) if err != nil { @@ -228,7 +205,6 @@ func doRollingUpgrade(config util.Config, collectors metrics.Collectors, recorde } func rollingUpgrade(clients kube.Clients, config util.Config, upgradeFuncs callbacks.RollingUpgradeFuncs, collectors metrics.Collectors, recorder record.EventRecorder, strategy invokeStrategy) error { - err := PerformAction(clients, config, upgradeFuncs, collectors, recorder, strategy) if err != nil { logrus.Errorf("Rolling upgrade for '%s' failed with error = %v", config.ResourceName, err) @@ -241,10 +217,9 @@ func PerformAction(clients kube.Clients, config util.Config, upgradeFuncs callba items := upgradeFuncs.ItemsFunc(clients, config.Namespace) for _, item := range items { - err := retry.RetryOnConflict(retry.DefaultRetry, func() error { - return upgradeResource(clients, config, upgradeFuncs, collectors, recorder, strategy, item) + err := retryOnConflict(retry.DefaultRetry, func(fetchResource bool) error { + return upgradeResource(clients, config, upgradeFuncs, collectors, recorder, strategy, item, fetchResource) }) - if err != nil { return err } @@ -253,16 +228,40 @@ func PerformAction(clients kube.Clients, config util.Config, upgradeFuncs callba return nil } -func upgradeResource(clients kube.Clients, config util.Config, upgradeFuncs callbacks.RollingUpgradeFuncs, collectors metrics.Collectors, recorder record.EventRecorder, strategy invokeStrategy, resource runtime.Object) error { +func retryOnConflict(backoff wait.Backoff, fn func(_ bool) error) error { + var lastError error + fetchResource := false // do not fetch resource on first attempt, already done by ItemsFunc + err := wait.ExponentialBackoff(backoff, func() (bool, error) { + err := fn(fetchResource) + fetchResource = true + switch { + case err == nil: + return true, nil + case apierrors.IsConflict(err): + lastError = err + return false, nil + default: + return false, err + } + }) + if wait.Interrupted(err) { + err = lastError + } + return err +} + +func upgradeResource(clients kube.Clients, config util.Config, upgradeFuncs callbacks.RollingUpgradeFuncs, collectors metrics.Collectors, recorder record.EventRecorder, strategy invokeStrategy, resource runtime.Object, fetchResource bool) error { accessor, err := meta.Accessor(resource) if err != nil { return err } resourceName := accessor.GetName() - resource, err = upgradeFuncs.ItemFunc(clients, resourceName, config.Namespace) - if err != nil { - return err + if fetchResource { + resource, err = upgradeFuncs.ItemFunc(clients, resourceName, config.Namespace) + if err != nil { + return err + } } // find correct annotation and update the resource diff --git a/internal/pkg/handler/upgrade_test.go b/internal/pkg/handler/upgrade_test.go index 9817f21..1d68a3e 100644 --- a/internal/pkg/handler/upgrade_test.go +++ b/internal/pkg/handler/upgrade_test.go @@ -1441,6 +1441,18 @@ func TestRollingUpgradeForDeploymentWithConfigmapUsingArs(t *testing.T) { deploymentFuncs := GetDeploymentRollingUpgradeFuncs() collectors := getCollectors() + itemCalled := 0 + itemsCalled := 0 + + deploymentFuncs.ItemFunc = func(client kube.Clients, namespace string, name string) (runtime.Object, error) { + itemCalled++ + return callbacks.GetDeploymentItem(client, namespace, name) + } + deploymentFuncs.ItemsFunc = func(client kube.Clients, namespace string) []runtime.Object { + itemsCalled++ + return callbacks.GetDeploymentItems(client, namespace) + } + err := PerformAction(clients, config, deploymentFuncs, collectors, nil, invokeReloadStrategy) time.Sleep(5 * time.Second) if err != nil { @@ -1460,6 +1472,10 @@ func TestRollingUpgradeForDeploymentWithConfigmapUsingArs(t *testing.T) { if promtestutil.ToFloat64(collectors.ReloadedByNamespace.With(prometheus.Labels{"success": "true", "namespace": arsNamespace})) != 1 { t.Errorf("Counter by namespace was not increased") } + + assert.Equal(t, 0, itemCalled, "ItemFunc should not be called") + assert.Equal(t, 2, itemsCalled, "ItemsFunc should be called twice") + testRollingUpgradeInvokeDeleteStrategyArs(t, clients, config, deploymentFuncs, collectors, envVarPostfix) } @@ -1474,6 +1490,18 @@ func TestRollingUpgradeForDeploymentWithPatchAndRetryUsingArs(t *testing.T) { assert.True(t, deploymentFuncs.SupportsPatch) assert.NotEmpty(t, deploymentFuncs.PatchTemplatesFunc().AnnotationTemplate) + itemCalled := 0 + itemsCalled := 0 + + deploymentFuncs.ItemFunc = func(client kube.Clients, namespace string, name string) (runtime.Object, error) { + itemCalled++ + return callbacks.GetDeploymentItem(client, namespace, name) + } + deploymentFuncs.ItemsFunc = func(client kube.Clients, namespace string) []runtime.Object { + itemsCalled++ + return callbacks.GetDeploymentItems(client, namespace) + } + patchCalled := 0 deploymentFuncs.PatchFunc = func(client kube.Clients, namespace string, resource runtime.Object, patchType patchtypes.PatchType, bytes []byte) error { patchCalled++ @@ -1498,7 +1526,9 @@ func TestRollingUpgradeForDeploymentWithPatchAndRetryUsingArs(t *testing.T) { t.Errorf("Rolling upgrade failed for Deployment with Configmap") } - assert.Equal(t, 2, patchCalled) + assert.Equal(t, 1, itemCalled, "ItemFunc should be called once") + assert.Equal(t, 1, itemsCalled, "ItemsFunc should be called once") + assert.Equal(t, 2, patchCalled, "PatchFunc should be called twice") deploymentFuncs = GetDeploymentRollingUpgradeFuncs() testRollingUpgradeWithPatchAndInvokeDeleteStrategyArs(t, clients, config, deploymentFuncs, collectors, envVarPostfix) @@ -2204,6 +2234,18 @@ func TestRollingUpgradeForDaemonSetWithConfigmapUsingArs(t *testing.T) { daemonSetFuncs := GetDaemonSetRollingUpgradeFuncs() collectors := getCollectors() + itemCalled := 0 + itemsCalled := 0 + + daemonSetFuncs.ItemFunc = func(client kube.Clients, namespace string, name string) (runtime.Object, error) { + itemCalled++ + return callbacks.GetDaemonSetItem(client, namespace, name) + } + daemonSetFuncs.ItemsFunc = func(client kube.Clients, namespace string) []runtime.Object { + itemsCalled++ + return callbacks.GetDaemonSetItems(client, namespace) + } + err := PerformAction(clients, config, daemonSetFuncs, collectors, nil, invokeReloadStrategy) time.Sleep(5 * time.Second) if err != nil { @@ -2224,6 +2266,9 @@ func TestRollingUpgradeForDaemonSetWithConfigmapUsingArs(t *testing.T) { t.Errorf("Counter by namespace was not increased") } + assert.Equal(t, 0, itemCalled, "ItemFunc should not be called") + assert.Equal(t, 2, itemsCalled, "ItemsFunc should be called twice") + testRollingUpgradeInvokeDeleteStrategyArs(t, clients, config, daemonSetFuncs, collectors, envVarPostfix) } @@ -2235,6 +2280,18 @@ func TestRollingUpgradeForDaemonSetWithPatchAndRetryUsingArs(t *testing.T) { config := getConfigWithAnnotations(envVarPostfix, arsConfigmapName, shaData, options.ConfigmapUpdateOnChangeAnnotation, options.ConfigmapReloaderAutoAnnotation) daemonSetFuncs := GetDaemonSetRollingUpgradeFuncs() + itemCalled := 0 + itemsCalled := 0 + + daemonSetFuncs.ItemFunc = func(client kube.Clients, namespace string, name string) (runtime.Object, error) { + itemCalled++ + return callbacks.GetDaemonSetItem(client, namespace, name) + } + daemonSetFuncs.ItemsFunc = func(client kube.Clients, namespace string) []runtime.Object { + itemsCalled++ + return callbacks.GetDaemonSetItems(client, namespace) + } + assert.True(t, daemonSetFuncs.SupportsPatch) assert.NotEmpty(t, daemonSetFuncs.PatchTemplatesFunc().AnnotationTemplate) @@ -2263,7 +2320,9 @@ func TestRollingUpgradeForDaemonSetWithPatchAndRetryUsingArs(t *testing.T) { t.Errorf("Rolling upgrade failed for DaemonSet with configmap") } - assert.Equal(t, 2, patchCalled) + assert.Equal(t, 1, itemCalled, "ItemFunc should be called once") + assert.Equal(t, 1, itemsCalled, "ItemsFunc should be called once") + assert.Equal(t, 2, patchCalled, "PatchFunc should be called twice") daemonSetFuncs = GetDeploymentRollingUpgradeFuncs() testRollingUpgradeWithPatchAndInvokeDeleteStrategyArs(t, clients, config, daemonSetFuncs, collectors, envVarPostfix) @@ -2406,6 +2465,18 @@ func TestRollingUpgradeForStatefulSetWithConfigmapUsingArs(t *testing.T) { statefulSetFuncs := GetStatefulSetRollingUpgradeFuncs() collectors := getCollectors() + itemCalled := 0 + itemsCalled := 0 + + statefulSetFuncs.ItemFunc = func(client kube.Clients, namespace string, name string) (runtime.Object, error) { + itemCalled++ + return callbacks.GetStatefulSetItem(client, namespace, name) + } + statefulSetFuncs.ItemsFunc = func(client kube.Clients, namespace string) []runtime.Object { + itemsCalled++ + return callbacks.GetStatefulSetItems(client, namespace) + } + err := PerformAction(clients, config, statefulSetFuncs, collectors, nil, invokeReloadStrategy) time.Sleep(5 * time.Second) if err != nil { @@ -2426,6 +2497,9 @@ func TestRollingUpgradeForStatefulSetWithConfigmapUsingArs(t *testing.T) { t.Errorf("Counter by namespace was not increased") } + assert.Equal(t, 0, itemCalled, "ItemFunc should not be called") + assert.Equal(t, 2, itemsCalled, "ItemsFunc should be called twice") + testRollingUpgradeInvokeDeleteStrategyArs(t, clients, config, statefulSetFuncs, collectors, envVarPostfix) } @@ -2437,6 +2511,18 @@ func TestRollingUpgradeForStatefulSetWithPatchAndRetryUsingArs(t *testing.T) { config := getConfigWithAnnotations(envVarPostfix, arsConfigmapName, shaData, options.ConfigmapUpdateOnChangeAnnotation, options.ConfigmapReloaderAutoAnnotation) statefulSetFuncs := GetStatefulSetRollingUpgradeFuncs() + itemCalled := 0 + itemsCalled := 0 + + statefulSetFuncs.ItemFunc = func(client kube.Clients, namespace string, name string) (runtime.Object, error) { + itemCalled++ + return callbacks.GetStatefulSetItem(client, namespace, name) + } + statefulSetFuncs.ItemsFunc = func(client kube.Clients, namespace string) []runtime.Object { + itemsCalled++ + return callbacks.GetStatefulSetItems(client, namespace) + } + assert.True(t, statefulSetFuncs.SupportsPatch) assert.NotEmpty(t, statefulSetFuncs.PatchTemplatesFunc().AnnotationTemplate) @@ -2465,7 +2551,9 @@ func TestRollingUpgradeForStatefulSetWithPatchAndRetryUsingArs(t *testing.T) { t.Errorf("Rolling upgrade failed for StatefulSet with configmap") } - assert.Equal(t, 2, patchCalled) + assert.Equal(t, 1, itemCalled, "ItemFunc should be called once") + assert.Equal(t, 1, itemsCalled, "ItemsFunc should be called once") + assert.Equal(t, 2, patchCalled, "PatchFunc should be called twice") statefulSetFuncs = GetDeploymentRollingUpgradeFuncs() testRollingUpgradeWithPatchAndInvokeDeleteStrategyArs(t, clients, config, statefulSetFuncs, collectors, envVarPostfix)