104 lines
5.1 KiB
Python
104 lines
5.1 KiB
Python
#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)
|