1919import os
2020import asyncio
2121import sys
22+ import tempfile
2223import uuid
2324from typing import List , Any , Tuple , Callable , Dict
2425from charon .config import get_config , RadasConfig
2526from charon .pkgs .oras_client import OrasClient
26- from proton import SSLDomain , SSLException , Message , Event
27+ from proton import SSLDomain , Message , Event
2728from proton .handlers import MessagingHandler
28- from proton .utils import BlockingConnection
29+ from proton .reactor import Container
2930
3031logger = logging .getLogger (__name__ )
3132
@@ -43,6 +44,8 @@ def __init__(self, sign_result_loc: str, request_id: str) -> None:
4344 super ().__init__ ()
4445 self .sign_result_loc = sign_result_loc
4546 self .request_id = request_id
47+ self .conn = None
48+ self .timer_task = None
4649
4750 def on_start (self , event : Event ) -> None :
4851 """
@@ -56,8 +59,21 @@ def on_start(self, event: Event) -> None:
5659 # explicit check to pass the type checker
5760 if rconf is None :
5861 sys .exit (1 )
59- conn = event .container .connect (rconf .umb_target ())
60- event .container .create_receiver (conn , rconf .result_queue ())
62+
63+ ssl_domain = SSLDomain (SSLDomain .MODE_CLIENT )
64+ ssl_domain .set_credentials (
65+ rconf .client_ca (),
66+ rconf .client_key (),
67+ rconf .client_key_password ()
68+ )
69+ ssl_domain .set_trusted_ca_db (rconf .root_ca ())
70+ ssl_domain .set_peer_authentication (SSLDomain .VERIFY_PEER )
71+
72+ self .conn = event .container .connect (
73+ url = rconf .umb_target (),
74+ ssl_domain = ssl_domain
75+ )
76+ self .receiver = event .container .create_receiver (self .conn , rconf .result_queue (), dynamic = True )
6177 logger .info ("Listening on %s, queue: %s" , rconf .umb_target (), rconf .result_queue ())
6278
6379 def on_message (self , event : Event ) -> None :
@@ -126,8 +142,8 @@ def sign_in_radas(repo_url: str,
126142 logger .debug ("params. repo_url: %s, requester: %s, sign_key: %s, result_path: %s,"
127143 "radas_config: %s" , repo_url , requester , sign_key , result_path , radas_config )
128144 request_id = str (uuid .uuid4 ())
129- exclude = list ( ignore_patterns ) if ignore_patterns else []
130-
145+ exclude = ignore_patterns if ignore_patterns else []
146+
131147 payload = {
132148 "request_id" : request_id ,
133149 "requested_by" : requester ,
@@ -137,33 +153,15 @@ def sign_in_radas(repo_url: str,
137153 "exclude" : exclude
138154 }
139155
140- try :
141- ssl_domain = SSLDomain (SSLDomain .MODE_CLIENT )
142- ssl_domain .set_credentials (
143- radas_config .client_ca (),
144- radas_config .client_key (),
145- radas_config .client_key_password ()
146- )
147- ssl_domain .set_trusted_ca_db (radas_config .root_ca ())
148- ssl_domain .set_peer_authentication (SSLDomain .VERIFY_PEER )
156+ temp_dir = tempfile .mktemp ()
157+ listener = RadasReceiver (temp_dir , json .dumps (payload ))
149158
150- conn = BlockingConnection (radas_config .umb_target (), ssl_domain = ssl_domain )
151- try :
152- sender = conn .create_sender (radas_config .request_queue ())
153- message = Message (body = json .dumps (payload ))
154- sender .send (message )
155- logger .info ("Successfully sent signing request ID: %s" , request_id )
156- finally :
157- conn .close ()
158-
159- except SSLException as e :
160- logger .error ("SSL connection failed: %s" , str (e ))
161- sys .exit (1 )
162- except Exception as e :
163- logger .error ("Failed to send signing request: %s" , str (e ))
164- sys .exit (1 )
165-
166- # wait for AMQP message to be consumed then get response message from UMB
159+ try :
160+ Container (listener ).run ()
161+ logger .info ("Successfully sent signing request ID: %s" , request_id )
162+ finally :
163+ if listener .conn and not listener .conn .closed :
164+ listener .conn .close ()
167165
168166
169167def generate_radas_sign (top_level : str , sign_result_loc : str ) -> Tuple [List [str ], List [str ]]:
0 commit comments