neptune 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -21,10 +21,15 @@ it also can be used to deploy other types of software. For example,
21
21
  Neptune has support for user-specified scaling of the underlying
22
22
  cloud platform: users can write Neptune jobs that manually add
23
23
  load balancers, application servers, or database servers to a running
24
- AppScale deployment.
24
+ AppScale deployment. Additionally, as of version 0.0.2, remote
25
+ compiling can also be performed: just give Neptune the path to
26
+ the directory you want to compile and be sure to include a Makefile
27
+ in it! Neptune will run 'make' on it (you can specify which target
28
+ to make as well) and return to you a folder containing the standard
29
+ out and standard error of the make command.
25
30
 
26
31
  Sample Neptune job scripts can be found in samples. Test scripts will
27
- be added to test in the next release.
32
+ be added to the 'test' folder soon.
28
33
 
29
34
  Developed by Chris Bunch as part of the AppScale project.
30
35
  See LICENSE for the specifics of the New BSD License
@@ -46,5 +51,13 @@ will likely appear in a future release as well.
46
51
  An academic paper describing Neptune is in the works - check
47
52
  in for a link to that as it becomes available.
48
53
 
54
+ Version History:
55
+
56
+ February 4, 2011 - 0.0.2 released, adding support for remote
57
+ compiling
58
+
59
+ January 27, 2011 - 0.0.1 released, with initial support for
60
+ MPI, X10, and MapReduce.
61
+
49
62
  =end
50
63
 
@@ -71,6 +71,8 @@
71
71
 
72
72
  <li><a href="#method-c-new">::new</a></li>
73
73
 
74
+ <li><a href="#method-i-compile_code">#compile_code</a></li>
75
+
74
76
  <li><a href="#method-i-get_acl">#get_acl</a></li>
75
77
 
76
78
  <li><a href="#method-i-get_output">#get_output</a></li>
@@ -149,6 +151,57 @@ AppScale Tools, but with non-Neptune SOAP calls removed.</p>
149
151
 
150
152
  <!-- Attributes -->
151
153
 
154
+ <div id="attribute-method-details" class="method-section section">
155
+ <h3 class="section-header">Attributes</h3>
156
+
157
+
158
+ <div id="conn-attribute-method" class="method-detail">
159
+ <a name="conn"></a>
160
+
161
+ <div class="method-heading attribute-method-heading">
162
+ <span class="method-name">conn</span><span
163
+ class="attribute-access-type">[R]</span>
164
+ </div>
165
+
166
+ <div class="method-description">
167
+
168
+
169
+
170
+ </div>
171
+ </div>
172
+
173
+ <div id="ip-attribute-method" class="method-detail">
174
+ <a name="ip"></a>
175
+
176
+ <div class="method-heading attribute-method-heading">
177
+ <span class="method-name">ip</span><span
178
+ class="attribute-access-type">[R]</span>
179
+ </div>
180
+
181
+ <div class="method-description">
182
+
183
+
184
+
185
+ </div>
186
+ </div>
187
+
188
+ <div id="secret-attribute-method" class="method-detail">
189
+ <a name="secret"></a>
190
+
191
+ <div class="method-heading attribute-method-heading">
192
+ <span class="method-name">secret</span><span
193
+ class="attribute-access-type">[R]</span>
194
+ </div>
195
+
196
+ <div class="method-description">
197
+
198
+
199
+
200
+ </div>
201
+ </div>
202
+
203
+ </div>
204
+
152
205
 
153
206
  <!-- Methods -->
154
207
 
@@ -191,6 +244,7 @@ def initialize(ip, secret)
191
244
  <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>)
192
245
  <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>)
193
246
  <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>)
247
+ <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>)
194
248
  end</pre>
195
249
  </div>
196
250
 
@@ -208,6 +262,45 @@ end</pre>
208
262
  <h3 class="section-header">Public Instance Methods</h3>
209
263
 
210
264
 
