#!/usr/bin/env python3 import argparse import yaml webhook_service = "infra-webhook-service-v2" namespace = "infra" ca_bundle_dev = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMzekNDQWNlZ0F3SUJBZ0lRUnAwN1VOT05hR0tzdzNRaEwrcXdFakFOQmdrcWhraUc5dzBCQVFzRkFEQVoKTVJjd0ZRWURWUVFERXc1elpXeG1MWE5wWjI1bFpDMWpZVEFlRncweU1UQTJNRGN3TnpNMk1URmFGdzB6TVRBMgpNRFV3TnpNMk1URmFNQmt4RnpBVkJnTlZCQU1URG5ObGJHWXRjMmxuYm1Wa0xXTmhNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyd0ZUV3Vxcndtc2ltMDNPV2NHK0xYVmlQbS8vMzl5SjVzVzEKZFBkeURSNkMrWWxKWjNtZTRCam55KzRwc3JTREZtcTRRUnVLNFd0WWZ0SmJYcUFFRkovcW9LUnE1a0JBMDBybQpLR2tueGlUSXFtNnVvNzNSQ05kOFlqb3ROaHgrZXBsd0pLSHRRcTkrSEViNThEMy9YNUZVNElFS3hBR0cvMysrClNiZXdsOHUvYkgwdjdZTzk0QTM3VkRPRHp6YmtXamRhTVZDRDBjN1AzSE43NEVER2IvaGhhWFZIQ1hOTXliU0wKVzRDQnZ5WlQ5cE9lalNGcHJtZWlJV0lpRHYwTWN5SHEvZ201OS82NElVbWhtVU9qSElNZVUzWm43ZzJrUWFuNgo2VFg4anE0L1dhaGd3OWZFeWVOUFZGeW13UHZXUnpFdnhsNmdKQmlnS25IMnZsTlNyd0lEQVFBQm95TXdJVEFPCkJnTlZIUThCQWY4RUJBTUNBcVF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0MKQVFFQXJiSHJEdDkySFhXMk4wekJLWW93OFZSdlpNNXdyYnc4aWJnTEhFSGFOd25DWUtGZytwaXJBcXJSZ2RCbwo4YjQzWWljYkQ4QXZHNGRKVm5SVEJxSkI1ZWJEV0ExcjRsSnZrTE9lbDZabHNLRGIyL1dvbWpkL0tGcFdoQVp0CnI5RWs3R1dlbkNuRytVMVBBR05Yc1Rlb0ZWcWxudW5sZWgwdTRjazRMSlJsVGYxMUQrQW9pYUQrTC9WOExSaGwKM2QxalJjZ09QOGtaRmFSUzNsWDd2ZHpiWktBcGlmK3N5VkZNcTBOcjFlZjd6T0xEYnhxT1duSjdJOEtKR090ZApjREFvZ0dMS0NnUXhva242bGJxK21Lb3hURmY0YmtlRnNSZ3Q5V1hHTDN4SUNBQkUvSEtoQW8vUjZNdlhSUFZKCndsTUxPa2d4REhtbXMrVGJYZnJHalNTSDlnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=' ca_bundle_stg = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMzekNDQWNlZ0F3SUJBZ0lRZGY1Nll3dGZUOHFFQVI4dTVQRE9VekFOQmdrcWhraUc5dzBCQVFzRkFEQVoKTVJjd0ZRWURWUVFERXc1elpXeG1MWE5wWjI1bFpDMWpZVEFlRncweU1UQTJNRGd3TlRNMk1qaGFGdzB6TVRBMgpNRFl3TlRNMk1qaGFNQmt4RnpBVkJnTlZCQU1URG5ObGJHWXRjMmxuYm1Wa0xXTmhNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF2Rkh0bnBjeGNwWVQyamExRHQ1UkE5b25jR2Y1NGFFT0lFTVoKMk02cWd6Y3g3YlEweFlPRExEbzdZaGQ0RlhFK1BMOG95S2oxellFWSs4dUcreS9sVUN2VGE3RTJxTjFlWUJpcgpuajVJWTBvQ3Y0bTdmWnpHS2ZDb3g5WUlsT0ora0JhcUFlWFVrMTAzcExRWXZYRWNmK1ZDeFlCVFVsaGdvaS9iCk15NWZZWVhTY3lYdXIwK0U5R3IzSE1pME1zN21qZDNiNUZmbHhZWC9RMGpla0JKVzg3eE16b0VhMTdOaWQ3VXMKd0JvY3hMQUFUdTJWQTJSRG5PNTBEU1RvUDhPdytBb2Q4WDVXbkpoSEpIWDl3RU91cFJhNE1zbUh4cnlaUHZ0VgpxdTl1emdEWmtVbDZwa2NheENRcFJWZnFwV2VNMWs5a0tFR0ErNFhYR1dSM2t5UEVWd0lEQVFBQm95TXdJVEFPCkJnTlZIUThCQWY4RUJBTUNBcVF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0MKQVFFQVdVblU2YjE3eUFVN1I0NWEyRFM2UU04RHNQNEpKZUkwQjV0ck1mdHdrT2c3QXJHOGJoSThmb2RZTWtOaQoxWURjR3l0VVQ2OWwrVjBXRUc4NUFsZ0x6WWkxRmtjY210aVZmZkJVaXZvcHRYd0k4YXVZWXJjekQrb1kyZU5BCnI2dWpaUGZRSVlBOFBRaDF1dTBZeE83TmVWK0tvM3RHSWxEcDlYVlhCNVkwQWo5VWdCS0dxeHdXaWVJZkNJN00KaHlYQWRtYndKSUZ0S3Z3NWlWT1N0S3JFVVJtM3M4b1UrdXlJQnR4VXNEUGxXc05hSWFkSnJwamNoYjhhMUdYYwo0V0NlQklMUVBKSzJQak5qOU5iQ2xJUjhMTk53ZStLbGhKcHd1T0lYNjl4STBlc3pUeldaYS9QRnBjdnZVUFhLCldRNUx1NEFFRDJkNk1aSEdiTDdIRlVOUWJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=' ca_bundle_prod = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMzekNDQWNlZ0F3SUJBZ0lRSFRjNURqeXJBeStmWTlMOUZNZGFXVEFOQmdrcWhraUc5dzBCQVFzRkFEQVoKTVJjd0ZRWURWUVFERXc1elpXeG1MWE5wWjI1bFpDMWpZVEFlRncweU1UQTJNRGd4TWpBMk1qaGFGdzB6TVRBMgpNRFl4TWpBMk1qaGFNQmt4RnpBVkJnTlZCQU1URG5ObGJHWXRjMmxuYm1Wa0xXTmhNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4UHFvL2ZUV1BNWnRWNVE3RnpGUGZTMGI4SzBPYVhreVBwcGYKbG1IRzBnMnJYck9iUmJON3d5WTczTzFueG1OSktRb3N5K0VJZDRhY0R2RlNNd2lmU2ljdHNIR3NQMWRmbWxSTgp2Y1lXUG9LMStveHdaN3hEb1Y4Q3R1bHNrTGt0aXhEY3l1cmZLV1FySlNWUVlVbFlnRk5GbkhDS1R6dmxhR0JhCmpET0dZck9xU1o3YnpqYTlHNnNFamswa2NGK1p6YU1xUDkvWVJIYkJoTmRuTFIyaFMwNHFONGVFYWFFUVdyM1oKR1VLR05yTi9DNFZOWGJoUmJneU9UOUZqcm9VcGloY1QrakxYd3NlUk9KclgvYVdPNitBY0hLQmIwNkVnRkdNNwprdkNnc1JQamtGcVFWWVBsTEZLbWExRXNrc0NMdENwNldIajhwYVljcHhVYS9TZ3dlUUlEQVFBQm95TXdJVEFPCkJnTlZIUThCQWY4RUJBTUNBcVF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0MKQVFFQWVHRjlya2dMNWVDSW1sNHJxZ292U2hQMTF1K29sTUFjVEx6Rmo2c1ZFYlFGUEpoQUt4amRobW1XZ2lCRwpncHkyQXA3eVZDY2pRTUtpYnBNc1haN0tIbkJnVldkTXZOa0h1WGtrdm9sTUhwNEYxTzhRbjBvczA0STdSdDJjClVXYjB6VlIrallKZlBvcUVWSGNJZHVHd2ZHeUJoWFQ3NGo2TmhBR0w3S2xVY3VVcGtUSksrZ3Z1VnhaMFNrV1AKZ2w2czJ5ajBaSU43ZytMYzlqdVp2a1UvV3lHelpJM1lwb21xcnJ1L3FXNUFRclJRWXJsdUtZSVJyQ1ozTmZGSQpsMGRTQXd3R3JBSWJHN0paODJ0VkMvY0dmNlJYbUI0cEo2UG1PREpld2hYRWxvWFlvc2liaW40UmRMZUh0U1pMCnczK0VWejR1ek1sc3ZTakhYNXpXdEhxRjl3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=' # Generate patch yaml file: patch webhook's clientConfig with caBundle and service def patch(env, ca_bundle): webhook_files = [ f'envs/{env}/webhook/manifests.yaml', # f'envs/{env}/webhook/revision-webhook.yaml', # this is only used for integration test ] for webhook_file in webhook_files: print(f'load webhook file {webhook_file}') with open(webhook_file, 'r') as f: webhook_configs = yaml.load_all(f, Loader=yaml.Loader) for config in webhook_configs: webhook_name = config['metadata']['name'] patch_file = f'envs/{env}/{webhook_name}-patch.yaml' patch_config = { 'apiVersion': config['apiVersion'], 'kind': config['kind'], 'metadata': config['metadata'], 'webhooks': [], } for webhook in config['webhooks']: path = webhook['clientConfig']['service']['path'] hook = { 'name': webhook['name'], 'clientConfig': { 'service': None, 'url': f'https://{webhook_service}.{namespace}.svc:443{path}', 'caBundle': ca_bundle, } } patch_config['webhooks'].append(hook) with open(patch_file, 'w') as stream: print(f'generate patch file: {patch_file}') yaml.dump(patch_config, stream) if __name__ == '__main__': parser = argparse.ArgumentParser(description='patch webhook') parser.add_argument('--ca', default='', help='base64 encoded ca certificate. The default ca_bundle will be used if it is empty') parser.add_argument('--env', default='dev', help='environment: dev | staging | prod') args = parser.parse_args() if not args.ca: print('using default ca_bundle...') if args.env == 'dev': args.ca = ca_bundle_dev elif args.env == 'staging': args.ca = ca_bundle_stg elif args.env == 'prod': args.ca = ca_bundle_prod else: print('invalid env') exit(1) patch(args.env, args.ca)