Skip to content

Commit

Permalink
Add support for Grafana 8.4 org preferences and default timezone
Browse files Browse the repository at this point in the history
  • Loading branch information
Stephen Fox committed Jun 2, 2023
1 parent 54e540a commit 3113efc
Show file tree
Hide file tree
Showing 13 changed files with 229 additions and 151 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# connector-grafana

## Change Log
+ **1.7.10** - Changed Org preference update to add the homeDashboardId to support Grafana 8.X. Added default timezone option in configuration
+ **1.7.9** - Fixed unmatched curly brace when logging org preference update failure
+ **1.7.8** - Set the Grafana loki password as confidential and not required
+ **1.7.6** - Set Home Dashboard Organization Preference when a datasource is created, updated, or read and not set
Expand Down
6 changes: 6 additions & 0 deletions configuration.structure.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ custom:
default: 'Viewer'
display: 'defaultOrgRole.display'
help: 'defaultOrgRole.help'
defaultTimeZone:
type: string
order: 110
default: 'UTC'
display: 'defaultTimeZone.display'
help: 'defaultTimeZone.help'
updateDashBoards:
type: boolean
order: 150
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
project_version=1.7.9
project_version=1.7.10
base_connector_version=3.0.3
config_plugin_version=3.0.3
test_connector_version=3.0.1
local_build_version=1049
local_build_version=1050
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ public enum GrafanaOrgAttribute
state,
uuid,
zipCode,
homeDashboardUID
homeDashboardUID,
homeDashboardId
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ public static String[] decomposeID(String composed)
* @param dashboard The dashboard raw JSON with datasource uid already embedded
* @return Dashboard uid
*/
public String createDashboard(GrafanaDriver driver, String orgId, String dashboard)
public GrafanaDashboardResponse createDashboard(GrafanaDriver driver, String orgId, String dashboard)
{
String dashboardUID = null;
GrafanaDashboardResponse dashboardInfo = null;
RestResponseData<GrafanaDashboardResponse> rd;
Map<String, String> headers = driver.getAdminHeaders();
headers.put(ORG_HEADER, String.valueOf(orgId));
Expand All @@ -63,11 +63,12 @@ public String createDashboard(GrafanaDriver driver, String orgId, String dashboa
GrafanaDashboardResponse.class,
dashboard,
headers);

if ( rd != null && rd.getResponseObject() != null )
{
dashboardUID = rd.getResponseObject().getUid();
dashboardInfo = rd.getResponseObject();
}
return dashboardUID ;
return dashboardInfo ;
}
@Override
public String create(GrafanaDriver driver, GrafanaDataSource dataSource) throws ConnectorException
Expand Down Expand Up @@ -164,7 +165,7 @@ public String create(GrafanaDriver driver, GrafanaDataSource dataSource) throws
// dashboard templete
try
{
String dashboardUID = null;
GrafanaDashboardResponse dashboardInfo = null;
if ( driver.getConfiguration().getUpdateDashBoards() != null
&& driver.getConfiguration().getUpdateDashBoards()
&& driver.getConfiguration().getDashboardTemplate() != null
Expand All @@ -173,12 +174,13 @@ public String create(GrafanaDriver driver, GrafanaDataSource dataSource) throws
String template = driver.getConfiguration().getDashboardTemplate();
template = template.replace("<DataSourceUID>", createInfo.getDatasource().getUid());
template = template.replace("__DataSourceUID__", createInfo.getDatasource().getUid());
dashboardUID = createDashboard(driver, String.valueOf(createInfo.getDatasource().getOrgId()), template);
if ( dashboardUID != null && dashboardUID.trim().length() > 0 )
dashboardInfo = createDashboard(driver, String.valueOf(createInfo.getDatasource().getOrgId()), template);
if ( dashboardInfo != null )
{
GrafanaOrgPreferences preferences = new GrafanaOrgPreferences();
preferences.setHomeDashboardUID(dashboardUID);
GrafanaOrgInvocator.updateOrganizationPreferences(driver, createInfo.getDatasource().getOrgId(), preferences);
GrafanaOrgPreferences current = GrafanaOrgInvocator.getOrganizationPreferences(driver, dataSource.getOrgId());
GrafanaOrgPreferences preferences = GrafanaOrgInvocator.setOrganizationPreferences(driver,
current, dashboardInfo.getId(), dashboardInfo.getUid());
GrafanaOrgInvocator.updateOrganizationPreferences(driver, dataSource.getOrgId(), preferences);
}
}
}
Expand Down Expand Up @@ -345,12 +347,13 @@ else if ( actual.getSecureJsonData() != null && actual.getSecureJsonData().size(
String template = driver.getConfiguration().getDashboardTemplate();
template = template.replace("<DataSourceUID>", dataSource.getUid());
template = template.replace("__DataSourceUID__", dataSource.getUid());
String dashboardUID = createDashboard(driver, String.valueOf(dataSource.getOrgId()), template);
if ( dashboardUID != null && dashboardUID.trim().length() > 0 )
GrafanaDashboardResponse dashboardInfo = createDashboard(driver, String.valueOf(dataSource.getOrgId()), template);
if ( dashboardInfo != null )
{
GrafanaOrgPreferences preferences = new GrafanaOrgPreferences();
preferences.setHomeDashboardUID(dashboardUID);
GrafanaOrgInvocator.updateOrganizationPreferences(driver, Integer.valueOf(orgId.trim()), preferences);
GrafanaOrgPreferences current = GrafanaOrgInvocator.getOrganizationPreferences(driver, dataSource.getOrgId());
GrafanaOrgPreferences preferences = GrafanaOrgInvocator.setOrganizationPreferences(driver,
current, dashboardInfo.getId(), dashboardInfo.getUid());
GrafanaOrgInvocator.updateOrganizationPreferences(driver, dataSource.getOrgId(), preferences);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,11 @@
import com.exclamationlabs.connid.base.connector.driver.rest.RestResponseData;
import com.exclamationlabs.connid.base.connector.results.ResultsFilter;
import com.exclamationlabs.connid.base.connector.results.ResultsPaginator;
import com.exclamationlabs.connid.base.grafana.model.GrafanaDashboard;
import com.exclamationlabs.connid.base.grafana.model.GrafanaHealth;
import com.exclamationlabs.connid.base.grafana.model.GrafanaOrg;
import com.exclamationlabs.connid.base.grafana.model.GrafanaOrgPreferences;
import com.exclamationlabs.connid.base.grafana.model.response.GrafanaDashboardResponse;
import com.exclamationlabs.connid.base.grafana.model.response.GrafanaOrgPreferencesResponse;
import com.exclamationlabs.connid.base.grafana.model.response.GrafanaSearchResponse;
import com.exclamationlabs.connid.base.grafana.model.response.GrafanaStandardResponse;
import com.google.gson.Gson;
import com.google.gson.internal.LinkedHashTreeMap;
import org.apache.commons.lang3.StringUtils;
import org.identityconnectors.common.logging.Log;
import org.identityconnectors.framework.common.exceptions.ConnectorException;
Expand Down Expand Up @@ -164,6 +160,12 @@ public Set<GrafanaOrg> getAll(GrafanaDriver driver, ResultsFilter resultsFilter,
return grafanaOrgs;
}

/**
* @param driver
* @param org
* @param dashboardInfo
* @return
*/
public List<String> getDashboards(GrafanaDriver driver, GrafanaOrg org, List<GrafanaSearchResponse> dashboardInfo)
{
List<String> list = new ArrayList<>();
Expand All @@ -188,6 +190,22 @@ public List<String> getDashboards(GrafanaDriver driver, GrafanaOrg org, List<Gra
return list;
}

/**
* Gets the Grafana Health which includes the version number
* @param driver
* @return GrafanaHealth Object
*/
public static GrafanaHealth getHealth(GrafanaDriver driver)
{
RestResponseData<GrafanaHealth> rd;
Map<String, String> headers = driver.getAdminHeaders();
rd = driver.executeGetRequest("/health",
GrafanaHealth.class,
headers);
GrafanaHealth health = rd.getResponseObject();
return health;
}

/**
* Get a Single Org from the Grafana Service
* @param driver The Rest Driver for the Connector
Expand Down Expand Up @@ -234,27 +252,15 @@ else if ( orgId > 0 )
driver.getAdminHeaders());
org = rd.getResponseObject();
}

if ( org != null )
{
// Get the Org Dashboards and update the GrafanaOrg Object Type
List<GrafanaSearchResponse> dashboardList = findDashboards(driver, org);
List<String> dashboards = getDashboards(driver, org, dashboardList);
org.setDashboards(dashboards);
// Get the Org Preferences and potentially update
GrafanaOrgPreferencesResponse current = getOrganizationPreferences(driver, org.getId());
if ( current != null
&& (current.getHomeDashboardUID() == null || current.getHomeDashboardUID().trim().length() == 0 )
&& dashboardList != null
&& dashboardList.size() > 0 )
{
GrafanaOrgPreferences preferences = new GrafanaOrgPreferences();
preferences.setHomeDashboardUID(dashboardList.get(0).getUid());
updateOrganizationPreferences(driver, org.getId(), preferences);
}
else if (current != null && current.getHomeDashboardUID() != null && current.getHomeDashboardUID().trim().length() > 0 )
{
org.setHomeDashboardUID(current.getHomeDashboardUID());
}
// Get the Org Preferences and potentially update the home dashboard
updateOrganizationPreferences(driver, org, dashboardList);
}
}
return org;
Expand Down Expand Up @@ -289,24 +295,12 @@ public GrafanaOrg getOneByName(GrafanaDriver driver, String name) throws Connect

if ( org != null )
{
// Retrieve the dashboard list
List<GrafanaSearchResponse> dashboardList = findDashboards(driver, org);
List<String> dashboards = getDashboards(driver, org, dashboardList);
org.setDashboards(dashboards);
// Get the Org Preferences and potentially update
GrafanaOrgPreferencesResponse current = getOrganizationPreferences(driver, org.getId());
if ( current != null
&& (current.getHomeDashboardUID() == null || current.getHomeDashboardUID().trim().length() == 0 )
&& dashboardList != null
&& dashboardList.size() > 0 )
{
GrafanaOrgPreferences preferences = new GrafanaOrgPreferences();
preferences.setHomeDashboardUID(dashboardList.get(0).getUid());
updateOrganizationPreferences(driver, org.getId(), preferences);
}
else if (current != null && current.getHomeDashboardUID() != null && current.getHomeDashboardUID().trim().length() > 0 )
{
org.setHomeDashboardUID(current.getHomeDashboardUID());
}
// Get and possibly update the home dashboard
updateOrganizationPreferences(driver, org, dashboardList);
}
}
else
Expand All @@ -322,15 +316,15 @@ else if (current != null && current.getHomeDashboardUID() != null && current.get
* @param orgId The Organization whose preferences updated
* @return Dashboard uid
*/
public static GrafanaOrgPreferencesResponse getOrganizationPreferences(GrafanaDriver driver, Integer orgId)
public static GrafanaOrgPreferences getOrganizationPreferences(GrafanaDriver driver, Integer orgId)
{
GrafanaOrgPreferencesResponse preferences = null;
RestResponseData<GrafanaOrgPreferencesResponse> rd;
GrafanaOrgPreferences preferences = null;
RestResponseData<GrafanaOrgPreferences> rd;
Map<String, String> headers = driver.getAdminHeaders();
headers.put(ORG_HEADER, String.valueOf(orgId));

rd = driver.executeGetRequest("/org/preferences",
GrafanaOrgPreferencesResponse.class,
GrafanaOrgPreferences.class,
headers);
if ( rd != null && rd.getResponseObject() != null )
{
Expand All @@ -339,6 +333,41 @@ public static GrafanaOrgPreferencesResponse getOrganizationPreferences(GrafanaDr
return preferences ;
}

/**
* Update the current organization preferences with dashboard and timezone
* @param driver The Grafana Driver
* @param current The current Organization preferences
* @param dashboardId The Dashboard ID to be set
* @param dashboardUid the dashboard UID to be set
* @return An updated organization preferences
*/
public static GrafanaOrgPreferences setOrganizationPreferences(GrafanaDriver driver,
GrafanaOrgPreferences current,
Integer dashboardId,
String dashboardUid)
{
GrafanaOrgPreferences preferences = new GrafanaOrgPreferences();
preferences.setHomeDashboardUID(dashboardUid);
preferences.setHomeDashboardId(dashboardId);
preferences.setTheme(current.getTheme());
String timezone = driver.getConfiguration().getDefaultTimeZone();
if ( current.getTimezone() == null || current.getTimezone().trim().length() == 0)
{
if ( timezone != null && timezone.trim().length() > 0 )
{
preferences.setTimezone(timezone);
}
else
{
preferences.setTimezone("UTC");
}
}
else
{
preferences.setTimezone(current.getTimezone());
}
return preferences;
}

/**
* Updates a Grafana Organization
Expand Down Expand Up @@ -372,25 +401,72 @@ public void update(GrafanaDriver driver, String orgId, GrafanaOrg org) throws Co
* @param orgId The Organization whose preferences updated
* @return Dashboard uid
*/
public static void updateOrganizationPreferences(GrafanaDriver driver, Integer orgId, GrafanaOrgPreferences preferences)
public static boolean updateOrganizationPreferences(GrafanaDriver driver, Integer orgId, GrafanaOrgPreferences preferences)
{
boolean success = true;
RestResponseData<GrafanaStandardResponse> rd;
Map<String, String> headers = driver.getAdminHeaders();
headers.put(ORG_HEADER, String.valueOf(orgId));

rd = driver.executePatchRequest("/org/preferences",
rd = driver.executePutRequest("/org/preferences",
GrafanaStandardResponse.class,
preferences,
headers);
if ( rd != null && rd.getResponseStatusCode() != 200 )
{
success = false;
LOG.warn("Failed to update Grafana Org {0} preferences. Returned HTTP status {1}", orgId, rd.getResponseStatusCode());
}
return;
return success;
}

public static void updateOrganizationPreferences(GrafanaDriver driver, GrafanaOrg org )
/**
* Update the organization preferences especially to set the home dashboard
* @param driver The Grafana Driver
* @param org the Grafana Organization whose preferences we are requested to update
* @param dashboardList list of available dashboards associated with the organization
*/
public void updateOrganizationPreferences(GrafanaDriver driver, GrafanaOrg org, List<GrafanaSearchResponse> dashboardList )
{

if ( org != null && dashboardList != null && dashboardList.size() > 0 )
{
// Get the Org Preferences and potentially update
GrafanaOrgPreferences current = getOrganizationPreferences(driver, org.getId());
if ( current != null )
{
// this item is a dashboard
GrafanaSearchResponse item = dashboardList.get(0);
if ( current.getHomeDashboardId() == null || current.getHomeDashboardId() == 0)
{
// The Id typically set
GrafanaOrgPreferences preferences = setOrganizationPreferences(driver, current, item.getId(), item.getUid());
if (updateOrganizationPreferences(driver, org.getId(), preferences))
{
org.setHomeDashboardId(preferences.getHomeDashboardId());
org.setHomeDashboardUID(preferences.getHomeDashboardUID());
}
else
{
org.setHomeDashboardId(current.getHomeDashboardId());
org.setHomeDashboardUID(current.getHomeDashboardUID());
}
}
else
{
org.setHomeDashboardId(current.getHomeDashboardId());
if ( current.getHomeDashboardUID() != null )
{
org.setHomeDashboardUID(current.getHomeDashboardUID());
}
else
{
// An assumption that this is the only one available
// since Version 8 does not return dashboard UID
org.setHomeDashboardUID(item.getUid());
}
}
}
}
return;
}
}
Loading

0 comments on commit 3113efc

Please sign in to comment.