From e880df92b532d76428886adf682d4266ba0fffad Mon Sep 17 00:00:00 2001 From: Jeff Hull Date: Fri, 28 Jun 2019 11:29:18 -0400 Subject: [PATCH 1/2] rollback shortcuts --- solvebio/resource/datasetcommit.py | 34 +++++++++++++++++++++++++++++- solvebio/resource/manifest.py | 6 +++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/solvebio/resource/datasetcommit.py b/solvebio/resource/datasetcommit.py index 8d49d9a2..3142aaa6 100644 --- a/solvebio/resource/datasetcommit.py +++ b/solvebio/resource/datasetcommit.py @@ -54,11 +54,43 @@ def dataset(self): @property def parent_object(self): - """ Get the commit objects parent Import or Migration """ + """ Get the commit objects parent Import, Migration or Commit """ from . import types parent_klass = types.get(self.parent_job_model.split('.')[1]) return parent_klass.retrieve(self.parent_job_id, client=self._client) + def _rollback_url(self): + return self.instance_url() + '/rollback' + + def _can_rollback(self): + """Check if this commit can be reverted""" + resp = self._client.get(self._beacon_url(), {}) + return resp['is_blocked'], resp['detail'], \ + [convert_to_solve_object(dc) for dc in resp['blocking_commits']] + + def can_rollback(self): + rollback_status = self._can_rollback() + is_blocked, reason, blocking_commits = rollback_status + if is_blocked: + print("Could not revert commit: {}".format(reason)) + if blocking_commits: + print('The following commits are blocking and ' + 'must be reverted first: {}'.format( + ', '.join([bc.id for bc in blocking_commits])) + ) + return is_blocked + + def rollback(self): + """Reverts this commit by creating a rollback""" + rollback_status = self._can_rollback() + is_blocked, reason, blocking_commits = rollback_status + if not is_blocked: + resp = self._client.post(self._beacon_url(), {}) + return convert_to_solve_object(resp) + + # TODO what do return in this scenario + raise Exception("Unable to rollback") + def follow(self, loop=True, sleep_seconds=Task.SLEEP_WAIT_DEFAULT): # Follow unfinished commits while self.status in ['queued', 'running']: diff --git a/solvebio/resource/manifest.py b/solvebio/resource/manifest.py index 02b55c49..44700265 100644 --- a/solvebio/resource/manifest.py +++ b/solvebio/resource/manifest.py @@ -35,9 +35,9 @@ def add_file(self, path, **kwargs): 'name': file_.filename, 'md5': file_.md5, 'size': file_.size, - 'reader_params': kwargs.get('reader_params'), - 'entity_params': kwargs.get('entity_params'), - 'validation_params': kwargs.get('validation_params') + 'reader_params': kwargs.get('reader_params', {}), + 'entity_params': kwargs.get('entity_params', {}), + 'validation_params': kwargs.get('validation_params', {}) }) def add_url(self, url, **kwargs): From 2547ed6687f4a5a68ecaef48e1d26be9fba2e887 Mon Sep 17 00:00:00 2001 From: Jeff Hull Date: Thu, 8 Oct 2020 11:29:15 -0400 Subject: [PATCH 2/2] still WIP --- solvebio/resource/dataset.py | 13 +++++++++++++ solvebio/resource/datasetcommit.py | 10 +++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/solvebio/resource/dataset.py b/solvebio/resource/dataset.py index 51998df3..bb0a9597 100644 --- a/solvebio/resource/dataset.py +++ b/solvebio/resource/dataset.py @@ -13,6 +13,7 @@ from .task import Task from .datasetfield import DatasetField from .datasetexport import DatasetExport +from .datasetcommit import DatasetCommit from .datasetmigration import DatasetMigration @@ -292,6 +293,18 @@ def activity(self, follow=False, limit=1, return list(activity) + def revert(self): + """Revert the most recent commit""" + commit_ids = [c.id for c in self.commits()] + if not commit_ids: + print("WARNING: No commits exist on this dataset") + return + + # Sort commits by oldest + commit_ids = sorted(commit_ids, reverse=True) + commit = DatasetCommit(id=commit_ids[0]) + return commit.rollback() + # # Vault properties # diff --git a/solvebio/resource/datasetcommit.py b/solvebio/resource/datasetcommit.py index 3142aaa6..50788851 100644 --- a/solvebio/resource/datasetcommit.py +++ b/solvebio/resource/datasetcommit.py @@ -64,7 +64,15 @@ def _rollback_url(self): def _can_rollback(self): """Check if this commit can be reverted""" - resp = self._client.get(self._beacon_url(), {}) + # NOTE this always returns a 400.... + try: + resp = self._client.get(self._rollback_url(), {}) + except Exception: + # TODO + # how to get the valid details? + # add special kwarg to client.request() to allow 400 as valid response? + raise + return resp['is_blocked'], resp['detail'], \ [convert_to_solve_object(dc) for dc in resp['blocking_commits']]