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 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