| 1 | from __init__ import ToolAction |
|---|
| 2 | from galaxy.datatypes.metadata import JobExternalOutputMetadataWrapper |
|---|
| 3 | from galaxy.util.odict import odict |
|---|
| 4 | |
|---|
| 5 | import logging |
|---|
| 6 | log = logging.getLogger( __name__ ) |
|---|
| 7 | |
|---|
| 8 | class SetMetadataToolAction( ToolAction ): |
|---|
| 9 | """Tool action used for setting external metadata on an existing dataset""" |
|---|
| 10 | |
|---|
| 11 | def execute( self, tool, trans, incoming = {}, set_output_hid = False, overwrite = True ): |
|---|
| 12 | for name, value in incoming.iteritems(): |
|---|
| 13 | if isinstance( value, trans.app.model.HistoryDatasetAssociation ): |
|---|
| 14 | dataset = value |
|---|
| 15 | dataset_name = name |
|---|
| 16 | break |
|---|
| 17 | else: |
|---|
| 18 | raise Exception( 'The dataset to set metadata on could not be determined.' ) |
|---|
| 19 | |
|---|
| 20 | # Create the job object |
|---|
| 21 | job = trans.app.model.Job() |
|---|
| 22 | job.session_id = trans.get_galaxy_session().id |
|---|
| 23 | job.history_id = trans.history.id |
|---|
| 24 | job.tool_id = tool.id |
|---|
| 25 | start_job_state = job.state #should be job.states.NEW |
|---|
| 26 | try: |
|---|
| 27 | # For backward compatibility, some tools may not have versions yet. |
|---|
| 28 | job.tool_version = tool.version |
|---|
| 29 | except: |
|---|
| 30 | job.tool_version = "1.0.1" |
|---|
| 31 | job.state = job.states.WAITING #we need to set job state to something other than NEW, or else when tracking jobs in db it will be picked up before we have added input / output parameters |
|---|
| 32 | trans.sa_session.add( job ) |
|---|
| 33 | trans.sa_session.flush() #ensure job.id is available |
|---|
| 34 | |
|---|
| 35 | #add parameters to job_parameter table |
|---|
| 36 | # Store original dataset state, so we can restore it. A separate table might be better (no chance of 'losing' the original state)? |
|---|
| 37 | incoming[ '__ORIGINAL_DATASET_STATE__' ] = dataset.state |
|---|
| 38 | external_metadata_wrapper = JobExternalOutputMetadataWrapper( job ) |
|---|
| 39 | cmd_line = external_metadata_wrapper.setup_external_metadata( dataset, |
|---|
| 40 | trans.sa_session, |
|---|
| 41 | exec_dir = None, |
|---|
| 42 | tmp_dir = trans.app.config.new_file_path, |
|---|
| 43 | dataset_files_path = trans.app.model.Dataset.file_path, |
|---|
| 44 | output_fnames = None, |
|---|
| 45 | config_root = None, |
|---|
| 46 | datatypes_config = None, |
|---|
| 47 | job_metadata = None, |
|---|
| 48 | kwds = { 'overwrite' : overwrite } ) |
|---|
| 49 | incoming[ '__SET_EXTERNAL_METADATA_COMMAND_LINE__' ] = cmd_line |
|---|
| 50 | for name, value in tool.params_to_strings( incoming, trans.app ).iteritems(): |
|---|
| 51 | job.add_parameter( name, value ) |
|---|
| 52 | #add the dataset to job_to_input_dataset table |
|---|
| 53 | job.add_input_dataset( dataset_name, dataset ) |
|---|
| 54 | #Need a special state here to show that metadata is being set and also allow the job to run |
|---|
| 55 | # i.e. if state was set to 'running' the set metadata job would never run, as it would wait for input (the dataset to set metadata on) to be in a ready state |
|---|
| 56 | dataset._state = dataset.states.SETTING_METADATA |
|---|
| 57 | job.state = start_job_state #job inputs have been configured, restore initial job state |
|---|
| 58 | trans.sa_session.flush() |
|---|
| 59 | |
|---|
| 60 | # Queue the job for execution |
|---|
| 61 | trans.app.job_queue.put( job.id, tool ) |
|---|
| 62 | trans.log_event( "Added set external metadata job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id ) |
|---|
| 63 | |
|---|
| 64 | #clear e.g. converted files |
|---|
| 65 | dataset.datatype.before_setting_metadata( dataset ) |
|---|
| 66 | |
|---|
| 67 | return job, odict() |
|---|