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 +4 -4
- data/Rakefile +9 -7
- data/lib/kinetic-ruby.rb +7 -132
- data/lib/kinetic_logger.rb +43 -0
- data/lib/kinetic_proto.rb +96 -0
- data/lib/kinetic_server.rb +111 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1840704ef9325e41a5d55525c171d5ddb13976a1
|
4
|
+
data.tar.gz: a23ef054767a14f647616611f28a21ab303827b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
2
|
-
|
3
|
-
|
1
|
+
require_relative 'kinetic_logger'
|
2
|
+
require_relative 'kinetic_proto'
|
3
|
+
require_relative 'kinetic_server'
|
4
4
|
|
5
|
-
|
5
|
+
module KineticRuby
|
6
6
|
|
7
|
-
VERSION =
|
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.
|
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-
|
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
|