Skip to content

Instantly share code, notes, and snippets.

@amotl
Created January 5, 2021 08:38
Show Gist options
  • Save amotl/43bb89107227431802556b7bcb135578 to your computer and use it in GitHub Desktop.
Save amotl/43bb89107227431802556b7bcb135578 to your computer and use it in GitHub Desktop.
Proof that grafana_api's `update_dashboard` will respawn the dashboard within the "General" folder
"""
About
=====
Proof that ``update_dashboard`` will respawn the dashboard within the "General" folder::
before: {'folderId': 1, 'folderTitle': 'testdrive', 'folderUrl': '/dashboards/f/RJS5vK-Mz/testdrive'}
after: {'folderId': 0, 'folderTitle': 'General', 'folderUrl': ''}
Synopsis
========
::
pip install grafana-api==1.0.3
python grafana_api_dashboard_folder_flaw.py
Tests against Grafana 5.x, 6.x, 7.x
===================================
::
docker run --rm -it \
--publish=3000:3000 \
--env='GF_SECURITY_ADMIN_PASSWORD=admin' \
grafana/grafana:7.3.6
docker run --rm -it \
--publish=3000:3000 \
--env='GF_SECURITY_ADMIN_PASSWORD=admin' \
grafana/grafana:6.7.5
docker run --rm -it \
--publish=3000:3000 \
--env='GF_SECURITY_ADMIN_PASSWORD=admin' \
grafana/grafana:5.4.5
"""
from grafana_api import GrafanaFace
def get_folderinfo(dashboard):
return {
"folderId": dashboard["meta"]["folderId"],
"folderTitle": dashboard["meta"]["folderTitle"],
"folderUrl": dashboard["meta"]["folderUrl"],
}
class Grafana(GrafanaFace):
def create_folder(self, name):
self.delete_folder(name)
folder = self.folder.create_folder(title=name)
return folder
def delete_folder(self, name):
folders = self.folder.get_all_folders()
try:
folder = list(filter(lambda folder: folder["title"] == name, folders))[0]
folder_uid = folder["uid"]
self.folder.delete_folder(folder_uid)
except IndexError:
pass
def create_dashboard(self, name, folder_id):
dashboard = self.dashboard.update_dashboard(dashboard={"dashboard": {"title": name}, "folderId": folder_id})
return dashboard
def create_dashboard_in_folder(self, name, folder):
folder_info = self.create_folder(folder)
dashboard = self.create_dashboard(name=name, folder_id=folder_info["id"])
return dashboard
def main():
grafana = Grafana(("admin", "admin"), host="localhost", port=3000)
# Create a new dashboard within a folder.
dashboard = grafana.create_dashboard_in_folder(name="testdashboard", folder="testfolder")
# Use this dashboard's UID to operate on.
dashboard_uid = dashboard["uid"]
# Display folder info of dashboard.
dashboard = grafana.dashboard.get_dashboard(dashboard_uid)
print("before:", get_folderinfo(dashboard))
# Update dashboard.
grafana.dashboard.update_dashboard(dashboard)
# Display folder info of dashboard.
dashboard = grafana.dashboard.get_dashboard(dashboard_uid)
print("after: ", get_folderinfo(dashboard))
# Clean up.
grafana.dashboard.delete_dashboard(dashboard_uid)
grafana.delete_folder("testfolder")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment