bayserver-core 2.2.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.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
  3. data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
  4. data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
  5. data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
  6. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
  7. data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
  8. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
  9. data/lib/baykit/bayserver/agent/package.rb +3 -0
  10. data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
  11. data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
  12. data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
  13. data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
  14. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
  15. data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
  16. data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
  17. data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
  18. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
  19. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
  20. data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
  21. data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
  22. data/lib/baykit/bayserver/bay_dockers.rb +60 -0
  23. data/lib/baykit/bayserver/bay_exception.rb +12 -0
  24. data/lib/baykit/bayserver/bay_log.rb +148 -0
  25. data/lib/baykit/bayserver/bay_message.rb +20 -0
  26. data/lib/baykit/bayserver/bayserver.rb +529 -0
  27. data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
  28. data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
  29. data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
  30. data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
  31. data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
  32. data/lib/baykit/bayserver/bcf/package.rb +6 -0
  33. data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
  34. data/lib/baykit/bayserver/config_exception.rb +25 -0
  35. data/lib/baykit/bayserver/constants.rb +8 -0
  36. data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
  37. data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
  38. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
  39. data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
  40. data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
  41. data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
  42. data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
  43. data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
  44. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
  45. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
  46. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
  47. data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
  48. data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
  49. data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
  50. data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
  51. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
  52. data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
  53. data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
  54. data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
  55. data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
  56. data/lib/baykit/bayserver/docker/city.rb +22 -0
  57. data/lib/baykit/bayserver/docker/club.rb +45 -0
  58. data/lib/baykit/bayserver/docker/docker.rb +8 -0
  59. data/lib/baykit/bayserver/docker/harbor.rb +34 -0
  60. data/lib/baykit/bayserver/docker/log.rb +17 -0
  61. data/lib/baykit/bayserver/docker/package.rb +12 -0
  62. data/lib/baykit/bayserver/docker/permission.rb +18 -0
  63. data/lib/baykit/bayserver/docker/port.rb +39 -0
  64. data/lib/baykit/bayserver/docker/reroute.rb +17 -0
  65. data/lib/baykit/bayserver/docker/secure.rb +22 -0
  66. data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
  67. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
  68. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
  69. data/lib/baykit/bayserver/docker/town.rb +30 -0
  70. data/lib/baykit/bayserver/docker/trouble.rb +17 -0
  71. data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
  72. data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
  73. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
  74. data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
  75. data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
  76. data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
  77. data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
  78. data/lib/baykit/bayserver/http_exception.rb +33 -0
  79. data/lib/baykit/bayserver/mem_usage.rb +104 -0
  80. data/lib/baykit/bayserver/protocol/command.rb +21 -0
  81. data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
  82. data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
  83. data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
  84. data/lib/baykit/bayserver/protocol/package.rb +15 -0
  85. data/lib/baykit/bayserver/protocol/packet.rb +63 -0
  86. data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
  87. data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
  88. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
  89. data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
  90. data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
  91. data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
  92. data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
  93. data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
  94. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
  95. data/lib/baykit/bayserver/sink.rb +22 -0
  96. data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
  97. data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
  98. data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
  99. data/lib/baykit/bayserver/tours/package.rb +4 -0
  100. data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
  101. data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
  102. data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
  103. data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
  104. data/lib/baykit/bayserver/tours/tour.rb +195 -0
  105. data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
  106. data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
  107. data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
  108. data/lib/baykit/bayserver/train/train.rb +54 -0
  109. data/lib/baykit/bayserver/train/train_runner.rb +32 -0
  110. data/lib/baykit/bayserver/util/byte_array.rb +54 -0
  111. data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
  112. data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
  113. data/lib/baykit/bayserver/util/char_util.rb +22 -0
  114. data/lib/baykit/bayserver/util/cities.rb +45 -0
  115. data/lib/baykit/bayserver/util/class_util.rb +17 -0
  116. data/lib/baykit/bayserver/util/counter.rb +23 -0
  117. data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
  118. data/lib/baykit/bayserver/util/executor_service.rb +81 -0
  119. data/lib/baykit/bayserver/util/groups.rb +110 -0
  120. data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
  121. data/lib/baykit/bayserver/util/headers.rb +194 -0
  122. data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
  123. data/lib/baykit/bayserver/util/http_status.rb +60 -0
  124. data/lib/baykit/bayserver/util/http_util.rb +157 -0
  125. data/lib/baykit/bayserver/util/io_util.rb +32 -0
  126. data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
  127. data/lib/baykit/bayserver/util/key_val.rb +15 -0
  128. data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
  129. data/lib/baykit/bayserver/util/locale.rb +30 -0
  130. data/lib/baykit/bayserver/util/md5_password.rb +24 -0
  131. data/lib/baykit/bayserver/util/message.rb +56 -0
  132. data/lib/baykit/bayserver/util/mimes.rb +27 -0
  133. data/lib/baykit/bayserver/util/object_factory.rb +13 -0
  134. data/lib/baykit/bayserver/util/object_store.rb +74 -0
  135. data/lib/baykit/bayserver/util/postman.rb +35 -0
  136. data/lib/baykit/bayserver/util/reusable.rb +13 -0
  137. data/lib/baykit/bayserver/util/selector.rb +141 -0
  138. data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
  139. data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
  140. data/lib/baykit/bayserver/util/string_util.rb +73 -0
  141. data/lib/baykit/bayserver/util/sys_util.rb +138 -0
  142. data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
  143. data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
  144. data/lib/baykit/bayserver/util/valve.rb +15 -0
  145. data/lib/baykit/bayserver/version.rb +7 -0
  146. data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
  147. data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
  148. data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
  149. metadata +189 -0
