kinetic-ruby 0.2.1 → 0.3.0
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 +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
|