1313See the License for the specific language governing permissions and
1414limitations under the License.
1515"""
16- from typing import List
16+ from typing import List , Tuple
17+
1718from charon .config import CharonConfig , get_config
1819from charon .utils .logs import set_logging
1920from charon .utils .archive import detect_npm_archive , download_archive , NpmArchiveType
6263 help = """
6364 The target to do the uploading, which will decide which s3 bucket
6465 and what root path where all files will be uploaded to.
66+ Can accept more than one target.
6567 """ ,
6668 required = True ,
67- multiple = False ,
69+ multiple = True ,
6870)
6971@option (
7072 "--root_path" ,
@@ -112,7 +114,7 @@ def upload(
112114 repo : str ,
113115 product : str ,
114116 version : str ,
115- target : str ,
117+ target : List [ str ] ,
116118 root_path = "maven-repository" ,
117119 ignore_patterns : List [str ] = None ,
118120 work_dir : str = None ,
@@ -126,10 +128,10 @@ def upload(
126128 """
127129 tmp_dir = work_dir
128130 try :
131+ __decide_mode (product , version , is_quiet = quiet , is_debug = debug )
129132 if dryrun :
130133 logger .info ("Running in dry-run mode,"
131134 "no files will be uploaded." )
132- __decide_mode (is_quiet = quiet , is_debug = debug )
133135 if not __validate_prod_key (product , version ):
134136 return
135137 conf = get_config ()
@@ -138,45 +140,47 @@ def upload(
138140
139141 aws_profile = os .getenv ("AWS_PROFILE" ) or conf .get_aws_profile ()
140142 if not aws_profile :
141- logger .warning ("No AWS profile specified!" )
142-
143- aws_bucket = conf .get_aws_bucket (target )
144- if not aws_bucket :
143+ logger .error ("No AWS profile specified!" )
145144 sys .exit (1 )
146145
147146 archive_path = __get_local_repo (repo )
148147 npm_archive_type = detect_npm_archive (archive_path )
149148 product_key = f"{ product } -{ version } "
150- prefix_ = conf .get_bucket_prefix (target )
149+ manifest_bucket_name = conf .get_manifest_bucket ()
150+ targets_ = __get_targets (target , conf )
151151 if npm_archive_type != NpmArchiveType .NOT_NPM :
152152 logger .info ("This is a npm archive" )
153- tmp_dir = handle_npm_uploading (
153+ tmp_dir , succeeded = handle_npm_uploading (
154154 archive_path ,
155155 product_key ,
156- bucket_name = aws_bucket ,
157- prefix = prefix_ ,
156+ targets = targets_ ,
158157 aws_profile = aws_profile ,
159158 dir_ = work_dir ,
160- dry_run = dryrun
159+ dry_run = dryrun ,
160+ manifest_bucket_name = manifest_bucket_name
161161 )
162+ if not succeeded :
163+ sys .exit (1 )
162164 else :
163165 ignore_patterns_list = None
164166 if ignore_patterns :
165167 ignore_patterns_list = ignore_patterns
166168 else :
167169 ignore_patterns_list = __get_ignore_patterns (conf )
168170 logger .info ("This is a maven archive" )
169- tmp_dir = handle_maven_uploading (
171+ tmp_dir , succeeded = handle_maven_uploading (
170172 archive_path ,
171173 product_key ,
172174 ignore_patterns_list ,
173175 root = root_path ,
174- bucket_name = aws_bucket ,
176+ targets = targets_ ,
175177 aws_profile = aws_profile ,
176- prefix = prefix_ ,
177178 dir_ = work_dir ,
178- dry_run = dryrun
179+ dry_run = dryrun ,
180+ manifest_bucket_name = manifest_bucket_name
179181 )
182+ if not succeeded :
183+ sys .exit (1 )
180184 except Exception :
181185 print (traceback .format_exc ())
182186 sys .exit (2 ) # distinguish between exception and bad config or bad state
@@ -216,9 +220,10 @@ def upload(
216220 help = """
217221 The target to do the deletion, which will decide which s3 bucket
218222 and what root path where all files will be deleted from.
223+ Can accept more than one target.
219224 """ ,
220225 required = True ,
221- multiple = False ,
226+ multiple = True ,
222227)
223228@option (
224229 "--root_path" ,
@@ -265,7 +270,7 @@ def delete(
265270 repo : str ,
266271 product : str ,
267272 version : str ,
268- target : str ,
273+ target : List [ str ] ,
269274 root_path = "maven-repository" ,
270275 ignore_patterns : List [str ] = None ,
271276 work_dir : str = None ,
@@ -279,10 +284,10 @@ def delete(
279284 """
280285 tmp_dir = work_dir
281286 try :
287+ __decide_mode (product , version , is_quiet = quiet , is_debug = debug )
282288 if dryrun :
283289 logger .info ("Running in dry-run mode,"
284290 "no files will be deleted." )
285- __decide_mode (is_quiet = quiet , is_debug = debug )
286291 if not __validate_prod_key (product , version ):
287292 return
288293 conf = get_config ()
@@ -291,45 +296,47 @@ def delete(
291296
292297 aws_profile = os .getenv ("AWS_PROFILE" ) or conf .get_aws_profile ()
293298 if not aws_profile :
294- logger .warning ("No AWS profile specified!" )
295-
296- aws_bucket = conf .get_aws_bucket (target )
297- if not aws_bucket :
299+ logger .error ("No AWS profile specified!" )
298300 sys .exit (1 )
299301
300302 archive_path = __get_local_repo (repo )
301303 npm_archive_type = detect_npm_archive (archive_path )
302304 product_key = f"{ product } -{ version } "
303- prefix_ = conf .get_bucket_prefix (target )
305+ manifest_bucket_name = conf .get_manifest_bucket ()
306+ targets_ = __get_targets (target , conf )
304307 if npm_archive_type != NpmArchiveType .NOT_NPM :
305308 logger .info ("This is a npm archive" )
306- tmp_dir = handle_npm_del (
309+ tmp_dir , succeeded = handle_npm_del (
307310 archive_path ,
308311 product_key ,
309- bucket_name = aws_bucket ,
310- prefix = prefix_ ,
312+ targets = targets_ ,
311313 aws_profile = aws_profile ,
312314 dir_ = work_dir ,
313- dry_run = dryrun
315+ dry_run = dryrun ,
316+ manifest_bucket_name = manifest_bucket_name
314317 )
318+ if not succeeded :
319+ sys .exit (1 )
315320 else :
316321 ignore_patterns_list = None
317322 if ignore_patterns :
318323 ignore_patterns_list = ignore_patterns
319324 else :
320325 ignore_patterns_list = __get_ignore_patterns (conf )
321326 logger .info ("This is a maven archive" )
322- tmp_dir = handle_maven_del (
327+ tmp_dir , succeeded = handle_maven_del (
323328 archive_path ,
324329 product_key ,
325330 ignore_patterns_list ,
326331 root = root_path ,
327- bucket_name = aws_bucket ,
332+ targets = targets_ ,
328333 aws_profile = aws_profile ,
329- prefix = prefix_ ,
330334 dir_ = work_dir ,
331- dry_run = dryrun
335+ dry_run = dryrun ,
336+ manifest_bucket_name = manifest_bucket_name
332337 )
338+ if not succeeded :
339+ sys .exit (1 )
333340 except Exception :
334341 print (traceback .format_exc ())
335342 sys .exit (2 ) # distinguish between exception and bad config or bad state
@@ -338,6 +345,23 @@ def delete(
338345 __safe_delete (tmp_dir )
339346
340347
348+ def __get_targets (target : List [str ], conf : CharonConfig ) -> List [Tuple [str , str , str ]]:
349+ targets_ = []
350+ for tgt in target :
351+ aws_bucket = conf .get_aws_bucket (tgt )
352+ if not aws_bucket :
353+ continue
354+ prefix = conf .get_bucket_prefix (tgt )
355+ targets_ .append ([tgt , aws_bucket , prefix ])
356+ if len (targets_ ) == 0 :
357+ logger .error (
358+ "All targets are not valid or configured, "
359+ "please check your charon configurations."
360+ )
361+ sys .exit (1 )
362+ return targets_
363+
364+
341365def __safe_delete (tmp_dir : str ):
342366 if tmp_dir and os .path .exists (tmp_dir ):
343367 logger .info ("Cleaning up work directory: %s" , tmp_dir )
@@ -386,15 +410,17 @@ def __validate_prod_key(product: str, version: str) -> bool:
386410 return True
387411
388412
389- def __decide_mode (is_quiet : bool , is_debug : bool ):
413+ def __decide_mode (product : str , version : str , is_quiet : bool , is_debug : bool ):
390414 if is_quiet :
391415 logger .info ("Quiet mode enabled, "
392416 "will only give warning and error logs." )
393- set_logging (level = logging .WARNING )
417+ set_logging (product , version , level = logging .WARNING )
394418 elif is_debug :
395419 logger .info ("Debug mode enabled, "
396420 "will give all debug logs for tracing." )
397- set_logging (level = logging .DEBUG )
421+ set_logging (product , version , level = logging .DEBUG )
422+ else :
423+ set_logging (product , version , level = logging .INFO )
398424
399425
400426@group ()
0 commit comments