From 88ed88f2b53074ff3008f638903c3466490aed56 Mon Sep 17 00:00:00 2001 From: ermisw Date: Tue, 20 Jun 2023 13:44:27 +0200 Subject: [PATCH] OPMAAS-4180 --- KRParser/krparser.py | 11 +- KRParser/patterns.py | 10 +- build/lib/KRParser/krparser.py | 3 +- tests/test.py | 48 --------- tests/test_patterns.py | 180 +++++++++++++++++++++++++++++++++ 5 files changed, 194 insertions(+), 58 deletions(-) delete mode 100644 tests/test.py create mode 100644 tests/test_patterns.py diff --git a/KRParser/krparser.py b/KRParser/krparser.py index 8a86cc5..efaefea 100644 --- a/KRParser/krparser.py +++ b/KRParser/krparser.py @@ -39,7 +39,9 @@ class KRParser: for p in self.patterns: groups=p.parseServicesAndMethods(subject) - if len(groups) > 0: + if len(groups) > 0: + for g in groups: + g["pattern"]=str(p.__class__) break return groups @@ -151,7 +153,7 @@ class KRParser: if len(entities)> 0: for ent in entities: - tmp_kr={"displayName":ent["displayName"], "entityId":ent["entityId"], "groupId":gid, "hasData":{}, "count":{},"services":[], "found":False, "foundCount":0, "exception":""} + tmp_kr=merge({"displayName":ent["displayName"], "entityId":ent["entityId"], "groupId":gid, "hasData":{}, "count":{},"services":[], "found":False, "foundCount":0, "exception":"", "_mInSloDef": group["_mInSloDef"] }, self.config["extendResultObjects"]) if "isServiceMethodOfService" in ent["fromRelationships"]: tmp_kr["services"]=ent["fromRelationships"]["isServiceMethodOfService"] @@ -163,9 +165,9 @@ class KRParser: else: if k.startswith('SERVICE_METHOD-'): - tmp_kr=merge({"displayName": None,"comparer": "entityId", "entityId":k, "groupId":gid, "hasData":{},"count":{},"services":[], "found":False, "foundCount":0, "exception":""}, self.config["extendResultObjects"]) #"exists":None, 'hasData_1W':None, + tmp_kr=merge({"displayName": None,"comparer": "entityId", "entityId":k, "groupId":gid, "hasData":{},"count":{},"services":[], "found":False, "foundCount":0, "exception":"", "_mInSloDef": group["_mInSloDef"]}, self.config["extendResultObjects"]) #"exists":None, 'hasData_1W':None, else: - tmp_kr=merge({"displayName":k,"comparer": "displayName", "entityId":None, "groupId":gid, "hasData":{}, "count":{},"services":[], "found":False, "foundCount":0, "exception":""}, self.config["extendResultObjects"]) #"exists":None, 'hasData_1W':None, + tmp_kr=merge({"displayName":k,"comparer": "displayName", "entityId":None, "groupId":gid, "hasData":{}, "count":{},"services":[], "found":False, "foundCount":0, "exception":"", "_mInSloDef": group["_mInSloDef"]}, self.config["extendResultObjects"]) #"exists":None, 'hasData_1W':None, tmp_KR.append(tmp_kr) @@ -296,6 +298,7 @@ class KRParser: for m in tmp_methods: group["methods"].append(m["entityId"]) + # tmp=merge({"displayName": None,"comparer": "entityId", "entityId":m["entityId"], "groupId":gid, "hasData":{}, "count":{},"services":[], "found":False, "foundCount":0, "exception":""},self.config["extendResultObjects"]) #"exists":None, 'hasData_1W':None, # kr.keyRequests.append(tmp) diff --git a/KRParser/patterns.py b/KRParser/patterns.py index d9b9ef7..42c3709 100644 --- a/KRParser/patterns.py +++ b/KRParser/patterns.py @@ -22,7 +22,7 @@ class Pattern1: for r in result: services=[s.strip() for s in urllib.parse.unquote_plus(r[0]).split(",")] methods=[s.strip() for s in urllib.parse.unquote_plus(r[1]).split(",")] - groups.append({"services":services, "methods":methods}) + groups.append({"services":services, "methods":methods, "_mInSloDef":True}) #return services, methods return groups @@ -38,7 +38,7 @@ class Pattern2: for r in result: services=[s.strip() for s in urllib.parse.unquote_plus(r[0]).split(",")] methods=[s.strip() for s in urllib.parse.unquote_plus(r[2]).split(",")] - groups.append({"services":services, "methods":methods}) + groups.append({"services":services, "methods":methods, "_mInSloDef":True}) return groups @@ -55,7 +55,7 @@ class Pattern3: if result: for r in result: methods=[s.strip() for s in urllib.parse.unquote_plus(r).split(",")] - groups.append({"services":[], "methods":methods}) + groups.append({"services":[], "methods":methods, "_mInSloDef":True}) return groups @@ -72,7 +72,7 @@ class Pattern4: #if not r: #methods=[s.strip() for s in r.split(",")] services=[s.strip() for s in urllib.parse.unquote_plus(r).split(",")] - groups.append({"services":services, "methods":[]}) + groups.append({"services":services, "methods":[], "_mInSloDef":False}) return groups @@ -92,6 +92,6 @@ class Pattern5: for r in result: services=[s.strip() for s in urllib.parse.unquote_plus(r).split(",")] #methods=[s.strip() for s in urllib.parse.unquote_plus(r[1]).split(",")] - groups.append({"services":services, "methods":[]}) + groups.append({"services":services, "methods":[], "_mInSloDef":False}) #return services, methods return groups \ No newline at end of file diff --git a/build/lib/KRParser/krparser.py b/build/lib/KRParser/krparser.py index 8a86cc5..6bce584 100644 --- a/build/lib/KRParser/krparser.py +++ b/build/lib/KRParser/krparser.py @@ -39,7 +39,8 @@ class KRParser: for p in self.patterns: groups=p.parseServicesAndMethods(subject) - if len(groups) > 0: + if len(groups) > 0: + groups[0]["pattern"]=str(p.__class__) break return groups diff --git a/tests/test.py b/tests/test.py deleted file mode 100644 index 496a2f8..0000000 --- a/tests/test.py +++ /dev/null @@ -1,48 +0,0 @@ -import sys -import os -sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/..") -#sys.path.append('..') - -import unittest -import yaml -#from helper import get_request -from KRParser.helper import get_request -from KRParser.krparser import KRParser, KROption - -import pandas as pd - - -#from KRParser import helper, krparser -from decouple import config - - - -class TestStringMethods(unittest.TestCase): - - - def setUp(self): - with open('./tests/environment.yaml') as file: - self.env_doc = yaml.safe_load(file) - - - def test_simplifySLOs(self): - DTURL=self.env_doc['euprod'][1]["env-url"] - DTTOKEN = config(self.env_doc['euprod'][2].get('env-token-name')) - - api_url = DTURL+"/api/v2/slo/cf5ba6e9-a56e-3ba8-99a9-b193dc68f410" #34bb71cf-30bc-3d2e-913f-389517699751" - - headers = { - 'Content-Type': 'application/json', - 'Authorization': 'Api-Token ' + DTTOKEN - } - - - result=get_request(api_url, headers, {}) - slo=result.json() - - krp = KRParser(options=KROption.RESOLVEKEYREQUETS | KROption.VALIDATE_HASDATA | KROption.RESOLVESERVICES, config={"threads":10,"serviceLookupParams":{"fields":"tags"},"extendResultObjects":{"env":"emea"}}, DTAPIURL=DTURL, DTAPIToken=DTTOKEN) - - krp.parse(slo) - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/tests/test_patterns.py b/tests/test_patterns.py new file mode 100644 index 0000000..385a284 --- /dev/null +++ b/tests/test_patterns.py @@ -0,0 +1,180 @@ +import sys +import os +sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/..") +#sys.path.append('..') + +import unittest +import yaml +#from helper import get_request +from KRParser.helper import get_request +from KRParser.krparser import KRParser, KROption + +import pandas as pd + + +#from KRParser import helper, krparser +from decouple import config + + + +class patterns(unittest.TestCase): + + + def setUp(self): + with open('./tests/environment.yaml') as file: + self.env_doc = yaml.safe_load(file) + + # TP_* SLO definition (Pattern1) + # Used SLO: TP_Mobile_Login + # https://xxu26128.apps.dynatrace.com/ui/apps/dynatrace.classic.settings/ui/settings/builtin:monitoring.slo?gtf=-2h&gf=all&id=2a07c9bf-2c7f-37eb-815b-efda7658bc13 + def test_TP_Pattern1(self): + + expected_services=['btc-user-composite-service - PROD', 'btc-connected-oauth-service - PROD'] + expected_methods=['GET /api/v1/presentation/oauth/config', 'GET /api/v1/presentation/profile-tab', 'POST /api/v1/oauth/token/identifier'] + expected_pattern="" + DTURL=self.env_doc['euprod'][1]["env-url"] + DTTOKEN = config(self.env_doc['euprod'][2].get('env-token-name')) + + api_url = DTURL+"/api/v2/slo/2a07c9bf-2c7f-37eb-815b-efda7658bc13" + + headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Api-Token ' + DTTOKEN + } + + + slo_result=get_request(api_url, headers, {}) + slo=slo_result.json() + + krp = KRParser(options=KROption.RESOLVEKEYREQUETS | KROption.VALIDATE_HASDATA | KROption.RESOLVESERVICES, config={"threads":1,"serviceLookupParams":{"fields":"tags"},"extendResultObjects":{"env":"emea"}}, DTAPIURL=DTURL, DTAPIToken=DTTOKEN) + + result= krp.parse(slo) + + self.assertListEqual(result[0].matchedGroups[0]["services"], expected_services) + self.assertListEqual(result[0].matchedGroups[0]["methods"], expected_methods) + self.assertEqual(result[0].matchedGroups[0]["pattern"], expected_pattern) + + # TP_* SLO definition (Pattern4) + # Used SLO: TP_Vehicle_Teleservices + # https://xxu26128.apps.dynatrace.com/ui/apps/dynatrace.classic.settings/ui/settings/builtin:monitoring.slo?gtf=-2h&gf=all&id=18c9bc95-5605-33b4-81e1-10335cf0191b + def test_TP_Pattern4(self): + + expected_services=['ifs-001 (Kinesis) CCM - teleservices - prod', 'ifs-001 (Kinesis) TyreWsIncoming - IN - teleservices - prod', 'ifs-001 (Kinesis) TyreDiIncoming - IN - teleservices - prod', 'ifs-003 (JOYNR) triggerPdmContainerUpdate/notifyPdmContainerStatus - IN/OUT - teleservices - prod', 'ifs-003 (JOYNR) triggerWhitelistUpdate/notifyWhitelistStatus - IN/OUT - wlupdater - prod', 'ifs-003 (JOYNR) triggerStandardOdfUpdate/notifyOdfStatus - IN/OUT - wlupdater - prod', 'ifs-003 (JOYNR) start/stop/notifyTemporaryOdfStatus - INT/OUT - wlupdater - prod', 'ifs-007 (JOYNR) requestPdmResult/notifyPdmResult - IN/OUT - teleservices - prod', 'ifs-002 (JOYNR) request/notifyKeyData - IN/OUT - teleservices - prod', 'ifs-002 (JOYNR) notifyRSUStatus - IN - teleservices - prod', 'VDLM_scallservice - VDLM_scallservice - ifs-002 (JOYNR) notifyMaintenanceStatus - IN - prod', 'VDLM_scallservice - VDLM_scallservice - ifs-002 (JOYNR) requestMaintenanceStatus/confirmMaintenanceStatus - OUT - prod', 'ifs-005 (JOYNR) notify/confirmBatteryStatus - IN/OUT - teleservices - prod', 'ifs-007 (JOYNR) requestDiagResult/notifyDiagResult - IN/OUT - teleservices - prod', 'ifs-005 (SQS) TscsCallTopic - IN - teleservices - prod', 'ifs-006 (SQS) TsddCallTopic - IN - teleservices - prod', 'ifs-010 (SQS) RtcadCallTopic - IN - teleservices - prod', 'VDLM_seam - ifs-004 (SQS) ServiceDemand - IN - teleservices - prod', 'VDLM_seam - ifs-004 (SQS) ServiceDemand - IN - teleservices - prod', 'ifs-003 (MQS) MguItsnIn/Out (ClassificationRequest/Response) - IN/OUT - teleservices - prod', 'ifs-003 (MQS) MguItsnIn/Out (DiagnosisRequest/Response) - IN/OUT - teleservices - prod', 'ifs-005 (MQS) BCallHandlerIstaIn/Out - IN/OUT - teleservices - prod', 'ifs-001 (SQS) BCallIn/Out - IN/OUT - teleservices - prod', 'VDLM_ts-asc - ifs-001 (SQS) AscIn/Out - IN/OUT - prod', 'InternalApiResourceV2 - teleservices - prod', 'VDLM_rtchandler - ifs-010 (SQS) RtcTeleXIn/Out - IN/OUT - prod', 'ckf.bmwgroup.net'] + expected_methods=['SERVICE_METHOD-0040C1B4C7A410B7', 'SERVICE_METHOD-116706FE1C0B57E9', 'SERVICE_METHOD-49981ADAE87D95D2', 'SERVICE_METHOD-5EB17880C0917DBF', 'SERVICE_METHOD-8226D6EB97776024', 'SERVICE_METHOD-90B715A55C1811EB', 'SERVICE_METHOD-AC1A7EF39680111E', 'SERVICE_METHOD-AEA1756029C53700', 'SERVICE_METHOD-E078C045186CDDA1', 'SERVICE_METHOD-FE7B9FE4485C6B29'] + expected_pattern="" + DTURL=self.env_doc['euprod'][1]["env-url"] + DTTOKEN = config(self.env_doc['euprod'][2].get('env-token-name')) + + api_url = DTURL+"/api/v2/slo/18c9bc95-5605-33b4-81e1-10335cf0191b" + + headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Api-Token ' + DTTOKEN + } + + + slo_result=get_request(api_url, headers, {}) + slo=slo_result.json() + + krp = KRParser(options=KROption.RESOLVEKEYREQUETS | KROption.VALIDATE_HASDATA | KROption.RESOLVESERVICES, config={"threads":1,"serviceLookupParams":{"fields":"tags"},"extendResultObjects":{"env":"emea"}}, DTAPIURL=DTURL, DTAPIToken=DTTOKEN) + + result= krp.parse(slo) + + self.assertListEqual(result[0].matchedGroups[0]["services"], expected_services) + self.assertListEqual(result[0].matchedGroups[0]["methods"], expected_methods) + self.assertEqual(result[0].matchedGroups[0]["pattern"], expected_pattern) + + # Simplieifed_* SLO definition (Pattern5) + # Used SLO: Simplified_TP_Mobile_Login + # https://xxu26128.apps.dynatrace.com/ui/apps/dynatrace.classic.slo/ui/slo?gtf=-2h&gf=all&filter=Text%3ATP&slovis=Graph&sloexp=5cc3efd1-fbb9-3504-8075-3cf0e4a2a4fa + def test_Simplified(self): + + expected_services=['btc-user-composite-service - PROD', 'btc-connected-oauth-service - PROD'] + expected_methods=['SERVICE_METHOD-0A047D679E974CF0','SERVICE_METHOD-1313A2ED47A33278','SERVICE_METHOD-2D3518701AFE612D','SERVICE_METHOD-45FDB365004EF766','SERVICE_METHOD-51B637F95F50EBE8','SERVICE_METHOD-5A5640BFFC3692D2','SERVICE_METHOD-5B50C30ADC9F8A8B','SERVICE_METHOD-63B88F2A195A44F1','SERVICE_METHOD-6858B9373C1B3C9A','SERVICE_METHOD-72BA0DBBCC1A9AED','SERVICE_METHOD-7B4FDDCAB657C7B3','SERVICE_METHOD-7E6EFAB2B32CBF87','SERVICE_METHOD-83EC6721A281B6F6','SERVICE_METHOD-91B6FB318FC612CD','SERVICE_METHOD-946D89B62E2559C0','SERVICE_METHOD-AD048A48A9FB4B84','SERVICE_METHOD-B20949E0FD947AE5','SERVICE_METHOD-BBC94FF8F8157D42','SERVICE_METHOD-C44DED4B58D56A8E','SERVICE_METHOD-CF980FC5191F17D1','SERVICE_METHOD-E78735CD41F780AC','SERVICE_METHOD-E8483228CE13A2AE','SERVICE_METHOD-E97B7D398DE28B1F','SERVICE_METHOD-F0B28D440F14795A','SERVICE_METHOD-FF77CD9406F022A3'] + + + expected_pattern="" + + DTURL=self.env_doc['euprod'][1]["env-url"] + DTTOKEN = config(self.env_doc['euprod'][2].get('env-token-name')) + + api_url = DTURL+"/api/v2/slo/5cc3efd1-fbb9-3504-8075-3cf0e4a2a4fa" #34bb71cf-30bc-3d2e-913f-389517699751" + + headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Api-Token ' + DTTOKEN + } + + + slo_result=get_request(api_url, headers, {}) + slo=slo_result.json() + + krp = KRParser(options=KROption.RESOLVEKEYREQUETS | KROption.VALIDATE_HASDATA | KROption.RESOLVESERVICES, config={"threads":1,"serviceLookupParams":{"fields":"tags"},"extendResultObjects":{"env":"emea"}}, DTAPIURL=DTURL, DTAPIToken=DTTOKEN) + + result= krp.parse(slo) + + self.assertListEqual(result[0].matchedGroups[0]["services"], expected_services) + self.assertListEqual(result[0].matchedGroups[0]["methods"], expected_methods) + self.assertEqual(result[0].matchedGroups[0]["pattern"], expected_pattern) + + + # entityIds by filter SLO definition (Pattern3) + # Used SLO: E2E - Wirkkette "Login" + # https://xxu26128.apps.dynatrace.com/ui/apps/dynatrace.classic.slo/ui/slo?gtf=-2h&gf=all&filter=Text%3ATP&slovis=Graph&sloexp=5fa56652-5f44-31af-892b-0681ff019b8b + def test_EntityIdsByFilter(self): + + expected_services=[] + expected_methods=['SERVICE_METHOD-088030038E4C48AD', 'SERVICE_METHOD-22DB51030E136454', 'SERVICE_METHOD-93D43FBFAC5DF78F'] + expected_pattern="" + + DTURL=self.env_doc['euprod'][1]["env-url"] + DTTOKEN = config(self.env_doc['euprod'][2].get('env-token-name')) + + api_url = DTURL+"/api/v2/slo/5fa56652-5f44-31af-892b-0681ff019b8b" #34bb71cf-30bc-3d2e-913f-389517699751" + + headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Api-Token ' + DTTOKEN + } + + + slo_result=get_request(api_url, headers, {}) + slo=slo_result.json() + + krp = KRParser(options=KROption.RESOLVEKEYREQUETS | KROption.VALIDATE_HASDATA | KROption.RESOLVESERVICES, config={"threads":1,"serviceLookupParams":{"fields":"tags"},"extendResultObjects":{"env":"emea"}}, DTAPIURL=DTURL, DTAPIToken=DTTOKEN) + + result= krp.parse(slo) + + self.assertListEqual(result[0].matchedGroups[0]["services"], expected_services) + self.assertListEqual(result[0].matchedGroups[0]["methods"], expected_methods) + self.assertEqual(result[0].matchedGroups[0]["pattern"], expected_pattern) + # def test_contains(self): + # expected_services=['btc-user-composite-service - PROD', 'btc-connected-oauth-service - PROD'] + # expected_methods=['SERVICE_METHOD-1313A2ED47A33278', 'SERVICE_METHOD-2D3518701AFE612D', 'SERVICE_METHOD-5A5640BFFC3692D2', 'SERVICE_METHOD-5B50C30ADC9F8A8B', 'SERVICE_METHOD-63B88F2A195A44F1', 'SERVICE_METHOD-6858B9373C1B3C9A', 'SERVICE_METHOD-72BA0DBBCC1A9AED', 'SERVICE_METHOD-7B4FDDCAB657C7B3', 'SERVICE_METHOD-7E6EFAB2B32CBF87', 'SERVICE_METHOD-83EC6721A281B6F6', 'SERVICE_METHOD-91B6FB318FC612CD', 'SERVICE_METHOD-946D89B62E2559C0', 'SERVICE_METHOD-AD048A48A9FB4B84', 'SERVICE_METHOD-B20949E0FD947AE5', 'SERVICE_METHOD-BBC94FF8F8157D42', 'SERVICE_METHOD-C44DED4B58D56A8E', 'SERVICE_METHOD-CF980FC5191F17D1', 'SERVICE_METHOD-E78735CD41F780AC', 'SERVICE_METHOD-E8483228CE13A2AE', 'SERVICE_METHOD-E97B7D398DE28B1F', 'SERVICE_METHOD-F0B28D440F14795A', 'SERVICE_METHOD-FF77CD9406F022A3'] + # expected_pattern="" + + # DTURL=self.env_doc['cnprod'][1]["env-url"] + # DTTOKEN = config(self.env_doc['cnprod'][2].get('env-token-name')) + + # api_url = DTURL+"/api/v2/slo/4230f8cb-ffaa-31b3-9e12-091488f330af" #34bb71cf-30bc-3d2e-913f-389517699751" + + # headers = { + # 'Content-Type': 'application/json', + # 'Authorization': 'Api-Token ' + DTTOKEN + # } + + + # result_slo=get_request(api_url, headers, {}) + # slo=result_slo.json() + + # krp = KRParser(options=KROption.RESOLVEKEYREQUETS | KROption.VALIDATE_HASDATA | KROption.RESOLVESERVICES, config={"threads":1,"serviceLookupParams":{"fields":"tags"},"extendResultObjects":{"env":"emea"}}, DTAPIURL=DTURL, DTAPIToken=DTTOKEN) + + # result= krp.parse(slo) + + # self.assertListEqual(result[0].matchedGroups[0]["services"], expected_services) + # self.assertListEqual(result[0].matchedGroups[0]["methods"], expected_methods) + # self.assertEqual(result[0].matchedGroups[0]["pattern"], expected_pattern) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file