File indexing completed on 2026-04-20 07:58:58
0001 import os
0002 import traceback
0003
0004 from pandaharvester.harvestercore import core_utils
0005 from pandaharvester.harvestermisc.token_utils import endpoint_to_filename
0006 from pandaharvester.harvestermisc.globus_compute_token_sync import GlobusComputeTokenReplicator
0007
0008 from .iam_token_cred_manager import IamTokenCredManager
0009
0010 _logger = core_utils.setup_logger("iam_token_cred_manager_gc")
0011
0012 class IamTokenCredManagerRemoteGlobusCompute(IamTokenCredManager):
0013 def __init__(self, **kwarg):
0014 super().__init__(**kwarg)
0015 tmp_log = self.make_logger(_logger, f"config={self.setup_name}", method_name="__init__")
0016
0017 self.remote_out_dir = self.setupMap.get("remote_out_dir", "")
0018 gc_cfg = self.setupMap.get("globus_compute", {})
0019 if gc_cfg and self.remote_out_dir:
0020 self.replicator = GlobusComputeTokenReplicator(gc_cfg, tmp_log)
0021 else:
0022 tmp_log.debug(f"replicator is not initialized as either gc_cfg or remote_out_dir is missing. They are gc_cfg = {gc_cfg} and remote_out_dir = {self.remote_out_dir}")
0023 self.replicator = None
0024
0025
0026
0027
0028
0029
0030 def _sync_remote(self, token_filename: str, token_str: str, logger):
0031 if not self.replicator:
0032 return
0033 remote_token_path = os.path.join(self.remote_out_dir, token_filename)
0034 status = self.replicator.do_it(token_str, remote_token_path)
0035 if status:
0036 logger.info(f"Synchronized token '{token_filename}' to remote: {remote_token_path}")
0037 else:
0038 logger.error(f"FAILED to synchronize token '{token_filename}' to remote: {remote_token_path}")
0039
0040 def renew_credential(self):
0041
0042 tmp_log = self.make_logger(_logger, f"config={self.setup_name}", method_name="renew_credential")
0043
0044 all_ok = True
0045 all_err_str = ""
0046 for target in self.targets_dict:
0047 try:
0048
0049 if self.target_type == "panda":
0050 token_filename = self.panda_token_filename
0051 else:
0052 token_filename = endpoint_to_filename(target)
0053 token_path = os.path.join(self.out_dir, token_filename)
0054
0055 if self._is_fresh(token_path):
0056
0057 tmp_log.debug(f"token for {target} at {token_path} still fresh; skipped")
0058 continue
0059
0060 access_token = self.issuer_broker.get_access_token(aud=target, scope=self.scope)
0061 with open(token_path, "w") as f:
0062 f.write(access_token)
0063 tmp_log.info(f"renewed token for {target} at {token_path}")
0064
0065 try:
0066 self._sync_remote(token_filename, access_token, tmp_log)
0067 except Exception:
0068 all_ok = False
0069 tmp_log.error(f"Remote sync failed for {target}. {traceback.format_exc()}")
0070 all_err_str = "failed to sync some tokens; see plugin log for details "
0071
0072 except Exception as e:
0073 err_str = f"Problem getting token for {target}. {traceback.format_exc()}"
0074 tmp_log.error(err_str)
0075 all_ok = False
0076 all_err_str = "failed to get some tokens. Check the plugin log for details "
0077 continue
0078
0079 self._update_ts()
0080 tmp_log.debug("done")
0081
0082 return all_ok, all_err_str