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