#Library includes funtions used for interacting with Dashboard API import requests from datetime import datetime import os import json #HTTP request definition def make_request(url, DTAPIToken,verify, method, jsondata): headers = { 'Content-Type': 'application/json', 'Authorization': 'Api-Token ' + DTAPIToken } try: if method == "get": response = requests.get(url, headers=headers,verify=verify) elif method == "post": response = requests.post(url, headers=headers,verify=verify, data=jsondata) elif method == "put": response = requests.put(url, headers=headers,verify=verify, data=jsondata) elif method == "delete": response = requests.delete(url, headers=headers,verify=verify) response.raise_for_status() except requests.exceptions.HTTPError as errh: return "An Http Error occurred:" + repr(errh) except requests.exceptions.ConnectionError as errc: return "An Error Connecting to the API occurred:" + repr(errc) except requests.exceptions.Timeout as errt: return "A Timeout Error occurred:" + repr(errt) except requests.exceptions.RequestException as err: return "An Unknown Error occurred" + repr(err) return response #Downloads dashboards from provided environment with given name def get_all_dashboards_withname(DTAPIToken, DTENV,name): DTAPIURL= DTENV + "api/config/v1/dashboards" r = make_request(DTAPIURL,DTAPIToken,True,"get",None) print(r) entityResponse = r.json() result = [] if("dashboards" in entityResponse): for dashboard in entityResponse["dashboards"]: if(dashboard["name"]).startswith(name): result.append(dashboard) result = sorted(result, key=lambda x : x['name'], reverse=False) return result #Stores current dashboard json files in archive repo def backup_dashboards(DTAPIToken, DTENV, dashboards): for dashboard in dashboards: DTAPIURL = DTENV + "api/config/v1/dashboards/" + dashboard["id"] r = make_request(DTAPIURL,DTAPIToken,True,"get",None) entityResponse = r.json() print("Downloaded dashboard from Dynatrace: "+entityResponse["dashboardMetadata"]["name"]+", creating backup...") now=datetime.now() strnow = now.strftime("%Y%m%d_%H%M%S") strnowdate = now.strftime("%Y%m%d") if not os.path.isdir("./archive/"+strnowdate): os.makedirs("./archive/"+strnowdate) with open("./archive/"+strnowdate+"/"+entityResponse["dashboardMetadata"]["name"]+"_"+strnow+".json", "w") as file: json.dump(entityResponse, file, indent=2) #Deletes dashboards from remote tenant def remove_dashboards(DTAPIToken, DTENV, dashboards): for dashboard in dashboards: print("Removing STAGING dashboard from Dynatrace: "+dashboard["name"]) DTAPIURL = DTENV + "api/config/v1/dashboards/" + dashboard["id"] print(make_request(DTAPIURL,DTAPIToken,True,"delete",None)) #Creates or updates staging dashboard on given tenant def create_or_update_dashboard(DTAPIToken, DTENV, dashboards, files, businessline, config, department): if(files): for index, filename in enumerate(files,start=1): with open('./tiles/'+filename) as file: tilesjson = json.load(file) if any(dashboard["name"].endswith("#"+str(index)) for dashboard in dashboards): existingdashboard = next((dashboard for dashboard in dashboards if dashboard["name"].endswith("#"+str(index))), None) if existingdashboard: print("Found dashboard for file: "+filename + ", Name: "+ existingdashboard["name"]) DTAPIURL = DTENV + "api/config/v1/dashboards/" + existingdashboard["id"] r = make_request(DTAPIURL,DTAPIToken,True,"get",None) entityResponse = r.json() entityResponse["tiles"] = tilesjson print("Updating dashboard: "+entityResponse["dashboardMetadata"]["name"]) print(make_request(DTAPIURL,DTAPIToken,True,"put",json.dumps(entityResponse))) dashboards.remove(existingdashboard) else: print("Dashboard for file: "+filename + " not found.") if(department == "ALL"): dashfullname = config["metadata"]["stagingname"] else: dashfullname = config["metadata"]["stagingname"] + " - " + businessline + " #" + str(index) newdashboard = { "dashboardMetadata":{ "name": dashfullname, "owner": config["metadata"]["owner"] }, "tiles":[] } DTAPIURL = DTENV + "api/config/v1/dashboards" newdashboard["tiles"] = tilesjson print("Creating dashboard: "+newdashboard["dashboardMetadata"]["name"]) creationresult = make_request(DTAPIURL,DTAPIToken,True,"post",json.dumps(newdashboard)) print(creationresult) remove_dashboards(DTAPIToken, DTENV, dashboards)