# What this PR does Will start persisting the `organization.is_grafana_irm_enabled` flag from the backend plugin's sync data that is sent to the oncall backend. The implications of this are that when `is_grafana_irm_enabled` is set to True, we will: - start using `grafana-irm-app` prefixed RBAC permissions (RBAC permissions for `grafana-irm-app`, as well as `grafana-oncall-app`, are already being synced to the OnCall backend since https://github.com/grafana/irm/pull/200 was merged/deployed) - start building UI URLs w/ `grafana-irm-app` instead of `grafana-oncall-app` ## Which issue(s) this PR closes Closes https://github.com/grafana/irm/issues/242 ## 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] Added the relevant release notes label (see labels prefixed w/ `release:`). These labels dictate how your PR will show up in the autogenerated release notes.
56 lines
2.4 KiB
Python
56 lines
2.4 KiB
Python
import logging
|
|
|
|
from celery.utils.log import get_task_logger
|
|
from django.conf import settings
|
|
|
|
from apps.grafana_plugin.helpers.client import GrafanaAPIClient
|
|
from apps.grafana_plugin.helpers.gcom import get_active_instance_ids
|
|
from apps.user_management.models import Organization
|
|
from common.custom_celery_tasks import shared_dedicated_queue_retry_task
|
|
|
|
logger = get_task_logger(__name__)
|
|
logger.setLevel(logging.DEBUG)
|
|
|
|
|
|
@shared_dedicated_queue_retry_task(autoretry_for=(Exception,), retry_backoff=True, max_retries=0)
|
|
def start_sync_organizations_v2():
|
|
organization_qs = Organization.objects.all()
|
|
active_instance_ids, is_cloud_configured = get_active_instance_ids()
|
|
if is_cloud_configured:
|
|
if not active_instance_ids:
|
|
logger.warning("Did not find any active instances!")
|
|
return
|
|
else:
|
|
logger.debug(f"Found {len(active_instance_ids)} active instances")
|
|
organization_qs = organization_qs.filter(stack_id__in=active_instance_ids)
|
|
|
|
logger.info(f"Found {len(organization_qs)} active organizations")
|
|
batch = []
|
|
batch_index = 0
|
|
task_countdown_seconds = 0
|
|
for org in organization_qs:
|
|
if GrafanaAPIClient.validate_grafana_token_format(org.api_token):
|
|
batch.append(org.pk)
|
|
if len(batch) == settings.SYNC_V2_BATCH_SIZE:
|
|
sync_organizations_v2.apply_async((batch,), countdown=task_countdown_seconds)
|
|
batch = []
|
|
batch_index += 1
|
|
if batch_index == settings.SYNC_V2_MAX_TASKS:
|
|
batch_index = 0
|
|
task_countdown_seconds += settings.SYNC_V2_PERIOD_SECONDS
|
|
else:
|
|
logger.info(f"Skipping stack_slug={org.stack_slug}, api_token format is invalid or not set")
|
|
if batch:
|
|
sync_organizations_v2.apply_async((batch,), countdown=task_countdown_seconds)
|
|
|
|
|
|
@shared_dedicated_queue_retry_task(autoretry_for=(Exception,), retry_backoff=True, max_retries=0)
|
|
def sync_organizations_v2(org_ids=None):
|
|
organization_qs = Organization.objects.filter(id__in=org_ids)
|
|
for org in organization_qs:
|
|
client = GrafanaAPIClient(api_url=org.grafana_url, api_token=org.api_token)
|
|
_, status = client.sync(org)
|
|
if status["status_code"] != 200:
|
|
logger.error(
|
|
f"Failed to request sync org_id={org.pk} stack_slug={org.stack_slug} status_code={status['status_code']} url={status['url']} message={status['message']}"
|
|
)
|