265
+ <div id="compile_code-method" class="method-detail ">
266
+ <a name="method-i-compile_code"></a>
267
+
268
+
269
+ <div class="method-heading">
270
+ <span class="method-name">compile_code</span><span
271
+ class="method-args">(job_data)</span>
272
+ <span class="method-click-advice">click to toggle source</span>
273
+ </div>
274
+
275
+
276
+ <div class="method-description">
277
+
278
+
279
+
280
+
281
+
282
+ <div class="method-source-code"
283
+ id="compile_code-source">
284
+ <pre>
285
+ <span class="ruby-comment"># File lib/app_controller_client.rb, line 137</span>
286
+ def compile_code(job_data)
287
+ result = <span class="ruby-string">&quot;&quot;</span>
288
+ make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
289
+ result = conn.neptune_compile_code(job_data, <span class="ruby-ivar">@secret</span>)
290
+ }
291
+ abort(result) if result =~ <span class="ruby-regexp">/Error:/</span>
292
+ return result
293
+ end</pre>
294
+ </div>
295
+
296
+ </div>
297
+
298
+
299
+
300
+
301
+ </div>
302
+
303
+
211
304
  <div id="get_acl-method" class="method-detail ">
212
305
  <a name="method-i-get_acl"></a>
213
306
 
@@ -231,7 +324,7 @@ exceptions mirror that of start_neptune_job.</p>
231
324
  <div class="method-source-code"
232
325
  id="get_acl-source">
233
326
  <pre>
234
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 113</span>
327
+ <span class="ruby-comment"># File lib/app_controller_client.rb, line 114</span>
235
328
  def get_acl(job_data)
236
329
  result = <span class="ruby-string">&quot;&quot;</span>
237
330
  make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
@@ -280,7 +373,7 @@ used for job_data.</p>
280
373
  <div class="method-source-code"
281
374
  id="get_output-source">
282
375
  <pre>
283
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 99</span>
376
+ <span class="ruby-comment"># File lib/app_controller_client.rb, line 100</span>
284
377
  def get_output(job_data)
285
378
  result = <span class="ruby-string">&quot;&quot;</span>
286
379
  make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
@@ -330,7 +423,7 @@ The result of the block is returned to the caller.</p>
330
423
  <div class="method-source-code"
331
424
  id="make_call-source">
332
425
  <pre>
333
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 50</span>
426
+ <span class="ruby-comment"># File lib/app_controller_client.rb, line 51</span>
334
427
  def make_call(time, retry_on_except)
335
428
  begin
