Merge pull request #2079 from davebx/api_install_bugfixes

Attempted fix for server error on repo preview.
This commit is contained in:
Martin Cech
2016-04-20 10:32:05 -04:00
15 changed files with 206 additions and 25 deletions
@@ -170,11 +170,13 @@ class RepositoryRevisionsController( BaseAPIController ):
new_changeset_revision = suc.get_next_downloadable_changeset_revision( repository_dependency,
repo,
changeset_revision )
repository_dependency_repository_metadata = \
suc.get_repository_metadata_by_changeset_revision( trans.app,
repository_dependency_id,
new_changeset_revision )
if repository_dependency_repository_metadata is None:
if new_changeset_revision != changeset_revision:
repository_dependency_repository_metadata = \
suc.get_repository_metadata_by_changeset_revision( trans.app,
repository_dependency_id,
new_changeset_revision )
changeset_revision = new_changeset_revision
else:
decoded_repository_dependency_id = trans.security.decode_id( repository_dependency_id )
debug_msg = 'Cannot locate repository_metadata with id %d for repository dependency %s owned by %s ' % \
( decoded_repository_dependency_id, str( name ), str( owner ) )
@@ -182,8 +184,6 @@ class RepositoryRevisionsController( BaseAPIController ):
( str( changeset_revision ), str( new_changeset_revision ) )
log.debug( debug_msg )
continue
else:
changeset_revision = new_changeset_revision
repository_dependency_metadata_dict = \
repository_dependency_repository_metadata.to_dict( view='element',
value_mapper=self.__get_value_mapper( trans ) )
@@ -2415,9 +2415,9 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ):
repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
repo = hg_util.get_repo_for_repository( trans.app, repository=repository, repo_path=None, create=False )
# Get the next installable changeset_revision beyond the received changeset_revision.
changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
if changeset_revision:
return changeset_revision
next_changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
if next_changeset_revision and next_changeset_revision != changeset_revision:
return next_changeset_revision
return ''
@web.json
@@ -2865,7 +2865,7 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ):
# Get updates to the received changeset_revision if any exist.
repo = hg_util.get_repo_for_repository( trans.app, repository=repository, repo_path=None, create=False )
upper_bound_changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
if upper_bound_changeset_revision:
if upper_bound_changeset_revision and upper_bound_changeset_revision != changeset_revision:
changeset_revision = upper_bound_changeset_revision
repository_metadata = metadata_util.get_repository_metadata_by_repository_id_changeset_revision( trans.app,
repository_id,
@@ -2914,12 +2914,12 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ):
else:
next_installable_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
if repository_metadata is None:
if next_installable_revision:
if next_installable_revision and next_installable_revision != changeset_revision:
tool_shed_status_dict[ 'latest_installable_revision' ] = 'True'
else:
tool_shed_status_dict[ 'latest_installable_revision' ] = 'False'
else:
if next_installable_revision:
if next_installable_revision and next_installable_revision != changeset_revision:
tool_shed_status_dict[ 'latest_installable_revision' ] = 'False'
else:
tool_shed_status_dict[ 'latest_installable_revision' ] = 'True'
+1 -1
View File
@@ -596,7 +596,7 @@ class ImportRepositoryManager( object ):
suc.get_next_downloadable_changeset_revision( defined_repository,
defined_repo,
changeset_revision )
if updated_changeset_revision == rm_changeset_revision:
if updated_changeset_revision == rm_changeset_revision and updated_changeset_revision != changeset_revision:
dependent_downloadable_revisions.append( downloadable_revision )
return dependent_downloadable_revisions
@@ -197,10 +197,11 @@ class RelationBuilder( object ):
# The repository changeset_revision is no longer installable, so see if there's been an update.
repo = hg_util.get_repo_for_repository( self.app, repository=repository, repo_path=None, create=False )
changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, rd_changeset_revision )
repository_metadata = \
metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app,
repository_id,
changeset_revision )
if changeset_revision != rd_changeset_revision:
repository_metadata = \
metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app,
repository_id,
changeset_revision )
if repository_metadata:
new_key_rd_dict = {}
new_key_rd_dict[ key ] = \
+5 -1
View File
@@ -39,7 +39,11 @@ def get_dependencies_for_metadata_revision( app, metadata ):
dependencies = []
for shed, name, owner, changeset, prior, _ in metadata[ 'repository_dependencies' ]:
required_repository = suc.get_repository_by_name_and_owner( app, name, owner )
metadata_entry = suc.get_repository_metadata_by_changeset_revision( app, app.security.encode_id( required_repository.id ), changeset )
repo = hg_util.get_repo_for_repository( app, repository=required_repository, repo_path=None, create=False )
updated_changeset = suc.get_next_downloadable_changeset_revision( required_repository, repo, changeset )
if updated_changeset is None:
continue
metadata_entry = suc.get_repository_metadata_by_changeset_revision( app, app.security.encode_id( required_repository.id ), updated_changeset )
dependencies.append( metadata_entry )
return dependencies
+1 -1
View File
@@ -299,7 +299,7 @@ def get_repo_info_dict( app, user, repository_id, changeset_revision ):
# repository_suite_definition or tool_dependency_definition.
next_downloadable_changeset_revision = \
suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
if next_downloadable_changeset_revision:
if next_downloadable_changeset_revision and next_downloadable_changeset_revision != changeset_revision:
repository_metadata = suc.get_repository_metadata_by_changeset_revision( app,
repository_id,
next_downloadable_changeset_revision )
+4 -3
View File
@@ -318,7 +318,7 @@ def get_current_repository_metadata_for_changeset_revision( app, repository, cha
updated_changeset_revision = get_next_downloadable_changeset_revision( repository,
repo,
after_changeset_revision=changeset_revision )
if updated_changeset_revision:
if updated_changeset_revision and updated_changeset_revision != changeset_revision:
repository_metadata = get_repository_metadata_by_changeset_revision( app,
encoded_repository_id,
updated_changeset_revision )
@@ -391,13 +391,14 @@ def get_metadata_changeset_revisions( repository, repo ):
def get_next_downloadable_changeset_revision( repository, repo, after_changeset_revision ):
"""
Return the installable changeset_revision in the repository changelog after the changeset to which
after_changeset_revision refers. If there isn't one, return None.
after_changeset_revision refers. If there isn't one, return None. If there is only one installable
changeset, and that matches the requested revision, return it.
"""
changeset_revisions = [ revision[ 1 ] for revision in get_metadata_revisions( repository, repo ) ]
if len( changeset_revisions ) == 1:
changeset_revision = changeset_revisions[ 0 ]
if changeset_revision == after_changeset_revision:
return None
return after_changeset_revision
found_after_changeset_revision = False
for changeset in repo.changelog:
changeset_revision = str( repo.changectx( changeset ) )
@@ -87,6 +87,7 @@ class TestGetAllMetadata( ShedTwillTestCase ):
commit_message='Uploaded column maker 1.0.',
strings_displayed=[],
strings_not_displayed=[] )
# Add a dependency on BWA.
self.upload_file( repository,
filename='0540_files/convert_chars/tool_dependencies.xml',
filepath=None,
@@ -96,7 +97,7 @@ class TestGetAllMetadata( ShedTwillTestCase ):
commit_message='Uploaded column maker 1.0.',
strings_displayed=[],
strings_not_displayed=[] )
# Visit the manage repository page for package_bwa_0_5_9_0100.
# Visit the manage repository page for convert_chars_0540.
self.display_manage_repository_page( repository, strings_displayed=[ repositories['bwa']['name'] ] )
def test_0015_create_column_repository( self ):
@@ -129,7 +130,7 @@ class TestGetAllMetadata( ShedTwillTestCase ):
valid_tools_only=True,
uncompress_file=True,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded column maker 1.0.',
commit_message='Uploaded column maker 2.0.',
strings_displayed=[],
strings_not_displayed=[] )
@@ -0,0 +1,157 @@
import logging
from shed_functional.base.twilltestcase import common, ShedTwillTestCase
log = logging.getLogger( __name__ )
repositories = dict( freebayes=dict( name='package_freebayes_0550',
description='Description for package_freebayes_0550',
long_description='Long description for package_freebayes_0550' ),
samtools=dict( name='package_samtools_0550',
description='Description for package_samtools_0550',
long_description='Long description for package_samtools_0550' ),
filtering=dict( name='filtering_0550',
description='Description for filtering_0550',
long_description='Long description for filtering_0550' ) )
category_name = 'Test 0550'
category_description = 'Verify metadata updates'
'''
1. Create repository package_freebayes_0550.
2. Create repository package_samtools_0550.
3. Create repository filtering_0550.
4. Create dependency on package_freebayes_0550 for filtering_0550.
5. Create dependency on package_samtools_0550 for filtering_0550.
6. Update package_freebayes_0550 and package_samtools_0550.
5. Load /api/repositories/{filtering_0550}.id/metadata and verify contents.
'''
class TestGetUpdatedMetadata( ShedTwillTestCase ):
'''Verify that updated repositories still have correct dependency links.'''
def test_0000_initiate_users( self ):
"""Create necessary user accounts."""
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
test_user_1 = self.test_db_util.get_user( common.test_user_1_email )
assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_1_email
self.test_db_util.get_private_role( test_user_1 )
self.login( email=common.admin_email, username=common.admin_username )
admin_user = self.test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
self.test_db_util.get_private_role( admin_user )
def test_0005_freebayes_repository( self ):
'''Create and populate package_freebayes_0550.'''
category = self.create_category( name=category_name, description=category_description )
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
# Create a repository named package_freebayes_0550 owned by user1.
freebayes = self.get_or_create_repository( name=repositories['freebayes']['name'],
description=repositories['freebayes']['description'],
long_description=repositories['freebayes']['long_description'],
owner=common.test_user_1_name,
category_id=self.security.encode_id( category.id ),
strings_displayed=[] )
assert freebayes is not None, 'Error creating freebayes %s' % repositories['freebayes']['name']
self.upload_file( freebayes,
filename='0550_files/package_freebayes_1_0550.tgz',
filepath=None,
valid_tools_only=True,
uncompress_file=False,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded.',
strings_displayed=[ 'has been successfully uploaded to the repository', 'contains a single file' ],
strings_not_displayed=None )
# Visit the manage repository page for package_freebayes_0_5_9_0100.
self.display_manage_repository_page( freebayes, strings_displayed=[ 'Tool dependencies', 'will not be', 'to this repository' ] )
def test_0010_create_samtools_repository( self ):
'''Create and populate the package_samtools_0550 repository.'''
category = self.create_category( name=category_name, description=category_description )
samtools = self.get_or_create_repository( name=repositories['samtools']['name'],
description=repositories['samtools']['description'],
long_description=repositories['samtools']['long_description'],
owner=common.test_user_1_name,
category_id=self.security.encode_id( category.id ),
strings_displayed=[] )
assert samtools is not None, 'Error creating samtools %s' % repositories['samtools']['name']
self.upload_file( samtools,
filename='0550_files/package_samtools_1_0550.tgz',
filepath=None,
valid_tools_only=True,
uncompress_file=True,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded samtools 1.0.',
strings_displayed=[ 'has been successfully uncompressed and uploaded to the repository' ],
strings_not_displayed=[] )
def test_0015_create_filtering_repository( self ):
'''Create the filtering_0550 repository.'''
category = self.create_category( name=category_name, description=category_description )
repository = self.get_or_create_repository( name=repositories['filtering']['name'],
description=repositories['filtering']['description'],
long_description=repositories['filtering']['long_description'],
owner=common.test_user_1_name,
category_id=self.security.encode_id( category.id ),
strings_displayed=[] )
assert repository is not None, 'Error creating repository %s' % repositories['filtering']['name']
self.upload_file( repository,
filename='0550_files/filtering_1.0.tgz',
filepath=None,
valid_tools_only=True,
uncompress_file=True,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded filtering 1.0.',
strings_displayed=[ 'has been successfully uncompressed and uploaded to the repository' ],
strings_not_displayed=[] )
def test_0020_check_repository_dependency( self ):
'''Make filtering depend on samtools and freebayes.'''
freebayes = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'freebayes' ][ 'name' ],
common.test_user_1_name )
samtools = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'samtools' ][ 'name' ],
common.test_user_1_name )
filtering = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'filtering' ][ 'name' ],
common.test_user_1_name )
strings_displayed = [ self.security.encode_id( freebayes.id ), self.security.encode_id( samtools.id ) ]
self.display_manage_repository_page( filtering, strings_displayed=strings_displayed )
def test_0025_update_dependent_repositories( self ):
'''
Update freebayes and samtools, load the API endpoint again.
'''
freebayes = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'freebayes' ][ 'name' ],
common.test_user_1_name )
samtools = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'samtools' ][ 'name' ],
common.test_user_1_name )
filtering = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'filtering' ][ 'name' ],
common.test_user_1_name )
self.upload_file( freebayes,
filename='0550_files/package_freebayes_2_0550.tgz',
filepath=None,
valid_tools_only=True,
uncompress_file=True,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded freebayes 2.0.',
strings_displayed=[ 'has been successfully uncompressed and uploaded to the repository' ],
strings_not_displayed=[] )
self.upload_file( samtools,
filename='0550_files/package_samtools_2_0550.tgz',
filepath=None,
valid_tools_only=True,
uncompress_file=True,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded samtools 2.0.',
strings_displayed=[ 'has been successfully uncompressed and uploaded to the repository' ],
strings_not_displayed=[] )
strings_displayed = [ repositories[ 'freebayes' ][ 'name' ],
repositories[ 'samtools' ][ 'name' ],
repositories[ 'filtering' ][ 'name' ] ]
self.fetch_repository_metadata( filtering, strings_displayed=strings_displayed, strings_not_displayed=None )
@@ -0,0 +1,17 @@
<?xml version="1.0"?>
<tool_dependency>
<package name="samtools" version="0.1.18">
<install version="1.0">
<actions>
<action type="shell_command">echo "Success."</action>
<action type="set_environment">
<environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable>
</action>
</actions>
</install>
<readme>
Compiling SAMtools requires the ncurses and zlib development libraries.
</readme>
</package>
</tool_dependency>