@@ -0,0 +1,112 @@
1
+ require 'baykit/bayserver/agent/next_socket_action'
2
+ require 'baykit/bayserver/agent/transporter/data_listener'
3
+ require 'baykit/bayserver/docker/warp/warp_ship'
4
+ require 'baykit/bayserver/tours/tour'
5
+ require 'baykit/bayserver/util/counter'
6
+ require 'baykit/bayserver/util/http_status'
7
+
8
+ module Baykit
9
+ module BayServer
10
+ module Docker
11
+ module Warp
12
+ class WarpDataListener
13
+
14
+ include Baykit::BayServer::Agent::Transporter::DataListener # implements
15
+
16
+ include Baykit::BayServer::Agent
17
+ include Baykit::BayServer::Util
18
+ include Baykit::BayServer::Tours
19
+
20
+ attr :ship
21
+
22
+ def initialize(sip)
23
+ @ship = sip
24
+ end
25
+
26
+ def to_s()
27
+ return @ship.to_s
28
+ end
29
+
30
+ ######################################################
31
+ # Implements DataListener
32
+ ######################################################
33
+
34
+ def notify_handshake_done(protocol)
35
+ @ship.protocol_handler.verify_protocol(protocol)
36
+
37
+ # Send pending packet
38
+ @ship.agent.non_blocking_handler.ask_to_write(@ship.socket)
39
+ NextSocketAction::CONTINUE
40
+ end
41
+
42
+ def notify_connect
43
+ @ship.connected = true
44
+ @ship.tour_map.values.each do |pair|
45
+ tur = pair[1]
46
+ tur.check_tour_id pair[0]
47
+ WarpData.get(tur).start
48
+ end
49
+ NextSocketAction::CONTINUE
50
+ end
51
+
52
+ def notify_read(buf, adr)
53
+ return @ship.protocol_handler.bytes_received(buf)
54
+ end
55
+
56
+ def notify_eof
57
+ BayLog.debug("%s EOF detected", self)
58
+
59
+ if @ship.tour_map.empty?
60
+ BayLog.debug("%s No warp tours. only close", self)
61
+ return NextSocketAction::CLOSE
62
+ end
63
+
64
+ @ship.tour_map.keys.each do |warp_id|
65
+ pair = @ship.tour_map[warp_id]
66
+ tur = pair[1]
67
+ tur.check_tour_id pair[0]
68
+
69
+ if !tur.res.header_sent
70
+ BayLog.error("%s Send ServiceUnavailable: tur=%s", self, tur);
71
+ tur.res.send_error(Tour::TOUR_ID_NOCHECK, HttpStatus::SERVICE_UNAVAILABLE, "Server closed on reading headers")
72
+ else
73
+ # NOT treat EOF as Error
74
+ BayLog.debug("%s EOF is not an error: tur=%s", self, tur);
75
+ begin
76
+ tur.res.end_content(Tour::TOUR_ID_NOCHECK)
77
+ rescue IOError => e
78
+ BayLog::debug_e(e, "%s end content error: tur=%s", self, tur);
79
+ end
80
+ end
81
+ end
82
+
83
+ @ship.tour_map.clear()
84
+ return NextSocketAction::CLOSE
85
+ end
86
+
87
+ def notify_protocol_error(err)
88
+ BayLog.error_e(err)
89
+ self.ship.notify_error_to_owner_tour(HttpStatus::SERVICE_UNAVAILABLE, err.message)
90
+ true
91
+ end
92
+
93
+ def check_timeout(duration_sec)
94
+ if @ship.is_timeout(duration_sec)
95
+ self.ship.notify_error_to_owner_tour(HttpStatus::GATEWAY_TIMEOUT, "#{self} server timeout")
96
+ true
97
+ else
98
+ false
99
+ end
100
+ end
101
+
102
+ def notify_close()
103
+ BayLog.debug("%s notifyClose", self)
104
+ self.ship.notify_error_to_owner_tour(HttpStatus::SERVICE_UNAVAILABLE, "#{self} server closed")
105
+ self.ship.end_ship()
106
+ end
107
+
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,273 @@
1
+ require 'uri'
2
+
3
+ require 'baykit/bayserver/agent/grand_agent'
4
+ require 'baykit/bayserver/docker/base/club_base'
5
+ require 'baykit/bayserver/docker/warp/warp_data'
6
+ require 'baykit/bayserver/docker/warp/warp_data_listener'
7
+ require 'baykit/bayserver/docker/warp/warp_ship_store'
8
+
9
+ module Baykit
10
+ module BayServer
11
+ module Docker
12
+ module Warp
13
+ class WarpDocker < Baykit::BayServer::Docker::Base::ClubBase
14
+
15
+ include Baykit::BayServer::Agent
16
+ include Baykit::BayServer::Protocol
17
+ include Baykit::BayServer::Bcf
18
+ include Baykit::BayServer::Util
19
+ include Baykit::BayServer::Docker::Warp
20
+
21
+ class AgentListener
22
+ include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener
23
+
24
+ attr :warp_docker
25
+
26
+ def initialize(dkr)
27
+ @warp_docker = dkr
28
+ end
29
+
30
+ def add(agt)
31
+ @warp_docker.stores[agt.agent_id] = WarpShipStore.new(@warp_docker.max_ships);
32
+ end
33
+
34
+ def remove(agt)
35
+ @warp_docker.stores.delete(agt.agent_id);
36
+ end
37
+ end
38
+
39
+
40
+ class WarpShipHolder
41
+ attr :owner_id
42
+ attr :ship_id
43
+ attr :ship
44
+
45
+ def initialize(owner_id, ship_id, ship)
46
+ @owner_id = owner_id
47
+ @ship_id = ship_id
48
+ @ship = ship
49
+ end
50
+ end
51
+
52
+ attr :scheme
53
+ attr :host
54
+ attr :port
55
+ attr :warp_base
56
+ attr :max_ships
57
+ attr :cur_ships
58
+ attr :host_addr
59
+ attr :timeout_sec
60
+ attr :tour_list
61
+ attr :lock
62
+
63
+ # Agent ID => WarpShipStore
64
+ attr :stores
65
+
66
+ ######################################################
67
+ # Abstract methods
68
+ ######################################################
69
+ #
70
+ #
71
+ # public abstract boolean secure();
72
+ # protected abstract String protocol();
73
+ # protected abstract Transporter newTransporter(ShipAgent agent, SocketChannel ch);
74
+ #
75
+
76
+ def initialize
77
+ super
78
+ @scheme = nil
79
+ @host = nil
80
+ @port = 0
81
+ @warp_base = nil
82
+ @max_ships = -1
83
+ @cur_ships = 0
84
+ @host_addr = nil
85
+ @tour_list = []
86
+ @timeout_sec = -1 # -1 means "Use harbor.socketTimeoutSec"
87
+ @stores = {}
88
+ @lock = Mutex.new
89
+ end
90
+
91
+ ######################################################
92
+ # Implements DockerBase
93
+ ######################################################
94
+
95
+ def init(elm, parent)
96
+ super
97
+
98
+ if @warp_base == nil
99
+ @warp_base = "/"
100
+ end
101
+
102
+ @host_addr = []
103
+ if @host && @host.start_with?(":unix:")
104
+ @host_addr << :UNIX
105
+ @host_addr << Socket.sockaddr_un(@host[6 .. -1])
106
+ @port = -1
107
+ else
108
+
109
+ if @port <= 0
110
+ @port = 80
111
+ end
112
+
113
+ @host_addr << :INET
114
+
115
+ begin
116
+ addrs = Addrinfo.getaddrinfo(@host, @port, nil, :STREAM)
117
+ rescue SocketError => e
118
+ BayLog.error_e(e)
119
+ raise ConfigException.new(elm.file_name, elm.line_no, "Invalid address: %s:%d", @host, @port)
120
+ end
121
+ inet4_addr = nil
122
+ inet6_addr = nil
123
+ if addrs
124
+ addrs.each do |adr|
125
+ if adr.ipv4?
126
+ inet4_addr = adr
127
+ elsif adr.ipv6?
128
+ inet6_addr = adr
129
+ end
130
+ end
131
+ end
132
+
133
+ if inet4_addr
134
+ @host_addr << inet4_addr
135
+ elsif inet6_addr
136
+ @host_addr << inet6_addr
137
+ else
138
+ raise ConfigException.new(elm.file_name, elm.line_no, "Host not found: %s", @host)
139
+ end
140
+
141
+
142
+
143
+ end
144
+
145
+ GrandAgent.add_lifecycle_listener(AgentListener.new(self));
146
+
147
+ BayLog.info("WarpDocker[%s] host=%s port=%d adr=%s", @warp_base, @host, @port, @host_addr)
148
+ end
149
+
150
+ def init_key_val(kv)
151
+ case kv.key.downcase
152
+
153
+ when "destcity"
154
+ @host = kv.value
155
+
156
+ when "destport"
157
+ @port = kv.value.to_i
158
+
159
+ when "desttown"
160
+ @warp_base = kv.value
161
+ if !@warp_base.end_with?("/")
162
+ @warp_base += "/"
163
+ end
164
+
165
+ when "maxships"
166
+ @max_ships = kv.value.to_i
167
+
168
+ when "timeout"
169
+ @timeout_sec = kv.value.to_i
170
+
171
+ else
172
+ return super
173
+ end
174
+ return true
175
+ end
176
+
177
+ ######################################################
178
+ # Implements Club
179
+ ######################################################
180
+
181
+ def arrive(tur)
182
+ agt = tur.ship.agent
183
+ sto = get_ship_store(agt.agent_id)
184
+
185
+ wsip = sto.rent()
186
+ if wsip == nil
187
+ BayLog.warn("%s Busy!", self)
188
+ raise HttpException.new HttpStatus::INTERNAL_SERVER_ERROR, "WarpDocker busy"
189
+ end
190
+
191
+ begin
192
+ BayLog.trace("%s got from store", wsip)
193
+ need_connect = false
194
+
195
+ if !wsip.initialized
196
+ if @host_addr[0] == :UNIX
197
+ skt = Socket.new(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
198
+ else
199
+ skt = Socket.new(@host_addr[1].ipv4? ? Socket::AF_INET : Socket::AF_INET6, Socket::SOCK_STREAM, 0)
200
+ end
201
+ skt.nonblock = true
202
+
203
+ tp = new_transporter(agt, skt)
204
+ proto_hnd = ProtocolHandlerStore.get_store(protocol(), false, agt.agent_id).rent()
205
+ wsip.init_warp(skt, agt, tp, self, proto_hnd)
206
+ tp.init(agt.non_blocking_handler, skt, WarpDataListener.new(wsip))
207
+ BayLog.debug("%s init warp ship", wsip)
208
+ BayLog.debug("%s Connect to %s:%d skt=%s", wsip, @host, @port, skt)
209
+
210
+ need_connect = true
211
+ end
212
+
213
+ @lock.synchronize do
214
+ @tour_list.append(tur)
215
+ end
216
+
217
+ wsip.start_warp_tour(tur)
218
+
219
+ if need_connect
220
+ agt.non_blocking_handler.add_channel_listener(wsip.socket, tp)
221
+ agt.non_blocking_handler.ask_to_connect(wsip.socket, @host_addr[1])
222
+ end
223
+
224
+ rescue SystemCallError => e
225
+ wsip.end_warp_tour(tur)
226
+ raise e
227
+ rescue HttpException => e
228
+ raise e
229
+ end
230
+
231
+ end
232
+
233
+
234
+
235
+ ######################################################
236
+ # Implements WarpDocker
237
+ ######################################################
238
+ def keep_ship(wsip)
239
+ BayLog.debug("%s keepShip: %s", self, wsip)
240
+ get_ship_store(wsip.agent.agent_id).keep(wsip)
241
+ end
242
+
243
+ def return_ship(wsip)
244
+ BayLog.debug("%s return ship: %s", self, wsip);
245
+ get_ship_store(wsip.agent.agent_id).Return(wsip)
246
+ end
247
+
248
+ def return_protocol_handler(agt, phnd)
249
+ BayLog.debug("%s Return protocol handler: ", phnd)
250
+ get_protocol_handler_store(agt.agent_id).Return(phnd)
251
+ end
252
+
253
+ ######################################################
254
+ # Other methods
255
+ ######################################################
256
+ def get_ship_store(agent_id)
257
+ return @stores[agent_id]
258
+ end
259
+
260
+ ######################################################
261
+ # private methods
262
+ ######################################################
263
+ private
264
+
265
+ def get_protocol_handler_store(agt_id)
266
+ return ProtocolHandlerStore.get_store(protocol(), false, agt_id)
267
+ end
268
+ end
269
+ end
270
+ end
271
+ end
272
+ end
273
+
@@ -0,0 +1,38 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Docker
4
+ module Warp
5
+ module WarpHandler # interface
6
+
7
+ def next_warp_id()
8
+ raise NotImplementedError()
9
+ end
10
+
11
+ def new_warp_data(warp_id)
12
+ raise NotImplementedError()
13
+ end
14
+
15
+ def post_warp_headers(tur)
16
+ raise NotImplementedError()
17
+ end
18
+
19
+ def post_warp_contents(tur, buf, start, len, &callback)
20
+ raise NotImplementedError()
21
+ end
22
+
23
+ def post_warp_end(tur)
24
+ raise NotImplementedError()
25
+ end
26
+
27
+ #
28
+ # Verify if protocol is allowed
29
+ #
30
+ def verify_protocol(protocol)
31
+ raise NotImplementedError()
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,166 @@
1
+ require 'baykit/bayserver/util/counter'
2
+ require 'baykit/bayserver/util/http_status'
3
+ require 'baykit/bayserver/docker/warp/warp_ship'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Docker
8
+ module Warp
9
+ class WarpShip < Baykit::BayServer::WaterCraft::Ship
10
+ include Baykit::BayServer::Agent
11
+ include Baykit::BayServer::WaterCraft
12
+ include Baykit::BayServer::Tours
13
+ include Baykit::BayServer::Util
14
+
15
+ attr :tour_map
16
+ attr :docker
17
+
18
+ attr_accessor :connected
19
+ attr :socket_timeout_sec
20
+ attr :lock
21
+
22
+
23
+ def initialize()
24
+ super
25
+ @docker = nil
26
+ @socket_timeout_sec = nil
27
+ @tour_map = {}
28
+ @lock = Mutex.new()
29
+ @connected = false
30
+ end
31
+
32
+ def to_s()
33
+ return "warp##{@ship_id}/#{@object_id}[#{protocol}]"
34
+ end
35
+
36
+ ######################################################
37
+ # Implements Reusable
38
+ ######################################################
39
+
40
+ def reset()
41
+ super
42
+ if !@tour_map.empty?
43
+ BayLog.error("BUG: Some tours is active: %s", @tour_map)
44
+ end
45
+ @connected = false
46
+ end
47
+
48
+
49
+ ######################################################
50
+ # Other methods
51
+ ######################################################
52
+ def init_warp(skt, agt, tp, dkr, proto_hnd)
53
+ init(skt, agt, tp)
54
+ @docker = dkr
55
+ @socket_timeout_sec = @docker.timeout_sec >= 0 ? @docker.timeout_sec : BayServer.harbor.socket_timeout_sec
56
+ set_protocol_handler(proto_hnd)
57
+ end
58
+
59
+ def warp_handler
60
+ return @protocol_handler
61
+ end
62
+
63
+ def start_warp_tour(tur)
64
+ w_hnd = warp_handler()
65
+ warp_id = w_hnd.next_warp_id()
66
+ wdat = w_hnd.new_warp_data(warp_id)
67
+ BayLog.debug("%s new warp tour related to %s", wdat, tur)
68
+ tur.req.set_content_handler(wdat)
69
+
70
+ BayLog.debug("%s start: warpId=%d", wdat, warp_id);
71
+ if @tour_map.key?(warp_id)
72
+ raise Sink.new("warpId exists")
73
+ end
74
+
75
+ @tour_map[warp_id] = [tur.id(), tur]
76
+ w_hnd.post_warp_headers(tur)
77
+
78
+ if @connected
79
+ BayLog.debug("%s is already connected. Start warp tour:%s", wdat, tur);
80
+ wdat.start
81
+ end
82
+ end
83
+
84
+ def end_warp_tour(tur)
85
+ wdat = WarpData.get(tur)
86
+ BayLog.debug("%s end: started=%s ended=%s", tur, wdat.started, wdat.ended)
87
+ @tour_map.delete wdat.warp_id
88
+ @docker.keep_ship(self)
89
+ end
90
+
91
+ def notify_service_unavailable(msg)
92
+ notify_error_to_owner_tour(HttpStatus::SERVICE_UNAVAILABLE, msg)
93
+ end
94
+
95
+ def get_tour(warp_id, must=true)
96
+ pair = @tour_map[warp_id]
97
+ if pair != nil
98
+ tur = pair[1]
99
+ tur.check_tour_id pair[0]
100
+ if !WarpData.get(tur).ended
101
+ return tur
102
+ end
103
+ end
104
+
105
+ if must
106
+ raise Sink.new("%s warp tours not found: id=%d", self, warp_id)
107
+ else
108
+ nil
109
+ end
110
+ end
111
+
112
+ def packet_unpacker
113
+ return @protocol_handler.packet_unpacker
114
+ end
115
+
116
+ def notify_error_to_owner_tour(status, msg)
117
+ @lock.synchronize do
118
+ @tour_map.keys.each do |warp_id|
119
+ tur = get_tour(warp_id)
120
+ BayLog.debug("%s send error to owner: %s running=%s", self, tur, tur.running?)
121
+ if tur.running?
122
+ begin
123
+ tur.res.send_error(Tour::TOUR_ID_NOCHECK, status, msg)
124
+ rescue Exception => e
125
+ BayLog.error_e(e)
126
+ end
127
+ end
128
+ end
129
+ @tour_map.clear
130
+ end
131
+ end
132
+
133
+
134
+ def end_ship()
135
+ @docker.return_protocol_handler(@agent, @protocol_handler)
136
+ @docker.return_ship(self)
137
+ end
138
+
139
+ def abort(check_id)
140
+ check_ship_id(check_id)
141
+ @postman.abort
142
+ end
143
+
144
+ def is_timeout(duration)
145
+ if @keeping
146
+ # warp connection never timeout in keeping
147
+ timeout = false
148
+ elsif @socket_timeout_sec <= 0
149
+ timeout = false
150
+ else
151
+ timeout = duration >= @socket_timeout_sec
152
+ end
153
+
154
+ BayLog.debug("%s Warp check timeout: dur=%d, timeout=%s, keeping=%s limit=%d",
155
+ self, duration, timeout, @keeping, @socket_timeout_sec)
156
+ return timeout
157
+ end
158
+
159
+ def inspect
160
+ to_s
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,111 @@
1
+ require 'baykit/bayserver/protocol/packet_store'
2
+ require 'baykit/bayserver/docker/warp/package'
3
+
4
+ module Baykit
5
+ module BayServer
6
+ module Docker
7
+ module Warp
8
+ class WarpShipStore < Baykit::BayServer::Util::ObjectStore
9
+ include Baykit::BayServer::Protocol
10
+ include Baykit::BayServer::Util
11
+ include Baykit::BayServer::Docker::Warp
12
+
13
+ attr :keep_list
14
+ attr :busy_list
15
+
16
+ attr :max_ships
17
+ attr :lock
18
+
19
+ def initialize(max_ships)
20
+ super()
21
+ @keep_list = []
22
+ @busy_list = []
23
+ @lock = Mutex.new
24
+ @max_ships = max_ships
25
+ @factory = -> { WarpShip.new() }
26
+ end
27
+
28
+ def to_s
29
+ return "warp_ship_store"
30
+ end
31
+
32
+ def rent()
33
+ if @max_ships > 0 && count() >= @max_ships
34
+ return nil
35
+ end
36
+
37
+ if @keep_list.empty?
38
+ BayLog.debug("rent from Object Store")
39
+
40
+ wsip = super()
41
+ if wsip == nil
42
+ return nil
43
+ end
44
+ else
45
+ BayLog.trace("rent from keep list: %s", @keep_list)
46
+ wsip = @keep_list.delete_at(@keep_list.length - 1)
47
+ end
48
+
49
+ if wsip == nil
50
+ raise Sink.new("BUG! ship is null")
51
+ end
52
+ if wsip.postman != nil && wsip.postman.zombie?
53
+ raise Sink("channel is zombie: %s", wsip)
54
+ end
55
+ @busy_list.append(wsip)
56
+
57
+ BayLog.trace(" rent keepList=%s busyList=%s", @keep_list, @busy_list)
58
+ return wsip
59
+ end
60
+
61
+ def keep(wsip)
62
+ BayLog.trace("keep: before keepList=%s busyList=%s", @keep_list, @busy_list)
63
+
64
+ if !@busy_list.delete(wsip)
65
+ BayLog.error("%s not in busy list", wsip)
66
+ end
67
+
68
+ @keep_list.append(wsip)
69
+
70
+ BayLog.trace("keep: after keepList=%s busyList=%s", @keep_list, @busy_list)
71
+ end
72
+
73
+ def Return(wsip)
74
+ BayLog.trace("Return: before keepList=%s busyList=%s", @keep_list, @busy_list)
75
+
76
+ removed_from_keep = @keep_list.delete(wsip)
77
+ removed_from_busy = @busy_list.delete(wsip)
78
+ if !removed_from_keep && !removed_from_busy
79
+ BayLog.error("%s not in both keep list and busy list", wsip)
80
+ end
81
+
82
+ super
83
+
84
+ BayLog.trace("Return: after keepList=%s busyList=%s", @keep_list, @busy_list)
85
+ end
86
+
87
+ def count()
88
+ @keep_list.length + @busy_list.length
89
+ end
90
+
91
+ def print_usage(indent)
92
+ BayLog.info("%sWarpShipStore Usage:", StringUtil.indent(indent))
93
+ BayLog.info("%skeepList: %d", StringUtil.indent(indent+1), @keep_list.length())
94
+ if BayLog.debug_mode?
95
+ @keep_list.each do |obj|
96
+ BayLog.debug("%s%s", StringUtil.indent(indent+1), obj)
97
+ end
98
+ end
99
+ BayLog.info("%sbusyList: %d", StringUtil.indent(indent+1), @busy_list.length())
100
+ if BayLog.debug_mode?
101
+ @busy_list.each do |obj|
102
+ BayLog.debug("%s%s", StringUtil.indent(indent+1), obj)
103
+ end
104
+ end
105
+ super
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end