kinetic-ruby 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ce317494566b4a799ad6f6d0fcd85b76710236ac
4
- data.tar.gz: 16d20839e916fe61f7d8af3efbee17ce58f24acd
3
+ metadata.gz: 1840704ef9325e41a5d55525c171d5ddb13976a1
4
+ data.tar.gz: a23ef054767a14f647616611f28a21ab303827b1
5
5
  SHA512:
6
- metadata.gz: e328a4e1ec4b30b4f558d5d7125bee2e402a6f8db56dc371e4bb9d969370ccb8a57406c78cbe50ff7115195ef4d237c784b8d20de4606b538317415b05ab2ce4
7
- data.tar.gz: acef68467e27a99e6e7792085abf33ca24dcd663c271561468e82de8b52560a9f264bafdcd9036db3b7b0d2fb756d27970b565e4a047e29ea8329232fb200684
6
+ metadata.gz: 14e8e1d553598b0bdef56324090ddfb4325bdb170d0350f86775faa2f602c4c48af3c7f08eabf2b3afe486063d8fdb29be4170bfcfc04744dae8152149806be0
7
+ data.tar.gz: f285d6d15043214f08b5319f444f745360bb0cd0ef2a0c7aa76044adc119bcfdc100103fec21336ea1060339f29664f842264cfaf7b1c9131e97b0612dec4189
data/Rakefile CHANGED
@@ -1,27 +1,29 @@
1
+ HERE = File.expand_path(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift File.join(HERE, 'lib')
3
+
1
4
  require 'rake'
2
5
  require 'rake/clean'
3
- require_relative 'lib/kinetic-ruby'
6
+ require 'kinetic-ruby'
7
+
8
+ load 'tasks/kinetic-ruby.rake'
4
9
 
5
10
  CLEAN.include ['*.gem', '*.log']
6
11
 
7
12
  desc "Run example"
8
13
  task :example do
9
- kr = KineticRuby.new
10
- kr.log_level = KineticRuby::LOG_LEVEL_INFO
14
+ kr = KineticRuby::Proto.new
11
15
  kr.test_kinetic_proto
12
16
  end
13
17
 
14
18
  desc "Run example w/o logging"
15
19
  task :example_no_log do
16
- kr = KineticRuby.new
17
- kr.log_level = KineticRuby::LOG_LEVEL_NONE
20
+ kr = KineticRuby::Proto.new(KineticRuby::Logger::LOG_LEVEL_NONE)
18
21
  kr.test_kinetic_proto
19
22
  end
20
23
 
21
24
  desc "Run example w/ verbose logging"
22
25
  task :example_verbose_log do
23
- kr = KineticRuby.new
24
- kr.log_level = KineticRuby::LOG_LEVEL_VERBOSE
26
+ kr = KineticRuby::Proto.new(KineticRuby::Logger::LOG_LEVEL_VERBOSE)
25
27
  kr.test_kinetic_proto
26
28
  end
27
29
 
data/lib/kinetic-ruby.rb CHANGED
@@ -1,10 +1,12 @@
1
- require_relative "protobuf/kinetic.pb"
2
- require 'yaml'
3
- require 'fileutils'
1
+ require_relative 'kinetic_logger'
2
+ require_relative 'kinetic_proto'
3
+ require_relative 'kinetic_server'
4
4
 
5
- class KineticRuby
5
+ module KineticRuby
6
6
 
7
- VERSION = "0.2.1"
7
+ VERSION = '0.3.0'
8
+ DEFAULT_KINETIC_PORT = 8123
9
+ TEST_KINETIC_PORT = 8999
8
10
 
9
11
  kp_tag = ''
10
12
  FileUtils.cd "./vendor/kinetic-protocol" do
@@ -13,131 +15,4 @@ class KineticRuby
13
15
  end
14
16
  KINETIC_PROTOCOL_VERSION = kp_tag
15
17
 
16
- LOG_LEVELS = [
17
- LOG_LEVEL_NONE = 0,
18
- LOG_LEVEL_ERROR = 1,
19
- LOG_LEVEL_INFO = 2,
20
- LOG_LEVEL_VERBOSE = 3,
21
- ]
22
-
23
- def initialize
24
- @message_out = nil
25
- @message_in = nil
26
- @log_level = LOG_LEVEL_NONE
27
- end
28
-
29
- def log_level=(level)
30
- if !LOG_LEVELS.include? level
31
- raise "\nInvalid LOG_LEVEL specified!\nValid levels:\n\t" +
32
- LOG_LEVELS.map{|l|"#{self.class}::#{l}"}.join("\n\t") + "\n\n"
33
- end
34
- @log_level = level
35
- end
36
-
37
- def encode_test_message
38
- encode
39
- end
40
-
41
- def test_kinetic_proto
42
- msg = encode
43
- decode msg
44
- puts
45
- puts "Kinetic Protocol protobuf encode/decode test passed!"
46
- end
47
-
48
- private
49
-
50
- def log_err(msg='')
51
- log_message(msg, $stderr) if @log_level >= LOG_LEVEL_ERROR
52
- end
53
-
54
- def log_info(msg='')
55
- log_message(msg) if @log_level >= LOG_LEVEL_INFO
56
- end
57
-
58
- alias log log_info
59
-
60
- def log_verbose(msg='')
61
- log_message(msg) if @log_level >= LOG_LEVEL_VERBOSE
62
- end
63
-
64
- def log_message(msg='', stream=$stdout)
65
- $stderr.flush
66
- stream.flush
67
- stream.puts msg
68
- stream.flush
69
- end
70
-
71
- def encode
72
- pb = Seagate::Kinetic::Message.new
73
-
74
- log
75
- log "#{pb.class} - Encoding"
76
- log "---------------------------------------"
77
-
78
- log_verbose " fields:"
79
- pb.fields.sort.each{|f| log_verbose " #{f}"}
80
- log_verbose
81
-
82
- log_verbose " hmac:"
83
- pb.hmac = "0123456789ABCDEF0123"
84
- log_verbose " #{pb.hmac.inspect}"
85
- log_verbose
86
-
87
- log " command:"
88
- pb.command = Seagate::Kinetic::Message::Command.new(
89
- header: Seagate::Kinetic::Message::Header.new(
90
- clusterVersion: 0x1122334455667788,
91
- identity: 0x1234567898654321
92
- ),
93
- body: Seagate::Kinetic::Message::Body.new(
94
- keyValue: Seagate::Kinetic::Message::KeyValue.new(
95
- key: "KeYvAl"
96
- )
97
- ),
98
- status: Seagate::Kinetic::Message::Status.new(
99
- code: Seagate::Kinetic::Message::Status::StatusCode::NO_SUCH_HMAC_ALGORITHM,
100
- statusMessage: "The specified HMAC security algorithm does not exist!",
101
- detailedMessage: "YOUCH!"
102
- ),
103
- )
104
- pb.command.to_yaml.each_line{|l| log(" #{l}")}
105
- log
106
-
107
- @message_out = pb
108
-
109
- log " encoded:"
110
- encoded = pb.encode
111
- log_verbose
112
- log_verbose " Inspection: #{encoded.inspect}"
113
- log_verbose
114
- log_verbose " Content:"
115
- encoded.to_yaml.each_line{|l| log_verbose " #{l}"}
116
- log_verbose
117
- log " Length: #{encoded.length} bytes"
118
- log
119
-
120
- return encoded
121
- end
122
-
123
- def decode(buf)
124
-
125
- @message_in = Seagate::Kinetic::Message.decode(buf)
126
-
127
- log
128
- log "#{@message_in.class} - Decoding"
129
- log "-----------------------------------"
130
-
131
- log " command:"
132
- @message_in.command.to_yaml.each_line{|l| log " #{l}"}
133
- log
134
-
135
- if @message_in != @message_out
136
- log_err "Inbound/outbound messages do not match!\n\n"
137
- raise "\nKinetic Protocol message roundtrip FAILED!\n\n"
138
- end
139
-
140
- log "Kinetic Protocol message roundtrip SUCCESS!"
141
- end
142
-
143
18
  end
@@ -0,0 +1,43 @@
1
+ module KineticRuby
2
+ class Logger
3
+ def initialize(logging_level=LOG_LEVEL_INFO, stream=$stdout)
4
+ set_log_level(logging_level)
5
+ @stream = stream
6
+ end
7
+
8
+ LOG_LEVELS = [
9
+ LOG_LEVEL_NONE = 0,
10
+ LOG_LEVEL_ERROR = 1,
11
+ LOG_LEVEL_INFO = 2,
12
+ LOG_LEVEL_VERBOSE = 3,
13
+ ]
14
+
15
+ def set_log_level(level)
16
+ if !LOG_LEVELS.include? level
17
+ raise "\nInvalid LOG_LEVEL specified!\nValid levels:\n\t" +
18
+ LOG_LEVELS.map{|l|"#{self.class}::#{l}"}.join("\n\t") + "\n\n"
19
+ end
20
+ @level = level
21
+ end
22
+
23
+ def log_info(msg='')
24
+ log_message(msg) if @level >= LOG_LEVEL_INFO
25
+ end
26
+ alias log log_info
27
+
28
+ def log_err(msg='')
29
+ log_message(msg, $stderr) if @level >= LOG_LEVEL_ERROR
30
+ end
31
+
32
+ def log_verbose(msg='')
33
+ log_message(msg) if @level >= LOG_LEVEL_VERBOSE
34
+ end
35
+
36
+ def log_message(msg='')
37
+ $stderr.flush
38
+ @stream.flush
39
+ @stream.puts msg
40
+ @stream.flush
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,96 @@
1
+ require 'yaml'
2
+ require 'fileutils'
3
+ require_relative 'kinetic_logger'
4
+ require_relative 'kinetic_server'
5
+
6
+ module KineticRuby
7
+
8
+ class Proto
9
+
10
+ def initialize(log_level = KineticRuby::Logger::LOG_LEVEL_INFO)
11
+ require_relative "protobuf/kinetic.pb"
12
+ @message_out = nil
13
+ @message_in = nil
14
+ @logger = KineticRuby::Logger.new(log_level)
15
+ end
16
+
17
+ def decode(buf)
18
+ @message_in = Seagate::Kinetic::Message.decode(buf)
19
+
20
+ @logger.log
21
+ @logger.log "#{@message_in.class} - Decoding"
22
+ @logger.log "-----------------------------------"
23
+
24
+ @logger.log " command:"
25
+ @message_in.command.to_yaml.each_line{|l| @logger.log " #{l}"}
26
+ @logger.log
27
+ end
28
+
29
+ def test_encode
30
+ pb = Seagate::Kinetic::Message.new
31
+
32
+ @logger.log
33
+ @logger.log "#{pb.class} - Encoding"
34
+ @logger.log "---------------------------------------"
35
+
36
+ @logger.log_verbose " fields:"
37
+ pb.fields.sort.each{|f| @logger.log_verbose " #{f}"}
38
+ @logger.log_verbose
39
+
40
+ @logger.log_verbose " hmac:"
41
+ pb.hmac = "0123456789ABCDEF0123"
42
+ @logger.log_verbose " #{pb.hmac.inspect}"
43
+ @logger.log_verbose
44
+
45
+ @logger.log " command:"
46
+ pb.command = Seagate::Kinetic::Message::Command.new(
47
+ header: Seagate::Kinetic::Message::Header.new(
48
+ clusterVersion: 0x1122334455667788,
49
+ identity: 0x1234567898654321
50
+ ),
51
+ body: Seagate::Kinetic::Message::Body.new(
52
+ keyValue: Seagate::Kinetic::Message::KeyValue.new(
53
+ key: "KeYvAl"
54
+ )
55
+ ),
56
+ status: Seagate::Kinetic::Message::Status.new(
57
+ code: Seagate::Kinetic::Message::Status::StatusCode::NO_SUCH_HMAC_ALGORITHM,
58
+ statusMessage: "The specified HMAC security algorithm does not exist!",
59
+ detailedMessage: "YOUCH!"
60
+ ),
61
+ )
62
+ pb.command.to_yaml.each_line{|l| @logger.log(" #{l}")}
63
+ @logger.log
64
+
65
+ @message_out = pb
66
+
67
+ @logger.log " encoded:"
68
+ encoded = pb.encode
69
+ @logger.log_verbose
70
+ @logger.log_verbose " Inspection: #{encoded.inspect}"
71
+ @logger.log_verbose
72
+ @logger.log_verbose " Content:"
73
+ encoded.to_yaml.each_line{|l| @logger.log_verbose " #{l}"}
74
+ @logger.log_verbose
75
+ @logger.log " Length: #{encoded.length} bytes"
76
+ @logger.log
77
+
78
+ return encoded
79
+ end
80
+
81
+ def test_kinetic_proto
82
+ msg = test_encode
83
+ decode msg
84
+
85
+ if @message_in != @message_out
86
+ @logger.log_err "Inbound/outbound messages do not match!\n\n"
87
+ raise "\nKinetic Protocol message roundtrip FAILED!\n\n"
88
+ end
89
+
90
+ @logger.log
91
+ @logger.log "Kinetic Protocol protobuf encode/decode test passed!"
92
+ @logger.log
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,111 @@
1
+ require_relative 'kinetic-ruby'
2
+
3
+ $kinetic_server = nil
4
+
5
+ module KineticRuby
6
+
7
+ class Server
8
+
9
+ def initialize(port = nil, logger = nil)
10
+ port ||= DEFAULT_KINETIC_PORT
11
+ raise "Invalid Kinetic test server port specified (port: #{port})" if !port || port < 0
12
+ @port = port
13
+ @logger = logger
14
+ @server = nil
15
+ @worker = nil
16
+ @listeners = []
17
+ end
18
+
19
+ def report(message='')
20
+ $stderr.flush
21
+ $stdout.flush
22
+ puts message
23
+ $stderr.flush
24
+ $stdout.flush
25
+ end
26
+
27
+ def report_banner(message)
28
+ report "\n#{message}\n#{'='*message.length}\n\n"
29
+ end
30
+
31
+ def report_buffer(buf)
32
+ bytes = buf.bytes
33
+ row_len = 16
34
+ report "Raw Data:"
35
+ while !bytes.empty?
36
+ row_len = bytes.count >= row_len ? row_len : bytes.count
37
+ row = bytes.slice!(row_len)
38
+ msg = " "
39
+ row.each do |b|
40
+ msg += sprintf("0x%02X", b)
41
+ end
42
+ report msg
43
+ end
44
+ report
45
+ end
46
+
47
+ def start
48
+ return unless @server.nil?
49
+
50
+ @server = TCPServer.new @port
51
+ @listeners = []
52
+
53
+ # Setup handler for signaled shutdown (via ctrl+c)
54
+ trap("INT") do
55
+ report "Kinetic Test Server: INT triggered Kintic Test Server shutdown"
56
+ shutdown
57
+ end
58
+
59
+ # Create worker thread for test server to run in so we can continue
60
+ @worker = Thread.new do
61
+ report "Kinetic Test Server: Listening for Kinetic clients..."
62
+ loop do
63
+ @listeners << Thread.start(@server.accept) do |client|
64
+ report "Kinetic Test Server: Connected to #{client.inspect}"
65
+ request = ""
66
+ while request += client.getc # Read characters from socket
67
+
68
+ request_match = request.match(/^read\((\d+)\)/)
69
+ if request_match
70
+ len = request_match[1].to_i
71
+ response = "G"*len
72
+ report "Kinetic Test Server: Responding to 'read(#{len})' w/ '#{response}'"
73
+ client.write response
74
+ request = ""
75
+
76
+ elsif request =~ /^readProto()/
77
+ kruby = KineticRuby::Server.new
78
+ response = kruby.encode_test_message
79
+ report "Kinetic Test Server: Responding to 'read(#{len})' w/ dummy protobuf (#{response.length} bytes)"
80
+ client.write response
81
+ request = ""
82
+
83
+ elsif request.length > 20
84
+ report_banner "Received unknown data:"
85
+ report_buffer(request)
86
+ end
87
+
88
+ end
89
+ report "Kinetic Test Server: Client #{client.inspect} disconnected!"
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ def shutdown
97
+ return if @server.nil?
98
+ report "Kinetic Test Server: shutting down..."
99
+ @listeners.each do |client|
100
+ client.join(0.3) if client.alive?
101
+ end
102
+ @listeners = []
103
+ @worker.exit
104
+ @worker = nil
105
+ @server.close
106
+ @server = nil
107
+ report "Kinetic Test Server: shutdown complete"
108
+ end
109
+
110
+ end
111
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kinetic-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-24 00:00:00.000000000 Z
11
+ date: 2014-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -63,6 +63,9 @@ files:
63
63
  - Rakefile
64
64
  - LICENSE
65
65
  - ./lib/kinetic-ruby.rb
66
+ - ./lib/kinetic_logger.rb
67
+ - ./lib/kinetic_proto.rb
68
+ - ./lib/kinetic_server.rb
66
69
  - ./lib/protobuf/kinetic.pb.rb
67
70
  - ./vendor/kinetic-protocol/kinetic.proto
68
71
  - ./vendor/kinetic-protocol/README.md