diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py
index d3cc43cbb7c..0da7f7a8167 100644
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -25,11 +25,6 @@ from sqlalchemy.ext import hybrid
from sqlalchemy import types
from sqlalchemy import type_coerce
-try:
- import pexpect
-except ImportError:
- pexpect = None
-
import galaxy.model.orm.now
import galaxy.model.metadata
import galaxy.security.passwords
@@ -60,9 +55,6 @@ _datatypes_registry = None
# this be unlimited - filter in Python if over this limit.
MAX_IN_FILTER_LENGTH = 100
-PEXPECT_IMPORT_MESSAGE = ('The Python pexpect package is required to use this '
- 'feature, please install it')
-
class NoConverterException(Exception):
def __init__(self, value):
@@ -4621,30 +4613,6 @@ class Sample( object, Dictifiable ):
untransferred_datasets.append( dataset )
return untransferred_datasets
- def get_untransferred_dataset_size( self, filepath, scp_configs ):
- def print_ticks( d ):
- pass
- if pexpect is None:
- return PEXPECT_IMPORT_MESSAGE
- error_msg = 'Error encountered in determining the file size of %s on the external_service.' % filepath
- if not scp_configs['host'] or not scp_configs['user_name'] or not scp_configs['password']:
- return error_msg
- login_str = '%s@%s' % ( scp_configs['user_name'], scp_configs['host'] )
- cmd = 'ssh %s "du -sh \'%s\'"' % ( login_str, filepath )
- try:
- output = pexpect.run( cmd,
- events={ '.ssword:*': scp_configs['password'] + '\r\n',
- pexpect.TIMEOUT: print_ticks},
- timeout=10 )
- except Exception:
- return error_msg
- # cleanup the output to get just the file size
- return output.replace( filepath, '' )\
- .replace( 'Password:', '' )\
- .replace( "'s password:", '' )\
- .replace( login_str, '' )\
- .strip()
-
@property
def run_details( self ):
# self.runs is a list of SampleRunAssociations ordered descending on update_time.
diff --git a/lib/galaxy/webapps/galaxy/controllers/requests_admin.py b/lib/galaxy/webapps/galaxy/controllers/requests_admin.py
index dd917846dbd..01c9d5e6b78 100644
--- a/lib/galaxy/webapps/galaxy/controllers/requests_admin.py
+++ b/lib/galaxy/webapps/galaxy/controllers/requests_admin.py
@@ -9,15 +9,7 @@ from galaxy.web.form_builder import build_select_field
from galaxy.web.framework.helpers import time_ago, grids
from .requests_common import RequestsGrid, invalid_id_redirect
from markupsafe import escape
-import amqp
-try:
- import pexpect
-except ImportError:
- pexpect = None
-
-PEXPECT_IMPORT_MESSAGE = ('The Python pexpect package is required to use this '
- 'feature, please install it')
log = logging.getLogger( __name__ )
@@ -371,207 +363,6 @@ class RequestsAdmin( BaseUIController, UsesFormDefinitionsMixin ):
action='manage_datasets',
sample_id=sample_id ) )
- @web.expose
- @web.require_admin
- def select_datasets_to_transfer( self, trans, **kwd ):
- params = util.Params( kwd )
- message = util.restore_text( params.get( 'message', '' ) )
- status = params.get( 'status', 'done' )
- request_id = kwd.get( 'request_id', None )
- external_service_id = kwd.get( 'external_service_id', None )
- request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) )
- external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) )
- # Load the data transfer settings
- external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
- selected_datasets_to_transfer = util.restore_text( params.get( 'selected_datasets_to_transfer', '' ) )
- if selected_datasets_to_transfer:
- selected_datasets_to_transfer = selected_datasets_to_transfer.split(',')
- else:
- selected_datasets_to_transfer = []
- sample_id = kwd.get( 'sample_id', 'none' )
- sample_id_select_field = self.__build_sample_id_select_field( trans, request, sample_id )
- if sample_id != 'none':
- sample = trans.sa_session.query( trans.model.Sample ).get( trans.security.decode_id( sample_id ) )
- else:
- sample = None
- # The __get_files() method redirects here with a status of 'error' and a message if there
- # was a problem retrieving the files.
- if params.get( 'select_datasets_to_transfer_button', False ):
- # Get the sample that was sequenced to produce these datasets.
- if sample_id == 'none':
- del kwd[ 'select_datasets_to_transfer_button' ]
- message = 'Select the sample that was sequenced to produce the datasets you want to transfer.'
- kwd[ 'message' ] = message
- kwd[ 'status' ] = 'error'
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='select_datasets_to_transfer',
- **kwd ) )
- if not sample.library:
- # Display an error if a sample has been selected that
- # has not yet been associated with a destination library.
- message = 'Select a target data library and folder for the sample before selecting the datasets.'
- status = 'error'
- return trans.response.send_redirect( web.url_for( controller='requests_common',
- action='edit_samples',
- cntrller='requests_admin',
- id=trans.security.encode_id( request.id ),
- status=status,
- message=message ) )
- # Save the sample datasets
- sample_dataset_file_names = self.__create_sample_datasets( trans, sample, selected_datasets_to_transfer, external_service )
- if sample_dataset_file_names:
- message = 'Datasets (%s) have been selected for sample (%s)' % \
- ( str( sample_dataset_file_names )[1:-1].replace( "'", "" ), sample.name )
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='manage_datasets',
- request_id=request_id,
- sample_id=sample_id,
- message=message,
- status=status ) )
- return trans.fill_template( '/admin/requests/select_datasets_to_transfer.mako',
- cntrller='requests_admin',
- request=request,
- external_service=external_service,
- scp_configs=scp_configs,
- sample=sample,
- sample_id_select_field=sample_id_select_field,
- status=status,
- message=message )
-
- @web.json
- def get_file_details( self, trans, request_id, external_service_id, folder_path ):
- def print_ticks( d ):
- # pexpect timeout method
- pass
- # Avoid caching
- trans.response.headers['Pragma'] = 'no-cache'
- trans.response.headers['Expires'] = '0'
- if pexpect is None:
- return PEXPECT_IMPORT_MESSAGE
- external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) )
- external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
- cmd = 'ssh %s@%s "ls -oghp \'%s\'"' % ( scp_configs[ 'user_name' ],
- scp_configs[ 'host' ],
- folder_path )
- # Handle the authentication message if ssh keys are not set - the message is
- # something like: "Are you sure you want to continue connecting (yes/no)."
- output = pexpect.run( cmd,
- events={ '\(yes\/no\)\.*' : 'yes\r\n',
- '.ssword:*' : scp_configs[ 'password' ] + '\r\n',
- pexpect.TIMEOUT : print_ticks },
- timeout=10 )
- for password_str in [ 'Password:\r\n', 'password:\r\n' ]:
- # Eliminate the output created using ssh from the tree
- if password_str in output:
- output = output.replace( password_str, '' )
- return text_type( output.replace( '\r\n', '
' ) )
-
- @web.json
- def open_folder( self, trans, request_id, external_service_id, key ):
- # Avoid caching
- trans.response.headers['Pragma'] = 'no-cache'
- trans.response.headers['Expires'] = '0'
- request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) )
- external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) )
- folder_path = key
- files_list = self.__get_files( trans, request, external_service, folder_path )
- folder_contents = []
- for filename in files_list:
- is_folder = False
- if filename and filename[-1] == os.sep:
- is_folder = True
- if filename:
- full_path = os.path.join( folder_path, filename )
- node = { "title": filename,
- "isFolder": is_folder,
- "isLazy": is_folder,
- "tooltip": full_path,
- "key": full_path }
- folder_contents.append( node )
- return folder_contents
-
- def __get_files( self, trans, request, external_service, folder_path ):
- # Retrieves the filenames to be transferred from the remote host.
- ok = True
- external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
- if not scp_configs[ 'host' ] or not scp_configs[ 'user_name' ] or not scp_configs[ 'password' ]:
- status = 'error'
- message = "Error in external service login information."
- ok = False
-
- def print_ticks( d ):
- pass
- cmd = 'ssh %s@%s "ls -p \'%s\'"' % ( scp_configs[ 'user_name' ], scp_configs[ 'host' ], folder_path )
- # Handle the authentication message if keys are not set - the message is
- # something like: "Are you sure you want to continue connecting (yes/no)."
- if pexpect is not None:
- output = pexpect.run( cmd,
- events={ '\(yes\/no\)\.*' : 'yes\r\n',
- '.ssword:*' : scp_configs[ 'password' ] + '\r\n',
- pexpect.TIMEOUT : print_ticks },
- timeout=10 )
- if 'No such file or directory' in output:
- status = 'error'
- message = "No folder named (%s) exists on the external service." % folder_path
- ok = False
- else:
- status = 'error'
- message = PEXPECT_IMPORT_MESSAGE
- ok = False
- if ok:
- if 'assword:' in output:
- # Eliminate the output created using ssh from the tree
- output_as_list = output.splitlines()[ 1: ]
- else:
- output_as_list = output.splitlines()
- return output_as_list
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='select_datasets_to_transfer',
- request_id=trans.security.encode_id( request.id ),
- external_service_id=trans.security.encode_id( external_service.id ),
- status=status,
- message=message ) )
-
- def __create_sample_datasets( self, trans, sample, selected_datasets_to_transfer, external_service ):
- external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
- sample_dataset_file_names = []
- if selected_datasets_to_transfer:
- for filepath in selected_datasets_to_transfer:
- # FIXME: handle folder selection - ignore folders for now
- if filepath[-1] != os.sep:
- name = self.__rename_dataset( sample, filepath.split( '/' )[-1], scp_configs )
- status = trans.app.model.SampleDataset.transfer_status.NOT_STARTED
- size = sample.get_untransferred_dataset_size( filepath, scp_configs )
- sample_dataset = trans.model.SampleDataset( sample=sample,
- file_path=filepath,
- status=status,
- name=name,
- error_msg='',
- size=size,
- external_service=external_service )
- trans.sa_session.add( sample_dataset )
- trans.sa_session.flush()
- sample_dataset_file_names.append( str( sample_dataset.name ) )
- return sample_dataset_file_names
-
- def __rename_dataset( self, sample, filepath, scp_configs ):
- name = filepath.split( '/' )[-1]
- options = sample.request.type.rename_dataset_options
- option = scp_configs.get( 'rename_dataset', options.NO )
- if option == options.SAMPLE_NAME:
- new_name = sample.name + '_' + name
- if option == options.EXPERIMENT_AND_SAMPLE_NAME:
- new_name = sample.request.name + '_' + sample.name + '_' + name
- if option == options.EXPERIMENT_NAME:
- new_name = sample.request.name + '_' + name
- else:
- new_name = name
- return util.sanitize_for_filename( new_name )
-
def __ensure_library_add_permission( self, trans, target_library, target_folder ):
"""
Ensures the current admin user has ADD_LIBRARY permission on the target data library and folder.
@@ -594,92 +385,6 @@ class RequestsAdmin( BaseUIController, UsesFormDefinitionsMixin ):
if flush_needed:
trans.sa_session.flush()
- def __create_data_transfer_messages( self, trans, sample, selected_sample_datasets ):
- """
- Creates the xml messages to send to the rabbitmq server. It returns a dictionary of messages
- keyed by the external service used to transfer the datasets
- """
- # Create the xml message based on the following template
- xml = \
- '''
%s" % str(e)
- status = "error"
- if not message:
- message = "%i datasets have been queued for transfer from the external service." % len( sample_datasets )
- status = "done"
+ message = "Message queue transfer is no longer supported, please set enable_beta_job_managers = True in galaxy.ini"
+ status = "error"
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='manage_datasets',
sample_id=trans.security.encode_id( sample.id ),
diff --git a/templates/admin/requests/select_datasets_to_transfer.mako b/templates/admin/requests/select_datasets_to_transfer.mako
deleted file mode 100644
index e81b9c38b44..00000000000
--- a/templates/admin/requests/select_datasets_to_transfer.mako
+++ /dev/null
@@ -1,148 +0,0 @@
-<%inherit file="/base.mako"/>
-<%namespace file="/message.mako" import="render_msg" />
-<%namespace file="/requests/common/common.mako" import="render_sample_datasets" />
-<%namespace file="/requests/common/common.mako" import="common_javascripts" />
-
-<%def name="javascripts()">
- ${parent.javascripts()}
- ${common_javascripts()}
-%def>
-
-${h.js( "libs/jquery/jquery-ui", "libs/jquery/jquery.cookie", "libs/jquery/jquery.dynatree" )}
-${h.css( "dynatree_skin/ui.dynatree" )}
-
-
-
-<%
- is_admin = cntrller == 'requests_admin' and trans.user_is_admin()
- can_transfer_datasets = is_admin and sample.untransferred_dataset_files and sample.library and sample.folder
-%>
-
-
-
- Select a target data library and folder for a sample before selecting its datasets to transfer from the external service -
-%endif - -%if message: - ${render_msg( message, status )} -%endif - -