336
429
  <span class="ruby-constant">Timeout</span>::timeout(time) {
@@ -387,7 +480,7 @@ that of start_neptune_job.</p>
387
480
  <div class="method-source-code"
388
481
  id="set_acl-source">
389
482
  <pre>
390
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 127</span>
483
+ <span class="ruby-comment"># File lib/app_controller_client.rb, line 128</span>
391
484
  def set_acl(job_data)
392
485
  result = <span class="ruby-string">&quot;&quot;</span>
393
486
  make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
@@ -433,7 +526,7 @@ is the result returned from the AppController.</p>
433
526
  <div class="method-source-code"
434
527
  id="start_neptune_job-source">
435
528
  <pre>
436
- <span class="ruby-comment"># File lib/app_controller_client.rb, line 80</span>
529
+ <span class="ruby-comment"># File lib/app_controller_client.rb, line 81</span>
437
530
  def start_neptune_job(job_data)
438
531
  result = <span class="ruby-string">&quot;&quot;</span>
439
532
  make_call(<span class="ruby-constant">NO_TIMEOUT</span>, false) {
data/doc/Object.html CHANGED
@@ -76,6 +76,8 @@
76
76
 
77
77
  <li><a href="#method-i-job">#job</a></li>
78
78
 
79
+ <li><a href="#method-i-preprocess_compile">#preprocess_compile</a></li>
80
+
79
81
  <li><a href="#method-i-preprocess_mapreduce">#preprocess_mapreduce</a></li>
80
82
 
81
83
  <li><a href="#method-i-preprocess_mpi">#preprocess_mpi</a></li>
@@ -244,17 +246,13 @@ vice-versa).</p>
244
246
  <div class="method-source-code"
245
247
  id="job-source">
246
248
  <pre>
247
- <span class="ruby-comment"># File lib/job.rb, line 101</span>
249
+ <span class="ruby-comment"># File lib/job.rb, line 119</span>
248
250
  def job(name, &amp;block)
249
251
  puts <span class="ruby-string">&quot;Received a request to run a job.&quot;</span>
250
252
  puts name
251
253
  block.call()
252
254
 
253
- if <span class="ruby-ivar">@keyname</span>.nil?
254
- keyname = <span class="ruby-string">&quot;appscale&quot;</span>
255
- else
256
- keyname = <span class="ruby-ivar">@keyname</span>
257
- end
255
+ keyname = <span class="ruby-ivar">@keyname</span> || <span class="ruby-string">&quot;appscale&quot;</span>
258
256
 
259
257
  shadow_ip = <span class="ruby-constant">CommonFunctions</span>.get_from_yaml(keyname, :shadow)
260
258
  secret = <span class="ruby-constant">CommonFunctions</span>.get_secret_key(keyname)
@@ -270,7 +268,7 @@ def job(name, &amp;block)
270
268
  job_data[<span class="ruby-string">&quot;@type&quot;</span>] = name
271
269
  job_data[<span class="ruby-string">&quot;@keyname&quot;</span>] = keyname
272
270
 
273
- if job_data[<span class="ruby-string">&quot;@output&quot;</span>].nil? or job_data[<span class="ruby-string">&quot;@output&quot;</span>] == <span class="ruby-string">&quot;&quot;</span>
271
+ if (job_data[<span class="ruby-string">&quot;@output&quot;</span>].nil? or job_data[<span class="ruby-string">&quot;@output&quot;</span>] == <span class="ruby-string">&quot;&quot;</span>)
274
272
  abort(<span class="ruby-string">&quot;Job output must be specified&quot;</span>)
275
273
  end
276
274
 
@@ -288,14 +286,38 @@ def job(name, &amp;block)
288
286
 
289
287
  do_preprocessing(job_data)
290
288
 
291
- if job_data[<span class="ruby-string">&quot;@type&quot;</span>] == <span class="ruby-string">&quot;output&quot;</span>
289
+ type = job_data[<span class="ruby-string">&quot;@type&quot;</span>]
290
+ if type == <span class="ruby-string">&quot;output&quot;</span>
292
291
  return controller.get_output(job_data)
293
- elsif job_data[<span class="ruby-string">&quot;@type&quot;</span>] == <span class="ruby-string">&quot;get-acl&quot;</span>
292
+ elsif type == <span class="ruby-string">&quot;get-acl&quot;</span>
294
293
  job_data[<span class="ruby-string">&quot;@type&quot;</span>] = <span class="ruby-string">&quot;acl&quot;</span>
295
294
  return controller.get_acl(job_data)
296
- elsif job_data[<span class="ruby-string">&quot;@type&quot;</span>] == <span class="ruby-string">&quot;set-acl&quot;</span>
295
+ elsif type == <span class="ruby-string">&quot;set-acl&quot;</span>
297
296
  job_data[<span class="ruby-string">&quot;@type&quot;</span>] = <span class="ruby-string">&quot;acl&quot;</span>
298
297
  return controller.set_acl(job_data)
298
+ elsif type == <span class="ruby-string">&quot;compile&quot;</span>
299
+ compiled_location = controller.compile_code(job_data)
300
+
301
+ ssh_args = &quot;-i ~/.appscale/#{keyname}.key -o StrictHostkeyChecking=no 2&gt;&amp;1 root@#{shadow_ip}&quot;
302
+ copy_to = job_data[<span class="ruby-string">&quot;@copy_to&quot;</span>]
303
+
304
+ loop {
305
+ ssh_command = &quot;ssh #{ssh_args} 'ls #{compiled_location}'&quot;
306
+ puts ssh_command
307
+ result = `#{ssh_command}`
308
+ puts &quot;result was [#{result}]&quot;
309
+ if result =~ <span class="ruby-regexp">/No such file or directory/</span>
310
+ puts <span class="ruby-string">&quot;Still waiting for code to be compiled...&quot;</span>
311
+ else
312
+ puts &quot;compilation complete! Copying compiled code to #{copy_to}&quot;
313
+ break
314
+ end
315
+ sleep(5)
316
+ }
317
+
318
+ scp_command = &quot;scp #{ssh_args}:#{compiled_location} #{copy_to}&quot;
319
+ puts scp_command
320
+ `#{scp_command}`
299
321
  else
300
322
  result = controller.start_neptune_job(job_data)
301
323
  if result =~ <span class="ruby-regexp">/job is now running\Z/</span>
@@ -312,6 +334,53 @@ end</pre>
312
334
 
313
335
 
314
336
 
337
+ </div>
338
+
339
+
340
+ <div id="preprocess_compile-method" class="method-detail ">
341
+ <a name="method-i-preprocess_compile"></a>
342
+
343
+
344
+ <div class="method-heading">
345
+ <span class="method-name">preprocess_compile</span><span
346
+ class="method-args">(job_data)</span>
347
+ <span class="method-click-advice">click to toggle source</span>
348
+ </div>
349
+
350
+
351
+ <div class="method-description">
352
+
353
+ <p>This preprocessing method copies over the user’s code to the Shadow node
354
+ so that it can be compiled there. A future version of this method may also
355
+ copy over libraries as well.</p>
356
+
357
+
358
+
359
+ <div class="method-source-code"
360
+ id="preprocess_compile-source">
361
+ <pre>
362
+ <span class="ruby-comment"># File lib/job.rb, line 45</span>
363
+ def preprocess_compile(job_data)
364
+ code = <span class="ruby-constant">File</span>.expand_path(job_data[<span class="ruby-string">&quot;@code&quot;</span>])
365
+ unless <span class="ruby-constant">File</span>.exists?(code)
366
+ abort(&quot;The source file #{code} does not exist.&quot;)
367
+ end
368
+
369
+ suffix = code.split(<span class="ruby-string">'/'</span>)[-1]
370
+ dest = &quot;/tmp/#{suffix}&quot;
371
+
372
+ keyname = job_data[<span class="ruby-string">&quot;@keyname&quot;</span>]
373
+ <span class="ruby-constant">CommonFunctions</span>.scp_to_shadow(code, dest, keyname)
374
+
375
+ job_data[<span class="ruby-string">&quot;@code&quot;</span>] = dest
376
+ end</pre>
377
+ </div>
378
+
379
+ </div>
380
+
381
+
382
+
383
+
315
384
  </div>
316
385
 
317
386
 
@@ -340,7 +409,7 @@ will copy it into HDFS for us.</p>
340
409
  <div class="method-source-code"
341
410
  id="preprocess_mapreduce-source">
342
411
  <pre>
343
- <span class="ruby-comment"># File lib/job.rb, line 65</span>
412
+ <span class="ruby-comment"># File lib/job.rb, line 67</span>
344
413
  def preprocess_mapreduce(job_data)
345
414
  items_to_copy = [<span class="ruby-string">&quot;@map&quot;</span>, <span class="ruby-string">&quot;@reduce&quot;</span>] if job_data[<span class="ruby-string">&quot;@map&quot;</span>] and job_data[<span class="ruby-string">&quot;@reduce&quot;</span>]
346
415
  items_to_copy = [<span class="ruby-string">&quot;@mapreducejar&quot;</span>] if job_data[<span class="ruby-string">&quot;@mapreducejar&quot;</span>]
@@ -392,7 +461,7 @@ job.</p>
392
461
  <div class="method-source-code"
393
462
  id="preprocess_mpi-source">
394
463
  <pre>
395
- <span class="ruby-comment"># File lib/job.rb, line 45</span>
464
+ <span class="ruby-comment"># File lib/job.rb, line 90</span>
396
465
  def preprocess_mpi(job_data)
397
466
  source_code = <span class="ruby-constant">File</span>.expand_path(job_data[<span class="ruby-string">&quot;@code&quot;</span>])
398
467
  unless <span class="ruby-constant">File</span>.exists?(source_code)
data/doc/README.html CHANGED
@@ -116,11 +116,18 @@ which Neptune is released.</p>
116
116
 
117
117
  <p>Contributors welcome! We would love to add support for other cloud
118
118
  platforms and test out Neptune more on non-virtualized deployments, as well
119
- as adding capabilities for other types of computation.</p>
119
+ as adding capabilities for other types of computation. We would also like
120
+ to refactor Neptune to use symbols instead of instance variables for
121
+ running jobs: this will likely appear in a future release as well.</p>
120
122
 
121
123
  <p>An academic paper describing Neptune is in the works - check in for a link
122
124
  to that as it becomes available.</p>
123
125
 
126
+ <p>Version History:</p>
127
+
128
+ <p>January 27, 20111 - 0.0.1 released, with initial support for MPI, X10, and
129
+ MapReduce.</p>
130
+
124
131
  <h1>end</h1>
125
132
 
126
133
  </div>
data/doc/bin/neptune.html CHANGED
@@ -24,7 +24,7 @@
24
24
  <div id="metadata">
25
25
  <dl>
26
26
  <dt class="modified-date">Last Modified</dt>
27
- <dd class="modified-date">Thu Jan 27 03:28:28 -0800 2011</dd>
27
+ <dd class="modified-date">Thu Jan 27 22:04:31 -0800 2011</dd>
28
28
 
29
29
 
30
30
  <dt class="requires">Requires</dt>
data/doc/created.rid CHANGED
@@ -1,7 +1,7 @@
1
- Thu, 27 Jan 2011 13:44:54 -0800
1
+ Tue, 01 Feb 2011 12:02:35 -0800
2
2
  ./lib/common_functions.rb Thu, 27 Jan 2011 12:52:03 -0800
3
3
  ./LICENSE Thu, 27 Jan 2011 13:24:30 -0800
4
- ./lib/job.rb Thu, 27 Jan 2011 13:28:13 -0800
5
- ./lib/app_controller_client.rb Thu, 27 Jan 2011 13:22:15 -0800
6
- ./README Thu, 27 Jan 2011 13:44:46 -0800
7
- ./bin/neptune Thu, 27 Jan 2011 03:28:28 -0800
4
+ ./lib/job.rb Mon, 31 Jan 2011 19:32:41 -0800
5
+ ./lib/app_controller_client.rb Mon, 31 Jan 2011 17:47:55 -0800
6
+ ./README Mon, 31 Jan 2011 19:32:13 -0800
7
+ ./bin/neptune Thu, 27 Jan 2011 22:04:31 -0800
data/doc/index.html CHANGED
@@ -61,6 +61,8 @@
61
61
 
62
62
  <li><a href="CommonFunctions.html#method-c-scp_to_shadow">::scp_to_shadow &mdash; CommonFunctions</a></li>
63
63
 
64
+ <li><a href="AppControllerClient.html#method-i-compile_code">#compile_code &mdash; AppControllerClient</a></li>
65
+
64
66
  <li><a href="Object.html#method-i-do_preprocessing">#do_preprocessing &mdash; Object</a></li>
65
67
 
66
68
  <li><a href="AppControllerClient.html#method-i-get_acl">#get_acl &mdash; AppControllerClient</a></li>
@@ -71,6 +73,8 @@
71
73
 
72
74
  <li><a href="AppControllerClient.html#method-i-make_call">#make_call &mdash; AppControllerClient</a></li>
73
75
 
76
+ <li><a href="Object.html#method-i-preprocess_compile">#preprocess_compile &mdash; Object</a></li>
77
+
74
78
  <li><a href="Object.html#method-i-preprocess_mapreduce">#preprocess_mapreduce &mdash; Object</a></li>
75
79
 
76
80
  <li><a href="Object.html#method-i-preprocess_mpi">#preprocess_mpi &mdash; Object</a></li>
@@ -24,7 +24,7 @@
24
24
  <div id="metadata">
25
25
  <dl>
26
26
  <dt class="modified-date">Last Modified</dt>
27
- <dd class="modified-date">Thu Jan 27 13:22:15 -0800 2011</dd>
27
+ <dd class="modified-date">Mon Jan 31 17:47:55 -0800 2011</dd>
28
28
 
29
29
 
30
30
  <dt class="requires">Requires</dt>
data/doc/lib/job_rb.html CHANGED
@@ -24,7 +24,7 @@
24
24
  <div id="metadata">
25
25
  <dl>
26
26
  <dt class="modified-date">Last Modified</dt>
27
- <dd class="modified-date">Thu Jan 27 13:28:13 -0800 2011</dd>
27
+ <dd class="modified-date">Mon Jan 31 19:32:41 -0800 2011</dd>
28
28
 
29
29
 
30
30
  <dt class="requires">Requires</dt>
@@ -32,6 +32,7 @@ class AppControllerClient
32
32
  @conn.add_method("neptune_get_output", "job_data", "secret")
33
33
  @conn.add_method("neptune_get_acl", "job_data", "secret")
34
34
  @conn.add_method("neptune_set_acl", "job_data", "secret")
35
+ @conn.add_method("neptune_compile_code", "job_data", "secret")
35
36
  end
36
37
 
37
38
  # A helper method to make SOAP calls for us. This method is mainly here to
@@ -132,4 +133,13 @@ class AppControllerClient
132
133
  abort(result) if result =~ /Error:/
133
134
  return result
134
135
  end
136
+
137
+ def compile_code(job_data)
138
+ result = ""
139
+ make_call(NO_TIMEOUT, false) {
140
+ result = conn.neptune_compile_code(job_data, @secret)
141
+ }
142
+ abort(result) if result =~ /Error:/
143
+ return result
144
+ end
135
145
  end
@@ -22,31 +22,35 @@ module CommonFunctions
22
22
  # placed, and the name of the key to use. The keyname is typically
23
23
  # specified by the Neptune job given, but defaults to ''appscale''
24
24
  # if not provided.
25
- def self.scp_to_shadow(local_file_loc, remote_file_loc, keyname)
25
+ def self.scp_to_shadow(local_file_loc, remote_file_loc, keyname, is_dir=false)
26
26
  shadow_ip = CommonFunctions.get_from_yaml(keyname, :shadow)
27
27
  ssh_key = File.expand_path("~/.appscale/#{keyname}.key")
28
28
 
29
- self.scp_file(local_file_loc, remote_file_loc, shadow_ip, ssh_key)
29
+ self.scp_file(local_file_loc, remote_file_loc, shadow_ip, ssh_key, is_dir)
30
30
  end
31
31
 
32
32
  # Performs the actual remote copying of files: given the IP address
33
33
  # and other information from scp_to_shadow, attempts to use scp
34
34
  # to copy the file over. Aborts if the scp fails, which can occur
35
35
  # if the network is down, if a bad keyname is provided, or if the
36
- # wrong IP is given.
37
- def self.scp_file(local_file_loc, remote_file_loc, target_ip, public_key_loc)
36
+ # wrong IP is given. If the user specifies that the file to copy is
37
+ # actually a directory, we append the -r flag to scp as well.
38
+ def self.scp_file(local_file_loc, remote_file_loc, target_ip, public_key_loc, is_dir=false)
38
39
  cmd = ""
39
40
  local_file_loc = File.expand_path(local_file_loc)
40
-
41
+
42
+ ssh_args = "-o StrictHostkeyChecking=no 2>&1"
43
+ ssh_args << " -r " if is_dir
44
+
41
45
  if public_key_loc.class == Array
42
46
  public_key_loc.each { |key|
43
47
  key = File.expand_path(key)
44
48
  }
45
49
 
46
- cmd = "scp -i #{public_key_loc.join(' -i ')} -o StrictHostkeyChecking=no 2>&1 #{local_file_loc} root@#{target_ip}:#{remote_file_loc}"
50
+ cmd = "scp -i #{public_key_loc.join(' -i ')} #{ssh_args} #{local_file_loc} root@#{target_ip}:#{remote_file_loc}"
47
51
  else
48
52
  public_key_loc = File.expand_path(public_key_loc)
49
- cmd = "scp -i #{public_key_loc} -o StrictHostkeyChecking=no 2>&1 #{local_file_loc} root@#{target_ip}:#{remote_file_loc}"
53
+ cmd = "scp -i #{public_key_loc} #{ssh_args} #{local_file_loc} root@#{target_ip}:#{remote_file_loc}"
50
54
  end
51
55
 
52
56
  cmd << "; echo $? >> ~/.appscale/retval"
data/lib/job.rb CHANGED
@@ -18,7 +18,7 @@ $VERBOSE = nil
18
18
 
19
19
  # A list of jobs that require some kind of work to be done before
20
20
  # the actual computation can be performed.
21
- NEED_PREPROCESSING = %w{ mpi mapreduce }
21
+ NEED_PREPROCESSING = ["compile", "mapreduce", "mpi"]
22
22
 
23
23
  # A set of methods and constants that we've monkey-patched to enable Neptune
24
24
  # support. In the future, it is likely that the only exposed / monkey-patched
@@ -39,20 +39,28 @@ def do_preprocessing(job_data)
39
39
  send(preprocess, job_data)
40
40
  end
41
41
 
42
- # This preprocessing method copies over the user's MPI
43
- # code to the master node in AppScale - this node will
44
- # then copy it to whoever will run the MPI job.
45
- def preprocess_mpi(job_data)
46
- source_code = File.expand_path(job_data["@code"])
47
- unless File.exists?(source_code)
48
- file_not_found = "The specified code, #{job_data['@code']}," +
49
- " didn't exist. Please specify one that exists and try again"
50
- abort(file_not_found)
42
+ # This preprocessing method copies over the user's code to the
43
+ # Shadow node so that it can be compiled there. A future version
44
+ # of this method may also copy over libraries as well.
45
+ def preprocess_compile(job_data)
46
+ code = File.expand_path(job_data["@code"])
47
+ unless File.exists?(code)
48
+ abort("The source file #{code} does not exist.")
51
49
  end
52
- dest_code = "/tmp/thempicode"
53
50
 
51
+ suffix = code.split('/')[-1]
52
+ dest = "/tmp/#{suffix}"
54
53
  keyname = job_data["@keyname"]
55
- CommonFunctions.scp_to_shadow(source_code, dest_code, keyname)
54
+ shadow_ip = CommonFunctions.get_from_yaml(keyname, :shadow)
55
+
56
+ ssh_args = "-i ~/.appscale/#{keyname}.key -o StrictHostkeyChecking=no 2>&1 root@#{shadow_ip}"
57
+ remove_dir = "ssh #{ssh_args} 'rm -rf #{dest}'"
58
+ #puts remove_dir
59
+ `#{remove_dir}`
60
+
61
+ CommonFunctions.scp_to_shadow(code, dest, keyname, is_dir=true)
62
+
63
+ job_data["@code"] = dest
56
64
  end
57
65
 
58
66
  # This preprocessing method handles copying data for regular
@@ -82,6 +90,22 @@ def preprocess_mapreduce(job_data)
82
90
  }
83
91
  end
84
92
 
93
+ # This preprocessing method copies over the user's MPI
94
+ # code to the master node in AppScale - this node will
95
+ # then copy it to whoever will run the MPI job.
96
+ def preprocess_mpi(job_data)
97
+ source_code = File.expand_path(job_data["@code"])
98
+ unless File.exists?(source_code)
99
+ file_not_found = "The specified code, #{job_data['@code']}," +
100
+ " didn't exist. Please specify one that exists and try again"
101
+ abort(file_not_found)
102
+ end
103
+ dest_code = "/tmp/thempicode"
104
+
105
+ keyname = job_data["@keyname"]
106
+ CommonFunctions.scp_to_shadow(source_code, dest_code, keyname)
107
+ end
108
+
85
109
  # TODO: actually use me!
86
110
  #def validate_args(list)
87
111
  # list.each do |item|
@@ -103,11 +127,7 @@ def job(name, &block)
103
127
  puts name
104
128
  block.call()
105
129
 
106
- if @keyname.nil?
107
- keyname = "appscale"
108
- else
109
- keyname = @keyname
110
- end
130
+ keyname = @keyname || "appscale"
111
131
 
112
132
  shadow_ip = CommonFunctions.get_from_yaml(keyname, :shadow)
113
133
  secret = CommonFunctions.get_secret_key(keyname)
@@ -123,7 +143,7 @@ def job(name, &block)
123
143
  job_data["@type"] = name
124
144
  job_data["@keyname"] = keyname
125
145
 
126
- if job_data["@output"].nil? or job_data["@output"] == ""
146
+ if (job_data["@output"].nil? or job_data["@output"] == "")
127
147
  abort("Job output must be specified")
128
148
  end
129
149
 
@@ -141,14 +161,46 @@ def job(name, &block)
141
161
 
142
162
  do_preprocessing(job_data)
143
163
 
144
- if job_data["@type"] == "output"
164
+ type = job_data["@type"]
165
+ if type == "output"
145
166
  return controller.get_output(job_data)
146
- elsif job_data["@type"] == "get-acl"
167
+ elsif type == "get-acl"
147
168
  job_data["@type"] = "acl"
148
169
  return controller.get_acl(job_data)
149
- elsif job_data["@type"] == "set-acl"
170
+ elsif type == "set-acl"
150
171
  job_data["@type"] = "acl"
151
172
  return controller.set_acl(job_data)
173
+ elsif type == "compile"
174
+ compiled_location = controller.compile_code(job_data)
175
+
176
+ ssh_args = "-i ~/.appscale/#{keyname}.key -o StrictHostkeyChecking=no 2>&1 root@#{shadow_ip}"
177
+ copy_to = job_data["@copy_to"]
178
+
179
+ loop {
180
+ ssh_command = "ssh #{ssh_args} 'ls #{compiled_location}'"
181
+ #puts ssh_command
182
+ result = `#{ssh_command}`
183
+ #puts "result was [#{result}]"
184
+ if result =~ /No such file or directory/
185
+ puts "Still waiting for code to be compiled..."
186
+ else
187
+ puts "compilation complete! Copying compiled code to #{copy_to}"
188
+ break
189
+ end
190
+ sleep(5)
191
+ }
192
+
193
+ rm_local = "rm -rf #{copy_to}"
194
+ #puts rm_local
195
+ `#{rm_local}`
196
+
197
+ scp_command = "scp -r #{ssh_args}:#{compiled_location} #{copy_to}"
198
+ #puts scp_command
199
+ `#{scp_command}`
200
+
201
+ out = File.open("#{copy_to}/compile_out") { |f| f.read.chomp! }
202
+ err = File.open("#{copy_to}/compile_err") { |f| f.read.chomp! }
203
+ return {:out => out, :err => err }
152
204
  else
153
205
  result = controller.start_neptune_job(job_data)
154
206
  if result =~ /job is now running\Z/
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: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Bunch
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-27 00:00:00 -08:00
18
+ date: 2011-02-04 00:00:00 -08:00
19
19
  default_executable: neptune
20
20
  dependencies: []
21
21