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.
- data/README +4 -0
- data/doc/BabelHelper.html +393 -376
- data/doc/BadConfigurationException.html +121 -127
- data/doc/CommonFunctions.html +237 -265
- data/doc/ExodusHelper.html +820 -0
- data/doc/ExodusTaskInfo.html +263 -0
- data/doc/FileNotFoundException.html +121 -127
- data/doc/NeptuneHelper.html +527 -592
- data/doc/NeptuneManagerClient.html +696 -0
- data/doc/NeptuneManagerException.html +139 -0
- data/doc/Object.html +334 -236
- data/doc/TaskInfo.html +428 -0
- data/doc/created.rid +8 -5
- data/doc/images/add.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/index.html +74 -142
- data/doc/js/darkfish.js +99 -62
- data/doc/js/jquery.js +15 -29
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/table_of_contents.html +226 -0
- data/lib/babel.rb +116 -50
- data/lib/custom_exceptions.rb +2 -2
- data/lib/exodus.rb +311 -0
- data/lib/exodus_task_info.rb +36 -0
- data/lib/neptune.rb +52 -18
- data/lib/{app_controller_client.rb → neptune_manager_client.rb} +54 -38
- data/lib/task_info.rb +155 -0
- data/test/{unit/test_babel.rb → test_babel.rb} +161 -26
- data/test/{unit/test_common_functions.rb → test_common_functions.rb} +1 -1
- data/test/test_exodus.rb +687 -0
- data/test/{unit/test_neptune.rb → test_neptune.rb} +28 -17
- data/test/{unit/test_app_controller_client.rb → test_neptune_manager_client.rb} +15 -16
- data/test/test_task_info.rb +32 -0
- data/test/{unit/ts_all.rb → ts_all.rb} +3 -1
- metadata +30 -34
- data/doc/AppControllerClient.html +0 -702
- data/doc/AppControllerException.html +0 -145
- data/doc/bin/neptune.html +0 -56
- data/doc/js/quicksearch.js +0 -114
- data/doc/js/thickbox-compressed.js +0 -10
- data/doc/lib/app_controller_client_rb.html +0 -60
- data/doc/lib/babel_rb.html +0 -68
- data/doc/lib/common_functions_rb.html +0 -70
- data/doc/lib/custom_exceptions_rb.html +0 -54
- data/doc/lib/neptune_rb.html +0 -60
- data/test/integration/tc_c.rb +0 -57
- data/test/integration/tc_dfsp.rb +0 -37
- data/test/integration/tc_dwssa.rb +0 -38
- data/test/integration/tc_erlang.rb +0 -183
- data/test/integration/tc_mapreduce.rb +0 -282
- data/test/integration/tc_mpi.rb +0 -160
- data/test/integration/tc_storage.rb +0 -209
- data/test/integration/tc_upc.rb +0 -75
- data/test/integration/tc_x10.rb +0 -94
- data/test/integration/test_helper.rb +0 -135
- data/test/integration/ts_neptune.rb +0 -40
@@ -1,282 +0,0 @@
|
|
1
|
-
|
2
|
-
class TestMapReduce < Test::Unit::TestCase
|
3
|
-
def test_java_mr_code
|
4
|
-
STORAGE_TYPES.each { |storage|
|
5
|
-
# TODO: once files api is good in appscale, test this use case
|
6
|
-
next if storage == "appdb"
|
7
|
-
run_java_mr_code(storage)
|
8
|
-
}
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_mr_streaming_code
|
12
|
-
STORAGE_TYPES.each { |storage|
|
13
|
-
run_streaming_code(storage)
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
|
-
def run_java_mr_code(storage)
|
18
|
-
local_input = File.expand_path("~/neptune/samples/mapreduce/the-end-of-time.txt")
|
19
|
-
unless File.exists?(local_input)
|
20
|
-
abort("missing input corpus - please download it and try again.")
|
21
|
-
end
|
22
|
-
input = TestHelper.read_file(local_input)
|
23
|
-
|
24
|
-
local_code = File.expand_path("~/neptune/samples/mapreduce/hadoop-0.20.0-examples.jar")
|
25
|
-
unless File.exists?(local_code)
|
26
|
-
abort("missing hadoop examples jar - please download it and try again.")
|
27
|
-
end
|
28
|
-
main = "wordcount"
|
29
|
-
|
30
|
-
local_output = File.expand_path("~/neptune/samples/mapreduce/expected-output.txt")
|
31
|
-
unless File.exists?(local_output)
|
32
|
-
abort("missing expected output - please download it and try again.")
|
33
|
-
end
|
34
|
-
expected_output = TestHelper.read_file(local_output)
|
35
|
-
|
36
|
-
folder = "wordcount-#{TestHelper.get_random_alphanumeric}"
|
37
|
-
tmp_folder = "/tmp/#{folder}"
|
38
|
-
FileUtils.mkdir_p(tmp_folder)
|
39
|
-
|
40
|
-
input_name = "input"
|
41
|
-
local_input = "#{tmp_folder}/#{input_name}"
|
42
|
-
TestHelper.write_file(local_input, input)
|
43
|
-
|
44
|
-
remote_input = TestHelper.get_output_location("#{folder}-input", storage)
|
45
|
-
remote_code = TestHelper.get_output_location("#{folder}-code.jar", storage, notxt=true)
|
46
|
-
remote_output = TestHelper.get_output_location("#{folder}-output", storage)
|
47
|
-
|
48
|
-
put_file_in_storage(local_input, remote_input, storage)
|
49
|
-
put_file_in_storage(local_code, remote_code, storage)
|
50
|
-
|
51
|
-
start_mr_code(remote_input, remote_output, remote_code, main, storage)
|
52
|
-
get_mr_output(remote_output, expected_output, storage)
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
def start_mr_code(input, output, code, main, storage)
|
57
|
-
params = {
|
58
|
-
:type => "mapreduce",
|
59
|
-
:input => input,
|
60
|
-
:output => output,
|
61
|
-
:mapreducejar => code,
|
62
|
-
:main => main,
|
63
|
-
:nodes_to_use => 1
|
64
|
-
}.merge(TestHelper.get_storage_params(storage))
|
65
|
-
|
66
|
-
status = nil
|
67
|
-
|
68
|
-
loop {
|
69
|
-
status = neptune(params)
|
70
|
-
if status[:msg] =~ /not enough free nodes/
|
71
|
-
puts status[:msg]
|
72
|
-
else
|
73
|
-
break
|
74
|
-
end
|
75
|
-
sleep(5)
|
76
|
-
}
|
77
|
-
|
78
|
-
msg = "Your job was not started successfully. The failure message " +
|
79
|
-
"reported was #{status[:msg]}"
|
80
|
-
assert_equal(status[:result], :success, msg)
|
81
|
-
end
|
82
|
-
|
83
|
-
def run_streaming_code(storage)
|
84
|
-
expected_output = "sum x ="
|
85
|
-
input = <<BAZ
|
86
|
-
1 32
|
87
|
-
33 64
|
88
|
-
65 96
|
89
|
-
97 128
|
90
|
-
BAZ
|
91
|
-
|
92
|
-
map_code = <<BAZ
|
93
|
-
#!/usr/bin/ruby -w
|
94
|
-
# Programmer: Chris Bunch
|
95
|
-
# mapper-ruby.rb: Solves part of the EP parallel benchmark via the
|
96
|
-
# MapReduce framework as follows:
|
97
|
-
# Input: Takes in ranges of k values to compute over STDIN.
|
98
|
-
# Output: list [l, X_k, Y_k]
|
99
|
-
|
100
|
-
A = 5 ** 13
|
101
|
-
S = 271828183
|
102
|
-
MIN_VAL = 2 ** -46
|
103
|
-
MAX_VAL = 2 ** 46
|
104
|
-
|
105
|
-
def generate_random(k)
|
106
|
-
xk = (A ** k) * S % MAX_VAL
|
107
|
-
MIN_VAL * xk
|
108
|
-
end
|
109
|
-
|
110
|
-
def ep(k)
|
111
|
-
k = Integer(k)
|
112
|
-
|
113
|
-
xj = generate_random(k)
|
114
|
-
yj = generate_random(k+1)
|
115
|
-
|
116
|
-
t = xj * xj + yj * yj
|
117
|
-
|
118
|
-
if t <= 1
|
119
|
-
xk = xj * Math.sqrt(-2 * Math.log(t) / t)
|
120
|
-
yk = yj * Math.sqrt(-2 * Math.log(t) / t)
|
121
|
-
|
122
|
-
max = [xk.abs, yk.abs].max
|
123
|
-
l = max.floor
|
124
|
-
puts l.to_s + " " + xk.to_s + " " + yk.to_s
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
loop {
|
129
|
-
input = STDIN.gets
|
130
|
-
break if input.nil?
|
131
|
-
start, fin = input.chomp.split
|
132
|
-
start = Integer(start)
|
133
|
-
fin = Integer(fin)
|
134
|
-
current = start
|
135
|
-
loop {
|
136
|
-
ep(current)
|
137
|
-
current = current + 2
|
138
|
-
break if current > fin
|
139
|
-
}
|
140
|
-
}
|
141
|
-
|
142
|
-
BAZ
|
143
|
-
|
144
|
-
red_code = <<BAZ
|
145
|
-
#!/usr/bin/ruby -w
|
146
|
-
# Programmer: Chris Bunch
|
147
|
-
# reducer-ruby.rb: Solves part of the EP parallel benchmark via the
|
148
|
-
# MapReduce framework as follows:
|
149
|
-
# Input: list [l, X_k, Y_k]
|
150
|
-
# Output: [l, sum(X_k), sum(Y_k)]
|
151
|
-
|
152
|
-
current_l = nil
|
153
|
-
|
154
|
-
x_count = 0
|
155
|
-
y_count = 0
|
156
|
-
|
157
|
-
sum_x = 0.0
|
158
|
-
sum_y = 0.0
|
159
|
-
|
160
|
-
loop {
|
161
|
-
input = STDIN.gets
|
162
|
-
break if input.nil?
|
163
|
-
l, x, y = input.chomp.split
|
164
|
-
l = Integer(l)
|
165
|
-
x = Float(x)
|
166
|
-
y = Float(y)
|
167
|
-
|
168
|
-
current_l = l if current_l.nil?
|
169
|
-
|
170
|
-
if l != current_l
|
171
|
-
puts "bucket = " + current_l.to_s + ", |x| = " + x_count.to_s + ", |y| = " + y_count.to_s
|
172
|
-
current_l = l
|
173
|
-
x_count = 0
|
174
|
-
y_count = 0
|
175
|
-
end
|
176
|
-
|
177
|
-
sum_x = sum_x + x
|
178
|
-
sum_y = sum_y + y
|
179
|
-
|
180
|
-
abs_x = x.abs
|
181
|
-
abs_y = y.abs
|
182
|
-
|
183
|
-
if abs_x > abs_y
|
184
|
-
x_count = x_count + 1
|
185
|
-
else
|
186
|
-
y_count = y_count + 1
|
187
|
-
end
|
188
|
-
}
|
189
|
-
|
190
|
-
puts "bucket = " + current_l.to_s + ", |x| = " + x_count.to_s + ", |y| = " + y_count.to_s
|
191
|
-
puts "sum x = " + sum_x.to_s + ", sum y = " + sum_y.to_s
|
192
|
-
|
193
|
-
BAZ
|
194
|
-
|
195
|
-
contents = TestHelper.get_random_alphanumeric(1024)
|
196
|
-
folder = "ep-#{TestHelper.get_random_alphanumeric}"
|
197
|
-
|
198
|
-
input_name = "input"
|
199
|
-
map_source = "map.rb"
|
200
|
-
red_source = "reduce.rb"
|
201
|
-
|
202
|
-
tmp_folder = "/tmp/#{folder}"
|
203
|
-
FileUtils.mkdir_p(tmp_folder)
|
204
|
-
|
205
|
-
local_input = "#{tmp_folder}/#{input_name}"
|
206
|
-
local_map = "#{tmp_folder}/#{map_source}"
|
207
|
-
local_red = "#{tmp_folder}/#{red_source}"
|
208
|
-
|
209
|
-
TestHelper.write_file(local_input, input)
|
210
|
-
TestHelper.write_file(local_map, map_code)
|
211
|
-
TestHelper.write_file(local_red, red_code)
|
212
|
-
|
213
|
-
remote_input = TestHelper.get_output_location("#{folder}-input", storage)
|
214
|
-
remote_map = TestHelper.get_output_location("#{folder}-map.rb", storage, notxt=true)
|
215
|
-
remote_red = TestHelper.get_output_location("#{folder}-reduce.rb", storage, notxt=true)
|
216
|
-
remote_output = TestHelper.get_output_location("#{folder}-output", storage)
|
217
|
-
|
218
|
-
put_file_in_storage(local_input, remote_input, storage)
|
219
|
-
put_file_in_storage(local_map, remote_map, storage)
|
220
|
-
put_file_in_storage(local_red, remote_red, storage)
|
221
|
-
|
222
|
-
start_mr_streaming_code(remote_input, remote_output, remote_map, remote_red, storage)
|
223
|
-
get_mr_output(remote_output, expected_output, storage)
|
224
|
-
|
225
|
-
FileUtils.rm_rf(local_input)
|
226
|
-
FileUtils.rm_rf(local_map)
|
227
|
-
FileUtils.rm_rf(local_red)
|
228
|
-
end
|
229
|
-
|
230
|
-
def put_file_in_storage(local, remote, storage)
|
231
|
-
params = {
|
232
|
-
:type => "input",
|
233
|
-
:local => local,
|
234
|
-
:remote => remote
|
235
|
-
}.merge(TestHelper.get_storage_params(storage))
|
236
|
-
|
237
|
-
input_result = neptune(params)
|
238
|
-
|
239
|
-
msg = "We were unable to store a file in the database. We " +
|
240
|
-
" got back this: #{msg}"
|
241
|
-
assert(input_result, msg)
|
242
|
-
end
|
243
|
-
|
244
|
-
def start_mr_streaming_code(input, output, map, reduce, storage)
|
245
|
-
params = {
|
246
|
-
:type => "mapreduce",
|
247
|
-
:input => input,
|
248
|
-
:output => output,
|
249
|
-
:map => map,
|
250
|
-
:reduce => reduce,
|
251
|
-
:nodes_to_use => 1
|
252
|
-
}.merge(TestHelper.get_storage_params(storage))
|
253
|
-
|
254
|
-
status = nil
|
255
|
-
|
256
|
-
loop {
|
257
|
-
status = neptune(params)
|
258
|
-
if status[:msg] =~ /not enough free nodes/
|
259
|
-
puts status[:msg]
|
260
|
-
else
|
261
|
-
break
|
262
|
-
end
|
263
|
-
sleep(5)
|
264
|
-
}
|
265
|
-
|
266
|
-
msg = "Your job was not started successfully. The failure message " +
|
267
|
-
"reported was #{status[:msg]}"
|
268
|
-
assert_equal(status[:result], :success, msg)
|
269
|
-
end
|
270
|
-
|
271
|
-
def get_mr_output(output, expected, storage)
|
272
|
-
result = TestHelper.get_job_output(output, storage)
|
273
|
-
|
274
|
-
TestHelper.write_file("/tmp/result", result)
|
275
|
-
|
276
|
-
msg = "The MapReduce job you ran did not return the expected result. " +
|
277
|
-
"We expected to see [#{expected}] but instead saw [#{result}]"
|
278
|
-
success = result.include?(expected)
|
279
|
-
assert(success, msg)
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
data/test/integration/tc_mpi.rb
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
|
2
|
-
class TestMPI < Test::Unit::TestCase
|
3
|
-
def test_hello_world_code
|
4
|
-
num_procs = 1
|
5
|
-
|
6
|
-
STORAGE_TYPES.each { |storage|
|
7
|
-
run_hello_world_code(storage, num_procs)
|
8
|
-
}
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_not_enough_procs
|
12
|
-
num_procs = 0
|
13
|
-
|
14
|
-
STORAGE_TYPES.each { |storage|
|
15
|
-
msg = "Running an MPI compute job with p < n should have thrown " +
|
16
|
-
"an exception, when in fact it did not. Here we used #{storage} " +
|
17
|
-
"as the storage backend."
|
18
|
-
|
19
|
-
assert_raise(SystemExit, msg) {
|
20
|
-
run_hello_world_code(storage, num_procs)
|
21
|
-
}
|
22
|
-
}
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_bad_source_code
|
26
|
-
location = "/tmp/baz" + TestHelper.get_random_alphanumeric
|
27
|
-
output = "/bazboo2"
|
28
|
-
storage = "appdb"
|
29
|
-
|
30
|
-
msg = "Running an MPI compute job with a non-existent code location" +
|
31
|
-
" should have thrown an exception, when in fact it did not."
|
32
|
-
|
33
|
-
assert_raise(SystemExit, msg) {
|
34
|
-
TestHelper.start_job("mpi", location, output, storage)
|
35
|
-
}
|
36
|
-
|
37
|
-
FileUtils.mkdir_p(location)
|
38
|
-
|
39
|
-
bad_file_msg = "Running an MPI compute job with a code location that" +
|
40
|
-
" is not a file should have thrown an exception, when in fact it did not."
|
41
|
-
|
42
|
-
assert_raise(SystemExit, bad_file_msg) {
|
43
|
-
TestHelper.start_job("mpi", location, output, storage)
|
44
|
-
}
|
45
|
-
|
46
|
-
FileUtils.rmdir(location)
|
47
|
-
end
|
48
|
-
|
49
|
-
def run_hello_world_code(storage, num_procs)
|
50
|
-
expected_output = "0: We have 1 processors"
|
51
|
-
ring_code = <<BAZ
|
52
|
-
/*
|
53
|
-
"Hello World" MPI Test Program
|
54
|
-
*/
|
55
|
-
#include <mpi.h>
|
56
|
-
#include <stdio.h>
|
57
|
-
#include <string.h>
|
58
|
-
|
59
|
-
#define BUFSIZE 128
|
60
|
-
#define TAG 0
|
61
|
-
|
62
|
-
int main(int argc, char *argv[])
|
63
|
-
{
|
64
|
-
char idstr[32];
|
65
|
-
char buff[BUFSIZE];
|
66
|
-
int numprocs;
|
67
|
-
int myid;
|
68
|
-
int i;
|
69
|
-
MPI_Status stat;
|
70
|
-
|
71
|
-
MPI_Init(&argc,&argv); /* all MPI programs start with MPI_Init; all 'N' processes exist thereafter */
|
72
|
-
MPI_Comm_size(MPI_COMM_WORLD,&numprocs); /* find out how big the SPMD world is */
|
73
|
-
MPI_Comm_rank(MPI_COMM_WORLD,&myid); /* and this processes' rank is */
|
74
|
-
|
75
|
-
/* At this point, all programs are running equivalently, the rank distinguishes
|
76
|
-
the roles of the programs in the SPMD model, with rank 0 often used specially... */
|
77
|
-
if(myid == 0)
|
78
|
-
{
|
79
|
-
printf("%d: We have %d processors", myid, numprocs);
|
80
|
-
for(i=1;i<numprocs;i++)
|
81
|
-
{
|
82
|
-
sprintf(buff, "Hello %d! ", i);
|
83
|
-
MPI_Send(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD);
|
84
|
-
}
|
85
|
-
for(i=1;i<numprocs;i++)
|
86
|
-
{
|
87
|
-
MPI_Recv(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD, &stat);
|
88
|
-
printf("%d: %s", myid, buff);
|
89
|
-
}
|
90
|
-
}
|
91
|
-
else
|
92
|
-
{
|
93
|
-
/* receive from rank 0: */
|
94
|
-
MPI_Recv(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &stat);
|
95
|
-
sprintf(idstr, "Processor %d ", myid);
|
96
|
-
strncat(buff, idstr, BUFSIZE-1);
|
97
|
-
strncat(buff, "reporting for duty", BUFSIZE-1);
|
98
|
-
/* send to rank 0: */
|
99
|
-
MPI_Send(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD);
|
100
|
-
}
|
101
|
-
|
102
|
-
MPI_Finalize(); /* MPI Programs end with MPI Finalize; this is a weak synchronization point */
|
103
|
-
return 0;
|
104
|
-
}
|
105
|
-
|
106
|
-
BAZ
|
107
|
-
|
108
|
-
contents = TestHelper.get_random_alphanumeric(1024)
|
109
|
-
folder = "hello-world-#{TestHelper.get_random_alphanumeric}"
|
110
|
-
source = "HelloWorld.c"
|
111
|
-
|
112
|
-
tmp_folder = "/tmp/#{folder}"
|
113
|
-
FileUtils.mkdir_p(tmp_folder)
|
114
|
-
compiled = "#{tmp_folder}-compiled"
|
115
|
-
compiled_code = "#{compiled}/HelloWorld"
|
116
|
-
|
117
|
-
local = "#{tmp_folder}/#{source}"
|
118
|
-
TestHelper.write_file(local, ring_code)
|
119
|
-
|
120
|
-
output = TestHelper.get_output_location(folder, storage)
|
121
|
-
|
122
|
-
compile_mpi_code(tmp_folder, source, compiled)
|
123
|
-
start_mpi_code(compiled_code, num_procs, output, storage)
|
124
|
-
get_mpi_output(output, expected_output, storage)
|
125
|
-
|
126
|
-
FileUtils.rm_rf(tmp_folder)
|
127
|
-
FileUtils.rm_rf(compiled)
|
128
|
-
end
|
129
|
-
|
130
|
-
def compile_mpi_code(location, main_file, compiled)
|
131
|
-
std_out, std_err = TestHelper.compile_code(location, main_file, compiled)
|
132
|
-
|
133
|
-
make = "mpicc HelloWorld.c -o HelloWorld -Wall"
|
134
|
-
msg = "The MPI code did not compile as expected. It should have " +
|
135
|
-
"compiled with the command [#{make}] instead of [#{std_out}]."
|
136
|
-
assert_equal(std_out, make, msg)
|
137
|
-
|
138
|
-
msg = "The MPI code did not compile successfully. It reported " +
|
139
|
-
"the following error: #{std_err}"
|
140
|
-
assert_nil(std_err, msg)
|
141
|
-
end
|
142
|
-
|
143
|
-
def start_mpi_code(code_location, num_procs, output, storage)
|
144
|
-
params = { :procs_to_use => num_procs }
|
145
|
-
status = TestHelper.start_job("mpi", code_location, output, storage, params)
|
146
|
-
|
147
|
-
msg = "Your job was not started successfully. The failure message " +
|
148
|
-
"reported was #{status[:msg]}"
|
149
|
-
assert_equal(status[:result], :success, msg)
|
150
|
-
end
|
151
|
-
|
152
|
-
def get_mpi_output(output, expected, storage)
|
153
|
-
result = TestHelper.get_job_output(output, storage)
|
154
|
-
|
155
|
-
msg = "The MPI job you ran did not return the expected result. " +
|
156
|
-
"We expected to see [#{expected}] but instead saw [#{result}]"
|
157
|
-
assert_equal(result, expected, msg)
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
@@ -1,209 +0,0 @@
|
|
1
|
-
|
2
|
-
class TestStorage < Test::Unit::TestCase
|
3
|
-
def test_acl
|
4
|
-
STORAGE_TYPES.each { |storage|
|
5
|
-
run_in_acl(storage)
|
6
|
-
}
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_in_out
|
10
|
-
STORAGE_TYPES.each { |storage|
|
11
|
-
run_in_out(storage)
|
12
|
-
}
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_run_in_out_w_env
|
16
|
-
STORAGE_TYPES.each { |storage|
|
17
|
-
run_in_out_w_env(storage)
|
18
|
-
}
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_no_creds
|
22
|
-
creds = %w{
|
23
|
-
GSTORAGE_ACCESS_KEY GSTORAGE_SECRET_KEY GSTORAGE_URL
|
24
|
-
S3_ACCESS_KEY S3_SECRET_KEY S3_URL
|
25
|
-
WALRUS_ACCESS_KEY WALRUS_SECRET_KEY WALRUS_URL
|
26
|
-
}
|
27
|
-
|
28
|
-
old_creds = {}
|
29
|
-
creds.each { |c|
|
30
|
-
old_creds[c] = ENV[c]
|
31
|
-
ENV[c] = nil
|
32
|
-
}
|
33
|
-
|
34
|
-
# try an input job with creds in env but not in job
|
35
|
-
# should succeed
|
36
|
-
|
37
|
-
STORAGE_TYPES.each { |storage|
|
38
|
-
params = { :storage => storage }
|
39
|
-
testhelper = flexmock(TestHelper)
|
40
|
-
testhelper.should_receive(:get_storage_params).with(storage).and_return(params)
|
41
|
-
|
42
|
-
no_msg = "Trying to start a storage job and failing to specify " +
|
43
|
-
"necessary credentials should not have failed, but it did." +
|
44
|
-
" The storage type used was #{storage}."
|
45
|
-
|
46
|
-
msg = "Trying to start a storage job and failing to specify " +
|
47
|
-
"necessary credentials should have failed, but it didn't." +
|
48
|
-
" The storage type used was #{storage}."
|
49
|
-
|
50
|
-
if storage == "appdb"
|
51
|
-
assert_nothing_raised(SystemExit, no_msg) {
|
52
|
-
run_in_out(storage)
|
53
|
-
}
|
54
|
-
else
|
55
|
-
assert_raise(SystemExit, msg) {
|
56
|
-
run_in_out(storage)
|
57
|
-
}
|
58
|
-
end
|
59
|
-
}
|
60
|
-
|
61
|
-
creds.each { |c|
|
62
|
-
ENV[c] = old_creds[c]
|
63
|
-
}
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_bad_storage
|
67
|
-
msg = "Specifying an incorrect storage backend should have thrown an " +
|
68
|
-
"exception, when in fact it did not."
|
69
|
-
assert_raise(SystemExit, msg) { run_in_out("blarg_storage") }
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_bad_output_location
|
73
|
-
output = "baz-boo-for-me-too"
|
74
|
-
|
75
|
-
STORAGE_TYPES.each { |storage|
|
76
|
-
end_of_msg = " should have thrown an exception, when in fact it did not." +
|
77
|
-
"Here we tested with #{storage} as the storage backend."
|
78
|
-
|
79
|
-
no_slash_msg = "Specifying an output location without a leading slash"
|
80
|
-
|
81
|
-
assert_raise(SystemExit, no_slash_msg + end_of_msg) {
|
82
|
-
TestHelper.get_job_output(output, storage)
|
83
|
-
}
|
84
|
-
|
85
|
-
no_output_msg = "Specifying an output job with a blank output parameter"
|
86
|
-
assert_raise(SystemExit, no_output_msg + end_of_msg) {
|
87
|
-
TestHelper.get_job_output("", storage)
|
88
|
-
}
|
89
|
-
|
90
|
-
nil_output_msg = "Specifying an output job with a nil output"
|
91
|
-
assert_raise(SystemExit, nil_output_msg + end_of_msg) {
|
92
|
-
TestHelper.get_job_output(nil, storage)
|
93
|
-
}
|
94
|
-
}
|
95
|
-
end
|
96
|
-
|
97
|
-
def run_in_acl(storage)
|
98
|
-
contents = TestHelper.get_random_alphanumeric(1024) + "+&baz"
|
99
|
-
suffix = "neptune-testfile-#{TestHelper.get_random_alphanumeric}"
|
100
|
-
local = "/tmp/#{suffix}"
|
101
|
-
TestHelper.write_file(local, contents)
|
102
|
-
remote = TestHelper.get_output_location(suffix, storage)
|
103
|
-
|
104
|
-
in_params = {
|
105
|
-
:type => "input",
|
106
|
-
:local => local,
|
107
|
-
:remote => remote
|
108
|
-
}.merge(TestHelper.get_storage_params(storage))
|
109
|
-
|
110
|
-
input_result = neptune(in_params)
|
111
|
-
|
112
|
-
msg = "We were unable to store a file in the datastore. We " +
|
113
|
-
" got back this: #{msg}"
|
114
|
-
assert(input_result, msg)
|
115
|
-
|
116
|
-
get_params = {
|
117
|
-
:type => "get-acl",
|
118
|
-
:output => remote
|
119
|
-
}.merge(TestHelper.get_storage_params(storage))
|
120
|
-
|
121
|
-
acl = neptune(get_params)
|
122
|
-
|
123
|
-
get_acl_msg1 = "The default ACL should be private, but was [#{acl}] instead."
|
124
|
-
assert_equal("private", acl, get_acl_msg1)
|
125
|
-
|
126
|
-
# TODO: set acl is currently broken - once we fix it, we should
|
127
|
-
# do the following:
|
128
|
-
|
129
|
-
# set acl to something else
|
130
|
-
# verify that it was set correctly
|
131
|
-
|
132
|
-
FileUtils.rm_rf(local)
|
133
|
-
end
|
134
|
-
|
135
|
-
def run_in_out_w_env(storage)
|
136
|
-
creds = %w{
|
137
|
-
GSTORAGE_ACCESS_KEY GSTORAGE_SECRET_KEY GSTORAGE_URL
|
138
|
-
S3_ACCESS_KEY S3_SECRET_KEY S3_URL
|
139
|
-
WALRUS_ACCESS_KEY WALRUS_SECRET_KEY WALRUS_URL
|
140
|
-
}
|
141
|
-
|
142
|
-
old_creds = {}
|
143
|
-
creds.each { |c|
|
144
|
-
old_creds[c] = ENV[c]
|
145
|
-
}
|
146
|
-
|
147
|
-
s3_creds = %w{ EC2_ACCESS_KEY EC2_SECRET_KEY S3_URL }
|
148
|
-
|
149
|
-
needed_creds = TestHelper.get_storage_params(storage)
|
150
|
-
puts needed_creds.inspect
|
151
|
-
|
152
|
-
params = { :storage => storage }
|
153
|
-
testhelper = flexmock(TestHelper)
|
154
|
-
testhelper.should_receive(:get_storage_params).with(storage).and_return(params)
|
155
|
-
|
156
|
-
s3_creds.each { |c|
|
157
|
-
ENV[c] = needed_creds[c.to_sym]
|
158
|
-
}
|
159
|
-
|
160
|
-
run_in_out(storage)
|
161
|
-
|
162
|
-
s3_creds.each { |c|
|
163
|
-
ENV[c] = nil
|
164
|
-
}
|
165
|
-
|
166
|
-
creds.each { |c|
|
167
|
-
ENV[c] = old_creds[c]
|
168
|
-
}
|
169
|
-
|
170
|
-
testhelper.flexmock_teardown
|
171
|
-
end
|
172
|
-
|
173
|
-
def run_in_out(storage)
|
174
|
-
contents = TestHelper.get_random_alphanumeric(1024) + "+&baz"
|
175
|
-
suffix = "neptune-testfile-#{TestHelper.get_random_alphanumeric}"
|
176
|
-
local = "/tmp/#{suffix}"
|
177
|
-
TestHelper.write_file(local, contents)
|
178
|
-
|
179
|
-
run_input(local, suffix, storage)
|
180
|
-
run_output(contents, suffix, storage)
|
181
|
-
|
182
|
-
FileUtils.rm_rf(local)
|
183
|
-
end
|
184
|
-
|
185
|
-
def run_input(local, suffix, storage)
|
186
|
-
params = {
|
187
|
-
:type => "input",
|
188
|
-
:local => local,
|
189
|
-
:remote => TestHelper.get_output_location(suffix, storage)
|
190
|
-
}.merge(TestHelper.get_storage_params(storage))
|
191
|
-
|
192
|
-
input_result = neptune(params)
|
193
|
-
|
194
|
-
msg = "We were unable to store a file in the database. We " +
|
195
|
-
" got back this: #{msg}"
|
196
|
-
assert(input_result, msg)
|
197
|
-
end
|
198
|
-
|
199
|
-
def run_output(local, suffix, storage)
|
200
|
-
output = TestHelper.get_output_location(suffix, storage)
|
201
|
-
remote = TestHelper.get_job_output(output, storage)
|
202
|
-
|
203
|
-
msg = "We were unable to verify that the remote file matches the " +
|
204
|
-
"local version. The local copy's contents are: " +
|
205
|
-
"[#{local}], while the remote copy's contents are [#{remote}]."
|
206
|
-
assert_equal(local, remote, msg)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|