Add check for multiple storage classes in arvados-cwl-runner
authorFuad Muhic <fmuhic@capeannenterprises.com>
Tue, 5 Jun 2018 15:30:05 +0000 (17:30 +0200)
committerFuad Muhic <fmuhic@capeannenterprises.com>
Tue, 5 Jun 2018 15:30:05 +0000 (17:30 +0200)
Arvados-DCO-1.1-Signed-off-by: Fuad Muhic <fmuhic@capeannenterprises.com>

sdk/cwl/arvados_cwl/__init__.py
sdk/cwl/tests/test_make_output.py
sdk/cwl/tests/test_submit.py

index 6d4eda4f4790717dde489d7839973a8a0d7fa6fe..31995ff8c2e371072000f0d0c045f05934b29bed 100644 (file)
@@ -601,10 +601,7 @@ class ArvCwlRunner(object):
             if self.output_tags is None:
                 self.output_tags = ""
 
-            storage_classes = ["default"]
-            if kwargs.get("storage_classes"):
-                storage_classes = kwargs.get("storage_classes").strip().split(",")
-
+            storage_classes = kwargs.get("storage_classes")
             self.final_output, self.final_output_collection = self.make_output_collection(self.output_name, storage_classes, self.output_tags, self.final_output)
             self.set_crunch_output()
 
@@ -723,8 +720,8 @@ def arg_parser():  # type: () -> argparse.ArgumentParser
     parser.add_argument("--enable-dev", action="store_true",
                         help="Enable loading and running development versions "
                              "of CWL spec.", default=False)
-    parser.add_argument('--storage-classes', 
-                        help="Specify comma separated list of storage classes to be used when saving wortkflow output to Keep.")
+    parser.add_argument('--storage-classes', default="default",
+                        help="Specify comma separated list of storage classes to be used when saving workflow output to Keep.")
 
     parser.add_argument("--intermediate-output-ttl", type=int, metavar="N",
                         help="If N > 0, intermediate output collections will be trashed N seconds after creation.  Default is 0 (don't trash).",
@@ -786,6 +783,11 @@ def main(args, stdout, stderr, api_client=None, keep_client=None,
     job_order_object = None
     arvargs = parser.parse_args(args)
 
+    arvargs.storage_classes = arvargs.storage_classes.strip().split(',')
+    if len(arvargs.storage_classes) > 1:
+        logger.error("Multiple storage classes are not supported currently.")
+        sys.exit(1)
+
     if install_sig_handlers:
         arv_cmd.install_signal_handlers()
 
index 13b1aff9fb05124dad2c9c3817bc7381e015af9a..590c82d207d590784c677a5831721ce577c99554 100644 (file)
@@ -39,7 +39,7 @@ class TestMakeOutput(unittest.TestCase):
         final.open.return_value = openmock
         openmock.__enter__.return_value = cwlout
 
-        _, runner.final_output_collection = runner.make_output_collection("Test output", ["default"], "tag0,tag1,tag2", {
+        _, runner.final_output_collection = runner.make_output_collection("Test output", ["foo"], "tag0,tag1,tag2", {
             "foo": {
                 "class": "File",
                 "location": "keep:99999999999999999999999999999991+99/foo.txt",
@@ -56,7 +56,7 @@ class TestMakeOutput(unittest.TestCase):
 
         final.copy.assert_has_calls([mock.call('bar.txt', 'baz.txt', overwrite=False, source_collection=readermock)])
         final.copy.assert_has_calls([mock.call('foo.txt', 'foo.txt', overwrite=False, source_collection=readermock)])
-        final.save_new.assert_has_calls([mock.call(ensure_unique_name=True, name='Test output', owner_uuid='zzzzz-j7d0g-zzzzzzzzzzzzzzz', storage_classes=['default'])])
+        final.save_new.assert_has_calls([mock.call(ensure_unique_name=True, name='Test output', owner_uuid='zzzzz-j7d0g-zzzzzzzzzzzzzzz', storage_classes=['foo'])])
         self.assertEqual("""{
     "bar": {
         "basename": "baz.txt",
index 77bef075fa97903e96bcc18e5f6c2c11dc4f5654..d6553aa4c28aed4a244886e6f54bb2cd65fa4cb4 100644 (file)
@@ -333,6 +333,17 @@ class TestSubmit(unittest.TestCase):
         self.assertEqual(capture_stdout.getvalue(),
                          stubs.expect_pipeline_uuid + '\n')
 
+    @stubs
+    def test_error_when_multiple_storage_classes_specified(self, stubs):
+        capture_stdout = cStringIO.StringIO()
+        storage_classes = "foo,bar"
+
+        with self.assertRaises(SystemExit):
+            arvados_cwl.main(
+                ["--debug", "--storage-classes", storage_classes,
+                 "tests/wf/submit_wf.cwl", "tests/submit_test_job.json"],
+                capture_stdout, sys.stderr, api_client=stubs.api)
+
     @mock.patch("time.sleep")
     @stubs
     def test_submit_on_error(self, stubs, tm):