datawire_mdk 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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