Add labels feature flag for list of organizations (#3246)

# What this PR does
Adds a flag that allows to enable labels feature for the list of
organizations

## Which issue(s) this PR fixes
https://github.com/grafana/oncall-private/issues/2226

## Checklist

- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
This commit is contained in:
Yulya Artyukhina 2023-11-02 10:52:32 +01:00 committed by GitHub
parent fa68f1f2ae
commit 66a898df7d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 57 additions and 10 deletions

View file

@ -192,7 +192,7 @@ def test_labels_feature_false(
make_alert_receive_channel,
settings,
):
setattr(settings, "FEATURE_LABELS_ENABLED", False)
setattr(settings, "FEATURE_LABELS_ENABLED_FOR_ALL", False)
organization, user, token = make_organization_and_user_with_plugin_token()
client = APIClient()

View file

@ -2,7 +2,27 @@ import pytest
from apps.alerts.models import AlertReceiveChannel
from apps.labels.models import AlertReceiveChannelAssociatedLabel, AssociatedLabel, LabelValueCache
from apps.labels.utils import get_associating_label_model
from apps.labels.utils import get_associating_label_model, is_labels_feature_enabled
@pytest.mark.django_db
def test_labels_feature_flag(mock_is_labels_feature_enabled_for_org, make_organization, settings):
organization = make_organization()
# returns True if feature flag is enabled
assert settings.FEATURE_LABELS_ENABLED_FOR_ALL
assert organization.id not in settings.FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS
assert is_labels_feature_enabled(organization)
mock_is_labels_feature_enabled_for_org(organization.org_id)
# returns True if feature flag is disabled and organization is in the feature list
assert not settings.FEATURE_LABELS_ENABLED_FOR_ALL
assert organization.org_id in settings.FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS
assert is_labels_feature_enabled(organization)
mock_is_labels_feature_enabled_for_org(12345)
# returns False if feature flag is disabled and organization is not in the feature list
assert organization.org_id not in settings.FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS
assert not is_labels_feature_enabled(organization)
@pytest.mark.django_db

View file

@ -43,12 +43,18 @@ def get_associating_label_model(obj_model_name: str) -> typing.Type["AssociatedL
def is_labels_feature_enabled(organization) -> bool:
# check FEATURE_LABELS_ENABLED in settings
# checking labels feature flag per organization will be added later
"""
Checks if labels feature enabled for all organizations (FEATURE_LABELS_ENABLED_FOR_ALL).
If not, checks if current organization's grafana org_id is in the list of organizations labels feature enabled for
(FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS)
"""
logger.info(
"is_labels_feature_enabled: "
f"FEATURE_LABELS_ENABLED={settings.FEATURE_LABELS_ENABLED} "
f"FEATURE_LABELS_ENABLED_FOR_ALL={settings.FEATURE_LABELS_ENABLED_FOR_ALL}, "
f"organization in FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS="
f"{organization.id in settings.FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS}, "
f"organization={organization.id}"
)
return settings.FEATURE_LABELS_ENABLED
if not settings.FEATURE_LABELS_ENABLED_FOR_ALL:
return organization.org_id in settings.FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS
return settings.FEATURE_LABELS_ENABLED_FOR_ALL

View file

@ -1,5 +1,6 @@
import functools
import html
import json
import os
import random
import re
@ -112,6 +113,14 @@ def getenv_integer(variable_name: str, default: int) -> int:
return default
def getenv_list(variable_name: str, default: list) -> list:
value = os.environ.get(variable_name)
if value is None:
return default
return json.loads(value)
def batch_queryset(qs, batch_size=1000):
qs_count = qs.count()
for start in range(0, qs_count, batch_size):

View file

@ -180,7 +180,16 @@ def mock_apply_async(monkeypatch):
@pytest.fixture(autouse=True)
def mock_is_labels_feature_enabled(settings):
setattr(settings, "FEATURE_LABELS_ENABLED", True)
setattr(settings, "FEATURE_LABELS_ENABLED_FOR_ALL", True)
@pytest.fixture
def mock_is_labels_feature_enabled_for_org(settings):
def _mock_is_labels_feature_enabled_for_org(org_id):
setattr(settings, "FEATURE_LABELS_ENABLED_FOR_ALL", False)
setattr(settings, "FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS", [org_id])
return _mock_is_labels_feature_enabled_for_org
@pytest.fixture

View file

@ -7,7 +7,7 @@ from random import randrange
from celery.schedules import crontab
from firebase_admin import credentials, initialize_app
from common.utils import getenv_boolean, getenv_integer
from common.utils import getenv_boolean, getenv_integer, getenv_list
VERSION = "dev-oss"
SEND_ANONYMOUS_USAGE_STATS = getenv_boolean("SEND_ANONYMOUS_USAGE_STATS", default=True)
@ -66,9 +66,12 @@ FEATURE_MULTIREGION_ENABLED = getenv_boolean("FEATURE_MULTIREGION_ENABLED", defa
FEATURE_INBOUND_EMAIL_ENABLED = getenv_boolean("FEATURE_INBOUND_EMAIL_ENABLED", default=True)
FEATURE_PROMETHEUS_EXPORTER_ENABLED = getenv_boolean("FEATURE_PROMETHEUS_EXPORTER_ENABLED", default=False)
FEATURE_GRAFANA_ALERTING_V2_ENABLED = getenv_boolean("FEATURE_GRAFANA_ALERTING_V2_ENABLED", default=False)
FEATURE_LABELS_ENABLED = getenv_boolean("FEATURE_LABELS_ENABLED", default=False)
GRAFANA_CLOUD_ONCALL_HEARTBEAT_ENABLED = getenv_boolean("GRAFANA_CLOUD_ONCALL_HEARTBEAT_ENABLED", default=True)
GRAFANA_CLOUD_NOTIFICATIONS_ENABLED = getenv_boolean("GRAFANA_CLOUD_NOTIFICATIONS_ENABLED", default=True)
# Enable labels feature fo all organizations. This flag overrides FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS
FEATURE_LABELS_ENABLED_FOR_ALL = getenv_boolean("FEATURE_LABELS_ENABLED_FOR_ALL", default=False)
# Enable labels feature for organizations from the list. Use Grafana org_id, not OnCall id, for this flag
FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS = getenv_list("FEATURE_LABELS_ENABLED_FOR_GRAFANA_ORGS", default=list())
TWILIO_API_KEY_SID = os.environ.get("TWILIO_API_KEY_SID")
TWILIO_API_KEY_SECRET = os.environ.get("TWILIO_API_KEY_SECRET")