Implemented interaction with git (archive and shared config)

OPMAAS-3253
Patryk Gudalewicz 2022-07-27 22:13:52 +02:00
parent d5f7976967
commit 1482f949cf
4 changed files with 40 additions and 268 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
.env
dashboard_tiles_*
\[STAGING\]*
shared_configuration/
archive/

View File

@ -4,14 +4,35 @@ import json
import argparse
import requests
from datetime import datetime
from git import Repo
import os
#set STAGING global dashboard name
DASHBOARD_NAME = "[STAGING]Global Offboard Reliability - Touchpoint Mobile #"
CONFIG_REPO_URL = "https://atc.bmwgroup.net/bitbucket/scm/opapm/shared_configuration.git"
CONFIG_REPO_NAME = "shared_configuration"
ARCHIVE_REPO_URL = "https://atc.bmwgroup.net/bitbucket/scm/opapm/archive.git"
ARCHIVE_REPO_NAME = "archive"
parser = argparse.ArgumentParser(description="Generate and deploy the Dynatrace Global Dashboard as Code. Auto deployment works only for STAGING dashboard",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-R", "--rows", type=int, help="Number of rows per dashboard. If not specified, all rows will be added to single dashboard")
parser.add_argument('--auto-upload', default=False, action='store_true', help="Auto upload to STAGING dashboard")
args = parser.parse_args()
def clone_repo_if_notexist(repourl, reponame):
if(not os.path.isdir(reponame)):
repo = Repo.clone_from(repourl, reponame)
return repo
return Repo(reponame)
def pull_repo(repo):
origin = repo.remotes.origin
origin.pull()
def push_repo(repo, message):
repo.git.add(all=True)
repo.index.commit(message)
origin = repo.remotes.origin
origin.push()
def load_slo_parameter(path):
# the first part is to read a yaml and only select latest, valid config
with open(path) as file:
@ -62,7 +83,10 @@ def backup_dashboards(DTAPIToken, DTENV, dashboards):
print("Downloaded dashboard from Dynatrace: "+entityResponse["dashboardMetadata"]["name"]+", creating backup...")
now=datetime.now()
strnow = now.strftime("%Y%m%d_%H%M%S")
with open(entityResponse["dashboardMetadata"]["name"]+"_"+strnow+".json", "w") as file:
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)
def remove_dashboards(DTAPIToken, DTENV, dashboards):
for dashboard in dashboards:
@ -70,7 +94,6 @@ def remove_dashboards(DTAPIToken, DTENV, dashboards):
DTAPIURL = DTENV + "api/config/v1/dashboards/" + dashboard["id"]
print(make_request(DTAPIURL,DTAPIToken,True,"delete",None))
def create_or_update_dashboard(DTAPIToken, DTENV, dashboards, files):
backup_dashboards(DTAPIToken, DTENV, dashboards)
if(files):
for index, filename in enumerate(files,start=1):
with open('./'+filename) as file:
@ -248,6 +271,10 @@ def create_default_tiles():
return newDashboardTiles
def main(slo_path):
configrepo = clone_repo_if_notexist(CONFIG_REPO_URL, CONFIG_REPO_NAME)
pull_repo(configrepo)
archiverepo = clone_repo_if_notexist(ARCHIVE_REPO_URL, ARCHIVE_REPO_NAME)
pull_repo(archiverepo)
print("Generating dashboard tiles...")
slo_doc = load_slo_parameter(slo_path)
dashboard_json = create_default_tiles()
@ -331,8 +358,12 @@ def main(slo_path):
existingdashboards = get_all_dashboards_withname(DTTOKEN, DTURL,DASHBOARD_NAME)
print("Uploading STAGING dashboards to Dynatrace...")
backup_dashboards(DTTOKEN, DTURL, existingdashboards)
now=datetime.now()
strnowdate = now.strftime("%Y%m%d")
push_repo(archiverepo, strnowdate+"_Global dashboard as code auto-upload backup")
create_or_update_dashboard(DTTOKEN, DTURL, existingdashboards, generatedfiles)
if __name__ == "__main__":
main('./slo_parameter.yaml')
main('./shared_configuration/slo_parameter.yaml')

View File

@ -3,3 +3,4 @@ pyyaml
requests
datetime
argparse
GitPython

View File

@ -1,262 +0,0 @@
---
TP_Mobile_Login:
index: 1
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Login"
department: "DE-442"
metric: "func:slo.tp_mobile_login"
doc_url: "https://atc.bmwgroup.net/confluence/x/R1OqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_Mapping:
index: 2
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Mapping"
department: "DE-443"
metric: "func:slo.tp_mobile_mapping"
doc_url: "https://atc.bmwgroup.net/confluence/x/WFOqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_VehicleList:
index: 3
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Vehicle List"
department: "DE-43"
metric: "func:slo.tp_mobile_vehiclelist"
doc_url: "https://atc.bmwgroup.net/confluence/x/c1OqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_VehicleData:
index: 4
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Vehicle Data"
department: "DE-733"
metric: "func:slo.tp_mobile_vehicledata"
doc_url: "https://atc.bmwgroup.net/confluence/x/LFOqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_RemoteServices:
index: 5
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Remote Services"
department: "DE-723"
metric: "func:slo.tp_mobile_remoteservices"
doc_url: "https://atc.bmwgroup.net/confluence/x/dFSqdQ"
ops_dashboard:
emea: "https://xxu26128.live.dynatrace.com/#dashboard;gtf=-35m%20to%20-5m;gf=all;id=a3d9155e-24fd-4ec9-b9bc-31eb5772422f"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_Remote360:
index: 6
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Remote Camera"
department: "DE-723"
metric: "func:slo.tp_mobile_remote360"
doc_url: "https://atc.bmwgroup.net/confluence/x/aVSqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_Send2VehicleMGU:
index: 7
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Send to Vehicle (MGU)"
department: "DE-320"
metric: "func:slo.tp_mobile_send2vehiclemgu"
doc_url: "https://atc.bmwgroup.net/confluence/x/qFSqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_Send2VehicleLegacy:
index: 8
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Send to Vehicle (Legacy)"
department: "DE-723"
metric: "func:slo.tp_mobile_send2vehiclelegacy"
doc_url: "https://atc.bmwgroup.net/confluence/x/z1SqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_PersonalFavorites:
index: 9
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Personal Favorites"
department: "DE-443"
metric: "func:slo.tp_mobile_personalfavorites"
doc_url: "https://atc.bmwgroup.net/confluence/x/w1SqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_DigitalKey:
index: 10
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "Digital Key"
department: "DE-730"
metric: "func:slo.tp_mobile_digitalkey"
doc_url: "https://atc.bmwgroup.net/confluence/x/u1SqdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"
TP_Mobile_RSU:
index: 11
selector_type: "text"
selector_var: 'CoCo-QM-Report_Mobile'
yearstart: "2022-01-01"
displayname: "RSU Mobile"
department: "DE-430"
metric: "func:slo.wirkkette__rsu__mobile_____reliability_of_key_requests"
doc_url: "https://atc.bmwgroup.net/confluence/x/NpnwdQ"
ops_dashboard:
emea: "https"
na: ""
cn: ""
hubs:
euprod:
tiles: ["actual","graph","ytd"]
naprod:
tiles: ["actual","graph","ytd"]
cnprod:
tiles: ["actual","graph","ytd"]
thresholds:
single_value: "99_#577025|98_#f5d30f|0_#ff0000"
graph_value: "99_#353535|98_#f5d30f|0_#ff0000"