neptune 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. data/README +4 -0
  2. data/doc/BabelHelper.html +393 -376
  3. data/doc/BadConfigurationException.html +121 -127
  4. data/doc/CommonFunctions.html +237 -265
  5. data/doc/ExodusHelper.html +820 -0
  6. data/doc/ExodusTaskInfo.html +263 -0
  7. data/doc/FileNotFoundException.html +121 -127
  8. data/doc/NeptuneHelper.html +527 -592
  9. data/doc/NeptuneManagerClient.html +696 -0
  10. data/doc/NeptuneManagerException.html +139 -0
  11. data/doc/Object.html +334 -236
  12. data/doc/TaskInfo.html +428 -0
  13. data/doc/created.rid +8 -5
  14. data/doc/images/add.png +0 -0
  15. data/doc/images/delete.png +0 -0
  16. data/doc/images/tag_blue.png +0 -0
  17. data/doc/images/transparent.png +0 -0
  18. data/doc/index.html +74 -142
  19. data/doc/js/darkfish.js +99 -62
  20. data/doc/js/jquery.js +15 -29
  21. data/doc/js/navigation.js +142 -0
  22. data/doc/js/search.js +94 -0
  23. data/doc/js/search_index.js +1 -0
  24. data/doc/js/searcher.js +228 -0
  25. data/doc/table_of_contents.html +226 -0
  26. data/lib/babel.rb +116 -50
  27. data/lib/custom_exceptions.rb +2 -2
  28. data/lib/exodus.rb +311 -0
  29. data/lib/exodus_task_info.rb +36 -0
  30. data/lib/neptune.rb +52 -18
  31. data/lib/{app_controller_client.rb → neptune_manager_client.rb} +54 -38
  32. data/lib/task_info.rb +155 -0
  33. data/test/{unit/test_babel.rb → test_babel.rb} +161 -26
  34. data/test/{unit/test_common_functions.rb → test_common_functions.rb} +1 -1
  35. data/test/test_exodus.rb +687 -0
  36. data/test/{unit/test_neptune.rb → test_neptune.rb} +28 -17
  37. data/test/{unit/test_app_controller_client.rb → test_neptune_manager_client.rb} +15 -16
  38. data/test/test_task_info.rb +32 -0
  39. data/test/{unit/ts_all.rb → ts_all.rb} +3 -1
  40. metadata +30 -34
  41. data/doc/AppControllerClient.html +0 -702
  42. data/doc/AppControllerException.html +0 -145
  43. data/doc/bin/neptune.html +0 -56
  44. data/doc/js/quicksearch.js +0 -114
  45. data/doc/js/thickbox-compressed.js +0 -10
  46. data/doc/lib/app_controller_client_rb.html +0 -60
  47. data/doc/lib/babel_rb.html +0 -68
  48. data/doc/lib/common_functions_rb.html +0 -70
  49. data/doc/lib/custom_exceptions_rb.html +0 -54
  50. data/doc/lib/neptune_rb.html +0 -60
  51. data/test/integration/tc_c.rb +0 -57
  52. data/test/integration/tc_dfsp.rb +0 -37
  53. data/test/integration/tc_dwssa.rb +0 -38
  54. data/test/integration/tc_erlang.rb +0 -183
  55. data/test/integration/tc_mapreduce.rb +0 -282
  56. data/test/integration/tc_mpi.rb +0 -160
  57. data/test/integration/tc_storage.rb +0 -209
  58. data/test/integration/tc_upc.rb +0 -75
  59. data/test/integration/tc_x10.rb +0 -94
  60. data/test/integration/test_helper.rb +0 -135
  61. data/test/integration/ts_neptune.rb +0 -40
@@ -1,6 +1,6 @@
1
1
  # Programmer: Chris Bunch (cgb@cs.ucsb.edu)
2
2
 
3
- $:.unshift File.join(File.dirname(__FILE__), "..", "..", "lib")
3
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
4
4
  require 'neptune'
5
5
 
6
6
  require 'test/unit'
@@ -77,50 +77,51 @@ class TestNeptune < Test::Unit::TestCase
77
77
 
78
78
  def test_preprocess_mpi
79
79
  # not specifying nodes to use or procs to use should throw an error
80
- job_data_1 = {}
80
+ job_data_1 = {"@output" => "baz", "@error" => "boo",
81
+ "@metadata" => "bar"}
81
82
  assert_raise(BadConfigurationException) {
82
83
  NeptuneHelper.preprocess_mpi(job_data_1, nil)
83
84
  }
84
85
 
85
86
  # not specifying procs to use should throw an error
86
- job_data_2 = {"@nodes_to_use" => 4}
87
+ job_data_2 = job_data_1.merge({"@nodes_to_use" => 4})
87
88
  assert_raise(BadConfigurationException) {
88
89
  NeptuneHelper.preprocess_mpi(job_data_2, nil)
89
90
  }
90
91
 
91
92
  # specifying procs to use == nodes to use should not throw an error
92
- job_data_3 = {"@nodes_to_use" => 4, "@procs_to_use" => 4}
93
+ job_data_3 = job_data_1.merge({"@nodes_to_use" => 4, "@procs_to_use" => 4})
93
94
  assert_equal(job_data_3, NeptuneHelper.preprocess_mpi(job_data_3, nil))
94
95
 
95
96
  # specifying procs to use < nodes to use should throw an error
96
- job_data_4 = {"@nodes_to_use" => 4, "@procs_to_use" => 1}
97
+ job_data_4 = job_data_1.merge({"@nodes_to_use" => 4, "@procs_to_use" => 1})
97
98
  assert_raise(BadConfigurationException) {
98
99
  NeptuneHelper.preprocess_mpi(job_data_4, nil)
99
100
  }
100
101
 
101
102
  # specifying an empty string for argv should be ok
