Skip to content

Commit 74c94d4

Browse files
committed
Change sign_result_loc to cmd flag both for sign request and maven upload
1 parent 89be82f commit 74c94d4

File tree

5 files changed

+77
-72
lines changed

5 files changed

+77
-72
lines changed

charon/cmd/cmd_upload.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,16 @@
136136
default=False
137137
)
138138
@option("--dryrun", "-n", is_flag=True, default=False)
139+
@option(
140+
"--sign_result_loc",
141+
"-l",
142+
default="/tmp/sign",
143+
help="""
144+
The local save path for oras to pull the radas signature result.
145+
Sign request will use this path to download the signature result,
146+
Upload will use the file on this path to generate the corresponding .asc files
147+
""",
148+
)
139149
@command()
140150
def upload(
141151
repo: str,
@@ -150,7 +160,8 @@ def upload(
150160
sign_key: str = "redhatdevel",
151161
debug=False,
152162
quiet=False,
153-
dryrun=False
163+
dryrun=False,
164+
sign_result_loc="/tmp/sign"
154165
):
155166
"""Upload all files from a released product REPO to Ronda
156167
Service. The REPO points to a product released tarball which
@@ -221,7 +232,8 @@ def upload(
221232
key=sign_key,
222233
dry_run=dryrun,
223234
manifest_bucket_name=manifest_bucket_name,
224-
config=config
235+
config=config,
236+
sign_result_loc=sign_result_loc
225237
)
226238
if not succeeded:
227239
sys.exit(1)

charon/config.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def validate(self) -> bool:
4848
logger.error("Missing host name setting for UMB!")
4949
return False
5050
if not self.__result_queue:
51-
logger.error("Missing the queue setting to receive siging result in UMB!")
51+
logger.error("Missing the queue setting to receive signing result in UMB!")
5252
return False
5353
if not self.__request_queue:
5454
logger.error("Missing the queue setting to send signing request in UMB!")
@@ -124,8 +124,10 @@ def __init__(self, data: Dict):
124124
self.__ignore_signature_suffix: Dict = data.get("ignore_signature_suffix", None)
125125
self.__signature_command: str = data.get("detach_signature_command", None)
126126
self.__aws_cf_enable: bool = data.get("aws_cf_enable", False)
127+
self.__radas_config_enable: bool = data.get("radas_config_enable", False)
127128
radas_config: Dict = data.get("radas", None)
128129
if radas_config:
130+
self.__radas_config_enable: bool = True
129131
self.__radas_config__: RadasConfig = RadasConfig(radas_config)
130132

131133
def get_ignore_patterns(self) -> List[str]:
@@ -155,6 +157,9 @@ def get_detach_signature_command(self) -> str:
155157
def is_aws_cf_enable(self) -> bool:
156158
return self.__aws_cf_enable
157159

160+
def is_radas_config_enable(self) -> bool:
161+
return self.__radas_config_enable
162+
158163
def get_radas_config(self) -> RadasConfig:
159164
return self.__radas_config__
160165

charon/constants.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,5 @@
175175
DEFAULT_ERRORS_LOG = "errors.log"
176176

177177
DEFAULT_REGISTRY = "localhost"
178-
DEFAULT_SIGN_RESULT_LOC = "/tmp/sign"
179178
DEFAULT_RADAS_SIGN_TIMEOUT_RETRY_COUNT = 10
180179
DEFAULT_RADAS_SIGN_TIMEOUT_RETRY_INTERVAL = 60

charon/pkgs/maven.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@ def handle_maven_uploading(
275275
key=None,
276276
dry_run=False,
277277
manifest_bucket_name=None,
278-
config=None
278+
config=None,
279+
sign_result_loc="/tmp/sign"
279280
) -> Tuple[str, bool]:
280281
""" Handle the maven product release tarball uploading process.
281282
* repo is the location of the tarball in filesystem
@@ -415,9 +416,11 @@ def handle_maven_uploading(
415416
if not conf:
416417
sys.exit(1)
417418

418-
if conf.is_radas_sign_enabled():
419+
if conf.is_radas_config_enable():
419420
logger.info("Start generating radas signature files for s3 bucket %s\n", bucket_name)
420-
(_failed_metas, _generated_signs) = radas_signature.generate_radas_sign(top_level)
421+
(_failed_metas, _generated_signs) = radas_signature.generate_radas_sign(
422+
top_level=top_level, sign_result_loc=sign_result_loc
423+
)
421424
if not _generated_signs:
422425
logger.error(
423426
"No sign result files were downloaded, "
@@ -426,17 +429,17 @@ def handle_maven_uploading(
426429

427430
failed_metas.extend(_failed_metas)
428431
generated_signs.extend(_generated_signs)
429-
logger.info("Singature generation against radas done.\n")
432+
logger.info("Radas signature files generation done.\n")
430433

431-
logger.info("Start upload radas singature files to s3 bucket %s\n", bucket_name)
434+
logger.info("Start upload radas signature files to s3 bucket %s\n", bucket_name)
432435
_failed_metas = s3_client.upload_signatures(
433436
meta_file_paths=generated_signs,
434437
target=(bucket_name, prefix),
435438
product=None,
436439
root=top_level
437440
)
438441
failed_metas.extend(_failed_metas)
439-
logger.info("Signature files uploading against radas done.\n")
442+
logger.info("Radas signature files uploading done.\n")
440443

441444
elif gen_sign:
442445
suffix_list = __get_suffix(PACKAGE_TYPE_MAVEN, conf)

charon/pkgs/radas_signature_handler.py

Lines changed: 48 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
limitations under the License.
1515
"""
1616

17-
import proton
18-
import proton.handlers
1917
import threading
2018
import logging
2119
import json
@@ -25,109 +23,84 @@
2523
import time
2624
from typing import List, Any, Tuple, Callable, Dict
2725
from charon.config import get_config
28-
from charon.constants import DEFAULT_SIGN_RESULT_LOC
2926
from charon.constants import DEFAULT_RADAS_SIGN_TIMEOUT_RETRY_COUNT
3027
from charon.constants import DEFAULT_RADAS_SIGN_TIMEOUT_RETRY_INTERVAL
3128
from charon.pkgs.oras_client import OrasClient
29+
from proton import Event
30+
from proton.handlers import MessagingHandler
3231

3332
logger = logging.getLogger(__name__)
3433

3534

36-
class SignHandler:
37-
"""
38-
Handle the sign result status management
39-
"""
40-
41-
_is_processing: bool = True
42-
_downloaded_files: List[str] = []
43-
44-
@classmethod
45-
def is_processing(cls) -> bool:
46-
return cls._is_processing
47-
48-
@classmethod
49-
def get_downloaded_files(cls) -> List[str]:
50-
return cls._downloaded_files.copy()
51-
52-
@classmethod
53-
def set_processing(cls, value: bool) -> None:
54-
cls._is_processing = value
55-
56-
@classmethod
57-
def set_downloaded_files(cls, files: List[str]) -> None:
58-
cls._downloaded_files = files
59-
60-
61-
class UmbListener(proton.handlers.MessagingHandler):
35+
class UmbListener(MessagingHandler):
6236
"""
6337
UmbListener class (AMQP version), register this when setup UmbClient
38+
Attributes:
39+
sign_result_loc (str): Local save path (e.g. “/tmp/sign”) for oras pull result,
40+
this value transfers from the cmd flag, should register UmbListener when the client starts
6441
"""
6542

66-
def __init__(self) -> None:
43+
def __init__(self, sign_result_loc: str) -> None:
6744
super().__init__()
45+
self.sign_result_loc = sign_result_loc
6846

69-
def on_start(self, event: proton.Event) -> None:
47+
def on_start(self, event: Event) -> None:
7048
"""
7149
On start callback
7250
"""
7351
conf = get_config()
74-
if not conf:
52+
rconf = conf.get_radas_config() if conf else None
53+
if not rconf:
7554
sys.exit(1)
76-
event.container.create_receiver(conf.get_amqp_queue())
55+
conn = event.container.connect(rconf.umb_target())
56+
event.container.create_receiver(conn, rconf.result_queue())
57+
logger.info("Listening on %s, queue: %s", rconf.umb_target(), rconf.result_queue())
7758

78-
def on_message(self, event: proton.Event) -> None:
59+
def on_message(self, event: Event) -> None:
7960
"""
8061
On message callback
8162
"""
8263
# handle response from radas in a thread
8364
thread = threading.Thread(target=self._process_message, args=[event.message.body])
8465
thread.start()
8566

86-
def on_error(self, event: proton.Event) -> None:
67+
def on_connection_error(self, event: Event) -> None:
8768
"""
88-
On error callback
69+
On connection error callback
8970
"""
9071
logger.error("Received an error event:\n%s", event)
9172

92-
def on_disconnected(self, event: proton.Event) -> None:
73+
def on_disconnected(self, event: Event) -> None:
9374
"""
9475
On disconnected callback
9576
"""
9677
logger.error("Disconnected from AMQP broker.")
9778

98-
def _process_message(msg: Any) -> None:
79+
def _process_message(self, msg: Any) -> None:
9980
"""
10081
Process a message received from UMB
10182
Args:
10283
msg: The message body received
10384
"""
104-
try:
105-
msg_dict = json.loads(msg)
106-
result_reference_url = msg_dict.get("result_reference")
85+
msg_dict = json.loads(msg)
86+
result_reference_url = msg_dict.get("result_reference")
10787

108-
if not result_reference_url:
109-
logger.warning("Not found result_reference in message,ignore.")
110-
return
111-
112-
conf = get_config()
113-
if not conf:
114-
sign_result_loc = DEFAULT_SIGN_RESULT_LOC
115-
sign_result_loc = os.getenv("SIGN_RESULT_LOC") or conf.get_sign_result_loc()
116-
logger.info("Using SIGN RESULT LOC: %s", sign_result_loc)
88+
if not result_reference_url:
89+
logger.warning("Not found result_reference in message,ignore.")
90+
return
11791

118-
sign_result_parent_dir = os.path.dirname(sign_result_loc)
119-
os.makedirs(sign_result_parent_dir, exist_ok=True)
92+
logger.info("Using SIGN RESULT LOC: %s", self.sign_result_loc)
93+
sign_result_parent_dir = os.path.dirname(self.sign_result_loc)
94+
os.makedirs(sign_result_parent_dir, exist_ok=True)
12095

121-
oras_client = OrasClient()
122-
files = oras_client.pull(
123-
result_reference_url=result_reference_url, sign_result_loc=sign_result_loc
124-
)
125-
SignHandler.set_downloaded_files(files)
126-
finally:
127-
SignHandler.set_processing(False)
96+
oras_client = OrasClient()
97+
files = oras_client.pull(
98+
result_reference_url=result_reference_url, sign_result_loc=self.sign_result_loc
99+
)
100+
logger.info("Number of files pulled: %d, path: %s", len(files), files[0])
128101

129102

130-
def generate_radas_sign(top_level: str) -> Tuple[List[str], List[str]]:
103+
def generate_radas_sign(top_level: str, sign_result_loc: str) -> Tuple[List[str], List[str]]:
131104
"""
132105
Generate .asc files based on RADAS sign result json file
133106
"""
@@ -142,17 +115,30 @@ def generate_radas_sign(top_level: str) -> Tuple[List[str], List[str]]:
142115
else DEFAULT_RADAS_SIGN_TIMEOUT_RETRY_INTERVAL
143116
)
144117
wait_count = 0
145-
while SignHandler.is_processing():
118+
119+
# Wait until files appear in the sign_result_loc directory
120+
while True:
121+
files = [
122+
os.path.join(sign_result_loc, f)
123+
for f in os.listdir(sign_result_loc)
124+
if os.path.isfile(os.path.join(sign_result_loc, f))
125+
]
126+
if files: # If files exist, break the loop
127+
break
128+
146129
wait_count += 1
147130
if wait_count > timeout_retry_count:
148131
logger.warning("Timeout when waiting for sign response.")
149132
break
150133
time.sleep(timeout_retry_interval)
151134

152-
files = SignHandler.get_downloaded_files()
153135
if not files:
154136
return [], []
155137

138+
if len(files) > 1:
139+
logger.error("Multiple files found in %s. Expected only one file.", sign_result_loc)
140+
return [], []
141+
156142
# should only have the single sign result json file from the radas registry
157143
json_file_path = files[0]
158144
try:

0 commit comments

Comments
 (0)