def move(self, dest): "Move this submit directory to dest" dest = os.path.abspath(dest) if os.path.isfile(dest): raise SubmitDirException("Destination is a file: %s" % dest) if os.path.isdir(dest): if os.path.exists(os.path.join(dest, "braindump.txt")): raise SubmitDirException("Destination is a submit dir: %s" % dest) dest = os.path.join(dest, os.path.basename(self.submitdir)) # Verify that we aren't trying to move a subworkflow if self.is_subworkflow(): raise SubmitDirException("Subworkflows cannot be moved independent of the root workflow") # Connect to master database mdbsession = connection.connect_by_submitdir(self.submitdir, connection.DBType.MASTER) mdb = MasterDatabase(mdbsession) # Get the workflow record from the master db db_url = None wf = mdb.get_master_workflow(self.wf_uuid) if wf is None: db_url = connection.url_by_submitdir(self.submitdir, connection.DBType.WORKFLOW) else: # We found an mdb record, so we need to update it # Save the master db's pointer db_url = wf.db_url # Update the master db's db_url # Note that this will only update the URL if it is an sqlite file # located in the submitdir log.info("Old master db_url: %s" % wf.db_url) wf.db_url = db_url.replace(self.submitdir, dest) log.info("New master db_url: %s" % wf.db_url) # Change the master db's submit_dir log.info("Old master submit_dir: %s" % wf.submit_dir) wf.submit_dir = dest log.info("New master submit_dir: %s" % wf.submit_dir) # Update the ensemble record if one exists ew = mdb.get_ensemble_workflow(self.wf_uuid) if ew is not None: log.info("Old ensemble submit dir: %s", ew.submitdir) ew.submitdir = dest log.info("New ensemble submit dir: %s", ew.submitdir) # Update the workflow database if we found one if db_url is not None: dbsession = connection.connect(db_url) db = WorkflowDatabase(dbsession) root_wf = db.get_workflow(self.wf_uuid) db.update_submit_dirs(root_wf.wf_id, self.submitdir, dest) dbsession.commit() dbsession.close() # Move all the files shutil.move(self.submitdir, dest) # Set new paths in the braindump file self.braindump["submit_dir"] = dest self.braindump["basedir"] = os.path.dirname(dest) utils.write_braindump(os.path.join(dest, "braindump.txt"), self.braindump) # Note that we do not need to update the properties file even though it # might contain DB URLs because it cannot contain a DB URL with the submit # dir in it. # TODO We might want to update all of the absolute paths in the condor submit files # if we plan on moving workflows that could be resubmitted in the future # TODO We might want to update the braindump files for subworkflows # Update master database mdbsession.commit() mdbsession.close() # Finally, update object self.submitdir = dest