102
- job_data_5 = {"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => ""}
103
+ job_data_5 = job_data_1.merge({"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => ""})
103
104
  assert_equal(job_data_5, NeptuneHelper.preprocess_mpi(job_data_5, nil))
104
105
 
105
106
  # specifying an empty array for argv should be ok
106
- job_data_6 = {"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => []}
107
+ job_data_6 = job_data_1.merge({"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => []})
107
108
  expected_job_data_6 = job_data_6.dup
108
109
  expected_job_data_6["@argv"] = ""
109
110
  assert_equal(expected_job_data_6, NeptuneHelper.preprocess_mpi(job_data_6, nil))
110
111
 
111
112
  # specifying something that's not a string or array for argv should throw
112
113
  # an error
113
- job_data_7 = {"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => 2}
114
+ job_data_7 = job_data_1.merge({"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => 2})
114
115
  assert_raise(BadConfigurationException) {
115
116
  NeptuneHelper.preprocess_mpi(job_data_7, nil)
116
117
  }
117
118
 
118
119
  # specifying a non-empty string for argv should be ok
119
- job_data_8 = {"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => "--file coo"}
120
+ job_data_8 = job_data_1.merge({"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => "--file coo"})
120
121
  assert_equal(job_data_8, NeptuneHelper.preprocess_mpi(job_data_8, nil))
121
122
 
122
123
  # specifying a non-empty array for argv should be ok
123
- job_data_9 = {"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => ["--file", "coo"]}
124
+ job_data_9 = job_data_1.merge({"@nodes_to_use" => 4, "@procs_to_use" => 4, "@argv" => ["--file", "coo"]})
124
125
  expected_job_data_9 = job_data_9.dup
125
126
  expected_job_data_9["@argv"] = "--file coo"
126
127
  assert_equal(expected_job_data_9, NeptuneHelper.preprocess_mpi(job_data_9, nil))
@@ -169,10 +170,11 @@ class TestNeptune < Test::Unit::TestCase
169
170
  expected_job_data_5 = {"@type" => "input", "@keyname" => "boo"}
170
171
  assert_equal(expected_job_data_5, NeptuneHelper.get_job_data(params_5))
171
172
 
173
+ nodes = {"cloud1" => 1, "cloud2" => 1}
172
174
  params_6 = {:type => :mpi, :output => "/boo",
173
- :nodes_to_use => {"cloud1" => 1, "cloud2" => 1}}
175
+ :nodes_to_use => nodes}
174
176
  expected_job_data_6 = {"@type" => "mpi", "@output" => "/boo",
175
- "@keyname" => "appscale", "@nodes_to_use" => ["cloud1", 1, "cloud2", 1]}
177
+ "@keyname" => "appscale", "@nodes_to_use" => nodes.to_a.flatten}
176
178
  assert_equal(expected_job_data_6, NeptuneHelper.get_job_data(params_6))
177
179
  end
178
180
 
@@ -227,7 +229,7 @@ class TestNeptune < Test::Unit::TestCase
227
229
  }
228
230
 
229
231
  @file.should_receive(:exists?).and_return(false)
230
- flexmock(AppControllerClient).new_instances { |instance|
232
+ flexmock(NeptuneManagerClient).new_instances { |instance|
231
233
  instance.should_receive(:put_input).and_return(true)
232
234
  }
233
235
 
@@ -241,7 +243,7 @@ class TestNeptune < Test::Unit::TestCase
241
243
  shadow_ip = "localhost?"
242
244
  secret = "abcdefg"
243
245
 
244
- flexmock(AppControllerClient).new_instances { |instance|
246
+ flexmock(NeptuneManagerClient).new_instances { |instance|
245
247
  instance.should_receive(:put_input).and_return(true)
246
248
  }
247
249
 
@@ -266,6 +268,8 @@ class TestNeptune < Test::Unit::TestCase
266
268
  def test_babel_job_validation
267
269
  input = "/boo/input.txt"
268
270
  output = "/boo/baz.txt"
271
+ error = "/boo/baz-err.txt"
272
+ metadata = "/boo/baz-meta.txt"
269
273
  code = "/boo/code.go"
270
274
  engine = "appscale-sqs"
271
275
  all_engines = [engine]
@@ -273,10 +277,11 @@ class TestNeptune < Test::Unit::TestCase
273
277
  @commonfunctions.should_receive(:get_from_yaml).and_return("127.0.0.1")
274
278
  @commonfunctions.should_receive(:get_secret_key).and_return("secret")
275
279
 
276
- flexmock(AppControllerClient).new_instances { |instance|
280
+ flexmock(NeptuneManagerClient).new_instances { |instance|
277
281
  instance.should_receive(:start_neptune_job).and_return("babel job is now running")
278
282
  instance.should_receive(:get_supported_babel_engines).and_return(all_engines)
279
- instance.should_receive(:does_file_exist?).and_return(true, false, true)
283
+ # code exists - output, error, metadata do not - something else does
284
+ instance.should_receive(:does_file_exist?).and_return(true, false, false, false, true)
280
285
  }
281
286
 
282
287
  # test cases where we don't give all the correct params
@@ -293,6 +298,8 @@ class TestNeptune < Test::Unit::TestCase
293
298
 
294
299
  params = {:type => :babel,
295
300
  :output => output,
301
+ :error => error,
302
+ :metadata => metadata,
296
303
  :code => code,
297
304
  :engine => engine,
298
305
  :argv => [input]}
@@ -302,6 +309,8 @@ class TestNeptune < Test::Unit::TestCase
302
309
 
303
310
  def test_babel_where_remote_files_dont_exist
304
311
  output = "/boo/baz.txt"
312
+ error = "/boo/baz-err.txt"
313
+ metadata = "/boo/baz-meta.txt"
305
314
  code = "/boo/code.go"
306
315
  engine = "appscale-sqs"
307
316
  all_engines = [engine]
@@ -309,7 +318,7 @@ class TestNeptune < Test::Unit::TestCase
309
318
  @commonfunctions.should_receive(:get_from_yaml).and_return("127.0.0.1")
310
319
  @commonfunctions.should_receive(:get_secret_key).and_return("secret")
311
320
 
312
- flexmock(AppControllerClient).new_instances { |instance|
321
+ flexmock(NeptuneManagerClient).new_instances { |instance|
313
322
  instance.should_receive(:start_neptune_job).and_return("babel job is now running")
314
323
  instance.should_receive(:get_supported_babel_engines).and_return(all_engines)
315
324
  instance.should_receive(:does_file_exist?).and_return(false)
@@ -317,6 +326,8 @@ class TestNeptune < Test::Unit::TestCase
317
326
 
318
327
  params = {:type => :babel,
319
328
  :output => output,
329
+ :error => error,
330
+ :metadata => metadata,
320
331
  :code => code,
321
332
  :engine => engine}
322
333
  assert_raises(FileNotFoundException) { neptune(params) }
@@ -1,7 +1,7 @@
1
1
  # Programmer: Chris Bunch (cgb@cs.ucsb.edu)
2
2
 
3
- $:.unshift File.join(File.dirname(__FILE__), "..", "..", "lib")
4
- require 'app_controller_client'
3
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
4
+ require 'neptune_manager_client'
5
5
 
6
6
  require 'test/unit'
7
7
 
@@ -9,9 +9,8 @@ class FakeConnection
9
9
  # Since all the methods we're faking take the same arguments and have
10
10
  # the same semantics (return true or abort), just cover it all in one place.
11
11
  def method_missing(id, *args, &block)
12
- method_names = ["neptune_start_job", "neptune_put_input"] +
13
- ["neptune_get_output", "neptune_get_acl", "neptune_set_acl"] +
14
- ["neptune_compile_code"]
12
+ method_names = ["start_job", "put_input", "get_output", "get_acl"] +
13
+ ["set_acl", "compile_code"]
15
14
 
16
15
  if method_names.include?(id.to_s)
17
16
  job_data = args[0]
@@ -26,9 +25,9 @@ class FakeConnection
26
25
  end
27
26
  end
28
27
 
29
- class TestAppControllerClient < Test::Unit::TestCase
28
+ class TestNeptuneManagerClient < Test::Unit::TestCase
30
29
  def setup
31
- @client = AppControllerClient.new("localhost", "secret")
30
+ @client = NeptuneManagerClient.new("localhost", "secret")
32
31
  @client.conn = FakeConnection.new()
33
32
 
34
33
  @job_data_ok = ["OK"]
@@ -41,7 +40,7 @@ class TestAppControllerClient < Test::Unit::TestCase
41
40
  no_retry_on_exception = false
42
41
 
43
42
  call_number = 0
44
- assert_nothing_raised(AppControllerException) {
43
+ assert_nothing_raised(NeptuneManagerException) {
45
44
  @client.make_call(no_timeout, retry_on_exception) {
46
45
  call_number += 1
47
46
  case call_number
@@ -57,13 +56,13 @@ class TestAppControllerClient < Test::Unit::TestCase
57
56
  }
58
57
  }
59
58
 
60
- assert_raise(AppControllerException) {
59
+ assert_raise(NeptuneManagerException) {
61
60
  @client.make_call(no_timeout, no_retry_on_exception) {
62
61
  raise Errno::ECONNREFUSED
63
62
  }
64
63
  }
65
64
 
66
- assert_raise(AppControllerException) {
65
+ assert_raise(NeptuneManagerException) {
67
66
  @client.make_call(no_timeout, no_retry_on_exception) {
68
67
  raise Exception
69
68
  }
@@ -76,31 +75,31 @@ class TestAppControllerClient < Test::Unit::TestCase
76
75
  # result unless it has 'Error:' in it. If it does, it aborts execution.
77
76
  def test_start_neptune_job
78
77
  assert(@client.start_neptune_job(@job_data_ok))
79
- assert_raise(AppControllerException) { @client.start_neptune_job(@job_data_err) }
78
+ assert_raise(NeptuneManagerException) { @client.start_neptune_job(@job_data_err) }
80
79
  end
81
80
 
82
81
  def test_put_input
83
82
  assert(@client.put_input(@job_data_ok))
84
- assert_raise(AppControllerException) { @client.put_input(@job_data_err) }
83
+ assert_raise(NeptuneManagerException) { @client.put_input(@job_data_err) }
85
84
  end
86
85
 
87
86
  def test_get_output
88
87
  assert(@client.get_output(@job_data_ok))
89
- assert_raise(AppControllerException) { @client.get_output(@job_data_err) }
88
+ assert_raise(NeptuneManagerException) { @client.get_output(@job_data_err) }
90
89
  end
91
90
 
92
91
  def test_get_acl
93
92
  assert(@client.get_acl(@job_data_ok))
94
- assert_raise(AppControllerException) { @client.get_acl(@job_data_err) }
93
+ assert_raise(NeptuneManagerException) { @client.get_acl(@job_data_err) }
95
94
  end
96
95
 
97
96
  def test_set_acl
98
97
  assert(@client.set_acl(@job_data_ok))
99
- assert_raise(AppControllerException) { @client.set_acl(@job_data_err) }
98
+ assert_raise(NeptuneManagerException) { @client.set_acl(@job_data_err) }
100
99
  end
101
100
 
102
101
  def test_compile_code
103
102
  assert(@client.compile_code(@job_data_ok))
104
- assert_raise(AppControllerException) { @client.compile_code(@job_data_err) }
103
+ assert_raise(NeptuneManagerException) { @client.compile_code(@job_data_err) }
105
104
  end
106
105
  end
@@ -0,0 +1,32 @@
1
+ # Programmer: Chris Bunch (cgb@cs.ucsb.edu)
2
+
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'task_info'
6
+
7
+
8
+ require 'rubygems'
9
+ require 'flexmock/test_unit'
10
+
11
+
12
+ class TestTaskInfo < Test::Unit::TestCase
13
+
14
+
15
+ def test_init
16
+ assert_raises(BadConfigurationException) {
17
+ TaskInfo.new("not a Hash")
18
+ }
19
+ end
20
+
21
+
22
+ def test_to_from_json
23
+ job_data = {'a' => 'b', 'c' => 'd'}
24
+ task = TaskInfo.new(job_data)
25
+
26
+ task_as_json = task.to_json
27
+ task_as_task = TaskInfo.new(task_as_json)
28
+ assert_equal(task.job_data, task_as_task.job_data)
29
+ end
30
+
31
+
32
+ end
@@ -5,7 +5,9 @@ require 'flexmock'
5
5
  require 'flexmock/test_unit'
6
6
 
7
7
  $:.unshift File.join(File.dirname(__FILE__))
8
- require 'test_app_controller_client'
9
8
  require 'test_babel'
10
9
  require 'test_common_functions'
10
+ require 'test_exodus'
11
11
  require 'test_neptune'
12
+ require 'test_neptune_manager_client'
13
+ require 'test_task_info'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neptune
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Bunch
@@ -15,8 +15,7 @@ autorequire: neptune
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-02-12 00:00:00 -08:00
19
- default_executable: neptune
18
+ date: 2012-07-31 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: promise
@@ -47,21 +46,21 @@ files:
47
46
  - bin/neptune
48
47
  - doc/CommonFunctions.html
49
48
  - doc/Object.html
49
+ - doc/ExodusHelper.html
50
+ - doc/TaskInfo.html
50
51
  - doc/js/jquery.js
52
+ - doc/js/searcher.js
53
+ - doc/js/search_index.js
51
54
  - doc/js/darkfish.js
52
- - doc/js/quicksearch.js
53
- - doc/js/thickbox-compressed.js
54
- - doc/AppControllerClient.html
55
- - doc/AppControllerException.html
55
+ - doc/js/navigation.js
56
+ - doc/js/search.js
56
57
  - doc/NeptuneHelper.html
58
+ - doc/NeptuneManagerClient.html
57
59
  - doc/FileNotFoundException.html
58
- - doc/lib/neptune_rb.html
59
- - doc/lib/custom_exceptions_rb.html
60
- - doc/lib/app_controller_client_rb.html
61
- - doc/lib/babel_rb.html
62
- - doc/lib/common_functions_rb.html
63
60
  - doc/index.html
64
- - doc/bin/neptune.html
61
+ - doc/ExodusTaskInfo.html
62
+ - doc/table_of_contents.html
63
+ - doc/NeptuneManagerException.html
65
64
  - doc/BabelHelper.html
66
65
  - doc/images/wrench.png
67
66
  - doc/images/loadingAnimation.gif
@@ -72,40 +71,38 @@ files:
72
71
  - doc/images/brick_link.png
73
72
  - doc/images/page_green.png
74
73
  - doc/images/brick.png
74
+ - doc/images/delete.png
75
75
  - doc/images/date.png
76
+ - doc/images/add.png
76
77
  - doc/images/bug.png
77
78
  - doc/images/bullet_black.png
78
79
  - doc/images/page_white_width.png
79
80
  - doc/images/tag_green.png
80
81
  - doc/images/macFFBgHack.png
81
82
  - doc/images/wrench_orange.png
83
+ - doc/images/transparent.png
82
84
  - doc/images/ruby.png
83
85
  - doc/images/bullet_toggle_plus.png
84
86
  - doc/images/package.png
85
87
  - doc/images/bullet_toggle_minus.png
88
+ - doc/images/tag_blue.png
86
89
  - doc/created.rid
87
90
  - doc/BadConfigurationException.html
88
91
  - lib/common_functions.rb
89
- - lib/app_controller_client.rb
92
+ - lib/exodus.rb
90
93
  - lib/babel.rb
94
+ - lib/neptune_manager_client.rb
95
+ - lib/task_info.rb
96
+ - lib/exodus_task_info.rb
91
97
  - lib/custom_exceptions.rb
92
98
  - lib/neptune.rb
93
- - test/integration/tc_c.rb
94
- - test/integration/tc_dfsp.rb
95
- - test/integration/test_helper.rb
96
- - test/integration/tc_mpi.rb
97
- - test/integration/tc_dwssa.rb
98
- - test/integration/tc_erlang.rb
99
- - test/integration/tc_storage.rb
100
- - test/integration/tc_x10.rb
101
- - test/integration/tc_upc.rb
102
- - test/integration/ts_neptune.rb
103
- - test/integration/tc_mapreduce.rb
104
- - test/unit/test_app_controller_client.rb
105
- - test/unit/test_babel.rb
106
- - test/unit/test_neptune.rb
107
- - test/unit/test_common_functions.rb
108
- - test/unit/ts_all.rb
99
+ - test/test_babel.rb
100
+ - test/test_task_info.rb
101
+ - test/test_exodus.rb
102
+ - test/test_neptune.rb
103
+ - test/test_neptune_manager_client.rb
104
+ - test/test_common_functions.rb
105
+ - test/ts_all.rb
109
106
  - samples/upc/run_upc_ring.rb
110
107
  - samples/upc/helloworld/HelloWorld.c
111
108
  - samples/upc/helloworld/Makefile
@@ -184,7 +181,6 @@ files:
184
181
  - samples/mpi/get_mpi_output.rb
185
182
  - README
186
183
  - LICENSE
187
- has_rdoc: true
188
184
  homepage: http://neptune-lang.org
189
185
  licenses: []
190
186
 
@@ -214,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
210
  requirements: []
215
211
 
216
212
  rubyforge_project:
217
- rubygems_version: 1.4.2
213
+ rubygems_version: 1.8.24
218
214
  signing_key:
219
215
  specification_version: 3
220
216
  summary: A domain specific language for deploying HPC apps to cloud platforms
@@ -1,702 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
- <head>
6
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
7
-
8
- <title>Class: AppControllerClient</title>
9
-
10
- <link rel="stylesheet" href="./rdoc.css" type="text/css" media="screen" />
11
-
12
- <script src="./js/jquery.js" type="text/javascript"
13
- charset="utf-8"></script>
14
- <script src="./js/thickbox-compressed.js" type="text/javascript"
15
- charset="utf-8"></script>
16
- <script src="./js/quicksearch.js" type="text/javascript"
17
- charset="utf-8"></script>
18
- <script src="./js/darkfish.js" type="text/javascript"
19
- charset="utf-8"></script>
20
-
21
- </head>
22
- <body class="class">
23
-
24
- <div id="metadata">
25
- <div id="home-metadata">
26
- <div id="home-section" class="section">
27
- <h3 class="section-header">
28
- <a href="./index.html">Home</a>
29
- <a href="./index.html#classes">Classes</a>
30
- <a href="./index.html#methods">Methods</a>
31
- </h3>
32
- </div>
33
- </div>
34
-
35
- <div id="file-metadata">
36
- <div id="file-list-section" class="section">
37
- <h3 class="section-header">In Files</h3>
38
- <div class="section-body">
39
- <ul>
40
-
41
- <li><a href="./lib/app_controller_client_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
42
- class="thickbox" title="lib/app_controller_client.rb">lib/app_controller_client.rb</a></li>
43
-
44
- </ul>
45
- </div>
46
- </div>
47
-
48
-
49
- </div>
50
-
51
- <div id="class-metadata">
52
-
53
- <!-- Parent Class -->
54
-
55
- <div id="parent-class-section" class="section">
56
- <h3 class="section-header">Parent</h3>
57
-
58
- <p class="link"><a href="Object.html">Object</a></p>
59
-
60
- </div>
61
-
62
-
63
- <!-- Namespace Contents -->
64
-
65
-
66
- <!-- Method Quickref -->
67
-
68
- <div id="method-list-section" class="section">
69
- <h3 class="section-header">Methods</h3>
70
- <ul class="link-list">
71
-
72
- <li><a href="#method-c-new">::new</a></li>
73
-
74
- <li><a href="#method-i-compile_code">#compile_code</a></li>
75
-
76
- <li><a href="#method-i-does_file_exist-3F">#does_file_exist?</a></li>
77
-
78
- <li><a href="#method-i-get_acl">#get_acl</a></li>
79
-
80
- <li><a href="#method-i-get_output">#get_output</a></li>
81
-
82
- <li><a href="#method-i-get_supported_babel_engines">#get_supported_babel_engines</a></li>
83
-
84
- <li><a href="#method-i-make_call">#make_call</a></li>
85
-
86
- <li><a href="#method-i-put_input">#put_input</a></li>
87
-
88
- <li><a href="#method-i-set_acl">#set_acl</a></li>
89
-
90
- <li><a href="#method-i-start_neptune_job">#start_neptune_job</a></li>
91
-
92
- </ul>
93
- </div>
94
-
95
-
96
- <!-- Included Modules -->
97
-
98
- </div>
99
-
100
- <div id="project-metadata">
101
-
102
-
103
-
104
- <div id="classindex-section" class="section project-section">
105
- <h3 class="section-header">Class/Module Index
106
- <span class="search-toggle"><img src="./images/find.png"
107
- height="16" width="16" alt="[+]"
108
- title="show/hide quicksearch" /></span></h3>
109
- <form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
110
- <fieldset>
111
- <legend>Quicksearch</legend>
112
- <input type="text" name="quicksearch" value=""
113
- class="quicksearch-field" />
114
- </fieldset>
115
- </form>
116
-
117
- <ul class="link-list">
118
-
119
- <li><a href="./AppControllerClient.html">AppControllerClient</a></li>
120
-
121
- <li><a href="./AppControllerException.html">AppControllerException</a></li>
122
-
123
- <li><a href="./BabelHelper.html">BabelHelper</a></li>
124
-
125
- <li><a href="./BadConfigurationException.html">BadConfigurationException</a></li>
126
-
127
- <li><a href="./CommonFunctions.html">CommonFunctions</a></li>
128
-
129
- <li><a href="./FileNotFoundException.html">FileNotFoundException</a></li>
130
-
131
- <li><a href="./NeptuneHelper.html">NeptuneHelper</a></li>
132
-
133
- <li><a href="./Object.html">Object</a></li>
134
-
135
- </ul>
136
- <div id="no-class-search-results" style="display: none;">No matching classes.</div>
137
- </div>
138
-
139
-
140
- </div>
141
- </div>
142
-
143
- <div id="documentation">
144
- <h1 class="class">AppControllerClient</h1>
145
-
146
- <div id="description">
147
-
148
- <p>A client that uses SOAP messages to communicate with the underlying cloud
149
- platform (here, AppScale). This client is similar to that used in the
150
- AppScale Tools, but with non-Neptune SOAP calls removed.</p>
151
-
152
- </div>
153
-
154
- <!-- Constants -->
155
-
156
-
157
- <!-- Attributes -->
158
-
159
- <div id="attribute-method-details" class="method-section section">
160
- <h3 class="section-header">Attributes</h3>
161
-
162
-
163
- <div id="conn-attribute-method" class="method-detail">
164
- <a name="conn"></a>
165
-
166
- <a name="conn="></a>
167
-
168
- <div class="method-heading attribute-method-heading">
169
- <span class="method-name">conn</span><span
170
- class="attribute-access-type">[RW]</span>
171
- </div>
172
-
173
- <div class="method-description">
174
-
175
- <p>The SOAP client that we use to communicate with the AppController.</p>
176
-
177
- </div>
178
- </div>
179
-
180
- <div id="ip-attribute-method" class="method-detail">
181
- <a name="ip"></a>
182
-
183
- <a name="ip="></a>
184
-
185
- <div class="method-heading attribute-method-heading">
186
- <span class="method-name">ip</span><span
187
- class="attribute-access-type">[RW]</span>
188
- </div>
189
-
190
- <div class="method-description">
191
-
192
- <p>The IP address of the AppController that we will be connecting to.</p>
193
-
194
- </div>
195
- </div>
196
-
197
- <div id="secret-attribute-method" class="method-detail">
198
- <a name="secret"></a>
199
-
200
- <a name="secret="></a>
201
-
202
- <div class="method-heading attribute-method-heading">
203
- <span class="method-name">secret</span><span
204
- class="attribute-access-type">[RW]</span>
205
- </div>
206
-
207
- <div class="method-description">
208
-
209
- <p>The secret string that is used to authenticate this client with
210
- AppControllers. It is initially generated by appscale-run-instances and can
211
- be found on the machine that ran that tool, or on any AppScale machine.</p>
212
-
213
- </div>
214
- </div>
215
-
216
- </div>
217
-
218
-
219
- <!-- Methods -->
220
-
221
- <div id="public-class-method-details" class="method-section section">
222
- <h3 class="section-header">Public Class Methods</h3>
223
-
224
-
225
- <div id="new-method" class="method-detail ">
226
- <a name="method-c-new"></a>
227
-
228
-
229
- <div class="method-heading">
230
- <span class="method-name">new</span><span
231
- class="method-args">(ip, secret)</span>
232
- <span class="method-click-advice">click to toggle source</span>
233
- </div>
234
-
235
-
236
- <div class="method-description">
237
-
238
- <p>A constructor that requires both the IP address of the machine to
239
- communicate with as well as the secret (string) needed to perform
240
- communication. AppControllers will reject SOAP calls if this secret
241
- (basically a password) is not present - it can be found in the user’s
242
- .appscale directory, and a helper method is usually present to fetch this
243
- for us.</p>
244
-
245
-
246
-
247
- <div class="method-source-code"
248
- id="new-source">
249
- <pre>
250
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 41</span>
251
- def initialize(ip, secret)
252
- <span class="ruby-ivar">@ip</span> = ip
253
- <span class="ruby-ivar">@secret</span> = secret
254
-
255
- <span class="ruby-ivar">@conn</span> = <span class="ruby-constant">SOAP</span>::<span class="ruby-constant">RPC</span>::<span class="ruby-constant">Driver</span>.new(&quot;https://#{@ip}:17443&quot;)
256
- <span class="ruby-ivar">@conn</span>.add_method(<span class="ruby-string">&quot;neptune_start_job&quot;</span>, <span class="ruby-string">&quot;job_data&quot;</span>, <span class="ruby-string">&quot;secret&quot;</span>)
257
- <span class="ruby-ivar">@conn</span>.add_method(<span class="ruby-string">&quot;neptune_put_input&quot;</span>, <span class="ruby-string">&quot;job_data&quot;</span>, <span class="ruby-string">&quot;secret&quot;</span>)
258
- <span class="ruby-ivar">@conn</span>.add_method(<span class="ruby-string">&quot;neptune_get_output&quot;</span>, <span class="ruby-string">&quot;job_data&quot;</span>, <span class="ruby-string">&quot;secret&quot;</span>)
259
- <span class="ruby-ivar">@conn</span>.add_method(<span class="ruby-string">&quot;neptune_get_acl&quot;</span>, <span class="ruby-string">&quot;job_data&quot;</span>, <span class="ruby-string">&quot;secret&quot;</span>)
260
- <span class="ruby-ivar">@conn</span>.add_method(<span class="ruby-string">&quot;neptune_set_acl&quot;</span>, <span class="ruby-string">&quot;job_data&quot;</span>, <span class="ruby-string">&quot;secret&quot;</span>)
261
- <span class="ruby-ivar">@conn</span>.add_method(<span class="ruby-string">&quot;neptune_compile_code&quot;</span>, <span class="ruby-string">&quot;job_data&quot;</span>, <span class="ruby-string">&quot;secret&quot;</span>)
262
- <span class="ruby-ivar">@conn</span>.add_method(<span class="ruby-string">&quot;neptune_get_supported_babel_engines&quot;</span>, <span class="ruby-string">&quot;job_data&quot;</span>, <span class="ruby-string">&quot;secret&quot;</span>)
263
- <span class="ruby-ivar">@conn</span>.add_method(<span class="ruby-string">&quot;neptune_does_file_exist&quot;</span>, <span class="ruby-string">&quot;file&quot;</span>, <span class="ruby-string">&quot;job_data&quot;</span>, <span class="ruby-string">&quot;secret&quot;</span>)
264
- end</pre>
265
- </div>
266
-
267
- </div>
268
-
269
-
270
-
271
-
272
- </div>
273
-
274
-
275
- </div>
276
-
277
- <div id="public-instance-method-details" class="method-section section">
278
- <h3 class="section-header">Public Instance Methods</h3>
279
-
280
-
281
- <div id="compile_code-method" class="method-detail ">
282
- <a name="method-i-compile_code"></a>
283
-
284
-
285
- <div class="method-heading">
286
- <span class="method-name">compile_code</span><span
287
- class="method-args">(job_data)</span>
288
- <span class="method-click-advice">click to toggle source</span>
289
- </div>
290
-
291
-
292
- <div class="method-description">
293
-
294
- <p>Instructs the AppController to fetch the code specified and compile it. The
295
- result should then be placed in a location specified in the job data.</p>
296
-
297
-
298
-
299
- <div class="method-source-code"
300
- id="compile_code-source">
301
- <pre>
302
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 178</span>
303
- def compile_code(job_data)
304
- result = <span class="ruby-string">&quot;&quot;</span>
305
- make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
306
- result = conn.neptune_compile_code(job_data, <span class="ruby-ivar">@secret</span>)
307
- }
308
- raise <span class="ruby-constant">AppControllerException</span>.new(result) if result =~ <span class="ruby-regexp">/Error:/</span>
309
- return result
310
- end</pre>
311
- </div>
312
-
313
- </div>
314
-
315
-
316
-
317
-
318
- </div>
319
-
320
-
321
- <div id="does_file_exist-3F-method" class="method-detail ">
322
- <a name="method-i-does_file_exist-3F"></a>
323
-
324
-
325
- <div class="method-heading">
326
- <span class="method-name">does_file_exist?</span><span
327
- class="method-args">(file, job_data)</span>
328
- <span class="method-click-advice">click to toggle source</span>
329
- </div>
330
-
331
-
332
- <div class="method-description">
333
-
334
- <p>Asks the AppController to see if the given file exists in the remote
335
- datastore. If extra credentials are needed for this operation, they are
336
- searched for within the job data.</p>
337
-
338
-
339
-
340
- <div class="method-source-code"
341
- id="does_file_exist-3F-source">
342
- <pre>
343
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 203</span>
344
- def does_file_exist?(file, job_data)
345
- result = false
346
- make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
347
- result = conn.neptune_does_file_exist(file, job_data, <span class="ruby-ivar">@secret</span>)
348
- }
349
- return result
350
- end</pre>
351
- </div>
352
-
353
- </div>
354
-
355
-
356
-
357
-
358
- </div>
359
-
360
-
361
- <div id="get_acl-method" class="method-detail ">
362
- <a name="method-i-get_acl"></a>
363
-
364
-
365
- <div class="method-heading">
366
- <span class="method-name">get_acl</span><span
367
- class="method-args">(job_data)</span>
368
- <span class="method-click-advice">click to toggle source</span>
369
- </div>
370
-
371
-
372
- <div class="method-description">
373
-
374
- <p>Returns the ACL associated with the named piece of data stored in the
375
- underlying cloud platform. Right now, data can only be public or private,
376
- but future versions will add individual user support. Input, output, and
377
- exceptions mirror that of start_neptune_job.</p>
378
-
379
-
380
-
381
- <div class="method-source-code"
382
- id="get_acl-source">
383
- <pre>
384
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 151</span>
385
- def get_acl(job_data)
386
- result = <span class="ruby-string">&quot;&quot;</span>
387
- make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
388
- result = conn.neptune_get_acl(job_data, <span class="ruby-ivar">@secret</span>)
389
- }
390
- raise <span class="ruby-constant">AppControllerException</span>.new(result) if result =~ <span class="ruby-regexp">/Error:/</span>
391
- return result
392
- end</pre>
393
- </div>
394
-
395
- </div>
396
-
397
-
398
-
399
-
400
- </div>
401
-
402
-
403
- <div id="get_output-method" class="method-detail ">
404
- <a name="method-i-get_output"></a>
405
-
406
-
407
- <div class="method-heading">
408
- <span class="method-name">get_output</span><span
409
- class="method-args">(job_data)</span>
410
- <span class="method-click-advice">click to toggle source</span>
411
- </div>
412
-
413
-
414
- <div class="method-description">
415
-
416
- <p>Retrieves the output of a Neptune job, stored in an underlying database.
417
- Within AppScale, a special application runs, referred to as the Repository,
418
- which provides a key-value interface to Neptune job data. Data is stored as
419
- though it were on a file system, therefore output be of the usual form
420
- /folder/filename . Currently the contents of the file is returned as a
421
- string to the caller, but as this may be inefficient for non-trivial output
422
- jobs, the next version of Neptune will add an additional call to directly
423
- copy the output to a file on the local filesystem. See <a
424
- href="AppControllerClient.html#method-i-start_neptune_job">start_neptune_job</a>
425
- for conditions by which this method can raise AppControllerException.new as
426
- well as the input format used for job_data.</p>
427
-
428
-
429
-
430
- <div class="method-source-code"
431
- id="get_output-source">
432
- <pre>
433
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 136</span>
434
- def get_output(job_data)
435
- result = <span class="ruby-string">&quot;&quot;</span>
436
- make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
437
- result = conn.neptune_get_output(job_data, <span class="ruby-ivar">@secret</span>)
438
- }
439
- raise <span class="ruby-constant">AppControllerException</span>.new(result) if result =~ <span class="ruby-regexp">/Error:/</span>
440
- return result
441
- end</pre>
442
- </div>
443
-
444
- </div>
445
-
446
-
447
-
448
-
449
- </div>
450
-
451
-
452
- <div id="get_supported_babel_engines-method" class="method-detail ">
453
- <a name="method-i-get_supported_babel_engines"></a>
454
-
455
-
456
- <div class="method-heading">
457
- <span class="method-name">get_supported_babel_engines</span><span
458
- class="method-args">(job_data)</span>
459
- <span class="method-click-advice">click to toggle source</span>
460
- </div>
461
-
462
-
463
- <div class="method-description">
464
-
465
- <p>Asks the AppController for a list of all the Babel engines (each of which
466
- is a queue to store jobs and something that executes tasks) that are
467
- supported for the given credentials.</p>
468
-
469
-
470
-
471
- <div class="method-source-code"
472
- id="get_supported_babel_engines-source">
473
- <pre>
474
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 191</span>
475
- def get_supported_babel_engines(job_data)
476
- result = []
477
- make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
478
- result = conn.neptune_get_supported_babel_engines(job_data, <span class="ruby-ivar">@secret</span>)
479
- }
480
- return result
481
- end</pre>
482
- </div>
483
-
484
- </div>
485
-
486
-
487
-
488
-
489
- </div>
490
-
491
-
492
- <div id="make_call-method" class="method-detail ">
493
- <a name="method-i-make_call"></a>
494
-
495
-
496
- <div class="method-heading">
497
- <span class="method-name">make_call</span><span
498
- class="method-args">(time, retry_on_except)</span>
499
- <span class="method-click-advice">click to toggle source</span>
500
- </div>
501
-
502
-
503
- <div class="method-description">
504
-
505
- <p>A helper method to make SOAP calls for us. This method is mainly here to
506
- reduce code duplication: all SOAP calls expect a certain timeout and can
507
- tolerate certain exceptions, so we consolidate this code into this method.
508
- Here, the caller specifies the timeout for the SOAP call (or NO_TIMEOUT if
509
- an infinite timeout is required) as well as whether the call should be
510
- retried in the face of exceptions. Exceptions can occur if the machine is
511
- not yet running or is too busy to handle the request, so these exceptions
512
- are automatically retried regardless of the retry value. Typically callers
513
- set this to false to catch ‘Connection Refused’ exceptions or the like.
514
- Finally, the caller must provide a block of code that indicates the SOAP
515
- call to make: this is really all that differs between the calling methods.
516
- The result of the block is returned to the caller.</p>
517
-
518
-
519
-
520
- <div class="method-source-code"
521
- id="make_call-source">
522
- <pre>
523
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 70</span>
524
- def make_call(time, retry_on_except)
525
- begin
526
- <span class="ruby-constant">Timeout</span>::timeout(time) {
527
- yield if block_given?
528
- }
529
- rescue <span class="ruby-constant">Errno</span>::<span class="ruby-constant">ECONNREFUSED</span>
530
- if retry_on_except
531
- retry
532
- else
533
- raise <span class="ruby-constant">AppControllerException</span>.new(<span class="ruby-string">&quot;Connection was refused. Is the AppController running?&quot;</span>)
534
- end
535
- rescue <span class="ruby-constant">OpenSSL</span>::<span class="ruby-constant">SSL</span>::<span class="ruby-constant">SSLError</span>, <span class="ruby-constant">NotImplementedError</span>, <span class="ruby-constant">Timeout</span>::<span class="ruby-constant">Error</span>
536
- retry
537
- rescue <span class="ruby-constant">Exception</span> =&gt; except
538
- if retry_on_except
539
- retry
540
- else
541
- raise <span class="ruby-constant">AppControllerException</span>.new(&quot;We saw an unexpected error of the type #{except.class} with the following message:\n#{except}.&quot;)
542
- end
543
- end
544
- end</pre>
545
- </div>
546
-
547
- </div>
548
-
549
-
550
-
551
-
552
- </div>
553
-
554
-
555
- <div id="put_input-method" class="method-detail ">
556
- <a name="method-i-put_input"></a>
557
-
558
-
559
- <div class="method-heading">
560
- <span class="method-name">put_input</span><span
561
- class="method-args">(job_data)</span>
562
- <span class="method-click-advice">click to toggle source</span>
563
- </div>
564
-
565
-
566
- <div class="method-description">
567
-
568
- <p>Stores a file stored on the user’s local file system in the underlying
569
- database. The user can specify to use either the underlying database that
570
- AppScale is using, or alternative storage mechanisms (as of writing, Google
571
- Storage, Amazon S3, and Eucalyptus Walrus are supported) via the storage
572
- parameter.</p>
573
-
574
-
575
-
576
- <div class="method-source-code"
577
- id="put_input-source">
578
- <pre>
579
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 116</span>
580
- def put_input(job_data)
581
- result = <span class="ruby-string">&quot;&quot;</span>
582
- make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
583
- result = conn.neptune_put_input(job_data, <span class="ruby-ivar">@secret</span>)
584
- }
585
- raise <span class="ruby-constant">AppControllerException</span>.new(result) if result =~ <span class="ruby-regexp">/Error:/</span>
586
- return result
587
- end</pre>
588
- </div>
589
-
590
- </div>
591
-
592
-
593
-
594
-
595
- </div>
596
-
597
-
598
- <div id="set_acl-method" class="method-detail ">
599
- <a name="method-i-set_acl"></a>
600
-
601
-
602
- <div class="method-heading">
603
- <span class="method-name">set_acl</span><span
604
- class="method-args">(job_data)</span>
605
- <span class="method-click-advice">click to toggle source</span>
606
- </div>
607
-
608
-
609
- <div class="method-description">
610
-
611
- <p>Sets the ACL of a specified pieces of data stored in the underlying cloud
612
- platform. As is the case with <a
613
- href="AppControllerClient.html#method-i-get_acl">get_acl</a>, ACLs can be
614
- either public or private right now, but this will be expanded upon in the
615
- future. As with the other SOAP calls, input, output, and exceptions mirror
616
- that of start_neptune_job.</p>
617
-
618
-
619
-
620
- <div class="method-source-code"
621
- id="set_acl-source">
622
- <pre>
623
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 166</span>
624
- def set_acl(job_data)
625
- result = <span class="ruby-string">&quot;&quot;</span>
626
- make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
627
- result = conn.neptune_set_acl(job_data, <span class="ruby-ivar">@secret</span>)
628
- }
629
- raise <span class="ruby-constant">AppControllerException</span>.new(result) if result =~ <span class="ruby-regexp">/Error:/</span>
630
- return result
631
- end</pre>
632
- </div>
633
-
634
- </div>
635
-
636
-
637
-
638
-
639
- </div>
640
-
641
-
642
- <div id="start_neptune_job-method" class="method-detail ">
643
- <a name="method-i-start_neptune_job"></a>
644
-
645
-
646
- <div class="method-heading">
647
- <span class="method-name">start_neptune_job</span><span
648
- class="method-args">(job_data)</span>
649
- <span class="method-click-advice">click to toggle source</span>
650
- </div>
651
-
652
-
653
- <div class="method-description">
654
-
655
- <p>Initiates the start of a Neptune job, whether it be a HPC job (MPI, X10, or
656
- MapReduce), or a scaling job (e.g., for AppScale itself). This method
657
- should not be used for retrieving the output of a job or getting / setting
658
- output ACLs, but just for starting new HPC / scaling jobs. This method
659
- takes a hash containing the parameters of the job to run, and can raise
660
- AppControllerException.new if the AppController it calls returns an error
661
- (e.g., if a bad secret is used or the machine isn’t running). Otherwise,
662
- the return value of this method is the result returned from the
663
- AppController.</p>
664
-
665
-
666
-
667
- <div class="method-source-code"
668
- id="start_neptune_job-source">
669
- <pre>
670
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 101</span>
671
- def start_neptune_job(job_data)
672
- result = <span class="ruby-string">&quot;&quot;</span>
673
- make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
674
- result = conn.neptune_start_job(job_data, <span class="ruby-ivar">@secret</span>)
675
- }
676
- raise <span class="ruby-constant">AppControllerException</span>.new(result) if result =~ <span class="ruby-regexp">/Error:/</span>
677
- return result
678
- end</pre>
679
- </div>
680
-
681
- </div>
682
-
683
-
684
-
685
-
686
- </div>
687
-
688
-
689
- </div>
690
-
691
-
692
- </div>
693
-
694
- <div id="validator-badges">
695
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
696
- <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
697
- Rdoc Generator</a> 2</small>.</p>
698
- </div>
699
-
700
- </body>
701
- </html>
702
-