diff --git a/autosubmit/autosubmit.py b/autosubmit/autosubmit.py index 1983dbce5f2b8b58f4be7cd76b794acfaf9975ff..d5595cae81179d5589bf85c357cd95df0f34d570 100644 --- a/autosubmit/autosubmit.py +++ b/autosubmit/autosubmit.py @@ -489,22 +489,49 @@ class Autosubmit: return False @staticmethod - def _delete_expid(expid_delete): + def _delete_expid(expid_delete, force): """ Removes an experiment from path and database + If current user is eadmin and -f has been sent, it deletes regardless + of experiment owner :type expid_delete: str :param expid_delete: identifier of the experiment to delete + :type force: boolean + :param force: True if the force flag has been sent + :return: True if succesfully deleted, False otherwise + :rtype: boolean """ + # Read current user uid + my_user = os.getuid() + # Read eadmin user uid + id_eadmin = os.popen('id -u eadmin').read() + if expid_delete == '' or expid_delete is None and not os.path.exists(os.path.join(BasicConfig.LOCAL_ROOT_DIR, expid_delete)): Log.info("Experiment directory does not exist.") else: - Log.info("Removing experiment directory...") ret = False - if pwd.getpwuid(os.stat(os.path.join(BasicConfig.LOCAL_ROOT_DIR, expid_delete)).st_uid).pw_name == os.getlogin(): - try: + # Handling possible failure of retrieval of current owner data + currentOwner_id = 0 + currentOwner = "empty" + try: + currentOwner = os.stat(os.path.join(BasicConfig.LOCAL_ROOT_DIR, expid_delete)).st_uid + currentOwner_id = pwd.getpwuid(os.stat(os.path.join(BasicConfig.LOCAL_ROOT_DIR, expid_delete)).st_uid).pw_name + except: + pass + finally: + if currentOwner_id == 0: + Log.info("Current owner '{0}' of experiment {1} does not exist anymore.", currentOwner, expid_delete) + + # Deletion workflow continues as usual, a disjunction is included for the case when + # force is sent, and user is eadmin + if currentOwner_id == os.getlogin() or (force and my_user == id_eadmin): + if (force and my_user == id_eadmin): + Log.info("Preparing deletion of experiment {0} from owner: {1}, as eadmin.", expid_delete, currentOwner) + try: + Log.info("Removing experiment directory...") shutil.rmtree(os.path.join(BasicConfig.LOCAL_ROOT_DIR, expid_delete)) except OSError as e: Log.warning('Can not delete experiment folder: {0}', e) @@ -513,9 +540,10 @@ class Autosubmit: ret = delete_experiment(expid_delete) if ret: Log.result("Experiment {0} deleted".format(expid_delete)) - else: - Log.warning("Current User is not the Owner {0} can not be deleted!",expid_delete) + else: + Log.critical("Current user is not the owner of the experiment. {0} can not be deleted!",expid_delete) return ret + @staticmethod def expid(hpc, description, copy_id='', dummy=False, test=False, operational=False): """ @@ -654,6 +682,7 @@ class Autosubmit: :returns: True if succesful, False if not :rtype: bool """ + log_path = os.path.join(BasicConfig.LOCAL_ROOT_DIR, "ASlogs", 'delete.log'.format(os.getuid())) try: Log.set_file(log_path) @@ -662,7 +691,8 @@ class Autosubmit: if os.path.exists(os.path.join(BasicConfig.LOCAL_ROOT_DIR, expid)): if force or Autosubmit._user_yes_no_query("Do you want to delete " + expid + " ?"): - return Autosubmit._delete_expid(expid) + Log.debug('Enter Autosubmit._delete_expid {0}', expid) + return Autosubmit._delete_expid(expid, force) else: Log.info("Quitting...") return False