From e49bcbc6343085e17de51acf99ee53efcf3692d5 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Wed, 2 Apr 2025 13:24:08 +0200 Subject: [PATCH] refactor to reduce boilerplate code --- .gitignore | 1 + snippets/test03.py | 109 +++++++++++++++++++++++++++++++++++++++++++++ snippets/test04.py | 26 +++++++++++ 3 files changed, 136 insertions(+) create mode 100644 snippets/test03.py create mode 100644 snippets/test04.py diff --git a/.gitignore b/.gitignore index 39af63c..58924b5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ ENV defs/ */.venv/ __pycache__/ +.*.swp diff --git a/snippets/test03.py b/snippets/test03.py new file mode 100644 index 0000000..5042065 --- /dev/null +++ b/snippets/test03.py @@ -0,0 +1,109 @@ +import os +from loguru import logger + +import defectdojo_api +from defectdojo_api.rest import ApiException as DefectDojoApiException +import datetime +from dateutil.relativedelta import relativedelta + +import dependencytrack_api +from dependencytrack_api.rest import ApiException as DependencyTrackApiException + +class MyLocalException(Exception): pass + +def executeApiCall(apiClient, ApiClass, EndpointMethod, RequestClass, requestParams, additionalParams=[]): + try: + logger.info(f"Calling {ApiClass}.{EndpointMethod} with {RequestClass} ({additionalParams}, {requestParams})") + instance = ApiClass(apiClient) + request = RequestClass(**requestParams) + response = EndpointMethod(instance, *additionalParams, request) + logger.info(f"Response is {response}") + return response + except Exception as e: + logger.error(f"Caught error {e} with {str(e)}") + raise MyLocalException(e) + + + +try: + DTRACK_API_URL = os.environ["DTRACK_API_URL"] + DTRACK_TOKEN = os.environ["DTRACK_TOKEN"] + DEFECTDOJO_URL = os.environ["DEFECTDOJO_URL"] + DEFECTDOJO_TOKEN = os.environ["DEFECTDOJO_TOKEN"] +except KeyError as e: + raise Exception(f"Env variable {e} is shall be set") + + + +defectdojo_configuration = defectdojo_api.Configuration( + host = DEFECTDOJO_URL +) +defectdojo_configuration.api_key['tokenAuth'] = DEFECTDOJO_TOKEN +defectdojo_configuration.api_key_prefix['tokenAuth'] = 'Token' + +dependencytrack_configuration = dependencytrack_api.Configuration( + host = f"{DTRACK_API_URL}/api" +) +dependencytrack_configuration.debug = False +dependencytrack_configuration.api_key['ApiKeyAuth'] = DTRACK_TOKEN + +with defectdojo_api.ApiClient(defectdojo_configuration) as defectdojo_api_client: + print("Create product in DefectDojo") + product_response = \ + executeApiCall( + defectdojo_api_client, + defectdojo_api.ProductsApi, + defectdojo_api.ProductsApi.products_create, + defectdojo_api.ProductRequest, + { 'name': "Test Product", 'description': "Just a product to test the API", 'prod_type': 1 }, + [] + ) + + product_id = product_response.id + print(f"{product_id=}") + + print("Create engagement in DefectDojo") + start_time = datetime.date.today() + end_time = start_time + relativedelta(years=10) + engagement_response = \ + executeApiCall( + defectdojo_api_client, + defectdojo_api.EngagementsApi, + defectdojo_api.EngagementsApi.engagements_create, + defectdojo_api.EngagementRequest, + { 'name': "Test Engagement 01", 'target_start': start_time, 'target_end': end_time, 'status': 'In Progress', 'product': product_id }, + [] + ) + + engagement_id = engagement_response.id + print(f"{engagement_id=}") + +with dependencytrack_api.ApiClient(dependencytrack_configuration) as dependencytrack_api_client: + project_response = \ + executeApiCall( + dependencytrack_api_client, + dependencytrack_api.ProjectApi, + dependencytrack_api.ProjectApi.create_project, + dependencytrack_api.Project, + { 'name': "Test Project", 'uuid': "", 'last_bom_import': 0 }, + [] + ) + + project_uuid = project_response.uuid + print(f"{project_uuid=}") + + properties = [ + { 'group_name': "integrations", 'property_name': "defectdojo.engagementId", 'property_value': str(engagement_id), 'property_type': "STRING" }, + { 'group_name': "integrations", 'property_name': "defectdojo.doNotReactivate", 'property_value': "true", 'property_type': "BOOLEAN" }, + { 'group_name': "integrations", 'property_name': "defectdojo.reimport", 'property_value': "true", 'property_type': "BOOLEAN" } + ] + for property in properties: + executeApiCall( + dependencytrack_api_client, + dependencytrack_api.ProjectPropertyApi, + dependencytrack_api.ProjectPropertyApi.create_property1, + dependencytrack_api.ProjectProperty, + property, + [ project_uuid ] + ) + diff --git a/snippets/test04.py b/snippets/test04.py new file mode 100644 index 0000000..5ea62b6 --- /dev/null +++ b/snippets/test04.py @@ -0,0 +1,26 @@ +def test(a, b, c, d, e, f, g): + print(f"{a=}, {b=}, {c=}, {d=}, {e=}, {g=}") + + +params = { + "a": 1, + "b": 2, + "c": 3, + "d": 4, + "e": 5, + "f": 6, + "g": 7 +} +test(*params) + +params = [1, 2, 3, 4, 5, 6, 7] +test(*params) + +p1 = [] +p2 = [2, 3, 4, 5, 6, 7, 8] +test(*p1, *p2) + +p1 = None +p2 = [2, 3, 4, 5, 6, 7, 8] +test(*p1, *p2) +