datawire_mdk 2.0.5
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 +7 -0
- data/lib/datawire-quark-core.rb +1213 -0
- data/lib/datawire_mdk_md.rb +54752 -0
- data/lib/mdk.rb +962 -0
- data/lib/mdk_discovery.rb +1518 -0
- data/lib/mdk_discovery/protocol.rb +818 -0
- data/lib/mdk_discovery/synapse.rb +267 -0
- data/lib/mdk_introspection.rb +281 -0
- data/lib/mdk_introspection/aws.rb +101 -0
- data/lib/mdk_introspection/kubernetes.rb +125 -0
- data/lib/mdk_protocol.rb +1255 -0
- data/lib/mdk_runtime.rb +2135 -0
- data/lib/mdk_runtime/actors.rb +457 -0
- data/lib/mdk_runtime/files.rb +575 -0
- data/lib/mdk_runtime/promise.rb +814 -0
- data/lib/mdk_tracing.rb +369 -0
- data/lib/mdk_tracing/api.rb +188 -0
- data/lib/mdk_tracing/protocol.rb +850 -0
- data/lib/mdk_util.rb +141 -0
- data/lib/quark.rb +3684 -0
- data/lib/quark/behaviors.rb +494 -0
- data/lib/quark/concurrent.rb +1250 -0
- data/lib/quark/error.rb +84 -0
- data/lib/quark/logging.rb +278 -0
- data/lib/quark/mock.rb +1223 -0
- data/lib/quark/os.rb +286 -0
- data/lib/quark/reflect.rb +489 -0
- data/lib/quark/spi.rb +130 -0
- data/lib/quark/spi_api.rb +489 -0
- data/lib/quark/spi_api_tracing.rb +1426 -0
- data/lib/quark/test.rb +766 -0
- metadata +142 -0
@@ -0,0 +1,1518 @@
|
|
1
|
+
# Quark 1.0.406 run at 2016-08-31 13:21:53.028839
|
2
|
+
module Quark
|
3
|
+
require "quark"
|
4
|
+
def self.mdk_discovery; MdkDiscovery; end
|
5
|
+
module MdkDiscovery
|
6
|
+
require "datawire-quark-core"
|
7
|
+
require_relative 'quark/reflect' # 0 ('quark',) ()
|
8
|
+
require_relative 'datawire_mdk_md' # 0 () ()
|
9
|
+
require_relative 'mdk_runtime/actors' # 0 ('mdk_runtime',) ()
|
10
|
+
require_relative 'mdk_runtime' # 0 () ()
|
11
|
+
require_relative 'mdk_runtime/promise' # 0 ('mdk_runtime',) ()
|
12
|
+
require_relative 'quark' # 0 () ()
|
13
|
+
require_relative 'mdk_util' # 0 () ()
|
14
|
+
require_relative 'mdk_discovery/protocol' # 0 ('mdk_discovery',) ()
|
15
|
+
require_relative 'mdk_discovery/synapse' # 0 ('mdk_discovery',) ()
|
16
|
+
|
17
|
+
|
18
|
+
def self.NodeActive; NodeActive; end
|
19
|
+
##
|
20
|
+
# Message from DiscoverySource: a node has become active.
|
21
|
+
|
22
|
+
class NodeActive < ::DatawireQuarkCore::QuarkObject
|
23
|
+
attr_accessor :node
|
24
|
+
extend ::DatawireQuarkCore::Static
|
25
|
+
|
26
|
+
static mdk_discovery_NodeActive_ref: -> { nil }
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
def initialize(node)
|
31
|
+
|
32
|
+
self.__init_fields__
|
33
|
+
(self).node = node
|
34
|
+
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
def _getClass()
|
42
|
+
|
43
|
+
return "mdk_discovery.NodeActive"
|
44
|
+
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def _getField(name)
|
49
|
+
|
50
|
+
if ((name) == ("node"))
|
51
|
+
return (self).node
|
52
|
+
end
|
53
|
+
return nil
|
54
|
+
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def _setField(name, value)
|
59
|
+
|
60
|
+
if ((name) == ("node"))
|
61
|
+
(self).node = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_discovery.Node }
|
62
|
+
end
|
63
|
+
|
64
|
+
nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def __init_fields__()
|
68
|
+
|
69
|
+
self.node = nil
|
70
|
+
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
end
|
76
|
+
NodeActive.unlazy_statics
|
77
|
+
|
78
|
+
def self.NodeExpired; NodeExpired; end
|
79
|
+
##
|
80
|
+
# Message from DiscoverySource: a node has expired.
|
81
|
+
|
82
|
+
class NodeExpired < ::DatawireQuarkCore::QuarkObject
|
83
|
+
attr_accessor :node
|
84
|
+
extend ::DatawireQuarkCore::Static
|
85
|
+
|
86
|
+
static mdk_discovery_NodeExpired_ref: -> { nil }
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
def initialize(node)
|
91
|
+
|
92
|
+
self.__init_fields__
|
93
|
+
(self).node = node
|
94
|
+
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
def _getClass()
|
102
|
+
|
103
|
+
return "mdk_discovery.NodeExpired"
|
104
|
+
|
105
|
+
nil
|
106
|
+
end
|
107
|
+
|
108
|
+
def _getField(name)
|
109
|
+
|
110
|
+
if ((name) == ("node"))
|
111
|
+
return (self).node
|
112
|
+
end
|
113
|
+
return nil
|
114
|
+
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
|
118
|
+
def _setField(name, value)
|
119
|
+
|
120
|
+
if ((name) == ("node"))
|
121
|
+
(self).node = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_discovery.Node }
|
122
|
+
end
|
123
|
+
|
124
|
+
nil
|
125
|
+
end
|
126
|
+
|
127
|
+
def __init_fields__()
|
128
|
+
|
129
|
+
self.node = nil
|
130
|
+
|
131
|
+
nil
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
end
|
136
|
+
NodeExpired.unlazy_statics
|
137
|
+
|
138
|
+
def self.ReplaceCluster; ReplaceCluster; end
|
139
|
+
##
|
140
|
+
# Message from DiscoverySource: replace all nodes in a particular Cluster.
|
141
|
+
|
142
|
+
class ReplaceCluster < ::DatawireQuarkCore::QuarkObject
|
143
|
+
attr_accessor :nodes, :cluster
|
144
|
+
extend ::DatawireQuarkCore::Static
|
145
|
+
|
146
|
+
static mdk_discovery_ReplaceCluster_ref: -> { nil }
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
def initialize(cluster, nodes)
|
151
|
+
|
152
|
+
self.__init_fields__
|
153
|
+
(self).nodes = nodes
|
154
|
+
(self).cluster = cluster
|
155
|
+
|
156
|
+
nil
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
def _getClass()
|
163
|
+
|
164
|
+
return "mdk_discovery.ReplaceCluster"
|
165
|
+
|
166
|
+
nil
|
167
|
+
end
|
168
|
+
|
169
|
+
def _getField(name)
|
170
|
+
|
171
|
+
if ((name) == ("nodes"))
|
172
|
+
return (self).nodes
|
173
|
+
end
|
174
|
+
if ((name) == ("cluster"))
|
175
|
+
return (self).cluster
|
176
|
+
end
|
177
|
+
return nil
|
178
|
+
|
179
|
+
nil
|
180
|
+
end
|
181
|
+
|
182
|
+
def _setField(name, value)
|
183
|
+
|
184
|
+
if ((name) == ("nodes"))
|
185
|
+
(self).nodes = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
|
186
|
+
end
|
187
|
+
if ((name) == ("cluster"))
|
188
|
+
(self).cluster = ::DatawireQuarkCore.cast(value) { ::String }
|
189
|
+
end
|
190
|
+
|
191
|
+
nil
|
192
|
+
end
|
193
|
+
|
194
|
+
def __init_fields__()
|
195
|
+
|
196
|
+
self.nodes = nil
|
197
|
+
self.cluster = nil
|
198
|
+
|
199
|
+
nil
|
200
|
+
end
|
201
|
+
|
202
|
+
|
203
|
+
end
|
204
|
+
ReplaceCluster.unlazy_statics
|
205
|
+
|
206
|
+
def self.DiscoverySource; DiscoverySource; end
|
207
|
+
##
|
208
|
+
# A source of discovery information.
|
209
|
+
#
|
210
|
+
# Sends ReplaceCluster, NodeActive and NodeExpired messages to a
|
211
|
+
# subscriber.
|
212
|
+
#
|
213
|
+
|
214
|
+
class DiscoverySource < ::DatawireQuarkCore::QuarkObject
|
215
|
+
extend ::DatawireQuarkCore::Static
|
216
|
+
|
217
|
+
static mdk_discovery_DiscoverySource_ref: -> { nil }
|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
def initialize()
|
222
|
+
self.__init_fields__
|
223
|
+
|
224
|
+
nil
|
225
|
+
end
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
|
230
|
+
def __init_fields__()
|
231
|
+
|
232
|
+
|
233
|
+
nil
|
234
|
+
end
|
235
|
+
|
236
|
+
|
237
|
+
end
|
238
|
+
DiscoverySource.unlazy_statics
|
239
|
+
|
240
|
+
def self.DiscoverySourceFactory; DiscoverySourceFactory; end
|
241
|
+
##
|
242
|
+
# A factory for DiscoverySource instances.
|
243
|
+
|
244
|
+
class DiscoverySourceFactory < ::DatawireQuarkCore::QuarkObject
|
245
|
+
extend ::DatawireQuarkCore::Static
|
246
|
+
|
247
|
+
static mdk_discovery_DiscoverySourceFactory_ref: -> { nil }
|
248
|
+
|
249
|
+
|
250
|
+
|
251
|
+
def initialize()
|
252
|
+
self.__init_fields__
|
253
|
+
|
254
|
+
nil
|
255
|
+
end
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
|
260
|
+
##
|
261
|
+
# Create a new instance
|
262
|
+
|
263
|
+
def create(subscriber, runtime)
|
264
|
+
raise NotImplementedError, '`DiscoverySourceFactory.create` is an abstract method'
|
265
|
+
|
266
|
+
nil
|
267
|
+
end
|
268
|
+
|
269
|
+
##
|
270
|
+
# If true, the returned DiscoverySource is also a DiscoveryRegistrar.
|
271
|
+
#
|
272
|
+
|
273
|
+
def isRegistrar()
|
274
|
+
raise NotImplementedError, '`DiscoverySourceFactory.isRegistrar` is an abstract method'
|
275
|
+
|
276
|
+
nil
|
277
|
+
end
|
278
|
+
|
279
|
+
def __init_fields__()
|
280
|
+
|
281
|
+
|
282
|
+
nil
|
283
|
+
end
|
284
|
+
|
285
|
+
|
286
|
+
end
|
287
|
+
DiscoverySourceFactory.unlazy_statics
|
288
|
+
|
289
|
+
def self.RegisterNode; RegisterNode; end
|
290
|
+
##
|
291
|
+
# Message sent to DiscoveryRegistrar Actor to register a node.
|
292
|
+
|
293
|
+
class RegisterNode < ::DatawireQuarkCore::QuarkObject
|
294
|
+
attr_accessor :node
|
295
|
+
extend ::DatawireQuarkCore::Static
|
296
|
+
|
297
|
+
static mdk_discovery_RegisterNode_ref: -> { nil }
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
def initialize(node)
|
302
|
+
|
303
|
+
self.__init_fields__
|
304
|
+
(self).node = node
|
305
|
+
|
306
|
+
nil
|
307
|
+
end
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
|
312
|
+
def _getClass()
|
313
|
+
|
314
|
+
return "mdk_discovery.RegisterNode"
|
315
|
+
|
316
|
+
nil
|
317
|
+
end
|
318
|
+
|
319
|
+
def _getField(name)
|
320
|
+
|
321
|
+
if ((name) == ("node"))
|
322
|
+
return (self).node
|
323
|
+
end
|
324
|
+
return nil
|
325
|
+
|
326
|
+
nil
|
327
|
+
end
|
328
|
+
|
329
|
+
def _setField(name, value)
|
330
|
+
|
331
|
+
if ((name) == ("node"))
|
332
|
+
(self).node = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_discovery.Node }
|
333
|
+
end
|
334
|
+
|
335
|
+
nil
|
336
|
+
end
|
337
|
+
|
338
|
+
def __init_fields__()
|
339
|
+
|
340
|
+
self.node = nil
|
341
|
+
|
342
|
+
nil
|
343
|
+
end
|
344
|
+
|
345
|
+
|
346
|
+
end
|
347
|
+
RegisterNode.unlazy_statics
|
348
|
+
|
349
|
+
def self.DiscoveryRegistrar; DiscoveryRegistrar; end
|
350
|
+
##
|
351
|
+
# Allow registration of services.
|
352
|
+
#
|
353
|
+
# Send this an actor a RegisterNode message to do so.
|
354
|
+
#
|
355
|
+
|
356
|
+
class DiscoveryRegistrar < ::DatawireQuarkCore::QuarkObject
|
357
|
+
extend ::DatawireQuarkCore::Static
|
358
|
+
|
359
|
+
static mdk_discovery_DiscoveryRegistrar_ref: -> { nil }
|
360
|
+
|
361
|
+
|
362
|
+
|
363
|
+
def initialize()
|
364
|
+
self.__init_fields__
|
365
|
+
|
366
|
+
nil
|
367
|
+
end
|
368
|
+
|
369
|
+
|
370
|
+
|
371
|
+
|
372
|
+
def __init_fields__()
|
373
|
+
|
374
|
+
|
375
|
+
nil
|
376
|
+
end
|
377
|
+
|
378
|
+
|
379
|
+
end
|
380
|
+
DiscoveryRegistrar.unlazy_statics
|
381
|
+
|
382
|
+
def self._Request; Request; end
|
383
|
+
class Request < ::DatawireQuarkCore::QuarkObject
|
384
|
+
attr_accessor :version, :factory
|
385
|
+
extend ::DatawireQuarkCore::Static
|
386
|
+
|
387
|
+
static mdk_discovery__Request_ref: -> { nil }
|
388
|
+
|
389
|
+
|
390
|
+
|
391
|
+
def initialize(version, factory)
|
392
|
+
|
393
|
+
self.__init_fields__
|
394
|
+
(self).version = version
|
395
|
+
(self).factory = factory
|
396
|
+
|
397
|
+
nil
|
398
|
+
end
|
399
|
+
|
400
|
+
|
401
|
+
|
402
|
+
|
403
|
+
def _getClass()
|
404
|
+
|
405
|
+
return "mdk_discovery._Request"
|
406
|
+
|
407
|
+
nil
|
408
|
+
end
|
409
|
+
|
410
|
+
def _getField(name)
|
411
|
+
|
412
|
+
if ((name) == ("version"))
|
413
|
+
return (self).version
|
414
|
+
end
|
415
|
+
if ((name) == ("factory"))
|
416
|
+
return (self).factory
|
417
|
+
end
|
418
|
+
return nil
|
419
|
+
|
420
|
+
nil
|
421
|
+
end
|
422
|
+
|
423
|
+
def _setField(name, value)
|
424
|
+
|
425
|
+
if ((name) == ("version"))
|
426
|
+
(self).version = ::DatawireQuarkCore.cast(value) { ::String }
|
427
|
+
end
|
428
|
+
if ((name) == ("factory"))
|
429
|
+
(self).factory = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.promise.PromiseResolver }
|
430
|
+
end
|
431
|
+
|
432
|
+
nil
|
433
|
+
end
|
434
|
+
|
435
|
+
def __init_fields__()
|
436
|
+
|
437
|
+
self.version = nil
|
438
|
+
self.factory = nil
|
439
|
+
|
440
|
+
nil
|
441
|
+
end
|
442
|
+
|
443
|
+
|
444
|
+
end
|
445
|
+
Request.unlazy_statics
|
446
|
+
|
447
|
+
def self.FailurePolicy; FailurePolicy; end
|
448
|
+
##
|
449
|
+
# A policy for choosing how to deal with failures.
|
450
|
+
|
451
|
+
class FailurePolicy < ::DatawireQuarkCore::QuarkObject
|
452
|
+
extend ::DatawireQuarkCore::Static
|
453
|
+
|
454
|
+
static mdk_discovery_FailurePolicy_ref: -> { nil }
|
455
|
+
|
456
|
+
|
457
|
+
|
458
|
+
def initialize()
|
459
|
+
self.__init_fields__
|
460
|
+
|
461
|
+
nil
|
462
|
+
end
|
463
|
+
|
464
|
+
|
465
|
+
|
466
|
+
|
467
|
+
##
|
468
|
+
# Record a success for the Node this policy is managing.
|
469
|
+
|
470
|
+
def success()
|
471
|
+
raise NotImplementedError, '`FailurePolicy.success` is an abstract method'
|
472
|
+
|
473
|
+
nil
|
474
|
+
end
|
475
|
+
|
476
|
+
##
|
477
|
+
# Record a failure for the Node this policy is managing.
|
478
|
+
|
479
|
+
def failure()
|
480
|
+
raise NotImplementedError, '`FailurePolicy.failure` is an abstract method'
|
481
|
+
|
482
|
+
nil
|
483
|
+
end
|
484
|
+
|
485
|
+
##
|
486
|
+
# Return whether the Node should be accessed.
|
487
|
+
|
488
|
+
def available()
|
489
|
+
raise NotImplementedError, '`FailurePolicy.available` is an abstract method'
|
490
|
+
|
491
|
+
nil
|
492
|
+
end
|
493
|
+
|
494
|
+
def __init_fields__()
|
495
|
+
|
496
|
+
|
497
|
+
nil
|
498
|
+
end
|
499
|
+
|
500
|
+
|
501
|
+
end
|
502
|
+
FailurePolicy.unlazy_statics
|
503
|
+
|
504
|
+
def self.FailurePolicyFactory; FailurePolicyFactory; end
|
505
|
+
##
|
506
|
+
# A factory for FailurePolicy.
|
507
|
+
|
508
|
+
class FailurePolicyFactory < ::DatawireQuarkCore::QuarkObject
|
509
|
+
extend ::DatawireQuarkCore::Static
|
510
|
+
|
511
|
+
static mdk_discovery_FailurePolicyFactory_ref: -> { nil }
|
512
|
+
|
513
|
+
|
514
|
+
|
515
|
+
def initialize()
|
516
|
+
self.__init_fields__
|
517
|
+
|
518
|
+
nil
|
519
|
+
end
|
520
|
+
|
521
|
+
|
522
|
+
|
523
|
+
|
524
|
+
##
|
525
|
+
# Create a new FailurePolicy.
|
526
|
+
|
527
|
+
def create()
|
528
|
+
raise NotImplementedError, '`FailurePolicyFactory.create` is an abstract method'
|
529
|
+
|
530
|
+
nil
|
531
|
+
end
|
532
|
+
|
533
|
+
def _getClass()
|
534
|
+
|
535
|
+
return "mdk_discovery.FailurePolicyFactory"
|
536
|
+
|
537
|
+
nil
|
538
|
+
end
|
539
|
+
|
540
|
+
def _getField(name)
|
541
|
+
|
542
|
+
return nil
|
543
|
+
|
544
|
+
nil
|
545
|
+
end
|
546
|
+
|
547
|
+
def _setField(name, value)
|
548
|
+
|
549
|
+
nil
|
550
|
+
|
551
|
+
nil
|
552
|
+
end
|
553
|
+
|
554
|
+
def __init_fields__()
|
555
|
+
|
556
|
+
|
557
|
+
nil
|
558
|
+
end
|
559
|
+
|
560
|
+
|
561
|
+
end
|
562
|
+
FailurePolicyFactory.unlazy_statics
|
563
|
+
|
564
|
+
def self.CircuitBreaker; CircuitBreaker; end
|
565
|
+
##
|
566
|
+
# Default circuit breaker policy.
|
567
|
+
|
568
|
+
class CircuitBreaker < ::DatawireQuarkCore::QuarkObject
|
569
|
+
attr_accessor :_log, :_threshold, :_delay, :_time, :_mutex, :_failed, :_failures, :_lastFailure
|
570
|
+
extend ::DatawireQuarkCore::Static
|
571
|
+
|
572
|
+
static mdk_discovery_CircuitBreaker_ref: -> { nil }
|
573
|
+
|
574
|
+
|
575
|
+
|
576
|
+
def initialize(time, threshold, retestDelay)
|
577
|
+
|
578
|
+
self.__init_fields__
|
579
|
+
@_threshold = threshold
|
580
|
+
@_delay = retestDelay
|
581
|
+
@_time = time
|
582
|
+
|
583
|
+
nil
|
584
|
+
end
|
585
|
+
|
586
|
+
|
587
|
+
|
588
|
+
|
589
|
+
def success()
|
590
|
+
|
591
|
+
@_mutex.acquire()
|
592
|
+
@_failed = false
|
593
|
+
@_failures = 0
|
594
|
+
@_lastFailure = 0.0
|
595
|
+
@_mutex.release()
|
596
|
+
|
597
|
+
nil
|
598
|
+
end
|
599
|
+
|
600
|
+
def failure()
|
601
|
+
|
602
|
+
@_mutex.acquire()
|
603
|
+
@_failures = (@_failures) + (1)
|
604
|
+
@_lastFailure = @_time.time()
|
605
|
+
if (((@_threshold) != (0)) && ((@_failures) >= (@_threshold)))
|
606
|
+
@_log.info("BREAKER TRIPPED.")
|
607
|
+
@_failed = true
|
608
|
+
end
|
609
|
+
@_mutex.release()
|
610
|
+
|
611
|
+
nil
|
612
|
+
end
|
613
|
+
|
614
|
+
def available()
|
615
|
+
|
616
|
+
if (@_failed)
|
617
|
+
@_mutex.acquire()
|
618
|
+
result = ((@_time.time()) - (@_lastFailure)) > (@_delay)
|
619
|
+
@_mutex.release()
|
620
|
+
if (result)
|
621
|
+
@_log.info("BREAKER RETEST.")
|
622
|
+
end
|
623
|
+
return result
|
624
|
+
else
|
625
|
+
return true
|
626
|
+
end
|
627
|
+
|
628
|
+
nil
|
629
|
+
end
|
630
|
+
|
631
|
+
def _getClass()
|
632
|
+
|
633
|
+
return "mdk_discovery.CircuitBreaker"
|
634
|
+
|
635
|
+
nil
|
636
|
+
end
|
637
|
+
|
638
|
+
def _getField(name)
|
639
|
+
|
640
|
+
if ((name) == ("_log"))
|
641
|
+
return (self)._log
|
642
|
+
end
|
643
|
+
if ((name) == ("_threshold"))
|
644
|
+
return (self)._threshold
|
645
|
+
end
|
646
|
+
if ((name) == ("_delay"))
|
647
|
+
return (self)._delay
|
648
|
+
end
|
649
|
+
if ((name) == ("_time"))
|
650
|
+
return (self)._time
|
651
|
+
end
|
652
|
+
if ((name) == ("_mutex"))
|
653
|
+
return (self)._mutex
|
654
|
+
end
|
655
|
+
if ((name) == ("_failed"))
|
656
|
+
return (self)._failed
|
657
|
+
end
|
658
|
+
if ((name) == ("_failures"))
|
659
|
+
return (self)._failures
|
660
|
+
end
|
661
|
+
if ((name) == ("_lastFailure"))
|
662
|
+
return (self)._lastFailure
|
663
|
+
end
|
664
|
+
return nil
|
665
|
+
|
666
|
+
nil
|
667
|
+
end
|
668
|
+
|
669
|
+
def _setField(name, value)
|
670
|
+
|
671
|
+
if ((name) == ("_log"))
|
672
|
+
(self)._log = value
|
673
|
+
end
|
674
|
+
if ((name) == ("_threshold"))
|
675
|
+
(self)._threshold = ::DatawireQuarkCore.cast(value) { ::Integer }
|
676
|
+
end
|
677
|
+
if ((name) == ("_delay"))
|
678
|
+
(self)._delay = ::DatawireQuarkCore.cast(value) { ::Float }
|
679
|
+
end
|
680
|
+
if ((name) == ("_time"))
|
681
|
+
(self)._time = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.Time }
|
682
|
+
end
|
683
|
+
if ((name) == ("_mutex"))
|
684
|
+
(self)._mutex = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::Lock }
|
685
|
+
end
|
686
|
+
if ((name) == ("_failed"))
|
687
|
+
(self)._failed = ::DatawireQuarkCore.cast(value) { ::Object }
|
688
|
+
end
|
689
|
+
if ((name) == ("_failures"))
|
690
|
+
(self)._failures = ::DatawireQuarkCore.cast(value) { ::Integer }
|
691
|
+
end
|
692
|
+
if ((name) == ("_lastFailure"))
|
693
|
+
(self)._lastFailure = ::DatawireQuarkCore.cast(value) { ::Float }
|
694
|
+
end
|
695
|
+
|
696
|
+
nil
|
697
|
+
end
|
698
|
+
|
699
|
+
def __init_fields__()
|
700
|
+
|
701
|
+
self._log = ::Quark.quark._getLogger("mdk.breaker")
|
702
|
+
self._threshold = nil
|
703
|
+
self._delay = nil
|
704
|
+
self._time = nil
|
705
|
+
self._mutex = ::DatawireQuarkCore::Lock.new()
|
706
|
+
self._failed = false
|
707
|
+
self._failures = 0
|
708
|
+
self._lastFailure = 0.0
|
709
|
+
|
710
|
+
nil
|
711
|
+
end
|
712
|
+
|
713
|
+
|
714
|
+
end
|
715
|
+
CircuitBreaker.unlazy_statics
|
716
|
+
|
717
|
+
def self.CircuitBreakerFactory; CircuitBreakerFactory; end
|
718
|
+
##
|
719
|
+
# Create CircuitBreaker instances.
|
720
|
+
|
721
|
+
class CircuitBreakerFactory < ::Quark.mdk_discovery.FailurePolicyFactory
|
722
|
+
attr_accessor :threshold, :retestDelay, :time
|
723
|
+
extend ::DatawireQuarkCore::Static
|
724
|
+
|
725
|
+
static mdk_discovery_CircuitBreakerFactory_ref: -> { nil }
|
726
|
+
|
727
|
+
|
728
|
+
|
729
|
+
def initialize(runtime)
|
730
|
+
|
731
|
+
super()
|
732
|
+
(self).time = runtime.getTimeService()
|
733
|
+
|
734
|
+
nil
|
735
|
+
end
|
736
|
+
|
737
|
+
|
738
|
+
|
739
|
+
|
740
|
+
def create()
|
741
|
+
|
742
|
+
return ::Quark.mdk_discovery.CircuitBreaker.new(@time, @threshold, @retestDelay)
|
743
|
+
|
744
|
+
nil
|
745
|
+
end
|
746
|
+
|
747
|
+
def _getClass()
|
748
|
+
|
749
|
+
return "mdk_discovery.CircuitBreakerFactory"
|
750
|
+
|
751
|
+
nil
|
752
|
+
end
|
753
|
+
|
754
|
+
def _getField(name)
|
755
|
+
|
756
|
+
if ((name) == ("threshold"))
|
757
|
+
return (self).threshold
|
758
|
+
end
|
759
|
+
if ((name) == ("retestDelay"))
|
760
|
+
return (self).retestDelay
|
761
|
+
end
|
762
|
+
if ((name) == ("time"))
|
763
|
+
return (self).time
|
764
|
+
end
|
765
|
+
return nil
|
766
|
+
|
767
|
+
nil
|
768
|
+
end
|
769
|
+
|
770
|
+
def _setField(name, value)
|
771
|
+
|
772
|
+
if ((name) == ("threshold"))
|
773
|
+
(self).threshold = ::DatawireQuarkCore.cast(value) { ::Integer }
|
774
|
+
end
|
775
|
+
if ((name) == ("retestDelay"))
|
776
|
+
(self).retestDelay = ::DatawireQuarkCore.cast(value) { ::Float }
|
777
|
+
end
|
778
|
+
if ((name) == ("time"))
|
779
|
+
(self).time = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.Time }
|
780
|
+
end
|
781
|
+
|
782
|
+
nil
|
783
|
+
end
|
784
|
+
|
785
|
+
def __init_fields__()
|
786
|
+
|
787
|
+
super
|
788
|
+
self.threshold = 3
|
789
|
+
self.retestDelay = 30.0
|
790
|
+
self.time = nil
|
791
|
+
|
792
|
+
nil
|
793
|
+
end
|
794
|
+
|
795
|
+
|
796
|
+
end
|
797
|
+
CircuitBreakerFactory.unlazy_statics
|
798
|
+
|
799
|
+
def self.Cluster; Cluster; end
|
800
|
+
##
|
801
|
+
# A Cluster is a group of providers of (possibly different versions of)
|
802
|
+
# a single service. Each service provider is represented by a Node.
|
803
|
+
|
804
|
+
class Cluster < ::DatawireQuarkCore::QuarkObject
|
805
|
+
attr_accessor :nodes, :_waiting, :_failurepolicies, :_counter, :_fpfactory
|
806
|
+
extend ::DatawireQuarkCore::Static
|
807
|
+
|
808
|
+
static quark_List_mdk_discovery__Request__ref: -> { nil }
|
809
|
+
static quark_Map_quark_String_mdk_discovery_FailurePolicy__ref: -> { nil }
|
810
|
+
static mdk_discovery_Cluster_ref: -> { nil }
|
811
|
+
|
812
|
+
|
813
|
+
|
814
|
+
def initialize(fpfactory)
|
815
|
+
|
816
|
+
self.__init_fields__
|
817
|
+
(self)._fpfactory = fpfactory
|
818
|
+
|
819
|
+
nil
|
820
|
+
end
|
821
|
+
|
822
|
+
|
823
|
+
|
824
|
+
|
825
|
+
##
|
826
|
+
# Choose a single Node to talk to. At present this is a simple round
|
827
|
+
# robin.
|
828
|
+
|
829
|
+
def choose()
|
830
|
+
|
831
|
+
return self.chooseVersion(nil)
|
832
|
+
|
833
|
+
nil
|
834
|
+
end
|
835
|
+
|
836
|
+
##
|
837
|
+
# Create a Node for external use.
|
838
|
+
|
839
|
+
def _copyNode(node)
|
840
|
+
|
841
|
+
result = ::Quark.mdk_discovery.Node.new()
|
842
|
+
(result).address = (node).address
|
843
|
+
(result).version = (node).version
|
844
|
+
(result).service = (node).service
|
845
|
+
(result).properties = (node).properties
|
846
|
+
(result)._policy = self.failurePolicy(node)
|
847
|
+
return result
|
848
|
+
|
849
|
+
nil
|
850
|
+
end
|
851
|
+
|
852
|
+
##
|
853
|
+
# Get the FailurePolicy for a Node.
|
854
|
+
|
855
|
+
def failurePolicy(node)
|
856
|
+
|
857
|
+
return ((self)._failurepolicies)[(node).address]
|
858
|
+
|
859
|
+
nil
|
860
|
+
end
|
861
|
+
|
862
|
+
##
|
863
|
+
# Choose a compatible version of a service to talk to.
|
864
|
+
|
865
|
+
def chooseVersion(version)
|
866
|
+
|
867
|
+
if (((@nodes).size) == (0))
|
868
|
+
return ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_discovery.Node }
|
869
|
+
end
|
870
|
+
start = (@_counter) % ((@nodes).size)
|
871
|
+
@_counter = (@_counter) + (1)
|
872
|
+
count = 0
|
873
|
+
while ((count) < ((@nodes).size)) do
|
874
|
+
choice = ((start) + (count)) % ((@nodes).size)
|
875
|
+
candidate = (@nodes)[choice]
|
876
|
+
policy = ((self)._failurepolicies)[(candidate).address]
|
877
|
+
if ((::Quark.mdk_util.versionMatch(version, (candidate).version)) && (policy.available()))
|
878
|
+
return self._copyNode(candidate)
|
879
|
+
end
|
880
|
+
count = (count) + (1)
|
881
|
+
end
|
882
|
+
return ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_discovery.Node }
|
883
|
+
|
884
|
+
nil
|
885
|
+
end
|
886
|
+
|
887
|
+
##
|
888
|
+
# Add a Node to the cluster (or, if it's already present in the cluster,
|
889
|
+
# update its properties). At present, this involves a linear search, so
|
890
|
+
# very large Clusters are unlikely to perform well.
|
891
|
+
|
892
|
+
def add(node)
|
893
|
+
|
894
|
+
if (!((@_failurepolicies).key?((node).address)))
|
895
|
+
(@_failurepolicies)[(node).address] = ((self)._fpfactory.create())
|
896
|
+
end
|
897
|
+
if ((((self)._waiting).size) > (0))
|
898
|
+
waiting = (self)._waiting
|
899
|
+
(self)._waiting = ::DatawireQuarkCore::List.new([])
|
900
|
+
jdx = 0
|
901
|
+
while ((jdx) < ((waiting).size)) do
|
902
|
+
req = (waiting)[jdx]
|
903
|
+
if (::Quark.mdk_util.versionMatch((req).version, (node).version))
|
904
|
+
(req).factory.resolve(self._copyNode(node))
|
905
|
+
else
|
906
|
+
((self)._waiting) << (req)
|
907
|
+
end
|
908
|
+
jdx = (jdx) + (1)
|
909
|
+
end
|
910
|
+
end
|
911
|
+
idx = 0
|
912
|
+
while ((idx) < ((@nodes).size)) do
|
913
|
+
if ((((@nodes)[idx]).address) == ((node).address))
|
914
|
+
(@nodes)[idx] = (node)
|
915
|
+
return
|
916
|
+
end
|
917
|
+
idx = (idx) + (1)
|
918
|
+
end
|
919
|
+
(@nodes) << (node)
|
920
|
+
|
921
|
+
nil
|
922
|
+
end
|
923
|
+
|
924
|
+
def _addRequest(version, factory)
|
925
|
+
|
926
|
+
(@_waiting) << (::Quark.mdk_discovery._Request.new(version, factory))
|
927
|
+
|
928
|
+
nil
|
929
|
+
end
|
930
|
+
|
931
|
+
##
|
932
|
+
# Remove a Node from the cluster, if it's present. If it's not present, do
|
933
|
+
# nothing. Note that it is possible to remove all the Nodes and be left with
|
934
|
+
# an empty cluster.
|
935
|
+
|
936
|
+
def remove(node)
|
937
|
+
|
938
|
+
idx = 0
|
939
|
+
while ((idx) < ((@nodes).size)) do
|
940
|
+
ep = (@nodes)[idx]
|
941
|
+
if ((((ep).address) == (nil)) || (((ep).address) == ((node).address)))
|
942
|
+
(@nodes).delete_at(idx)
|
943
|
+
return
|
944
|
+
end
|
945
|
+
idx = (idx) + (1)
|
946
|
+
end
|
947
|
+
|
948
|
+
nil
|
949
|
+
end
|
950
|
+
|
951
|
+
##
|
952
|
+
# Returns true if and only if this Cluster contains no Nodes.
|
953
|
+
|
954
|
+
def isEmpty()
|
955
|
+
|
956
|
+
return ((@nodes).size) <= (0)
|
957
|
+
|
958
|
+
nil
|
959
|
+
end
|
960
|
+
|
961
|
+
##
|
962
|
+
# Return a string representation of the Cluster.
|
963
|
+
#
|
964
|
+
# WARNING: every Node is represented in the string. Large Clusters will
|
965
|
+
# produce unusably large strings.
|
966
|
+
|
967
|
+
def toString()
|
968
|
+
|
969
|
+
result = "Cluster("
|
970
|
+
idx = 0
|
971
|
+
while ((idx) < ((@nodes).size)) do
|
972
|
+
if ((idx) > (0))
|
973
|
+
result = (result) + (", ")
|
974
|
+
end
|
975
|
+
result = (result) + ((@nodes)[idx].toString())
|
976
|
+
idx = (idx) + (1)
|
977
|
+
end
|
978
|
+
result = (result) + (")")
|
979
|
+
return result
|
980
|
+
|
981
|
+
nil
|
982
|
+
end
|
983
|
+
|
984
|
+
def _getClass()
|
985
|
+
|
986
|
+
return "mdk_discovery.Cluster"
|
987
|
+
|
988
|
+
nil
|
989
|
+
end
|
990
|
+
|
991
|
+
def _getField(name)
|
992
|
+
|
993
|
+
if ((name) == ("nodes"))
|
994
|
+
return (self).nodes
|
995
|
+
end
|
996
|
+
if ((name) == ("_waiting"))
|
997
|
+
return (self)._waiting
|
998
|
+
end
|
999
|
+
if ((name) == ("_failurepolicies"))
|
1000
|
+
return (self)._failurepolicies
|
1001
|
+
end
|
1002
|
+
if ((name) == ("_counter"))
|
1003
|
+
return (self)._counter
|
1004
|
+
end
|
1005
|
+
if ((name) == ("_fpfactory"))
|
1006
|
+
return (self)._fpfactory
|
1007
|
+
end
|
1008
|
+
return nil
|
1009
|
+
|
1010
|
+
nil
|
1011
|
+
end
|
1012
|
+
|
1013
|
+
def _setField(name, value)
|
1014
|
+
|
1015
|
+
if ((name) == ("nodes"))
|
1016
|
+
(self).nodes = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
|
1017
|
+
end
|
1018
|
+
if ((name) == ("_waiting"))
|
1019
|
+
(self)._waiting = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
|
1020
|
+
end
|
1021
|
+
if ((name) == ("_failurepolicies"))
|
1022
|
+
(self)._failurepolicies = ::DatawireQuarkCore.cast(value) { ::Hash }
|
1023
|
+
end
|
1024
|
+
if ((name) == ("_counter"))
|
1025
|
+
(self)._counter = ::DatawireQuarkCore.cast(value) { ::Integer }
|
1026
|
+
end
|
1027
|
+
if ((name) == ("_fpfactory"))
|
1028
|
+
(self)._fpfactory = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_discovery.FailurePolicyFactory }
|
1029
|
+
end
|
1030
|
+
|
1031
|
+
nil
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
def __init_fields__()
|
1035
|
+
|
1036
|
+
self.nodes = ::DatawireQuarkCore::List.new([])
|
1037
|
+
self._waiting = ::DatawireQuarkCore::List.new([])
|
1038
|
+
self._failurepolicies = {}
|
1039
|
+
self._counter = 0
|
1040
|
+
self._fpfactory = nil
|
1041
|
+
|
1042
|
+
nil
|
1043
|
+
end
|
1044
|
+
|
1045
|
+
|
1046
|
+
end
|
1047
|
+
Cluster.unlazy_statics
|
1048
|
+
|
1049
|
+
def self.Node; Node; end
|
1050
|
+
##
|
1051
|
+
# The Node class captures address and metadata information about a
|
1052
|
+
# server functioning as a service instance.
|
1053
|
+
|
1054
|
+
class Node < ::DatawireQuarkCore::QuarkObject
|
1055
|
+
attr_accessor :service, :version, :address, :properties, :_policy
|
1056
|
+
extend ::DatawireQuarkCore::Static
|
1057
|
+
|
1058
|
+
static mdk_discovery_Node_ref: -> { nil }
|
1059
|
+
|
1060
|
+
|
1061
|
+
|
1062
|
+
def initialize()
|
1063
|
+
self.__init_fields__
|
1064
|
+
|
1065
|
+
nil
|
1066
|
+
end
|
1067
|
+
|
1068
|
+
|
1069
|
+
|
1070
|
+
|
1071
|
+
def success()
|
1072
|
+
|
1073
|
+
@_policy.success()
|
1074
|
+
|
1075
|
+
nil
|
1076
|
+
end
|
1077
|
+
|
1078
|
+
def failure()
|
1079
|
+
|
1080
|
+
@_policy.failure()
|
1081
|
+
|
1082
|
+
nil
|
1083
|
+
end
|
1084
|
+
|
1085
|
+
def available()
|
1086
|
+
|
1087
|
+
return @_policy.available()
|
1088
|
+
|
1089
|
+
nil
|
1090
|
+
end
|
1091
|
+
|
1092
|
+
##
|
1093
|
+
# Return a string representation of the Node.
|
1094
|
+
|
1095
|
+
def toString()
|
1096
|
+
|
1097
|
+
result = "Node("
|
1098
|
+
if ((@service) == (nil))
|
1099
|
+
result = (result) + ("<unnamed>")
|
1100
|
+
else
|
1101
|
+
result = (result) + (@service)
|
1102
|
+
end
|
1103
|
+
result = (result) + (": ")
|
1104
|
+
if ((@address) == (nil))
|
1105
|
+
result = (result) + ("<unlocated>")
|
1106
|
+
else
|
1107
|
+
result = (result) + (@address)
|
1108
|
+
end
|
1109
|
+
if ((@version) != (nil))
|
1110
|
+
result = ((result) + (", ")) + (@version)
|
1111
|
+
end
|
1112
|
+
result = (result) + (")")
|
1113
|
+
if ((@properties) != (nil))
|
1114
|
+
result = ((result) + (" ")) + ((@properties).to_s)
|
1115
|
+
end
|
1116
|
+
return result
|
1117
|
+
|
1118
|
+
nil
|
1119
|
+
end
|
1120
|
+
|
1121
|
+
def _getClass()
|
1122
|
+
|
1123
|
+
return "mdk_discovery.Node"
|
1124
|
+
|
1125
|
+
nil
|
1126
|
+
end
|
1127
|
+
|
1128
|
+
def _getField(name)
|
1129
|
+
|
1130
|
+
if ((name) == ("service"))
|
1131
|
+
return (self).service
|
1132
|
+
end
|
1133
|
+
if ((name) == ("version"))
|
1134
|
+
return (self).version
|
1135
|
+
end
|
1136
|
+
if ((name) == ("address"))
|
1137
|
+
return (self).address
|
1138
|
+
end
|
1139
|
+
if ((name) == ("properties"))
|
1140
|
+
return (self).properties
|
1141
|
+
end
|
1142
|
+
if ((name) == ("_policy"))
|
1143
|
+
return (self)._policy
|
1144
|
+
end
|
1145
|
+
return nil
|
1146
|
+
|
1147
|
+
nil
|
1148
|
+
end
|
1149
|
+
|
1150
|
+
def _setField(name, value)
|
1151
|
+
|
1152
|
+
if ((name) == ("service"))
|
1153
|
+
(self).service = ::DatawireQuarkCore.cast(value) { ::String }
|
1154
|
+
end
|
1155
|
+
if ((name) == ("version"))
|
1156
|
+
(self).version = ::DatawireQuarkCore.cast(value) { ::String }
|
1157
|
+
end
|
1158
|
+
if ((name) == ("address"))
|
1159
|
+
(self).address = ::DatawireQuarkCore.cast(value) { ::String }
|
1160
|
+
end
|
1161
|
+
if ((name) == ("properties"))
|
1162
|
+
(self).properties = ::DatawireQuarkCore.cast(value) { ::Hash }
|
1163
|
+
end
|
1164
|
+
if ((name) == ("_policy"))
|
1165
|
+
(self)._policy = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_discovery.FailurePolicy }
|
1166
|
+
end
|
1167
|
+
|
1168
|
+
nil
|
1169
|
+
end
|
1170
|
+
|
1171
|
+
def __init_fields__()
|
1172
|
+
|
1173
|
+
self.service = nil
|
1174
|
+
self.version = nil
|
1175
|
+
self.address = nil
|
1176
|
+
self.properties = {}
|
1177
|
+
self._policy = nil
|
1178
|
+
|
1179
|
+
nil
|
1180
|
+
end
|
1181
|
+
|
1182
|
+
|
1183
|
+
end
|
1184
|
+
Node.unlazy_statics
|
1185
|
+
|
1186
|
+
def self.Discovery; Discovery; end
|
1187
|
+
##
|
1188
|
+
# The Discovery class functions as a conduit to a source of discovery information.
|
1189
|
+
# Using it, a provider can register itself as providing a particular service
|
1190
|
+
# (see the register method) and a consumer can locate a provider for a
|
1191
|
+
# particular service (see the resolve method).
|
1192
|
+
|
1193
|
+
class Discovery < ::DatawireQuarkCore::QuarkObject
|
1194
|
+
attr_accessor :logger, :services, :started, :mutex, :runtime, :_fpfactory
|
1195
|
+
extend ::DatawireQuarkCore::Static
|
1196
|
+
|
1197
|
+
static quark_ListUtil_mdk_discovery_Node__ref: -> { nil }
|
1198
|
+
static quark_Map_quark_String_mdk_discovery_Cluster__ref: -> { nil }
|
1199
|
+
static mdk_discovery_Discovery_ref: -> { nil }
|
1200
|
+
|
1201
|
+
|
1202
|
+
|
1203
|
+
##
|
1204
|
+
# Construct a Discovery object. You must set the token before doing
|
1205
|
+
# anything else; see the withToken() method.
|
1206
|
+
|
1207
|
+
def initialize(runtime)
|
1208
|
+
|
1209
|
+
self.__init_fields__
|
1210
|
+
@logger.info("Discovery created!")
|
1211
|
+
(self).runtime = runtime
|
1212
|
+
(self)._fpfactory = ::DatawireQuarkCore.cast((runtime).dependencies.getService("failurepolicy_factory")) { ::Quark.mdk_discovery.FailurePolicyFactory }
|
1213
|
+
|
1214
|
+
nil
|
1215
|
+
end
|
1216
|
+
|
1217
|
+
|
1218
|
+
|
1219
|
+
|
1220
|
+
##
|
1221
|
+
# Lock.
|
1222
|
+
|
1223
|
+
def _lock()
|
1224
|
+
|
1225
|
+
@mutex.acquire()
|
1226
|
+
|
1227
|
+
nil
|
1228
|
+
end
|
1229
|
+
|
1230
|
+
def _release()
|
1231
|
+
|
1232
|
+
@mutex.release()
|
1233
|
+
|
1234
|
+
nil
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
##
|
1238
|
+
# Start the uplink to the discovery service.
|
1239
|
+
|
1240
|
+
def onStart(dispatcher)
|
1241
|
+
|
1242
|
+
self._lock()
|
1243
|
+
if (!(@started))
|
1244
|
+
@started = true
|
1245
|
+
end
|
1246
|
+
self._release()
|
1247
|
+
|
1248
|
+
nil
|
1249
|
+
end
|
1250
|
+
|
1251
|
+
##
|
1252
|
+
# Stop the uplink to the discovery service.
|
1253
|
+
|
1254
|
+
def onStop()
|
1255
|
+
|
1256
|
+
self._lock()
|
1257
|
+
if (@started)
|
1258
|
+
@started = false
|
1259
|
+
end
|
1260
|
+
self._release()
|
1261
|
+
|
1262
|
+
nil
|
1263
|
+
end
|
1264
|
+
|
1265
|
+
##
|
1266
|
+
# Register info about a service node with a discovery source of truth. You must
|
1267
|
+
# usually start the uplink before this will do much; see start().
|
1268
|
+
|
1269
|
+
def register(node)
|
1270
|
+
|
1271
|
+
registrar = nil
|
1272
|
+
if ((@runtime).dependencies.hasService("discovery_registrar"))
|
1273
|
+
registrar = ::DatawireQuarkCore.cast((@runtime).dependencies.getService("discovery_registrar")) { ::Quark.mdk_discovery.DiscoveryRegistrar }
|
1274
|
+
else
|
1275
|
+
raise ("Registration not supported as no Discovery Registrar was setup.")
|
1276
|
+
end
|
1277
|
+
((self).runtime).dispatcher.tell(self, ::Quark.mdk_discovery.RegisterNode.new(node), registrar)
|
1278
|
+
return self
|
1279
|
+
|
1280
|
+
nil
|
1281
|
+
end
|
1282
|
+
|
1283
|
+
##
|
1284
|
+
# Register info about a service node with the discovery service. You must
|
1285
|
+
# usually start the uplink before this will do much; see start().
|
1286
|
+
|
1287
|
+
def register_service(service, address, version)
|
1288
|
+
|
1289
|
+
node = ::Quark.mdk_discovery.Node.new()
|
1290
|
+
(node).service = service
|
1291
|
+
(node).address = address
|
1292
|
+
(node).version = version
|
1293
|
+
return self.register(node)
|
1294
|
+
|
1295
|
+
nil
|
1296
|
+
end
|
1297
|
+
|
1298
|
+
##
|
1299
|
+
# Return the current known Nodes for a service, if any.
|
1300
|
+
|
1301
|
+
def knownNodes(service)
|
1302
|
+
|
1303
|
+
if (!((@services).key?(service)))
|
1304
|
+
return ::DatawireQuarkCore::List.new([])
|
1305
|
+
end
|
1306
|
+
return ((@services)[service]).nodes
|
1307
|
+
|
1308
|
+
nil
|
1309
|
+
end
|
1310
|
+
|
1311
|
+
##
|
1312
|
+
# Get the FailurePolicy for a Node.
|
1313
|
+
|
1314
|
+
def failurePolicy(node)
|
1315
|
+
|
1316
|
+
return (@services)[(node).service].failurePolicy(node)
|
1317
|
+
|
1318
|
+
nil
|
1319
|
+
end
|
1320
|
+
|
1321
|
+
##
|
1322
|
+
# Resolve a service name into an available service node. You must
|
1323
|
+
# usually start the uplink before this will do much; see start().
|
1324
|
+
# The returned Promise will end up with a Node as its value.
|
1325
|
+
|
1326
|
+
def _resolve(service, version)
|
1327
|
+
|
1328
|
+
factory = ::Quark.mdk_runtime.promise.PromiseResolver.new((@runtime).dispatcher)
|
1329
|
+
self._lock()
|
1330
|
+
if (!((@services).key?(service)))
|
1331
|
+
(@services)[service] = (::Quark.mdk_discovery.Cluster.new((self)._fpfactory))
|
1332
|
+
end
|
1333
|
+
result = (@services)[service].chooseVersion(version)
|
1334
|
+
if ((result) == (nil))
|
1335
|
+
(@services)[service]._addRequest(version, factory)
|
1336
|
+
self._release()
|
1337
|
+
else
|
1338
|
+
self._release()
|
1339
|
+
factory.resolve(result)
|
1340
|
+
end
|
1341
|
+
return (factory).promise
|
1342
|
+
|
1343
|
+
nil
|
1344
|
+
end
|
1345
|
+
|
1346
|
+
##
|
1347
|
+
# Resolve a service; return a (Bluebird) Promise on Javascript. Does not work elsewhere.
|
1348
|
+
|
1349
|
+
def resolve(service, version)
|
1350
|
+
|
1351
|
+
return ::Quark.mdk_util.toNativePromise(self._resolve(service, version))
|
1352
|
+
|
1353
|
+
nil
|
1354
|
+
end
|
1355
|
+
|
1356
|
+
##
|
1357
|
+
# Wait for service name to resolve into an available service node, or fail
|
1358
|
+
# appropriately (typically by raising an exception if the language
|
1359
|
+
# supports it). This should only be used in blocking runtimes (e.g.
|
1360
|
+
# you do not want to use this in Javascript).
|
1361
|
+
|
1362
|
+
def resolve_until(service, version, timeout)
|
1363
|
+
|
1364
|
+
return ::DatawireQuarkCore.cast(::Quark.mdk_util.WaitForPromise.wait(self._resolve(service, version), timeout, ("service ") + (service))) { ::Quark.mdk_discovery.Node }
|
1365
|
+
|
1366
|
+
nil
|
1367
|
+
end
|
1368
|
+
|
1369
|
+
def onMessage(origin, message)
|
1370
|
+
|
1371
|
+
klass = (::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(message))).id
|
1372
|
+
if ((klass) == ("mdk_discovery.NodeActive"))
|
1373
|
+
active = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_discovery.NodeActive }
|
1374
|
+
self._active((active).node)
|
1375
|
+
return
|
1376
|
+
end
|
1377
|
+
if ((klass) == ("mdk_discovery.NodeExpired"))
|
1378
|
+
expire = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_discovery.NodeExpired }
|
1379
|
+
self._expire((expire).node)
|
1380
|
+
return
|
1381
|
+
end
|
1382
|
+
if ((klass) == ("mdk_discovery.ReplaceCluster"))
|
1383
|
+
replace = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_discovery.ReplaceCluster }
|
1384
|
+
self._replace((replace).cluster, (replace).nodes)
|
1385
|
+
return
|
1386
|
+
end
|
1387
|
+
|
1388
|
+
nil
|
1389
|
+
end
|
1390
|
+
|
1391
|
+
def _replace(service, nodes)
|
1392
|
+
|
1393
|
+
self._lock()
|
1394
|
+
@logger.info(((("replacing all nodes for ") + (service)) + (" with ")) + ((nodes).to_s))
|
1395
|
+
if (!((@services).key?(service)))
|
1396
|
+
(@services)[service] = (::Quark.mdk_discovery.Cluster.new((self)._fpfactory))
|
1397
|
+
end
|
1398
|
+
cluster = (@services)[service]
|
1399
|
+
currentNodes = ::Quark.quark.ListUtil.new().slice((cluster).nodes, 0, ((cluster).nodes).size)
|
1400
|
+
idx = 0
|
1401
|
+
while ((idx) < ((currentNodes).size)) do
|
1402
|
+
cluster.remove((currentNodes)[idx])
|
1403
|
+
idx = (idx) + (1)
|
1404
|
+
end
|
1405
|
+
idx = 0
|
1406
|
+
while ((idx) < ((nodes).size)) do
|
1407
|
+
cluster.add((nodes)[idx])
|
1408
|
+
idx = (idx) + (1)
|
1409
|
+
end
|
1410
|
+
self._release()
|
1411
|
+
|
1412
|
+
nil
|
1413
|
+
end
|
1414
|
+
|
1415
|
+
def _active(node)
|
1416
|
+
|
1417
|
+
self._lock()
|
1418
|
+
service = (node).service
|
1419
|
+
@logger.info(("adding ") + (node.toString()))
|
1420
|
+
if (!((@services).key?(service)))
|
1421
|
+
(@services)[service] = (::Quark.mdk_discovery.Cluster.new((self)._fpfactory))
|
1422
|
+
end
|
1423
|
+
cluster = (@services)[service]
|
1424
|
+
cluster.add(node)
|
1425
|
+
self._release()
|
1426
|
+
|
1427
|
+
nil
|
1428
|
+
end
|
1429
|
+
|
1430
|
+
def _expire(node)
|
1431
|
+
|
1432
|
+
self._lock()
|
1433
|
+
service = (node).service
|
1434
|
+
if ((@services).key?(service))
|
1435
|
+
cluster = (@services)[service]
|
1436
|
+
@logger.info((("removing ") + (node.toString())) + (" from cluster"))
|
1437
|
+
cluster.remove(node)
|
1438
|
+
end
|
1439
|
+
self._release()
|
1440
|
+
|
1441
|
+
nil
|
1442
|
+
end
|
1443
|
+
|
1444
|
+
def _getClass()
|
1445
|
+
|
1446
|
+
return "mdk_discovery.Discovery"
|
1447
|
+
|
1448
|
+
nil
|
1449
|
+
end
|
1450
|
+
|
1451
|
+
def _getField(name)
|
1452
|
+
|
1453
|
+
if ((name) == ("logger"))
|
1454
|
+
return (self).logger
|
1455
|
+
end
|
1456
|
+
if ((name) == ("services"))
|
1457
|
+
return (self).services
|
1458
|
+
end
|
1459
|
+
if ((name) == ("started"))
|
1460
|
+
return (self).started
|
1461
|
+
end
|
1462
|
+
if ((name) == ("mutex"))
|
1463
|
+
return (self).mutex
|
1464
|
+
end
|
1465
|
+
if ((name) == ("runtime"))
|
1466
|
+
return (self).runtime
|
1467
|
+
end
|
1468
|
+
if ((name) == ("_fpfactory"))
|
1469
|
+
return (self)._fpfactory
|
1470
|
+
end
|
1471
|
+
return nil
|
1472
|
+
|
1473
|
+
nil
|
1474
|
+
end
|
1475
|
+
|
1476
|
+
def _setField(name, value)
|
1477
|
+
|
1478
|
+
if ((name) == ("logger"))
|
1479
|
+
(self).logger = value
|
1480
|
+
end
|
1481
|
+
if ((name) == ("services"))
|
1482
|
+
(self).services = ::DatawireQuarkCore.cast(value) { ::Hash }
|
1483
|
+
end
|
1484
|
+
if ((name) == ("started"))
|
1485
|
+
(self).started = ::DatawireQuarkCore.cast(value) { ::Object }
|
1486
|
+
end
|
1487
|
+
if ((name) == ("mutex"))
|
1488
|
+
(self).mutex = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::Lock }
|
1489
|
+
end
|
1490
|
+
if ((name) == ("runtime"))
|
1491
|
+
(self).runtime = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.MDKRuntime }
|
1492
|
+
end
|
1493
|
+
if ((name) == ("_fpfactory"))
|
1494
|
+
(self)._fpfactory = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_discovery.FailurePolicyFactory }
|
1495
|
+
end
|
1496
|
+
|
1497
|
+
nil
|
1498
|
+
end
|
1499
|
+
|
1500
|
+
def __init_fields__()
|
1501
|
+
|
1502
|
+
self.logger = ::Quark.quark._getLogger("discovery")
|
1503
|
+
self.services = ::Hash.new()
|
1504
|
+
self.started = false
|
1505
|
+
self.mutex = ::DatawireQuarkCore::Lock.new()
|
1506
|
+
self.runtime = nil
|
1507
|
+
self._fpfactory = nil
|
1508
|
+
|
1509
|
+
nil
|
1510
|
+
end
|
1511
|
+
|
1512
|
+
|
1513
|
+
end
|
1514
|
+
Discovery.unlazy_statics
|
1515
|
+
|
1516
|
+
|
1517
|
+
end # module MdkDiscovery
|
1518
|
+
end # module Quark
|