diff --git a/DE-3/TP_Vehicle_RTTI.yaml b/DE-3/TP_Vehicle_RTTI.yaml index c8024f7..471c2a8 100644 --- a/DE-3/TP_Vehicle_RTTI.yaml +++ b/DE-3/TP_Vehicle_RTTI.yaml @@ -14,27 +14,17 @@ slo_definition: filter: - service: "Netty on 0.0.0.0:8080 - rtti - prod" keyRequests: - - "/api/default" - - "/api/tw" - - "/api/ru" - - "/api/au" - - "/api/sea" - - "/api/br" - - "/api/mx" - - "/api/za" - - "/api/tw-mgu21" - - "/api/nz" - - "/api/ae" - - "/api/kw" + - "" NA-Prod: - - metric: "builtin:service.errors.fivexx.successCount" + - metric: "builtin:service.keyRequest.errors.server.successCount" filter: - - service: "Netty on 0.0.0.0:8080 - rtti - prod" + - service: "btc-vehicle-composite-service - PROD" keyRequests: - - "/api/na" + - "GET /api/v2/vehicles" + - "GET /api/v4/vehicles" CN-Prod: - metric: "builtin:service.errors.fivexx.successCount" filter: - service: "Netty on 0.0.0.0:8080 - rtti - prod" keyRequests: - - "/api/cn" + - "" diff --git a/DE-4/TP_Mobile_PersonalFavorites.yaml b/DE-4/TP_Mobile_PersonalFavorites.yaml new file mode 100644 index 0000000..e49af0a --- /dev/null +++ b/DE-4/TP_Mobile_PersonalFavorites.yaml @@ -0,0 +1,45 @@ +--- +slo_id: "9" +slo_name: 'TP_Mobile_PersonalFavorites' +displayname: "Personal Favorites" +department: "DE-443" +description: "2.0 SLO Mobile" +doc_url: "https://atc.bmwgroup.net/confluence/x/w1SqdQ" +slo_definition: + tresholds: + warning: 99 #traffic light orange + failure: 98 #traffic light red + EMEA-Prod: + - metric: "builtin:service.keyRequest.errors.server.successCount" + filter: + - service: "btc-destination-composite-service - PROD" + keyRequests: + - "POST /api/v2/favorites/" + - "POST /api/v3/favorites/" + - "GET /api/v2/favorites/" + - "GET /api/v3/favorites/" + - "GET /api/v1/favorites" + - "PUT /api/v2/favorites/" + - "PUT /api/v3/favorites/" + - "PUT /api/v2/favorites/homework/1" + - "PUT /api/v2/favorites/homework/2" + NA-Prod: + - metric: "builtin:service.keyRequest.errors.server.successCount" + filter: + - service: "btc-destination-composite-service - PROD" + keyRequests: + - "POST /api/v2/favorites/" + - "POST /api/v3/favorites/" + - "GET /api/v2/favorites/" + - "GET /api/v3/favorites/" + - "PUT /api/v2/favorites/" + - "PUT /api/v3/favorites/" + - "DELETE /api/v2/favorites/" + CN-Prod: + - metric: "builtin:service.keyRequest.errors.server.successCount" + filter: + - service: "btc-destination-composite-service - PROD" + keyRequests: + - "GET /api/v3/favorites/" + - "POST /api/v3/favorites/" + - "PUT /api/v3/favorites/" diff --git a/DE-7/TP_Mobile_DigitalKey.yaml b/DE-7/TP_Mobile_DigitalKey.yaml new file mode 100644 index 0000000..cba2cc9 --- /dev/null +++ b/DE-7/TP_Mobile_DigitalKey.yaml @@ -0,0 +1,44 @@ +--- +slo_id: "10" +slo_name: 'TP_Mobile_DigitalKey' +displayname: "Digital Key" +department: "DE-730" +description: "2.0 SLO Mobile" +doc_url: "https://atc.bmwgroup.net/confluence/x/u1SqdQ" +slo_definition: + tresholds: + warning: 99 #traffic light orange + failure: 98 #traffic light red + EMEA-Prod: + - metric: "builtin:service.keyRequest.errors.fivexx.count" + filter: + - service: "TrackApi - smc - PROD" + keyRequests: + - "trackKey" + - "manageKey" + - service: "digital-key-composite-service - PROD" + keyRequests: + - "GET /api/v1/digitalkey//password" + - "GET /api/v1/digitalkey//pairing" + NA-Prod: + - metric: "builtin:service.keyRequest.errors.fivexx.count" + filter: + - service: "TrackApi - smc - PROD" + keyRequests: + - "trackKey" + - "manageKey" + - service: "digital-key-composite-service - PROD" + keyRequests: + - "GET /api/v1/digitalkey//password" + - "GET /api/v1/digitalkey//pairing" + CN-Prod: + - metric: "builtin:service.keyRequest.errors.fivexx.count" + filter: + - service: "TrackApi - smc - PROD" + keyRequests: + - "trackKey" + - "manageKey" + - service: "digital-key-composite-service - PROD" + keyRequests: + - "GET /api/v1/digitalkey//password" + - "GET /api/v1/digitalkey//pairing" diff --git a/DE-XX/TP_Mobile_Send2VehicleLegacy.yaml b/DE-7/TP_Mobile_Send2VehicleLegacy.yaml similarity index 65% rename from DE-XX/TP_Mobile_Send2VehicleLegacy.yaml rename to DE-7/TP_Mobile_Send2VehicleLegacy.yaml index 73da4cc..816e77f 100644 --- a/DE-XX/TP_Mobile_Send2VehicleLegacy.yaml +++ b/DE-7/TP_Mobile_Send2VehicleLegacy.yaml @@ -15,30 +15,15 @@ slo_definition: - service: "LegacyPoiApi - msgsvc - prod" keyRequests: - "" - - metric: "builtin:service.requestCount.total" - filter: - - service: "LegacyPoiApi - msgsvc - prod" - keyRequests: - - "" NA-Prod: - metric: "builtin:service.errors.server.successCount" filter: - service: "LegacyPoiApi - msgsvc - prod" keyRequests: - "" - - metric: "builtin:service.requestCount.total" - filter: - - service: "LegacyPoiApi - msgsvc - prod" - keyRequests: - - "" CN-Prod: - metric: "builtin:service.errors.server.successCount" filter: - service: "LegacyPoiApi - msgsvc - prod" keyRequests: - "" - - metric: "builtin:service.requestCount.total" - filter: - - service: "LegacyPoiApi - msgsvc - prod" - keyRequests: - - "" diff --git a/README.md b/README.md index 9fdf9bf..2c611a3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,27 @@ -Requirements: - Welche SLOs sollen reingepackt werden? - Nur QM-Report und Dashboard +# YAML 2 Terraform Generator +## Description +The task was to create a first draft of a script that can use a specific YAML file datastructure to generate Terraform configuration files. Afterwards it can be used as part of a Jenkins pipeline. - 1 Skript YAML files für jede dieser SLOs https://atc.bmwgroup.net/bitbucket/projects/OPAPM/repos/qm_report/browse/slo_parameter.yaml?at=refs%2Fheads%2FVersion2 eintragen - 2 Skript, dass die YAML files einliest und Terraform files generiert, welche dann via Jenkins eingespielt werden können +## Info + - YAML files should be stored according to the business line + - DE-3 + - DE-4 + - DE-7 + - EC-DE + - Some YAML files have been created for testing purposes based on the shared_configuration and CoCo_Terraform_Config repositories. + +- [shared_configuration](https://atc.bmwgroup.net/bitbucket/projects/OPAPM/repos/shared_configuration) +- [CoCo_Terraform_Config](https://atc.bmwgroup.net/bitbucket/projects/OPAPM/repos/coco_terraform_config) + +## Requirements +### Python +The used python version for running the script is 3.11.2. +### Libraries +Some python packages need to be installed. Please use the requirements.txt file to install missing packages. + +## Running the program +Using the program is straightforward. +- `.\generate.py ` +- Example: `.\generate.py DE-3` +- `.\generate DE-3,DE-4,DE-7,EC-DE` diff --git a/convert.py b/generate.py similarity index 76% rename from convert.py rename to generate.py index a9d47fc..7ba2091 100644 --- a/convert.py +++ b/generate.py @@ -12,10 +12,11 @@ from pathlib import Path OUTPUT_FOLDER_BASENAME = os.path.basename("output") TEMPLATE_FOLDER_BASENAME = os.path.basename("jinja-templates") TEMPLATE_FILES = { - "terraform-template.j2": ["builtin:service.keyRequest.errors.fivexx.rate"], + "terraform-template-1.j2":["builtin:service.keyRequest.errors.fivexx.rate"], "terraform-template-2.j2":["builtin:service.keyRequest.errors.server.successCount"], "terraform-template-3.j2":["builtin:service.keyRequest.errors.fivexx.count"], - "terraform-template-4.j2":["builtin:service.successes.server.rate"] + "terraform-template-4.j2":["builtin:service.errors.server.successCount"], + "terraform-template-5.j2":["builtin:service.errors.fivexx.successCount"] } FOLDERS = {"My Journey":"DE-3", "Connected Vehicle Platforms":"DE-7", @@ -45,8 +46,8 @@ def main(configFile): environments = {} template = None metric = None - services = None - keyRequests = None + services = [] + keyRequests = [] try: # read yaml file @@ -89,20 +90,21 @@ def main(configFile): metric = nested_lookup('metric',ev) for service in ev[0]["filter"]: - services = nested_lookup('service',service) - keyRequests = nested_lookup('keyRequests',service) + services.append(nested_lookup('service',service)) + keyRequests.append(nested_lookup('keyRequests',service)) with open(os.path.join(folder_path,module_name+".tf"),"w+") as file: jinja_template = jinja_environment.get_template(template_logic(metric)) file.write(jinja_template.render(module=module_name, - slo_name=slo_name, - metric=metric, - description=description, - services='~",\n\t\t\t\t~"'.join(services), - keyRequests='~",\n\t\t\t\t~"'.join(itertools.chain.from_iterable(keyRequests)), - target=slo_definition_tresholds_failure, - warning=slo_definition_tresholds_warning)) - + slo_name=slo_name, + metric=metric[0], + description=description, + services='~",\n\t\t\t\t~"'.join(itertools.chain.from_iterable(services)), + keyRequests='~",\n\t\t\t\t~"'.join(itertools.chain.from_iterable(itertools.chain.from_iterable(keyRequests))), + target=slo_definition_tresholds_failure, + warning=slo_definition_tresholds_warning)) + services = [] + keyRequests = [] if __name__ == "__main__": @@ -111,9 +113,9 @@ if __name__ == "__main__": print(sys.argv) if len(sys.argv) != 2: - print(".\convert.py ") - print("Example: .\convert.py DE-3") - print("Example: .\convert.py DE-3,DE-4,...") + print(".\generate.py ") + print("Example: .\generate.py DE-3") + print("Example: .\generate.py DE-3,DE-4,...") sys.exit() # init folder diff --git a/jinja-templates/terraform-template.j2 b/jinja-templates/terraform-template-1.j2 similarity index 100% rename from jinja-templates/terraform-template.j2 rename to jinja-templates/terraform-template-1.j2 diff --git a/jinja-templates/terraform-template-4.j2 b/jinja-templates/terraform-template-4.j2 index 4eea089..e4c37dc 100644 --- a/jinja-templates/terraform-template-4.j2 +++ b/jinja-templates/terraform-template-4.j2 @@ -3,28 +3,32 @@ module {{ module }} { source = "../../_dynatrace-base-modules/dynatrace-service-level-objective" name = "{{ slo_name }}" - + description = "{{ description }}" - - # entity selector object - filter = "" + + # entity selector object + filter = "" # metric expression of the calculation as done in data explorer ui - metric_expression = <</password~", + ~"GET /api/v1/digitalkey//pairing~" + )"))))):splitBy()) / - (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), + (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), fromRelationship.isServiceMethodOfService( type(~"SERVICE~"),entityName.in( - ~"btc-vehicle-composite-service - PROD~" + ~"TrackApi - smc - PROD~", + ~"digital-key-composite-service - PROD~" ) ),entityName.in( - ~"GET /api/v1/vehicles~" + ~"trackKey~", + ~"manageKey~", + ~"GET /api/v1/digitalkey//password~", + ~"GET /api/v1/digitalkey//pairing~" )"))))):splitBy())) EOT @@ -39,5 +47,5 @@ module TP_Mobile_VehicleList { # target and warning percentage of the SLO as double target = 98 # if not set(removed) it's defaulted to 98 warning = 99 # if not set(removed) it's defaulted to 99 - + } \ No newline at end of file diff --git a/output/CN_Prod/slo/TP_Mobile_Login.tf b/output/CN_Prod/slo/TP_Mobile_Login.tf index 9d043d7..3559643 100644 --- a/output/CN_Prod/slo/TP_Mobile_Login.tf +++ b/output/CN_Prod/slo/TP_Mobile_Login.tf @@ -11,13 +11,18 @@ module TP_Mobile_Login { # metric expression of the calculation as done in data explorer ui metric_expression = </primary~", + ~"GET /api/v2/presentation/users/validate~", + ~"POST /api/v2/vehicles//primary~", ~"POST /api/v2/vehicles//primary/map~", ~"POST /api/v1/vehicles//validate-security-code~", ~"POST /api/v1/vehicles//resend-security-code~", @@ -27,10 +29,12 @@ module TP_Mobile_Mapping { (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), fromRelationship.isServiceMethodOfService( type(~"SERVICE~"),entityName.in( - ~"vehicle-mapping-composite-service - PROD~" + ~"btc-user-composite-service - PROD~", + ~"vehicle-mapping-composite-service - PROD~" ) ),entityName.in( - ~"POST /api/v2/vehicles//primary~", + ~"GET /api/v2/presentation/users/validate~", + ~"POST /api/v2/vehicles//primary~", ~"POST /api/v2/vehicles//primary/map~", ~"POST /api/v1/vehicles//validate-security-code~", ~"POST /api/v1/vehicles//resend-security-code~", diff --git a/output/CN_Prod/slo/TP_Mobile_Remote360.tf b/output/CN_Prod/slo/TP_Mobile_Remote360.tf index c664d0d..0d44337 100644 --- a/output/CN_Prod/slo/TP_Mobile_Remote360.tf +++ b/output/CN_Prod/slo/TP_Mobile_Remote360.tf @@ -11,7 +11,7 @@ module TP_Mobile_Remote360 { # metric expression of the calculation as done in data explorer ui metric_expression = </password~", + ~"GET /api/v1/digitalkey//pairing~" + )"))))):splitBy()) / - (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), + (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), fromRelationship.isServiceMethodOfService( type(~"SERVICE~"),entityName.in( - ~"btc-vehicle-composite-service - PROD~" + ~"TrackApi - smc - PROD~", + ~"digital-key-composite-service - PROD~" ) ),entityName.in( - ~"GET /api/v1/vehicles~" + ~"trackKey~", + ~"manageKey~", + ~"GET /api/v1/digitalkey//password~", + ~"GET /api/v1/digitalkey//pairing~" )"))))):splitBy())) EOT @@ -39,5 +47,5 @@ module TP_Mobile_VehicleList { # target and warning percentage of the SLO as double target = 98 # if not set(removed) it's defaulted to 98 warning = 99 # if not set(removed) it's defaulted to 99 - + } \ No newline at end of file diff --git a/output/EMEA_Prod/slo/TP_Mobile_Login.tf b/output/EMEA_Prod/slo/TP_Mobile_Login.tf index 9d043d7..3559643 100644 --- a/output/EMEA_Prod/slo/TP_Mobile_Login.tf +++ b/output/EMEA_Prod/slo/TP_Mobile_Login.tf @@ -11,13 +11,18 @@ module TP_Mobile_Login { # metric expression of the calculation as done in data explorer ui metric_expression = </primary~", + ~"GET /api/v2/presentation/users/validate~", + ~"POST /api/v2/vehicles//primary~", ~"POST /api/v2/vehicles//primary/map~", ~"POST /api/v1/vehicles//validate-security-code~", ~"POST /api/v1/vehicles//resend-security-code~", @@ -27,10 +29,12 @@ module TP_Mobile_Mapping { (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), fromRelationship.isServiceMethodOfService( type(~"SERVICE~"),entityName.in( - ~"vehicle-mapping-composite-service - PROD~" + ~"btc-user-composite-service - PROD~", + ~"vehicle-mapping-composite-service - PROD~" ) ),entityName.in( - ~"POST /api/v2/vehicles//primary~", + ~"GET /api/v2/presentation/users/validate~", + ~"POST /api/v2/vehicles//primary~", ~"POST /api/v2/vehicles//primary/map~", ~"POST /api/v1/vehicles//validate-security-code~", ~"POST /api/v1/vehicles//resend-security-code~", diff --git a/output/EMEA_Prod/slo/TP_Mobile_Remote360.tf b/output/EMEA_Prod/slo/TP_Mobile_Remote360.tf index c664d0d..0d44337 100644 --- a/output/EMEA_Prod/slo/TP_Mobile_Remote360.tf +++ b/output/EMEA_Prod/slo/TP_Mobile_Remote360.tf @@ -11,7 +11,7 @@ module TP_Mobile_Remote360 { # metric expression of the calculation as done in data explorer ui metric_expression = </password~", + ~"GET /api/v1/digitalkey//pairing~" + )"))))):splitBy()) / - (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), + (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), fromRelationship.isServiceMethodOfService( type(~"SERVICE~"),entityName.in( - ~"btc-vehicle-composite-service - PROD~" + ~"TrackApi - smc - PROD~", + ~"digital-key-composite-service - PROD~" ) ),entityName.in( - ~"GET /api/v1/vehicles~" + ~"trackKey~", + ~"manageKey~", + ~"GET /api/v1/digitalkey//password~", + ~"GET /api/v1/digitalkey//pairing~" )"))))):splitBy())) EOT @@ -39,5 +47,5 @@ module TP_Mobile_VehicleList { # target and warning percentage of the SLO as double target = 98 # if not set(removed) it's defaulted to 98 warning = 99 # if not set(removed) it's defaulted to 99 - + } \ No newline at end of file diff --git a/output/NA_Prod/slo/TP_Mobile_Login.tf b/output/NA_Prod/slo/TP_Mobile_Login.tf index 9d043d7..3559643 100644 --- a/output/NA_Prod/slo/TP_Mobile_Login.tf +++ b/output/NA_Prod/slo/TP_Mobile_Login.tf @@ -11,13 +11,18 @@ module TP_Mobile_Login { # metric expression of the calculation as done in data explorer ui metric_expression = </primary~", + ~"GET /api/v2/presentation/users/validate~", + ~"POST /api/v2/vehicles//primary~", ~"POST /api/v2/vehicles//primary/map~", ~"POST /api/v1/vehicles//validate-security-code~", ~"POST /api/v1/vehicles//resend-security-code~", @@ -27,10 +29,12 @@ module TP_Mobile_Mapping { (builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method), fromRelationship.isServiceMethodOfService( type(~"SERVICE~"),entityName.in( - ~"vehicle-mapping-composite-service - PROD~" + ~"btc-user-composite-service - PROD~", + ~"vehicle-mapping-composite-service - PROD~" ) ),entityName.in( - ~"POST /api/v2/vehicles//primary~", + ~"GET /api/v2/presentation/users/validate~", + ~"POST /api/v2/vehicles//primary~", ~"POST /api/v2/vehicles//primary/map~", ~"POST /api/v1/vehicles//validate-security-code~", ~"POST /api/v1/vehicles//resend-security-code~", diff --git a/output/NA_Prod/slo/TP_Mobile_Remote360.tf b/output/NA_Prod/slo/TP_Mobile_Remote360.tf index c664d0d..0d44337 100644 --- a/output/NA_Prod/slo/TP_Mobile_Remote360.tf +++ b/output/NA_Prod/slo/TP_Mobile_Remote360.tf @@ -11,7 +11,7 @@ module TP_Mobile_Remote360 { # metric expression of the calculation as done in data explorer ui metric_expression = <