From 193519abc07487812fed4b4d26667fb6094b8ade Mon Sep 17 00:00:00 2001 From: Vadim Stepanov Date: Mon, 18 Jul 2022 14:24:03 +0100 Subject: [PATCH] Add version mismatch warning (#241) * add version mismatch warning * add link to update docs --- engine/apps/api/serializers/organization.py | 21 ++++++++++++- .../DefaultPageLayout/DefaultPageLayout.tsx | 31 ++++++++++++++----- grafana-plugin/src/state/rootBaseStore.ts | 4 +++ 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/engine/apps/api/serializers/organization.py b/engine/apps/api/serializers/organization.py index 85d63fdf..4868ee40 100644 --- a/engine/apps/api/serializers/organization.py +++ b/engine/apps/api/serializers/organization.py @@ -3,6 +3,7 @@ from datetime import timedelta import humanize import pytz from django.apps import apps +from django.conf import settings from django.utils import timezone from rest_framework import fields, serializers @@ -109,7 +110,25 @@ class CurrentOrganizationSerializer(OrganizationSerializer): def get_limits(self, obj): user = self.context["request"].user - return obj.notifications_limit_web_report(user) + if not settings.OSS_INSTALLATION: + return obj.notifications_limit_web_report(user) + + # show a version warning on OSS installations in case backend and frontend are different versions + frontend_version = self.context["request"].headers.get("X-OnCall-Plugin-Version") + backend_version = settings.VERSION + version_warning = {} + if backend_version and frontend_version and backend_version != frontend_version: + text = ( + "Version mismatch! Please make sure you have the same versions of the Grafana OnCall plugin " + "and Grafana OnCall engine, " + "otherwise there could be issues with your Grafana OnCall installation! " + f"Current plugin version: {frontend_version}, current engine version: {backend_version}. " + "Please see the update instructions: " + "https://grafana.com/docs/oncall/latest/open-source/#update-grafana-oncall-oss" + ) + version_warning = {"period_title": "Version mismatch", "show_limits_warning": True, "warning_text": text} + + return version_warning or obj.notifications_limit_web_report(user) def get_env_status(self, obj): LiveSetting.populate_settings_if_needed() diff --git a/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.tsx b/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.tsx index 7b2c23a6..2f4cf07f 100644 --- a/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.tsx +++ b/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.tsx @@ -1,3 +1,4 @@ +import plugin from '../../../package.json'; // eslint-disable-line import React, { FC, useEffect, useState, useCallback } from 'react'; import { AppRootProps } from '@grafana/data'; @@ -88,14 +89,30 @@ const DefaultPageLayout: FC = observer((props) => { /> )} - {currentTeam?.limits.show_limits_warning && !getItem(currentTeam.limits.warning_text) && ( - + {store.backendVersion && plugin?.version && store.backendVersion !== plugin?.version && ( + + Please make sure you have the same versions of the Grafana OnCall plugin and the Grafana OnCall engine, + otherwise there could be issues with your Grafana OnCall installation! +
+ {`Current plugin version: ${plugin.version}, current engine version: ${store.backendVersion}`} +
+ Please see{' '} + + the update instructions + + . +
)} + {currentTeam?.limits.show_limits_warning && + currentTeam?.limits.period_title !== 'Version mismatch' && // don't show version mismatch warning twice + !getItem(currentTeam.limits.warning_text) && ( + + )} {Boolean( currentTeam && currentUser && diff --git a/grafana-plugin/src/state/rootBaseStore.ts b/grafana-plugin/src/state/rootBaseStore.ts index 331f6ca1..0c2e933f 100644 --- a/grafana-plugin/src/state/rootBaseStore.ts +++ b/grafana-plugin/src/state/rootBaseStore.ts @@ -38,6 +38,9 @@ export class RootBaseStore { @observable appLoading = true; + @observable + backendVersion = ''; + @observable pluginIsInitialized = true; @@ -134,6 +137,7 @@ export class RootBaseStore { this.initializationError = 'OnCall was not able to connect back to this Grafana'; return; } + this.backendVersion = get_sync_response.version; this.appLoading = false; }