From 39f749980ceec1fbe294aa23168223d3eb485aa4 Mon Sep 17 00:00:00 2001 From: miki3421 <42601846+miki3421@users.noreply.github.com> Date: Thu, 1 Oct 2026 22:15:40 +0200 Subject: [PATCH 1/4] Provide valid Alertmanager routing without notification destinations --- openserverless/enterprise_util.py | 2 +- .../templates/alert-manager-02-cm.yaml | 10 +++-- tests/test_alertmanager_config.py | 37 +++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 tests/test_alertmanager_config.py diff --git a/openserverless/enterprise_util.py b/openserverless/enterprise_util.py index 64c65ba..c875265 100644 --- a/openserverless/enterprise_util.py +++ b/openserverless/enterprise_util.py @@ -185,7 +185,7 @@ def get_am_config_data(): "slack_api_url": cfg.get("monitoring.alert-manager.slack.slack_api_url","SLACK_API_URL",""), "slack_default": cfg.get("monitoring.alert-manager.slack.default") or False, "gmail": cfg.get("monitoring.alert-manager.gmail.enabled") or False, - "gmail_default": cfg.get("monitoring.alert-manager.gmail.false") or False, + "gmail_default": cfg.get("monitoring.alert-manager.gmail.default") or False, "email_recipients": cfg.get("monitoring.alert-manager.gmail.to"), "email_from": cfg.get("monitoring.alert-manager.gmail.from"), "gmail_username": cfg.get("monitoring.alert-manager.gmail.username","GMAIL_USERNAME",""), diff --git a/openserverless/templates/alert-manager-02-cm.yaml b/openserverless/templates/alert-manager-02-cm.yaml index 3f694d4..dfa92ad 100644 --- a/openserverless/templates/alert-manager-02-cm.yaml +++ b/openserverless/templates/alert-manager-02-cm.yaml @@ -34,6 +34,7 @@ data: {% endif %} receivers: + - name: discard {% if gmail %} - name: email-receiver email_configs: @@ -80,12 +81,13 @@ data: route: group_interval: 5m group_wait: 10s - {% if slack and slack_default %} - receiver: slack-notifications - {% endif %} {% if gmail and gmail_default %} receiver: email-receiver - {% endif %} + {% elif slack and slack_default %} + receiver: slack-notifications + {% else %} + receiver: discard + {% endif %} repeat_interval: 10m {% if slack or gmail %} diff --git a/tests/test_alertmanager_config.py b/tests/test_alertmanager_config.py new file mode 100644 index 0000000..021e43c --- /dev/null +++ b/tests/test_alertmanager_config.py @@ -0,0 +1,37 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import itertools +import unittest +from pathlib import Path +import jinja2 +import yaml + +class AlertmanagerConfigTests(unittest.TestCase): + def test_receiver_exists_for_every_notification_combination(self): + template = jinja2.Template((Path(__file__).resolve().parents[1] / "openserverless/templates/alert-manager-02-cm.yaml").read_text()) + for slack, gmail, slack_default, gmail_default in itertools.product([False, True], repeat=4): + with self.subTest(slack=slack, gmail=gmail, slack_default=slack_default, gmail_default=gmail_default): + rendered = template.render(slack=slack, gmail=gmail, slack_default=slack_default, gmail_default=gmail_default, + slack_api_url="https://example.test", slack_channel_name="#test", email_recipients="test@example.test", + email_from="test@example.test", gmail_username="test@example.test", gmail_password="test") + config = yaml.safe_load(yaml.safe_load(rendered)["data"]["alertmanager.yml"]) + names = {r["name"] for r in config["receivers"]} + expected = "email-receiver" if gmail and gmail_default else "slack-notifications" if slack and slack_default else "discard" + self.assertEqual(config["route"]["receiver"], expected) + for route in config["route"].get("routes", []): self.assertIn(route["receiver"], names) + discard = next(r for r in config["receivers"] if r["name"] == "discard") + self.assertEqual(discard, {"name": "discard"}) From acd8999380a78a2c5e0c25c1cc60d09ffefb9d1f Mon Sep 17 00:00:00 2001 From: miki3421 <42601846+miki3421@users.noreply.github.com> Date: Tue, 6 Oct 2026 11:40:57 +0200 Subject: [PATCH 2/4] Disable inherited workflows on RC7 lab branch --- .github/{workflows => upstream-workflows}/check.yml | 0 .github/{workflows => upstream-workflows}/image.yml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/{workflows => upstream-workflows}/check.yml (100%) rename .github/{workflows => upstream-workflows}/image.yml (100%) diff --git a/.github/workflows/check.yml b/.github/upstream-workflows/check.yml similarity index 100% rename from .github/workflows/check.yml rename to .github/upstream-workflows/check.yml diff --git a/.github/workflows/image.yml b/.github/upstream-workflows/image.yml similarity index 100% rename from .github/workflows/image.yml rename to .github/upstream-workflows/image.yml From 5d90448e7b433dd979d45f5becf234c6e33c1729 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 6 Oct 2026 15:04:21 +0200 Subject: [PATCH 3/4] fix: correct operator image build permissions --- Dockerfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6ba7402..c0b1b50 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,7 +50,10 @@ ADD --chown=openserverless:openserverless deploy/postgres-backup /home/openserve ADD --chown=openserverless:openserverless run.sh dbinit.sh cron.sh pyproject.toml poetry.lock whisk-system.sh /home/openserverless/ # prepares the required folders to deploy the whisk-system actions -RUN mkdir /home/openserverless/deploy/whisk-system +USER root +RUN mkdir -p /home/openserverless/deploy/whisk-system && \ + chown openserverless:openserverless /home/openserverless/deploy/whisk-system +USER openserverless ADD --chown=openserverless:openserverless actions /home/openserverless/actions # enterprise specific @@ -72,6 +75,9 @@ ADD --chown=openserverless:openserverless quota.sh /home/openserverless/ # Python dependencies FROM python:3.12-slim-bookworm AS deps +RUN groupadd --gid 1001 openserverless && \ + useradd -m openserverless -s /bin/bash --uid 1001 --gid 1001 --groups root + # --- Install Poetry --- ARG POETRY_VERSION=2.3.2 ENV POETRY_HOME=/opt/poetry From c20503e849a25ef807798716d02dfbe8f500e25e Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 6 Oct 2026 15:07:24 +0200 Subject: [PATCH 4/4] chore: restore Apache workflow paths on PR branch --- .github/{upstream-workflows => workflows}/check.yml | 0 .github/{upstream-workflows => workflows}/image.yml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/{upstream-workflows => workflows}/check.yml (100%) rename .github/{upstream-workflows => workflows}/image.yml (100%) diff --git a/.github/upstream-workflows/check.yml b/.github/workflows/check.yml similarity index 100% rename from .github/upstream-workflows/check.yml rename to .github/workflows/check.yml diff --git a/.github/upstream-workflows/image.yml b/.github/workflows/image.yml similarity index 100% rename from .github/upstream-workflows/image.yml rename to .github/workflows/image.yml