kb-redstorm 0.6.4
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/CHANGELOG.md +74 -0
- data/LICENSE.md +13 -0
- data/README.md +375 -0
- data/Rakefile +11 -0
- data/bin/redstorm +15 -0
- data/examples/native/Gemfile +2 -0
- data/examples/native/cluster_word_count_topology.rb +25 -0
- data/examples/native/exclamation_bolt.rb +21 -0
- data/examples/native/local_exclamation_topology.rb +31 -0
- data/examples/native/local_exclamation_topology2.rb +48 -0
- data/examples/native/local_redis_word_count_topology.rb +69 -0
- data/examples/native/local_word_count_topology.rb +27 -0
- data/examples/native/random_sentence_spout.rb +30 -0
- data/examples/native/split_sentence_bolt.rb +20 -0
- data/examples/native/word_count_bolt.rb +26 -0
- data/examples/shell/resources/splitsentence.py +9 -0
- data/examples/shell/resources/storm.py +206 -0
- data/examples/shell/shell_topology.rb +41 -0
- data/examples/simple/exclamation_bolt.rb +10 -0
- data/examples/simple/exclamation_topology.rb +45 -0
- data/examples/simple/exclamation_topology2.rb +45 -0
- data/examples/simple/kafka_topology.rb +55 -0
- data/examples/simple/random_sentence_spout.rb +21 -0
- data/examples/simple/redis_word_count_topology.rb +61 -0
- data/examples/simple/ruby_version_topology.rb +32 -0
- data/examples/simple/split_sentence_bolt.rb +33 -0
- data/examples/simple/word_count_bolt.rb +19 -0
- data/examples/simple/word_count_topology.rb +38 -0
- data/ivy/settings.xml +11 -0
- data/lib/red_storm.rb +9 -0
- data/lib/red_storm/application.rb +85 -0
- data/lib/red_storm/configuration.rb +16 -0
- data/lib/red_storm/configurator.rb +26 -0
- data/lib/red_storm/environment.rb +41 -0
- data/lib/red_storm/loggable.rb +15 -0
- data/lib/red_storm/proxy/batch_spout.rb +71 -0
- data/lib/red_storm/proxy/bolt.rb +63 -0
- data/lib/red_storm/proxy/proxy_function.rb +48 -0
- data/lib/red_storm/proxy/spout.rb +87 -0
- data/lib/red_storm/simple_bolt.rb +135 -0
- data/lib/red_storm/simple_drpc_topology.rb +87 -0
- data/lib/red_storm/simple_spout.rb +184 -0
- data/lib/red_storm/simple_topology.rb +209 -0
- data/lib/red_storm/topology_launcher.rb +54 -0
- data/lib/red_storm/version.rb +3 -0
- data/lib/tasks/red_storm.rake +272 -0
- data/src/main/redstorm/storm/jruby/JRubyBatchSpout.java +89 -0
- data/src/main/redstorm/storm/jruby/JRubyBolt.java +88 -0
- data/src/main/redstorm/storm/jruby/JRubyProxyFunction.java +59 -0
- data/src/main/redstorm/storm/jruby/JRubyShellBolt.java +26 -0
- data/src/main/redstorm/storm/jruby/JRubyShellSpout.java +26 -0
- data/src/main/redstorm/storm/jruby/JRubySpout.java +107 -0
- metadata +134 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'red_storm'
|
2
|
+
require 'thread'
|
3
|
+
|
4
|
+
java_import 'redstorm.storm.jruby.JRubyShellBolt'
|
5
|
+
|
6
|
+
class SimpleSpout < RedStorm::SimpleSpout
|
7
|
+
on_init do
|
8
|
+
@q = Queue.new
|
9
|
+
@q << "the quick red fox"
|
10
|
+
end
|
11
|
+
|
12
|
+
on_send do
|
13
|
+
# avoid putting the thread to sleep endlessly on @q.pop which will prevent local cluster.shutdown
|
14
|
+
sleep(1)
|
15
|
+
@q.pop unless @q.empty?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ShellTopology < RedStorm::SimpleTopology
|
20
|
+
spout SimpleSpout do
|
21
|
+
output_fields :string
|
22
|
+
end
|
23
|
+
|
24
|
+
bolt JRubyShellBolt, ["python", "splitsentence.py"] do
|
25
|
+
output_fields "word"
|
26
|
+
source SimpleSpout, :shuffle
|
27
|
+
end
|
28
|
+
|
29
|
+
configure do |env|
|
30
|
+
debug true
|
31
|
+
end
|
32
|
+
|
33
|
+
on_submit do |env|
|
34
|
+
case env
|
35
|
+
when :local
|
36
|
+
sleep(10)
|
37
|
+
cluster.shutdown
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
java_import 'backtype.storm.testing.TestWordSpout'
|
2
|
+
|
3
|
+
require 'examples/simple/exclamation_bolt'
|
4
|
+
|
5
|
+
# this example topology uses the Storm TestWordSpout and our own JRuby ExclamationBolt
|
6
|
+
|
7
|
+
module RedStorm
|
8
|
+
module Examples
|
9
|
+
class ExclamationTopology < RedStorm::SimpleTopology
|
10
|
+
spout TestWordSpout, :parallelism => 5 do
|
11
|
+
debug true
|
12
|
+
end
|
13
|
+
|
14
|
+
bolt ExclamationBolt, :parallelism => 2 do
|
15
|
+
source TestWordSpout, :shuffle
|
16
|
+
# max_task_parallelism 1
|
17
|
+
end
|
18
|
+
|
19
|
+
bolt ExclamationBolt, :id => :ExclamationBolt2, :parallelism => 2 do
|
20
|
+
source ExclamationBolt, :shuffle
|
21
|
+
# max_task_parallelism 1
|
22
|
+
debug true
|
23
|
+
end
|
24
|
+
|
25
|
+
configure do |env|
|
26
|
+
debug false
|
27
|
+
set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
|
28
|
+
case env
|
29
|
+
when :local
|
30
|
+
max_task_parallelism 40
|
31
|
+
when :cluster
|
32
|
+
num_workers 20
|
33
|
+
max_spout_pending(1000);
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
on_submit do |env|
|
38
|
+
if env == :local
|
39
|
+
sleep(5)
|
40
|
+
cluster.shutdown
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
java_import 'backtype.storm.testing.TestWordSpout'
|
2
|
+
require 'red_storm'
|
3
|
+
|
4
|
+
# this example topology uses the Storm TestWordSpout and our own JRuby ExclamationBolt
|
5
|
+
# and a locally defined ExclamationBolt
|
6
|
+
|
7
|
+
module RedStorm
|
8
|
+
module Examples
|
9
|
+
class ExclamationBolt < RedStorm::SimpleBolt
|
10
|
+
output_fields :word
|
11
|
+
on_receive(:ack => true, :anchor => true) {|tuple| "!#{tuple.getString(0)}!"}
|
12
|
+
end
|
13
|
+
|
14
|
+
class ExclamationTopology2 < RedStorm::SimpleTopology
|
15
|
+
spout TestWordSpout, :parallelism => 10
|
16
|
+
|
17
|
+
bolt ExclamationBolt, :parallelism => 3 do
|
18
|
+
source TestWordSpout, :shuffle
|
19
|
+
end
|
20
|
+
|
21
|
+
bolt ExclamationBolt, :id => :ExclamationBolt2, :parallelism => 2 do
|
22
|
+
source ExclamationBolt, :shuffle
|
23
|
+
end
|
24
|
+
|
25
|
+
configure do |env|
|
26
|
+
debug true
|
27
|
+
set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
|
28
|
+
case env
|
29
|
+
when :local
|
30
|
+
max_task_parallelism 3
|
31
|
+
when :cluster
|
32
|
+
num_workers 20
|
33
|
+
max_spout_pending(1000);
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
on_submit do |env|
|
38
|
+
if env == :local
|
39
|
+
sleep(5)
|
40
|
+
cluster.shutdown
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'red_storm'
|
2
|
+
java_import 'storm.kafka.KafkaConfig'
|
3
|
+
java_import 'storm.kafka.SpoutConfig'
|
4
|
+
java_import 'storm.kafka.StringScheme'
|
5
|
+
java_import 'storm.kafka.KafkaSpout'
|
6
|
+
|
7
|
+
# the KafkaTopology obviously requires a Kafka server running, you can ajust the
|
8
|
+
# host and port below.
|
9
|
+
#
|
10
|
+
# custom dependencies are required for the Kafka and Scala jars. put the following
|
11
|
+
# dependencies in the "Dependencies" file in the root of your RedStorm project:
|
12
|
+
#
|
13
|
+
# {
|
14
|
+
# :storm_artifacts => [
|
15
|
+
# "storm:storm:0.8.1, transitive=true",
|
16
|
+
# ],
|
17
|
+
# :topology_artifacts => [
|
18
|
+
# "org.jruby:jruby-complete:1.6.8, transitive=false",
|
19
|
+
# "org.scala-lang:scala-library:2.8.0, transitive=false",
|
20
|
+
# "storm:kafka:0.7.0-incubating, transitive=false",
|
21
|
+
# "storm:storm-kafka:0.8.0-wip4, transitive=false",
|
22
|
+
# ],
|
23
|
+
# }
|
24
|
+
|
25
|
+
class KafkaTopology < RedStorm::SimpleTopology
|
26
|
+
spout_config = SpoutConfig.new(
|
27
|
+
KafkaConfig::ZkHosts.new("localhost:2181", "/brokers"),
|
28
|
+
"words", # topic to read from
|
29
|
+
"/kafkastorm", # Zookeeper root path to store the consumer offsets
|
30
|
+
"discovery" # Zookeeper consumer id to store the consumer offsets
|
31
|
+
)
|
32
|
+
spout_config.scheme = StringScheme.new
|
33
|
+
|
34
|
+
class SplitStringBolt < RedStorm::SimpleBolt
|
35
|
+
on_receive {|tuple| tuple.getString(0).split.map{|w| [w]}}
|
36
|
+
end
|
37
|
+
|
38
|
+
spout KafkaSpout, [spout_config]
|
39
|
+
|
40
|
+
bolt SplitStringBolt do
|
41
|
+
output_fields :word
|
42
|
+
source KafkaSpout, :shuffle
|
43
|
+
end
|
44
|
+
|
45
|
+
configure do |env|
|
46
|
+
debug true
|
47
|
+
end
|
48
|
+
|
49
|
+
on_submit do |env|
|
50
|
+
if env == :local
|
51
|
+
sleep(10)
|
52
|
+
cluster.shutdown
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'red_storm'
|
2
|
+
|
3
|
+
module RedStorm
|
4
|
+
module Examples
|
5
|
+
class RandomSentenceSpout < RedStorm::SimpleSpout
|
6
|
+
output_fields :word
|
7
|
+
|
8
|
+
on_send {@sentences[rand(@sentences.length)]}
|
9
|
+
|
10
|
+
on_init do
|
11
|
+
@sentences = [
|
12
|
+
"the cow jumped over the moon",
|
13
|
+
"an apple a day keeps the doctor away",
|
14
|
+
"four score and seven years ago",
|
15
|
+
"snow white and the seven dwarfs",
|
16
|
+
"i am at two with nature"
|
17
|
+
]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'red_storm'
|
3
|
+
|
4
|
+
require 'redis'
|
5
|
+
require 'thread'
|
6
|
+
require 'examples/simple/word_count_bolt'
|
7
|
+
|
8
|
+
module RedStorm
|
9
|
+
module Examples
|
10
|
+
|
11
|
+
# RedisWordSpout reads the Redis queue "test" on localhost:6379
|
12
|
+
# and emits each word items pop'ed from the queue.
|
13
|
+
|
14
|
+
class RedisWordSpout < RedStorm::SimpleSpout
|
15
|
+
output_fields :word
|
16
|
+
|
17
|
+
on_send {@q.pop.to_s if @q.size > 0}
|
18
|
+
|
19
|
+
on_init do
|
20
|
+
@q = Queue.new
|
21
|
+
@redis_reader = detach_redis_reader
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def detach_redis_reader
|
27
|
+
Thread.new do
|
28
|
+
Thread.current.abort_on_exception = true
|
29
|
+
|
30
|
+
redis = Redis.new(:host => "localhost", :port => 6379)
|
31
|
+
loop do
|
32
|
+
if data = redis.blpop("test", 0)
|
33
|
+
@q << data[1]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class RedisWordCountTopology < RedStorm::SimpleTopology
|
41
|
+
spout RedisWordSpout
|
42
|
+
|
43
|
+
bolt WordCountBolt, :parallelism => 3 do
|
44
|
+
source RedisWordSpout, :fields => ["word"]
|
45
|
+
end
|
46
|
+
|
47
|
+
configure do |env|
|
48
|
+
debug true
|
49
|
+
set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
|
50
|
+
case env
|
51
|
+
when :local
|
52
|
+
max_task_parallelism 3
|
53
|
+
when :cluster
|
54
|
+
max_task_parallelism 5
|
55
|
+
num_workers 20
|
56
|
+
max_spout_pending(1000);
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'red_storm'
|
2
|
+
|
3
|
+
# this example topology only prints the Ruby version string. No tuple is emitted.
|
4
|
+
|
5
|
+
module RedStorm
|
6
|
+
module Examples
|
7
|
+
class VersionSpout < RedStorm::SimpleSpout
|
8
|
+
output_fields :dummy
|
9
|
+
on_init {log.info("***************** RUBY_VERSION=#{RUBY_VERSION}")}
|
10
|
+
on_send {}
|
11
|
+
end
|
12
|
+
|
13
|
+
class RubyVersionTopology < RedStorm::SimpleTopology
|
14
|
+
spout VersionSpout
|
15
|
+
|
16
|
+
configure do |env|
|
17
|
+
debug true
|
18
|
+
|
19
|
+
# force the JRuby version property for this topology. this will only affect remote cluster execution
|
20
|
+
# for local execution use the --1.8|--1.9 switch when launching
|
21
|
+
# set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
|
22
|
+
end
|
23
|
+
|
24
|
+
on_submit do |env|
|
25
|
+
if env == :local
|
26
|
+
sleep(5)
|
27
|
+
cluster.shutdown
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'red_storm'
|
2
|
+
|
3
|
+
module RedStorm
|
4
|
+
module Examples
|
5
|
+
class SplitSentenceBolt < RedStorm::SimpleBolt
|
6
|
+
output_fields :word
|
7
|
+
|
8
|
+
# block declaration style using auto-emit (default)
|
9
|
+
#
|
10
|
+
on_receive {|tuple| tuple.getString(0).split(' ').map{|w| [w]}}
|
11
|
+
|
12
|
+
# block declaration style no auto-emit
|
13
|
+
#
|
14
|
+
# on_receive :emit => false do |tuple|
|
15
|
+
# tuple.getString(0).split(' ').each{|w| unanchored_emit(w)}
|
16
|
+
# end
|
17
|
+
|
18
|
+
# alternate declaration style using on_receive method
|
19
|
+
#
|
20
|
+
# on_receive :emit => true
|
21
|
+
# def on_receive(tuple)
|
22
|
+
# tuple.getString(0).split(' ').map{|w| [w]}
|
23
|
+
# end
|
24
|
+
|
25
|
+
# alternate declaration style using any specific method
|
26
|
+
#
|
27
|
+
# on_receive :my_method, :emit => true
|
28
|
+
# def my_method(tuple)
|
29
|
+
# tuple.getString(0).split(' ').map{|w| [w]}
|
30
|
+
# end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'red_storm'
|
2
|
+
|
3
|
+
module RedStorm
|
4
|
+
module Examples
|
5
|
+
class WordCountBolt < RedStorm::SimpleBolt
|
6
|
+
output_fields :word, :count
|
7
|
+
on_init {@counts = Hash.new{|h, k| h[k] = 0}}
|
8
|
+
|
9
|
+
# block declaration style using auto-emit (default)
|
10
|
+
#
|
11
|
+
on_receive do |tuple|
|
12
|
+
word = tuple.getValue(0).to_s
|
13
|
+
@counts[word] += 1
|
14
|
+
|
15
|
+
[word, @counts[word]]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'examples/simple/random_sentence_spout'
|
2
|
+
require 'examples/simple/split_sentence_bolt'
|
3
|
+
require 'examples/simple/word_count_bolt'
|
4
|
+
|
5
|
+
module RedStorm
|
6
|
+
module Examples
|
7
|
+
class WordCountTopology < SimpleTopology
|
8
|
+
spout RandomSentenceSpout, :parallelism => 5
|
9
|
+
|
10
|
+
bolt SplitSentenceBolt, :parallelism => 8 do
|
11
|
+
source RandomSentenceSpout, :shuffle
|
12
|
+
end
|
13
|
+
|
14
|
+
bolt WordCountBolt, :parallelism => 12 do
|
15
|
+
source SplitSentenceBolt, :fields => ["word"]
|
16
|
+
end
|
17
|
+
|
18
|
+
configure :word_count do |env|
|
19
|
+
debug true
|
20
|
+
set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
|
21
|
+
case env
|
22
|
+
when :local
|
23
|
+
max_task_parallelism 3
|
24
|
+
when :cluster
|
25
|
+
num_workers 20
|
26
|
+
max_spout_pending(1000);
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
on_submit do |env|
|
31
|
+
if env == :local
|
32
|
+
sleep(5)
|
33
|
+
cluster.shutdown
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/ivy/settings.xml
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
<ivysettings>
|
2
|
+
<settings defaultResolver="repositories"/>
|
3
|
+
<resolvers>
|
4
|
+
<chain name="repositories">
|
5
|
+
<ibiblio name="ibiblio" m2compatible="true"/>
|
6
|
+
<ibiblio name="maven2" root="http://repo.maven.apache.org/maven2/" m2compatible="true"/>
|
7
|
+
<ibiblio name="sonatype" root="http://repo.maven.apache.org/maven2/" m2compatible="true"/>
|
8
|
+
<ibiblio name="clojars" root="http://clojars.org/repo/" m2compatible="true"/>
|
9
|
+
</chain>
|
10
|
+
</resolvers>
|
11
|
+
</ivysettings>
|
data/lib/red_storm.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
require 'red_storm/environment'
|
4
|
+
require 'red_storm/version'
|
5
|
+
require 'red_storm/configuration'
|
6
|
+
require 'red_storm/simple_bolt'
|
7
|
+
require 'red_storm/simple_spout'
|
8
|
+
require 'red_storm/simple_topology'
|
9
|
+
require 'red_storm/simple_drpc_topology'
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'red_storm/version'
|
2
|
+
require 'red_storm/environment'
|
3
|
+
|
4
|
+
CWD = Dir.pwd
|
5
|
+
TARGET_DIR = "#{CWD}/target"
|
6
|
+
TARGET_LIB_DIR = "#{TARGET_DIR}/lib"
|
7
|
+
TARGET_SRC_DIR = "#{TARGET_DIR}/src"
|
8
|
+
TARGET_GEM_DIR = "#{TARGET_DIR}/gems/gems"
|
9
|
+
TARGET_SPECS_DIR = "#{TARGET_DIR}/gems/specifications"
|
10
|
+
TARGET_CLASSES_DIR = "#{TARGET_DIR}/classes"
|
11
|
+
TARGET_DEPENDENCY_DIR = "#{TARGET_DIR}/dependency"
|
12
|
+
TARGET_DEPENDENCY_UNPACKED_DIR = "#{TARGET_DIR}/dependency-unpacked"
|
13
|
+
TARGET_CLUSTER_JAR = "#{TARGET_DIR}/cluster-topology.jar"
|
14
|
+
|
15
|
+
REDSTORM_JAVA_SRC_DIR = "#{RedStorm::REDSTORM_HOME}/src/main"
|
16
|
+
REDSTORM_LIB_DIR = "#{RedStorm::REDSTORM_HOME}/lib"
|
17
|
+
|
18
|
+
SRC_EXAMPLES = "#{RedStorm::REDSTORM_HOME}/examples"
|
19
|
+
DST_EXAMPLES = "#{CWD}/examples"
|
20
|
+
|
21
|
+
SRC_IVY_DIR = "#{RedStorm::REDSTORM_HOME}/ivy"
|
22
|
+
DST_IVY_DIR = "#{CWD}/ivy"
|
23
|
+
CUSTOM_DEPENDENCIES = "#{CWD}/Dependencies"
|
24
|
+
DEFAULT_IVY_SETTINGS = "#{SRC_IVY_DIR}/settings.xml"
|
25
|
+
CUSTOM_IVY_SETTINGS = "#{DST_IVY_DIR}/settings.xml"
|
26
|
+
|
27
|
+
|
28
|
+
module RedStorm
|
29
|
+
|
30
|
+
class Application
|
31
|
+
TASKS_FILE = "#{RedStorm::REDSTORM_HOME}/lib/tasks/red_storm.rake"
|
32
|
+
|
33
|
+
def self.local_storm_command(class_file, ruby_mode = nil)
|
34
|
+
src_dir = File.expand_path(File.dirname(class_file))
|
35
|
+
"java -Djruby.compat.version=#{RedStorm.jruby_mode_token(ruby_mode)} -cp \"#{TARGET_CLASSES_DIR}:#{TARGET_DEPENDENCY_DIR}/storm/default/*:#{TARGET_DEPENDENCY_DIR}/topology/default/*:#{src_dir}/\" redstorm.TopologyLauncher local #{class_file}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.cluster_storm_command(class_file, ruby_mode = nil)
|
39
|
+
"storm jar #{TARGET_CLUSTER_JAR} -Djruby.compat.version=#{RedStorm.jruby_mode_token(ruby_mode)} redstorm.TopologyLauncher cluster #{class_file}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.usage
|
43
|
+
puts("usage: redstorm version")
|
44
|
+
puts(" redstorm install")
|
45
|
+
puts(" redstorm deps")
|
46
|
+
puts(" redstorm build")
|
47
|
+
puts(" redstorm examples")
|
48
|
+
puts(" redstorm bundle [BUNDLER_GROUP]")
|
49
|
+
puts(" redstorm jar DIR1, [DIR2, ...]")
|
50
|
+
puts(" redstorm local [--1.8|--1.9] TOPOLOGY_CLASS_PATH")
|
51
|
+
puts(" redstorm cluster [--1.8|--1.9] TOPOLOGY_CLASS_PATH")
|
52
|
+
exit(1)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.run(args)
|
56
|
+
if args.size > 0
|
57
|
+
if args[0] == "version"
|
58
|
+
puts("RedStorm v#{VERSION}")
|
59
|
+
exit
|
60
|
+
elsif ["install", "examples", "jar", "bundle", "deps", "build"].include?(args[0])
|
61
|
+
load(TASKS_FILE)
|
62
|
+
Rake::Task[args.shift].invoke(args.join(":"))
|
63
|
+
exit
|
64
|
+
elsif args.size >= 2 && ["local", "cluster"].include?(args[0])
|
65
|
+
env = args.delete_at(0)
|
66
|
+
version = args.delete("--1.8") || args.delete("--1.9")
|
67
|
+
if args.size == 1
|
68
|
+
file = args[0]
|
69
|
+
load(TASKS_FILE)
|
70
|
+
Rake::Task['launch'].invoke(env, version, file)
|
71
|
+
exit
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
usage
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.subshell(command)
|
79
|
+
out = IO.popen(command, {:err => [:child, :out]}) {|io| io.read}
|
80
|
+
[!!$?.success?, out]
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|