@@ -3,37 +3,47 @@ package explorer
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "strings"
7
+ "sync"
6
8
"time"
7
9
8
10
"github.com/mudler/LocalAI/core/p2p"
9
11
"github.com/mudler/edgevpn/pkg/blockchain"
10
12
)
11
13
12
14
type DiscoveryServer struct {
15
+ sync.Mutex
13
16
database * Database
14
17
networkState * NetworkState
15
18
}
16
19
17
20
type NetworkState struct {
18
- Nodes map [string ]map [string ]p2p.NodeData
21
+ Networks map [string ]Network
22
+ }
23
+
24
+ func (s * DiscoveryServer ) NetworkState () * NetworkState {
25
+ s .Lock ()
26
+ defer s .Unlock ()
27
+ return s .networkState
19
28
}
20
29
21
30
func NewDiscoveryServer (db * Database ) * DiscoveryServer {
22
31
return & DiscoveryServer {
23
32
database : db ,
24
33
networkState : & NetworkState {
25
- Nodes : map [string ]map [ string ]p2p. NodeData {},
34
+ Networks : map [string ]Network {},
26
35
},
27
36
}
28
37
}
29
38
39
+ type Network struct {
40
+ Clusters []ClusterData
41
+ }
42
+
30
43
func (s * DiscoveryServer ) runBackground () {
31
44
for _ , token := range s .database .TokenList () {
32
-
33
- fmt .Println ("Checking token" , token )
34
45
c , cancel := context .WithTimeout (context .Background (), 50 * time .Second )
35
46
defer cancel ()
36
- fmt .Println ("Starting node" , token )
37
47
38
48
// Connect to the network
39
49
// Get the number of nodes
@@ -45,39 +55,38 @@ func (s *DiscoveryServer) runBackground() {
45
55
continue
46
56
}
47
57
48
- fmt .Println ("Starting network" , token )
49
58
err = n .Start (c )
50
59
if err != nil {
51
60
fmt .Println (err )
52
61
continue
53
62
}
54
- fmt .Println ("ledger" , token )
55
63
56
64
ledger , err := n .Ledger ()
57
65
if err != nil {
58
66
fmt .Println (err )
59
67
continue
60
68
}
61
69
62
- ledgerKeys := make (chan string )
63
- go s .getLedgerKeys (c , ledger , ledgerKeys )
70
+ networkData := make (chan ClusterData )
64
71
65
- ledgerK := []string {}
66
- fmt .Println ("waiting for ledger keys" , token )
72
+ // get the network data - it takes the whole timeout
73
+ // as we might not be connected to the network yet,
74
+ // and few attempts would have to be made before bailing out
75
+ go s .retrieveNetworkData (c , ledger , networkData )
67
76
68
- LOOP:
69
- for {
70
- select {
71
- case <- c .Done ():
72
- fmt .Println ("Context exhausted" )
73
- break LOOP
74
- case key := <- ledgerKeys :
75
- ledgerK = append (ledgerK , key )
76
- }
77
+ ledgerK := []ClusterData {}
78
+ for key := range networkData {
79
+ ledgerK = append (ledgerK , key )
77
80
}
78
81
79
82
fmt .Println ("Token network" , token )
80
- fmt .Println ("Found the following ledger keys in the network" , ledgerK )
83
+ fmt .Println ("Found the following workers in the network" , ledgerK )
84
+
85
+ s .Lock ()
86
+ s .networkState .Networks [token ] = Network {
87
+ Clusters : ledgerK ,
88
+ }
89
+ s .Unlock ()
81
90
// get new services, allocate and return to the channel
82
91
83
92
// TODO:
@@ -89,26 +98,69 @@ func (s *DiscoveryServer) runBackground() {
89
98
}
90
99
}
91
100
92
- func (s * DiscoveryServer ) getLedgerKeys (c context.Context , ledger * blockchain.Ledger , ledgerKeys chan string ) {
93
- keys := map [string ]struct {}{}
101
+ type ClusterData struct {
102
+ Workers []string
103
+ Type string
104
+ }
105
+
106
+ func (s * DiscoveryServer ) retrieveNetworkData (c context.Context , ledger * blockchain.Ledger , networkData chan ClusterData ) {
107
+ clusters := map [string ]ClusterData {}
108
+
109
+ defer func () {
110
+ fmt .Println ("Defer clusters" , clusters )
111
+
112
+ for _ , n := range clusters {
113
+ networkData <- n
114
+ }
115
+ close (networkData )
116
+ }()
94
117
95
118
for {
96
119
select {
97
120
case <- c .Done ():
121
+ fmt .Println ("Closing with ccluster" )
122
+ fmt .Println (clusters )
98
123
return
99
124
default :
100
125
time .Sleep (5 * time .Second )
101
126
102
127
data := ledger .LastBlock ().Storage
103
- for k , _ := range data {
104
- if _ , ok := keys [k ]; ! ok {
105
- keys [k ] = struct {}{}
106
- ledgerKeys <- k
128
+ LEDGER:
129
+ for d := range data {
130
+ toScanForWorkers := false
131
+ cd := ClusterData {}
132
+ isWorkerCluster := d == p2p .WorkerID || (strings .Contains (d , "_" ) && strings .Contains (d , p2p .WorkerID ))
133
+ isFederatedCluster := d == p2p .FederatedID || (strings .Contains (d , "_" ) && strings .Contains (d , p2p .FederatedID ))
134
+ switch {
135
+ case isWorkerCluster :
136
+ toScanForWorkers = true
137
+ cd .Type = "worker"
138
+ case isFederatedCluster :
139
+ toScanForWorkers = true
140
+ cd .Type = "federated"
141
+
142
+ }
143
+
144
+ if ! toScanForWorkers {
145
+ continue LEDGER
107
146
}
147
+
148
+ DATA:
149
+ for _ , v := range data [d ] {
150
+ nd := & p2p.NodeData {}
151
+ if err := v .Unmarshal (nd ); err != nil {
152
+ continue DATA
153
+ }
154
+
155
+ if nd .IsOnline () {
156
+ (& cd ).Workers = append (cd .Workers , nd .ID )
157
+ }
158
+ }
159
+
160
+ clusters [d ] = cd
108
161
}
109
162
}
110
163
}
111
-
112
164
}
113
165
114
166
// Start the discovery server. This is meant to be run in to a goroutine.
0 commit comments