mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
205 lines
7.9 KiB
Python
205 lines
7.9 KiB
Python
import time
|
|
import json
|
|
import StringIO
|
|
from pkg_resources import resource_string
|
|
|
|
# Simple workflow that takes an input and call cat wrapper on it.
|
|
workflow_str = resource_string( __name__, "test_workflow_1.ga" )
|
|
# Simple workflow that takes an input and filters with random lines twice in a
|
|
# row - first grabbing 8 lines at random and then 6.
|
|
workflow_random_x2_str = resource_string( __name__, "test_workflow_2.ga" )
|
|
|
|
|
|
# Deprecated mixin, use dataset populator instead.
|
|
# TODO: Rework existing tests to target DatasetPopulator in a setup method instead.
|
|
class TestsDatasets:
|
|
|
|
def _new_dataset( self, history_id, content='TestData123', **kwds ):
|
|
return DatasetPopulator( self.galaxy_interactor ).new_dataset( history_id, content=content, **kwds)
|
|
|
|
def _wait_for_history( self, history_id, assert_ok=False ):
|
|
return DatasetPopulator( self.galaxy_interactor ).wait_for_history( history_id, assert_ok=assert_ok )
|
|
|
|
def _new_history( self, **kwds ):
|
|
return DatasetPopulator( self.galaxy_interactor ).new_history( **kwds )
|
|
|
|
def _upload_payload( self, history_id, content, **kwds ):
|
|
return DatasetPopulator( self.galaxy_interactor ).upload_payload( history_id, content, **kwds )
|
|
|
|
def _run_tool_payload( self, tool_id, inputs, history_id, **kwds ):
|
|
return DatasetPopulator( self.galaxy_interactor ).run_tool_payload( tool_id, inputs, history_id, **kwds )
|
|
|
|
|
|
class DatasetPopulator( object ):
|
|
|
|
def __init__( self, galaxy_interactor ):
|
|
self.galaxy_interactor = galaxy_interactor
|
|
|
|
def new_dataset( self, history_id, content='TestData123', **kwds ):
|
|
payload = self.upload_payload( history_id, content, **kwds )
|
|
run_response = self.galaxy_interactor.post( "tools", data=payload )
|
|
return run_response.json()["outputs"][0]
|
|
|
|
def wait_for_history( self, history_id, assert_ok=False ):
|
|
wait_on_state( lambda: self.galaxy_interactor.get( "histories/%s" % history_id ), assert_ok=assert_ok )
|
|
|
|
def new_history( self, **kwds ):
|
|
name = kwds.get( "name", "API Test History" )
|
|
create_history_response = self.galaxy_interactor.post( "histories", data=dict( name=name ) )
|
|
history_id = create_history_response.json()[ "id" ]
|
|
return history_id
|
|
|
|
def upload_payload( self, history_id, content, **kwds ):
|
|
name = kwds.get( "name", "Test Dataset" )
|
|
dbkey = kwds.get( "dbkey", "?" )
|
|
file_type = kwds.get( "file_type", 'txt' )
|
|
upload_params = {
|
|
'files_0|NAME': name,
|
|
'files_0|url_paste': content,
|
|
'dbkey': dbkey,
|
|
'file_type': file_type,
|
|
}
|
|
if "to_posix_lines" in kwds:
|
|
upload_params[ "files_0|to_posix_lines"] = kwds[ "to_posix_lines" ]
|
|
if "space_to_tab" in kwds:
|
|
upload_params[ "files_0|space_to_tab" ] = kwds[ "space_to_tab" ]
|
|
return self.run_tool_payload(
|
|
tool_id='upload1',
|
|
inputs=upload_params,
|
|
history_id=history_id,
|
|
upload_type='upload_dataset'
|
|
)
|
|
|
|
def run_tool_payload( self, tool_id, inputs, history_id, **kwds ):
|
|
return dict(
|
|
tool_id=tool_id,
|
|
inputs=json.dumps(inputs),
|
|
history_id=history_id,
|
|
**kwds
|
|
)
|
|
|
|
|
|
class WorkflowPopulator( object ):
|
|
# Impulse is to make this a Mixin, but probably better as an object.
|
|
|
|
def __init__( self, api_test_case ):
|
|
self.api_test_case = api_test_case
|
|
|
|
def load_workflow( self, name, content=workflow_str, add_pja=False ):
|
|
workflow = json.loads( content )
|
|
workflow[ "name" ] = name
|
|
if add_pja:
|
|
tool_step = workflow[ "steps" ][ "2" ]
|
|
tool_step[ "post_job_actions" ][ "RenameDatasetActionout_file1" ] = dict(
|
|
action_type="RenameDatasetAction",
|
|
output_name="out_file1",
|
|
action_arguments=dict( newname="the_new_name" ),
|
|
)
|
|
return workflow
|
|
|
|
def load_random_x2_workflow( self, name ):
|
|
return self.load_workflow( name, content=workflow_random_x2_str )
|
|
|
|
def simple_workflow( self, name, **create_kwds ):
|
|
workflow = self.load_workflow( name )
|
|
return self.create_workflow( workflow, **create_kwds )
|
|
|
|
def create_workflow( self, workflow, **create_kwds ):
|
|
data = dict(
|
|
workflow=json.dumps( workflow ),
|
|
**create_kwds
|
|
)
|
|
upload_response = self.api_test_case._post( "workflows/upload", data=data )
|
|
uploaded_workflow_id = upload_response.json()[ "id" ]
|
|
return uploaded_workflow_id
|
|
|
|
|
|
class LibraryPopulator( object ):
|
|
|
|
def __init__( self, api_test_case ):
|
|
self.api_test_case = api_test_case
|
|
self.galaxy_interactor = api_test_case.galaxy_interactor
|
|
|
|
def new_private_library( self, name ):
|
|
library = self.new_library( name )
|
|
library_id = library[ "id" ]
|
|
|
|
role_id = self.user_private_role_id()
|
|
self.set_permissions( library_id, role_id )
|
|
return library
|
|
|
|
def new_library( self, name ):
|
|
data = dict( name=name )
|
|
create_response = self.galaxy_interactor.post( "libraries", data=data, admin=True )
|
|
return create_response.json()
|
|
|
|
def set_permissions( self, library_id, role_id=None ):
|
|
if role_id:
|
|
perm_list = json.dumps( role_id )
|
|
else:
|
|
perm_list = json.dumps( [] )
|
|
|
|
permissions = dict(
|
|
LIBRARY_ACCESS_in=perm_list,
|
|
LIBRARY_MODIFY_in=perm_list,
|
|
LIBRARY_ADD_in=perm_list,
|
|
LIBRARY_MANAGE_in=perm_list,
|
|
)
|
|
self.galaxy_interactor.post( "libraries/%s/permissions" % library_id, data=permissions, admin=True )
|
|
|
|
def user_email( self ):
|
|
users_response = self.galaxy_interactor.get( "users" )
|
|
users = users_response.json()
|
|
assert len( users ) == 1
|
|
return users[ 0 ][ "email" ]
|
|
|
|
def user_private_role_id( self ):
|
|
user_email = self.user_email()
|
|
roles_response = self.api_test_case.galaxy_interactor.get( "roles", admin=True )
|
|
users_roles = [ r for r in roles_response.json() if r[ "name" ] == user_email ]
|
|
assert len( users_roles ) == 1
|
|
return users_roles[ 0 ][ "id" ]
|
|
|
|
def create_dataset_request( self, library, **kwds ):
|
|
create_data = {
|
|
"folder_id": kwds.get( "folder_id", library[ "root_folder_id" ] ),
|
|
"create_type": "file",
|
|
"files_0|NAME": kwds.get( "name", "NewFile" ),
|
|
"upload_option": kwds.get( "upload_option", "upload_file" ),
|
|
"file_type": kwds.get( "file_type", "auto" ),
|
|
"db_key": kwds.get( "db_key", "?" ),
|
|
}
|
|
files = {
|
|
"files_0|file_data": kwds.get( "file", StringIO.StringIO( kwds.get( "contents", "TestData" ) ) ),
|
|
}
|
|
return create_data, files
|
|
|
|
def new_library_dataset( self, name, **create_dataset_kwds ):
|
|
library = self.new_private_library( name )
|
|
payload, files = self.create_dataset_request( library, **create_dataset_kwds )
|
|
url_rel = "libraries/%s/contents" % ( library[ "id" ] )
|
|
dataset = self.api_test_case.galaxy_interactor.post( url_rel, payload, files=files ).json()[0]
|
|
|
|
def show():
|
|
return self.api_test_case.galaxy_interactor.get( "libraries/%s/contents/%s" % ( library[ "id" ], dataset[ "id" ] ) )
|
|
|
|
wait_on_state(show)
|
|
return show().json()
|
|
|
|
|
|
def wait_on_state( state_func, assert_ok=False, timeout=5 ):
|
|
delta = .1
|
|
iteration = 0
|
|
while True:
|
|
if (delta * iteration) > timeout:
|
|
assert False, "Timed out waiting on state."
|
|
iteration += 1
|
|
response = state_func()
|
|
assert response.status_code == 200, "Failed to fetch state update while waiting."
|
|
state = response.json()[ "state" ]
|
|
if state not in [ "running", "queued", "new" ]:
|
|
break
|
|
time.sleep( delta )
|
|
if assert_ok:
|
|
assert state == "ok", "Final state - %s - not okay." % state
|