From a006ff33faee032d857970a4484268831e6f29a2 Mon Sep 17 00:00:00 2001 From: Tarun Tak Date: Thu, 14 May 2026 06:49:37 +0000 Subject: [PATCH 1/2] feat: add batch size option to certificate retirement API call --- .../retired_user_cert_remover.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/util/jenkins/retired_user_cert_remover/retired_user_cert_remover.py b/util/jenkins/retired_user_cert_remover/retired_user_cert_remover.py index 75e731d5c..b588af9f7 100644 --- a/util/jenkins/retired_user_cert_remover/retired_user_cert_remover.py +++ b/util/jenkins/retired_user_cert_remover/retired_user_cert_remover.py @@ -78,7 +78,7 @@ def _request(): sys.exit(1) -def call_retire_certs_api(lms_host, token, dry_run): +def call_retire_certs_api(lms_host, token, dry_run, batch_size=0): """ Call POST /api/certificates/v1/retire_certs_s3 on the LMS. @@ -88,7 +88,11 @@ def call_retire_certs_api(lms_host, token, dry_run): Exits with code 2 if the call returns 207 (partial failure). """ url = f'{lms_host.rstrip("/")}/api/certificates/v1/retire_certs_s3' - params = {'dry_run': 'true'} if dry_run else {} + params = {} + if dry_run: + params['dry_run'] = 'true' + if batch_size: + params['batch_size'] = batch_size headers = {'Authorization': f'JWT {token}', 'Content-Type': 'application/json'} @backoff.on_exception(backoff.expo, requests.RequestException, max_tries=MAX_API_ATTEMPTS) @@ -134,10 +138,12 @@ def _request(): @click.option('--lms-host', required=True, help='Base URL of the LMS (e.g. https://lms.edx.org)') @click.option('--client-id', envvar='LMS_CLIENT_ID', required=True, help='OAuth DOT client id') @click.option('--client-secret', envvar='LMS_CLIENT_SECRET', required=True, help='OAuth DOT client secret') -@click.option('--dry-run', is_flag=True, help='Run in dry-run mode without making any changes') -def controller(lms_host, client_id, client_secret, dry_run): +@click.option('--dry-run', default='true', help='Run in dry-run mode without making any changes (true/false)') +@click.option('--batch-size', default=0, type=int, help='Max certificates to process per run (0 = no limit)') +def controller(lms_host, client_id, client_secret, dry_run, batch_size): + dry_run = dry_run.lower() != 'false' jwt_token = get_jwt_token(lms_host, client_id, client_secret) - call_retire_certs_api(lms_host, jwt_token, dry_run) + call_retire_certs_api(lms_host, jwt_token, dry_run, batch_size) if __name__ == '__main__': From 944f28afcca6e86d1a14a8543956ffb54f90fabb Mon Sep 17 00:00:00 2001 From: Tarun Tak Date: Thu, 14 May 2026 07:24:01 +0000 Subject: [PATCH 2/2] fix: update batch size validation and dry-run option type in certificate retirement API --- .../retired_user_cert_remover/retired_user_cert_remover.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/util/jenkins/retired_user_cert_remover/retired_user_cert_remover.py b/util/jenkins/retired_user_cert_remover/retired_user_cert_remover.py index b588af9f7..26993a85f 100644 --- a/util/jenkins/retired_user_cert_remover/retired_user_cert_remover.py +++ b/util/jenkins/retired_user_cert_remover/retired_user_cert_remover.py @@ -91,7 +91,7 @@ def call_retire_certs_api(lms_host, token, dry_run, batch_size=0): params = {} if dry_run: params['dry_run'] = 'true' - if batch_size: + if batch_size > 0: params['batch_size'] = batch_size headers = {'Authorization': f'JWT {token}', 'Content-Type': 'application/json'} @@ -138,10 +138,9 @@ def _request(): @click.option('--lms-host', required=True, help='Base URL of the LMS (e.g. https://lms.edx.org)') @click.option('--client-id', envvar='LMS_CLIENT_ID', required=True, help='OAuth DOT client id') @click.option('--client-secret', envvar='LMS_CLIENT_SECRET', required=True, help='OAuth DOT client secret') -@click.option('--dry-run', default='true', help='Run in dry-run mode without making any changes (true/false)') +@click.option('--dry-run', default=True, type=click.BOOL, help='Run in dry-run mode without making any changes (true/false)') @click.option('--batch-size', default=0, type=int, help='Max certificates to process per run (0 = no limit)') def controller(lms_host, client_id, client_secret, dry_run, batch_size): - dry_run = dry_run.lower() != 'false' jwt_token = get_jwt_token(lms_host, client_id, client_secret) call_retire_certs_api(lms_host, jwt_token, dry_run, batch_size)