From 451dfc1224f4031b76ff3375ec09badeb480ac83 Mon Sep 17 00:00:00 2001
From: "Kevin S. Hahn" <kevinshahn@gmail.com>
Date: Mon, 6 Apr 2015 18:03:11 -0700
Subject: [PATCH] create jobs based on available compatible app

---
 util.py | 139 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 69 insertions(+), 70 deletions(-)

diff --git a/util.py b/util.py
index 6f0b53d2..bb903536 100644
--- a/util.py
+++ b/util.py
@@ -4,10 +4,12 @@ import logging
 log = logging.getLogger('scitran.api')
 
 import os
+import json
 import bson
 import copy
 import shutil
 import difflib
+import tarfile
 import datetime
 import mimetypes
 import tempdir as tempfile
@@ -151,81 +153,78 @@ def _update_db(db, dataset):
 
 # TODO: create job should be use-able from bootstrap.py with only database information
 def create_job(dbc, dataset):
-        db = dbc.database
-        type_ = dataset.nims_file_type
-        kinds_ = dataset.nims_file_kinds
-        state_ = dataset.nims_file_state
-        app = None
-        # TODO: check if there are 'default apps' set for this project/session/acquisition
-        acquisition = db.acquisitions.find_one({'uid': dataset.nims_acquisition_id})
-        session = db.sessions.find_one({'_id': bson.ObjectId(acquisition.get('session'))})
-        project = db.projects.find_one({'_id': bson.ObjectId(session.get('project'))})
-        aid = acquisition.get('_id')
+    db = dbc.database
+    type_ = dataset.nims_file_type
+    kinds_ = dataset.nims_file_kinds
+    state_ = dataset.nims_file_state
+    app = None
+    # TODO: check if there are 'default apps' set for this project/session/acquisition
+    acquisition = db.acquisitions.find_one({'uid': dataset.nims_acquisition_id})
+    session = db.sessions.find_one({'_id': bson.ObjectId(acquisition.get('session'))})
+    project = db.projects.find_one({'_id': bson.ObjectId(session.get('project'))})
+    aid = acquisition.get('_id')
 
-        # job descriptions have a few special cases
-        # XXX: outputs can specify to __INHERIT__ a value from the parent input file, for ex: kinds
-        # XXX: if an input kinds = None, then that job is meant to work on any file kinds
-        # otherwise, kinds will restrict the app to work on specific kinds only
-        app = db.apps.find_one({
-            '$or': [
-                {'inputs': {'$elemMatch': {'type': type_, 'state': state_, 'kinds': kinds_}}, 'default': True},
-                {'inputs': {'$elemMatch': {'type': type_, 'state': state_, 'kinds': None}}, 'default': True},
-            ],
-        })
-        # TODO: this has to move...
-        # force acquisition dicom file to be marked as 'optional = True'
-        db.acquisitions.find_and_modify(
-            {'uid': dataset.nims_acquisition_id, 'files.type': 'dicom'},
-            {'$set': {'files.$.optional': True}},
-            )
+    # XXX: if an input kinds = None, then that job is meant to work on any file kinds
+    app = db.apps.find_one({
+        '$or': [
+            {'inputs': {'$elemMatch': {'type': type_, 'state': state_, 'kinds': kinds_}}, 'default': True},
+            {'inputs': {'$elemMatch': {'type': type_, 'state': state_, 'kinds': None}}, 'default': True},
+        ],
+    })
+    # TODO: this has to move...
+    # force acquisition dicom file to be marked as 'optional = True'
+    db.acquisitions.find_and_modify(
+        {'uid': dataset.nims_acquisition_id, 'files.type': 'dicom'},
+        {'$set': {'files.$.optional': True}},
+        )
 
-        if not app:
-            log.info('no app for type=%s, state=%s, kinds=%s, default=True. no job created.' % (type_, state_, kinds_))
-        else:
-            # replace any special values in the app description
-            for output in app['outputs']:
-                if output['kinds'] == '__INHERIT__':
-                    output['kinds'] = kinds_
+    if not app:
+        log.info('no app for type=%s, state=%s, kinds=%s, default=True. no job created.' % (type_, state_, kinds_))
+    else:
+        # XXX: outputs can specify to __INHERIT__ a value from the parent input file, for ex: kinds
+        for output in app['outputs']:
+            if output['kinds'] == '__INHERIT__':
+                output['kinds'] = kinds_
 
-            # TODO: job description needs more metadata to be searchable in a useful way
-            output_url = '%s/%s/%s' % ('acquisitions', aid, 'file')
-            job = db.jobs.find_and_modify(
-                {
-                    '_id': db.jobs.count() + 1,
+        # TODO: job description needs more metadata to be searchable in a useful way
+        output_url = '%s/%s/%s' % ('acquisitions', aid, 'file')
+        job = db.jobs.find_and_modify(
+            {
+                '_id': db.jobs.count() + 1,
+            },
+            {
+                '_id': db.jobs.count() + 1,
+                'group': project.get('group_id'),
+                'project': {
+                    '_id': project.get('_id'),
+                    'name': project.get('name'),
                 },
-                {
-                    '_id': db.jobs.count() + 1,
-                    'group': project.get('group_id'),
-                    'project': {
-                        '_id': project.get('_id'),
-                        'name': project.get('name'),
-                    },
-                    'exam': session.get('exam'),
-                    'app': {
-                        '_id': app['_id'],
-                        'type': 'docker',
-                    },
-                    'inputs': [
-                        {
-                            'filename': dataset.nims_file_name + dataset.nims_file_ext,
-                            'url': '%s/%s/%s' % ('acquisitions', aid, 'file'),
-                            'payload': {
-                                'type': dataset.nims_file_type,
-                                'state': dataset.nims_file_state,
-                                'kinds': dataset.nims_file_kinds,
-                            },
-                        }
-                    ],
-                    'outputs': [{'url': output_url, 'payload': i} for i in app['outputs']],
-                    'status': 'pending',
-                    'activity': None,
-                    'added': datetime.datetime.now(),
-                    'timestamp': datetime.datetime.now(),
+                'exam': session.get('exam'),
+                'app': {
+                    '_id': app['_id'],
+                    'type': 'docker',
                 },
-                upsert=True,
-                new=True,
-            )
-            log.info('created job %d, group: %s, project %s' % (job['_id'], job['group'], job['project']))
+                'inputs': [
+                    {
+                        'filename': dataset.nims_file_name + dataset.nims_file_ext,
+                        'url': '%s/%s/%s' % ('acquisitions', aid, 'file'),
+                        'payload': {
+                            'type': dataset.nims_file_type,
+                            'state': dataset.nims_file_state,
+                            'kinds': dataset.nims_file_kinds,
+                        },
+                    }
+                ],
+                'outputs': [{'url': output_url, 'payload': i} for i in app['outputs']],
+                'status': 'pending',
+                'activity': None,
+                'added': datetime.datetime.now(),
+                'timestamp': datetime.datetime.now(),
+            },
+            upsert=True,
+            new=True,
+        )
+        log.info('created job %d, group: %s, project %s' % (job['_id'], job['group'], job['project']))
 
 
 def _entity_metadata(dataset, properties, metadata={}, parent_key=''):
-- 
GitLab