def load_session(self, flow=None, session=None): ''' Loads last session or, if over or forced, a new session Creates a new session or load last session if not over :param flow: kind of workflow :type flow: :func:`biomaj.workflow.Workflow.FLOW` ''' if flow is None: flow = Workflow.FLOW if session is not None: logging.debug('Load specified session ' + str(session['id'])) self.session = Session(self.name, self.config, flow) self.session.load(session) self.use_last_session = True return if len(self.bank['sessions']) == 0 or self.options.get_option( Options.FROMSCRATCH): self.session = Session(self.name, self.config, flow) logging.debug('Start new session') else: # Take last session self.session = Session(self.name, self.config, flow) session_id = None # Load previous session for updates only if self.session.get( 'action' ) == 'update' and 'last_update_session' in self.bank and self.bank[ 'last_update_session']: session_id = self.bank['last_update_session'] load_session = None for session in self.bank['sessions']: if session['id'] == session_id: load_session = session break if load_session is not None: # self.session.load(self.bank['sessions'][len(self.bank['sessions'])-1]) self.session.load(session) # if self.config.last_modified > self.session.get('last_modified'): # # Config has changed, need to restart # self.session = Session(self.name, self.config, flow) # logging.info('Configuration file has been modified since last session, restart in any case a new session') if self.session.get_status( Workflow.FLOW_OVER) and self.options.get_option( Options.FROM_TASK) is None: previous_release = self.session.get('remoterelease') self.session = Session(self.name, self.config, flow) self.session.set('previous_release', previous_release) logging.debug('Start new session') else: logging.debug('Load previous session ' + str(self.session.get('id'))) self.use_last_session = True
def remove(self, release): ''' Remove a release (db and files) :param release: release or release directory :type release: str :return: bool ''' release = str(release) logging.warning('Bank:' + self.name + ':Remove') if not self.is_owner(): logging.error('Not authorized, bank owned by ' + self.bank['properties']['owner']) raise Exception('Not authorized, bank owned by ' + self.bank['properties']['owner']) self.session = self.get_new_session(RemoveWorkflow.FLOW) oldsession = None # Search production release matching release for prod in self.bank['production']: if prod['release'] == release or prod['prod_dir'] == release: if 'freeze' in prod and prod['freeze']: logging.error( 'Cannot remove release, release is freezed, unfreeze it first' ) return False # Search session related to this production release for s in self.bank['sessions']: if s['id'] == prod['session']: oldsession = s break break if oldsession is None: logging.error( 'No production session could be found for this release') return False if 'current' in self.bank and self.bank['current'] == oldsession['id']: logging.error( 'This release is the release in the main release production, you should first unpublish it' ) return False # New empty session for removal session = Session(self.name, self.config, RemoveWorkflow.FLOW) session.set('action', 'remove') session.set('release', oldsession['release']) session.set('update_session_id', oldsession['id']) self.session = session # Reset status, we take an update session res = self.start_remove(session) self.session.set('workflow_status', res) self.save_session() return res
def test_remove_session(self): b = Bank('alu') for i in range(1, 5): s = Session('alu', self.config, UpdateWorkflow.FLOW) s._session['status'][Workflow.FLOW_INIT] = True b.session = s b.save_session() self.assertTrue(len(b.bank['sessions']) == 4) b.remove_session(b.session.get('id')) self.assertTrue(len(b.bank['sessions']) == 3)
def get_new_session(self, flow=None): ''' Returns an empty session :param flow: kind of workflow :type flow: :func:`biomaj.workflow.Workflow.FLOW` ''' if flow is None: flow = Workflow.FLOW return Session(self.name, self.config, flow)
def test_clean_old_sessions(self): ''' Checks a session is used if present ''' b = Bank('local') for i in range(1, 5): s = Session('alu', self.config, UpdateWorkflow.FLOW) s._session['status'][Workflow.FLOW_INIT] = True b.session = s b.save_session() b2 = Bank('local') b2.update() b2.clean_old_sessions() self.assertTrue(len(b2.bank['sessions']) == 1)
def test_session_reload_notover(self): ''' Checks a session is used if present ''' b = Bank('alu') for i in range(1, 5): s = Session('alu', self.config, UpdateWorkflow.FLOW) s._session['status'][Workflow.FLOW_INIT] = True b.session = s b.save_session() b = Bank('alu') b.load_session(UpdateWorkflow.FLOW) self.assertTrue(b.session.get_status(Workflow.FLOW_INIT))
def test_session_reload_over(self): """ Checks a session if is not over """ b = Bank('alu') for i in range(1, 5): s = Session('alu', self.config, UpdateWorkflow.FLOW) s._session['status'][Workflow.FLOW_INIT] = True s._session['status'][Workflow.FLOW_OVER] = True b.session = s b.save_session() b = Bank('alu') b.load_session(UpdateWorkflow.FLOW) self.assertFalse(b.session.get_status(Workflow.FLOW_INIT))
def remove_pending(self, release=None): """ Remove pending releases if 'release is None :param release: release or release directory, default None :type release: str :return: bool """ if release: release = str(release) logging.warning('Bank:' + self.name + ':RemovePending') if not self.is_owner(): logging.error('Not authorized, bank owned by ' + self.bank['properties']['owner']) raise Exception('Not authorized, bank owned by ' + self.bank['properties']['owner']) if 'pending' not in self.bank: return True pendings = self.bank['pending'] for pending in pendings: # Only work with pending for argument release if release and release != pending['release']: continue pending_session_id = pending['id'] pending_session = None for s in self.bank['sessions']: if s['id'] == pending_session_id: pending_session = s break session = Session(self.name, self.config, RemoveWorkflow.FLOW) if pending_session is None: session._session['release'] = pending['release'] else: session.load(pending_session) if os.path.exists(session.get_full_release_directory()): logging.debug("Remove:Pending:Dir:" + session.get_full_release_directory()) shutil.rmtree(session.get_full_release_directory()) self.remove_session(pending['id']) # If no release ask for deletion, remove all pending if not release: self.banks.update({'name': self.name}, {'$set': {'pending': []}}) return True
def remove_pending(self, release): ''' Remove pending releases :param release: release or release directory :type release: str :return: bool ''' release = str(release) logging.warning('Bank:' + self.name + ':RemovePending') if not self.is_owner(): logging.error('Not authorized, bank owned by ' + self.bank['properties']['owner']) raise Exception('Not authorized, bank owned by ' + self.bank['properties']['owner']) if not self.bank['pending']: return True pendings = self.bank['pending'] for release in list(pendings.keys()): pending_session_id = pendings[release] pending_session = None for s in self.bank['sessions']: if s['id'] == pending_session_id: pending_session = s break session = Session(self.name, self.config, RemoveWorkflow.FLOW) if pending_session is None: session._session['release'] = release else: session.load(pending_session) if os.path.exists(session.get_full_release_directory()): logging.debug("Remove:Pending:Dir:" + session.get_full_release_directory()) shutil.rmtree(session.get_full_release_directory()) self.remove_session(pendings[release]) self.banks.update({'name': self.name}, {'$set': {'pending': {}}}) return True