zillabyte-cli 0.0.20 → 0.0.21
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.
- checksums.yaml +8 -8
- data/lib/zillabyte/api/apps.rb +5 -2
- data/lib/zillabyte/api.rb +3 -0
- data/lib/zillabyte/cli/apps.rb +277 -45
- data/lib/zillabyte/cli/apps.rb.orig +1158 -0
- data/lib/zillabyte/cli/auth.rb +2 -2
- data/lib/zillabyte/cli/config.rb +2 -1
- data/lib/zillabyte/cli/help.rb +3 -2
- data/lib/zillabyte/cli/nuke.rb +42 -0
- data/lib/zillabyte/cli/relations.rb +8 -8
- data/lib/zillabyte/cli/repl.rb +32 -11
- data/lib/zillabyte/cli/templates/ruby/Gemfile.lock +81 -0
- data/lib/zillabyte/cli/templates/ruby/app.rb +2 -2
- data/lib/zillabyte/cli/version.rb +8 -1
- data/lib/zillabyte/command.rb +7 -1
- data/lib/zillabyte/helpers.rb +3 -2
- data/lib/zillabyte-cli/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
M2YyYjcyMWJlMGExNmUzOGI3NjE1N2UzMThiZjU4ZjZkYzc4ZDgyYg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MWIyNjZmMjVlYWJhYzM2OTdhOGU2NzlhY2U2NTg4YTRkMjJjMjJkMQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MWFmY2FiMzUzNjM0MmY3OGE2NzA3YjEwYTY4MzQ2NWMwZTdmNGE4NDA5ZDgy
|
10
|
+
NjdmNDI4YjllMjQyMGFiNDY1ZGQzYzY1OTliY2Y1YTRkMGJlMzQyM2VkZDA4
|
11
|
+
NzY5ZWFmMThkNjFjNDhmYzZmODM3Yzk3ZjQ0OGRkMDZkNjE1Njg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YjA3ZGIxNDU4NjVkNDViZGNmN2M5MTg5YmNkYTQ0YzQzODU3NDJkMTNmMzZi
|
14
|
+
MDNjZTI3YmViMDhiM2JlNzA4NGFiNDVhZjk3MTg2ZmY0NmI1NDYzMmNlNDNi
|
15
|
+
YmIzYWY2ZjcyNGZjYTI0NmVkNzdhM2ZhMDEyNTY1OGYyNWI2YjA=
|
data/lib/zillabyte/api/apps.rb
CHANGED
@@ -203,6 +203,7 @@ class Zillabyte::API::Apps < Zillabyte::API::Base
|
|
203
203
|
:body => options.to_json
|
204
204
|
)
|
205
205
|
|
206
|
+
|
206
207
|
if(res.body['uri'])
|
207
208
|
uri = URI(res.body['uri'])
|
208
209
|
try_again = 1
|
@@ -246,9 +247,11 @@ class Zillabyte::API::Apps < Zillabyte::API::Base
|
|
246
247
|
full_script = File.join(dir, hash['script'])
|
247
248
|
command = nil
|
248
249
|
|
250
|
+
|
249
251
|
info_file = "#{dir}/#{SecureRandom.uuid}"
|
250
252
|
arg = "--info --file #{info_file}"
|
251
|
-
|
253
|
+
|
254
|
+
|
252
255
|
case hash["language"]
|
253
256
|
when "ruby"
|
254
257
|
command = "cd \"#{dir}\"; unset BUNDLE_GEMFILE; ZILLABYTE_HARNESS=1 bundle exec ruby \"#{full_script}\" #{arg}"
|
@@ -267,7 +270,7 @@ class Zillabyte::API::Apps < Zillabyte::API::Base
|
|
267
270
|
return nil
|
268
271
|
end
|
269
272
|
|
270
|
-
results = Zillabyte::Command::Apps.get_info(command, info_file, options)
|
273
|
+
results = Zillabyte::Command::Apps.get_info(command, info_file, dir, options)
|
271
274
|
|
272
275
|
begin
|
273
276
|
meta = JSON.parse(results.split("\n").first.strip) # Throws error if invalid json
|
data/lib/zillabyte/api.rb
CHANGED
@@ -87,6 +87,9 @@ class Zillabyte::API
|
|
87
87
|
# Executed on each chunk excon bubbles up
|
88
88
|
params[:response_block] = lambda do |chunk, remaining_bytes, total_bytes|
|
89
89
|
|
90
|
+
# Debug helper
|
91
|
+
puts chunk if ENV["ZB_DEBUG"]
|
92
|
+
|
90
93
|
# assume single-line json, split by '\n'
|
91
94
|
last_string += chunk
|
92
95
|
ary = last_string.split("\n", -1)
|
data/lib/zillabyte/cli/apps.rb
CHANGED
@@ -23,6 +23,8 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
23
23
|
def index
|
24
24
|
self.list
|
25
25
|
end
|
26
|
+
|
27
|
+
|
26
28
|
|
27
29
|
# apps
|
28
30
|
#
|
@@ -37,15 +39,143 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
37
39
|
headings = row.keys
|
38
40
|
headings.delete("rel_dir")
|
39
41
|
end
|
42
|
+
|
40
43
|
v = row.values_at *headings
|
41
44
|
v
|
42
45
|
end
|
43
46
|
|
44
47
|
display "apps:\n" if type.nil?
|
45
48
|
display TableOutputBuilder.build_table(headings, rows, type)
|
46
|
-
display "Total number of apps: "+rows.length.to_s if type.nil?
|
49
|
+
display "Total number of apps: " + rows.length.to_s if type.nil?
|
47
50
|
end
|
48
51
|
|
52
|
+
# apps:details ID
|
53
|
+
#
|
54
|
+
# list details for an app, including percentage complete
|
55
|
+
# if the source is an existing relation
|
56
|
+
def details
|
57
|
+
|
58
|
+
app_id = options[:id] || shift_argument
|
59
|
+
type = options[:type]
|
60
|
+
|
61
|
+
if app_id.nil?
|
62
|
+
app_id = read_name_from_conf(options)
|
63
|
+
options[:is_name] = true
|
64
|
+
elsif !(app_id =~ /^\d*$/)
|
65
|
+
options[:is_name] = true
|
66
|
+
end
|
67
|
+
|
68
|
+
res = api.request(
|
69
|
+
:expects => 200,
|
70
|
+
:method => :get,
|
71
|
+
:path => "/flows/#{app_id}/details",
|
72
|
+
:body => options.to_json
|
73
|
+
)
|
74
|
+
res.body
|
75
|
+
|
76
|
+
# a nested hash so can't map directly
|
77
|
+
# instead i'll map separately and then merge the arrays
|
78
|
+
heading1 = ["type", "name"]
|
79
|
+
|
80
|
+
# a level deeper
|
81
|
+
heading2 = ["consumed", "emitted", "errors"]
|
82
|
+
|
83
|
+
# for the table output
|
84
|
+
headings = heading1 + heading2
|
85
|
+
|
86
|
+
# get the values for the headings
|
87
|
+
type_name = res.body.map do |instance|
|
88
|
+
|
89
|
+
heading1.map do |heading|
|
90
|
+
instance[heading]
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
# get the values for the headings
|
96
|
+
stats = res.body.map do |instance|
|
97
|
+
|
98
|
+
heading2.map do |heading|
|
99
|
+
instance["stats"][heading]
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
# combine the arrays
|
105
|
+
rows = type_name.zip(stats).map{|x,y| x.concat y}
|
106
|
+
|
107
|
+
# check if it's from a relation.
|
108
|
+
# if the source is a relation, there's a sharder.
|
109
|
+
# remove source types, and hardcode sharder-named instances as source
|
110
|
+
|
111
|
+
from_relation = false
|
112
|
+
|
113
|
+
rows.each do | row |
|
114
|
+
if row[1].scan("sharder").length != 0
|
115
|
+
from_relation = true
|
116
|
+
break
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
if from_relation == true
|
121
|
+
|
122
|
+
rows = rows.each do |row|
|
123
|
+
if row[0].scan("source").length != 0
|
124
|
+
rows.delete(row)
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
rows = rows.each do |row|
|
131
|
+
if row[1].scan("sharder").length != 0
|
132
|
+
row[0] = "source"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
# rows to be output to the CLI
|
139
|
+
rows = rows.group_by{ |type, name, consumed, emitted, errors| name }.map{ |hashkey, array| [array[0][0], hashkey, array.inject(0){ |sum, i | sum + i[2].to_i }, array.inject(0){ |sum, i | sum + i[3].to_i },array.inject(0){ |sum, i | sum + i[4].to_i }] }
|
140
|
+
# example sums: [["sink", "has_facebook_likebox_and_vwo", 73, 0, 0], ["source", "sharder.1", 16, 10367872, 1], ["each", "each_3", 10367872, 73, 0]]
|
141
|
+
|
142
|
+
# calculate percentage for the user to see
|
143
|
+
|
144
|
+
attempts = 0
|
145
|
+
total = 0
|
146
|
+
|
147
|
+
if from_relation == true
|
148
|
+
|
149
|
+
rows.each do |instance|
|
150
|
+
if instance[0] == "source"
|
151
|
+
total = instance[3]
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
rows.each do |instance|
|
157
|
+
if instance[0] == "each"
|
158
|
+
attempts = instance[2]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
if attempts > 0 && total > 0
|
164
|
+
completion = attempts/total*100
|
165
|
+
else
|
166
|
+
completion = 0
|
167
|
+
end
|
168
|
+
|
169
|
+
# output on the CLI
|
170
|
+
display "details:"
|
171
|
+
display TableOutputBuilder.build_table(headings, rows, type)
|
172
|
+
if from_relation == true
|
173
|
+
display "percent complete: #{completion}%\n"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
|
49
179
|
|
50
180
|
# apps:push [DIR]
|
51
181
|
#
|
@@ -62,7 +192,13 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
62
192
|
def push
|
63
193
|
|
64
194
|
since = Time.now.utc.to_s
|
65
|
-
dir = options[:directory] || shift_argument
|
195
|
+
dir = options[:directory] || shift_argument
|
196
|
+
if dir.nil?
|
197
|
+
dir = Dir.pwd
|
198
|
+
else
|
199
|
+
dir = File.expand_path(dir)
|
200
|
+
end
|
201
|
+
options[:directory] = dir
|
66
202
|
type = options[:type]
|
67
203
|
|
68
204
|
res = api.apps.push_directory dir, session, options
|
@@ -89,8 +225,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
89
225
|
# exit(0) if (hash['line'] || '').downcase.include?("app deployed")
|
90
226
|
|
91
227
|
end
|
92
|
-
|
93
|
-
display {}.to_json if type == "json"
|
228
|
+
display "{}" if type == "json"
|
94
229
|
|
95
230
|
end
|
96
231
|
alias_command "push", "apps:push"
|
@@ -103,8 +238,9 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
103
238
|
#
|
104
239
|
# --force # pulls even if the directory exists
|
105
240
|
# --type TYPE # specify an output type i.e. json
|
241
|
+
# --directory DIR # Directory of the app
|
106
242
|
#
|
107
|
-
#Examples:
|
243
|
+
# Examples:
|
108
244
|
#
|
109
245
|
# $ zillabyte apps:pull .
|
110
246
|
#
|
@@ -117,10 +253,12 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
117
253
|
end
|
118
254
|
|
119
255
|
dir = options[:directory] || shift_argument
|
256
|
+
error("no directory given", type) if dir.nil?
|
257
|
+
dir = File.expand_path(dir)
|
258
|
+
|
120
259
|
type = options[:type]
|
121
260
|
|
122
261
|
error("no id given", type) if app_id.nil?
|
123
|
-
error("no directory given", type) if dir.nil?
|
124
262
|
|
125
263
|
# Create if not exists..
|
126
264
|
if File.exists?(dir)
|
@@ -137,7 +275,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
137
275
|
error("error: #{res['error_message']}", type)
|
138
276
|
else
|
139
277
|
if type == "json"
|
140
|
-
display {}
|
278
|
+
display "{}"
|
141
279
|
else
|
142
280
|
display "app ##{res['id']} pulled to #{dir}"
|
143
281
|
end
|
@@ -186,7 +324,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
186
324
|
if confirmed
|
187
325
|
response = api.apps.delete(app_id, options)
|
188
326
|
if type == "json"
|
189
|
-
display {}
|
327
|
+
display "{}"
|
190
328
|
else
|
191
329
|
display response["body"]
|
192
330
|
end
|
@@ -196,23 +334,31 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
196
334
|
|
197
335
|
|
198
336
|
# apps:prep [DIR]
|
199
|
-
#
|
200
|
-
#
|
337
|
+
#
|
338
|
+
# performs any necessary initialization for the app
|
339
|
+
#
|
201
340
|
# --directory DIR # app directory
|
202
341
|
# --type TYPE # specify an output type i.e. json
|
203
|
-
#
|
342
|
+
#
|
204
343
|
def prep
|
205
|
-
|
206
|
-
type = options[:type]
|
207
|
-
dir = options[:directory] || shift_argument
|
344
|
+
|
345
|
+
type = options[:type]
|
346
|
+
dir = options[:directory] || shift_argument
|
347
|
+
if dir.nil?
|
348
|
+
dir = Dir.pwd
|
349
|
+
else
|
350
|
+
dir = File.expand_path(dir)
|
351
|
+
end
|
352
|
+
options[:directory] = dir
|
208
353
|
meta = Zillabyte::CLI::Config.get_config_info(dir)
|
354
|
+
|
209
355
|
if meta.nil?
|
210
356
|
error("The specified directory (#{dir}) does not appear to contain a valid Zillabyte configuration file.", type)
|
211
357
|
end
|
212
358
|
|
213
359
|
case meta["language"]
|
214
360
|
when "ruby"
|
215
|
-
|
361
|
+
|
216
362
|
# Execute in the bundler context
|
217
363
|
full_script = File.join(dir, meta["script"])
|
218
364
|
cmd = "cd \"#{meta['home_dir']}\"; unset BUNDLE_GEMFILE; unset RUBYOPT; bundle install"
|
@@ -247,6 +393,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
247
393
|
# [LANG] defaults to ruby, and [DIR] to the current directory
|
248
394
|
#
|
249
395
|
# --type TYPE # specify an output type i.e. json
|
396
|
+
# --directory DIR # Directory of the app
|
250
397
|
#
|
251
398
|
#Examples:
|
252
399
|
#
|
@@ -255,7 +402,12 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
255
402
|
def init
|
256
403
|
|
257
404
|
lang = options[:lang] || shift_argument || "ruby"
|
258
|
-
dir = options[:
|
405
|
+
dir = options[:directory] || shift_argument
|
406
|
+
if dir.nil?
|
407
|
+
dir = Dir.pwd
|
408
|
+
else
|
409
|
+
dir = File.expand_path(dir)
|
410
|
+
end
|
259
411
|
type = options[:type]
|
260
412
|
|
261
413
|
languages = ["ruby","python", "js"]
|
@@ -311,7 +463,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
311
463
|
|
312
464
|
# apps:errors ID
|
313
465
|
#
|
314
|
-
#
|
466
|
+
# show recent errors generated by the app
|
315
467
|
# --type TYPE # specify an output type i.e. json
|
316
468
|
#
|
317
469
|
def errors
|
@@ -432,7 +584,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
432
584
|
when 'completed'
|
433
585
|
if res['return']
|
434
586
|
if type == "json"
|
435
|
-
return {}
|
587
|
+
return "{}"
|
436
588
|
else
|
437
589
|
display res['return']
|
438
590
|
end
|
@@ -521,8 +673,15 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
521
673
|
end
|
522
674
|
|
523
675
|
|
676
|
+
|
524
677
|
# INIT
|
525
|
-
|
678
|
+
dir = options[:directory] || shift_argument
|
679
|
+
if dir.nil?
|
680
|
+
dir = Dir.pwd
|
681
|
+
else
|
682
|
+
dir = File.expand_path(dir)
|
683
|
+
end
|
684
|
+
options[:directory] = dir
|
526
685
|
|
527
686
|
meta = Zillabyte::API::Apps.get_rich_meta_info_from_script(dir, self, {:test => true})
|
528
687
|
if meta.nil?
|
@@ -598,7 +757,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
598
757
|
next
|
599
758
|
|
600
759
|
else
|
601
|
-
|
760
|
+
|
602
761
|
# A regular source..
|
603
762
|
stream_messages[default_stream] ||= []
|
604
763
|
stream_messages[default_stream] << "{\"command\": \"begin_cycle\"}\n"
|
@@ -705,6 +864,8 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
705
864
|
handshake stdin, stdout, node, color
|
706
865
|
write_queue = []
|
707
866
|
read_queue = []
|
867
|
+
mutex = Mutex.new
|
868
|
+
signal = ConditionVariable.new
|
708
869
|
|
709
870
|
if consumes.nil?
|
710
871
|
# Assume default stream (this should only happen for the source)
|
@@ -716,7 +877,6 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
716
877
|
stream_messages.delete(stream_name)
|
717
878
|
|
718
879
|
# Start writing the messages...
|
719
|
-
stuff_to_read = false
|
720
880
|
writing_thread = Thread.start do
|
721
881
|
|
722
882
|
while(true)
|
@@ -733,8 +893,10 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
733
893
|
end
|
734
894
|
|
735
895
|
# Make sure we're not reading anything...
|
736
|
-
while(
|
737
|
-
|
896
|
+
while(write_queue.size == 0)
|
897
|
+
mutex.synchronize do
|
898
|
+
signal.wait(mutex)
|
899
|
+
end
|
738
900
|
end
|
739
901
|
|
740
902
|
# Get next mesage
|
@@ -749,13 +911,12 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
749
911
|
last_call_next_tuple = true
|
750
912
|
op_display.call "getting next set of tuples in the batch"
|
751
913
|
else
|
752
|
-
puts write_json
|
914
|
+
# puts write_json
|
753
915
|
end
|
754
916
|
|
755
917
|
# Actually send it to the process
|
756
918
|
begin
|
757
919
|
write_message stdin, write_msg
|
758
|
-
stuff_to_read = true
|
759
920
|
sleep 0.1
|
760
921
|
rescue Exception => e
|
761
922
|
puts "Error running #{cmd}: #{e}"
|
@@ -771,25 +932,30 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
771
932
|
# If the end cycle command is received, we either trigger the next cycle if the number of emitted
|
772
933
|
# cycles is less than what the user requested, or we break
|
773
934
|
if type == "source" and end_cycle_received
|
774
|
-
|
935
|
+
|
936
|
+
mutex.synchronize do
|
937
|
+
write_queue << "{\"command\": \"begin_cycle\"}\n"
|
938
|
+
signal.signal()
|
939
|
+
end
|
940
|
+
|
775
941
|
n_batches_emitted += 1
|
776
942
|
end_cycle_received = false
|
777
943
|
last_call_next_tuple = false
|
778
|
-
stuff_to_read = false
|
779
944
|
break if n_batches_emitted > batches
|
780
945
|
sleep 0.5
|
781
946
|
next
|
782
947
|
end
|
783
948
|
|
784
949
|
# Get next message
|
785
|
-
read_msg = read_message(stdout, color)
|
950
|
+
read_msg = read_message(stdout, color);
|
951
|
+
|
786
952
|
if read_msg == "done" || read_msg.nil?
|
787
|
-
stuff_to_read = false
|
788
953
|
|
789
954
|
# For sources, if we receive a "done", check to see if any of the streams emitted by the source has
|
790
955
|
# increased in size since the last call to next_tuple. If so, the cycle isn't over, otherwise, the
|
791
956
|
# current call to next_tuple emitted nothing and if the end_cycle_policy is set to null_emit, this
|
792
957
|
# should end the current cycle.
|
958
|
+
|
793
959
|
if type == "source"
|
794
960
|
if last_call_next_tuple and node["end_cycle_policy"] == "null_emit"
|
795
961
|
end_cycle_received = true
|
@@ -801,7 +967,11 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
801
967
|
end
|
802
968
|
|
803
969
|
# If the policy isn't "null_emit", then just request next_tuple again
|
804
|
-
|
970
|
+
mutex.synchronize do
|
971
|
+
write_queue << "{\"command\": \"next\"}\n"
|
972
|
+
signal.signal()
|
973
|
+
end
|
974
|
+
|
805
975
|
end
|
806
976
|
|
807
977
|
# For other operations, if the queue is empty then we're done
|
@@ -812,7 +982,6 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
812
982
|
next
|
813
983
|
end
|
814
984
|
end
|
815
|
-
stuff_to_read = true
|
816
985
|
|
817
986
|
# Process message
|
818
987
|
obj = JSON.parse(read_msg)
|
@@ -859,6 +1028,13 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
859
1028
|
elsif obj['command'] == 'fail'
|
860
1029
|
op_display.call "error: #{obj['msg']}", :red
|
861
1030
|
exit(1)
|
1031
|
+
elsif obj['ping']
|
1032
|
+
|
1033
|
+
mutex.synchronize do
|
1034
|
+
write_queue << "{\"pong\": \"#{Time.now.utc.to_f}\"}\n"
|
1035
|
+
signal.signal()
|
1036
|
+
end
|
1037
|
+
|
862
1038
|
else
|
863
1039
|
error "unknown message: #{read_msg}"
|
864
1040
|
end
|
@@ -924,7 +1100,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
924
1100
|
api.apps.kill(id, options)
|
925
1101
|
|
926
1102
|
if type == "json"
|
927
|
-
display {}
|
1103
|
+
display "{}"
|
928
1104
|
else
|
929
1105
|
display "App ##{id} killed"
|
930
1106
|
end
|
@@ -938,7 +1114,7 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
938
1114
|
#
|
939
1115
|
# --config CONFIG_FILE # use the given config file
|
940
1116
|
# --type TYPE # specify an output type i.e. json
|
941
|
-
# --directory DIR #
|
1117
|
+
# --directory DIR # Directory of the app
|
942
1118
|
#
|
943
1119
|
# HIDDEN:
|
944
1120
|
def live_run
|
@@ -947,22 +1123,68 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
947
1123
|
type = options[:type]
|
948
1124
|
|
949
1125
|
thread_id = options[:thread] || shift_argument || ""
|
950
|
-
dir = options[:directory] || shift_argument
|
951
|
-
|
1126
|
+
dir = options[:directory] || shift_argument
|
1127
|
+
if dir.nil?
|
1128
|
+
dir = Dir.pwd
|
1129
|
+
else
|
1130
|
+
dir = File.expand_path(dir)
|
1131
|
+
end
|
1132
|
+
options[:directory] = dir
|
1133
|
+
|
1134
|
+
meta = Zillabyte::CLI::Config.get_config_info(dir, options)
|
952
1135
|
|
953
1136
|
if meta.nil?
|
954
1137
|
error("could not find meta information for: #{dir}", type)
|
955
1138
|
end
|
956
1139
|
|
957
1140
|
if(thread_id == "")
|
958
|
-
exec(command("--execute_live --name #{name.to_s}",
|
1141
|
+
exec(command("--execute_live --name #{name.to_s}",type, dir))
|
959
1142
|
else
|
960
|
-
exec(command("--execute_live --name #{name.to_s} --pipe #{thread_id}",
|
1143
|
+
exec(command("--execute_live --name #{name.to_s} --pipe #{dir}/#{thread_id}",type, dir))
|
961
1144
|
end
|
962
1145
|
end
|
963
1146
|
alias_command "live_run", "apps:live_run"
|
964
1147
|
|
965
1148
|
|
1149
|
+
|
1150
|
+
# apps:status [DIR]
|
1151
|
+
#
|
1152
|
+
# fetches detailed status of the app
|
1153
|
+
#
|
1154
|
+
# --type TYPE # specify an output type i.e. json
|
1155
|
+
# --directory DIR # Directory of the app
|
1156
|
+
#
|
1157
|
+
def status
|
1158
|
+
|
1159
|
+
id = options[:id] || shift_argument
|
1160
|
+
type = options[:type]
|
1161
|
+
|
1162
|
+
if id.nil?
|
1163
|
+
id = read_name_from_conf(options)
|
1164
|
+
options[:is_name] = true
|
1165
|
+
elsif !(id =~ /^\d*$/)
|
1166
|
+
options[:is_name] = true
|
1167
|
+
end
|
1168
|
+
|
1169
|
+
res = api.request(
|
1170
|
+
:expects => 200,
|
1171
|
+
:method => :get,
|
1172
|
+
:path => "/flows/#{id}"
|
1173
|
+
)
|
1174
|
+
res.body
|
1175
|
+
|
1176
|
+
if type == "json"
|
1177
|
+
display res.body.to_json
|
1178
|
+
else
|
1179
|
+
# TODO
|
1180
|
+
display res.body.to_json
|
1181
|
+
end
|
1182
|
+
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
|
1186
|
+
|
1187
|
+
|
966
1188
|
# apps:info [DIR]
|
967
1189
|
#
|
968
1190
|
# outputs the info for the app in the dir.
|
@@ -972,12 +1194,20 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
972
1194
|
# --directory DIR # Directory of the app
|
973
1195
|
#
|
974
1196
|
def info
|
975
|
-
|
976
|
-
|
1197
|
+
|
1198
|
+
dir = options[:directory] || shift_argument
|
1199
|
+
if dir.nil?
|
1200
|
+
dir = Dir.pwd
|
1201
|
+
else
|
1202
|
+
dir = File.expand_path(dir)
|
1203
|
+
end
|
1204
|
+
options[:directory] = dir
|
1205
|
+
|
977
1206
|
info_file = "#{dir}/#{SecureRandom.uuid}"
|
1207
|
+
type = options[:type]
|
978
1208
|
|
979
1209
|
cmd = command("--info --file #{info_file}", type, dir)
|
980
|
-
app_info = Zillabyte::Command::Apps.get_info(cmd, info_file)
|
1210
|
+
app_info = Zillabyte::Command::Apps.get_info(cmd, info_file, dir, options)
|
981
1211
|
|
982
1212
|
if type == "json"
|
983
1213
|
puts app_info
|
@@ -997,11 +1227,14 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
997
1227
|
#
|
998
1228
|
# --type TYPE # specify an output type i.e. json
|
999
1229
|
#
|
1000
|
-
def self.get_info(cmd, info_file, options = {})
|
1230
|
+
def self.get_info(cmd, info_file, dir, options = {})
|
1001
1231
|
type = options[:type]
|
1232
|
+
|
1002
1233
|
response = `#{cmd}`
|
1003
1234
|
if($?.exitstatus == 1)
|
1235
|
+
|
1004
1236
|
File.delete("#{info_file}") if File.exists?(info_file)
|
1237
|
+
|
1005
1238
|
if options[:type].nil?
|
1006
1239
|
exit(1)
|
1007
1240
|
else
|
@@ -1022,8 +1255,8 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
1022
1255
|
File.delete("#{info_file}")
|
1023
1256
|
|
1024
1257
|
app_info = app_info.to_json
|
1025
|
-
if(File.exists?("info_to_java.in"))
|
1026
|
-
java_pipe = open("info_to_java.in","w+")
|
1258
|
+
if(File.exists?("#{dir}/info_to_java.in"))
|
1259
|
+
java_pipe = open("#{dir}/info_to_java.in","w+")
|
1027
1260
|
java_pipe.puts(app_info+"\n")
|
1028
1261
|
java_pipe.flush
|
1029
1262
|
java_pipe.close()
|
@@ -1035,13 +1268,12 @@ class Zillabyte::Command::Apps < Zillabyte::Command::Base
|
|
1035
1268
|
|
1036
1269
|
private
|
1037
1270
|
|
1038
|
-
#
|
1039
1271
|
#
|
1040
1272
|
# --type TYPE # specify an output type i.e. json
|
1041
1273
|
#
|
1042
1274
|
def command(arg="--execute_live", type = nil, dir = Dir.pwd, ignore_stderr = false)
|
1043
|
-
|
1044
1275
|
meta = Zillabyte::CLI::Config.get_config_info(dir, self, options)
|
1276
|
+
|
1045
1277
|
#meta = Zillabyte::API::Functions.get_rich_meta_info_from_script(dir, self)
|
1046
1278
|
error("could not extract meta information. missing zillabyte.conf.yml?", type) if meta.nil?
|
1047
1279
|
error(meta["error_message"], type) if meta['status'] == "error"
|