- Add node store implementation for edge app - Add adapters factory for node app - Update edge and node transport layers - Update domain rules for edge and node - Add bin scripts for edge and node - Update configs and documentation - Add agent-task node_centralized_mgmt directory
91 lines
2 KiB
Go
91 lines
2 KiB
Go
package node
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
|
|
"iop/packages/config"
|
|
)
|
|
|
|
// NodeRecord is the pre-registered node definition stored in edge.
|
|
type NodeRecord struct {
|
|
ID string
|
|
Alias string
|
|
Token string
|
|
Adapters config.AdaptersConf
|
|
Runtime config.RuntimeConf
|
|
}
|
|
|
|
// NodeStore holds pre-registered node definitions, keyed by token.
|
|
type NodeStore struct {
|
|
mu sync.RWMutex
|
|
byToken map[string]*NodeRecord
|
|
byID map[string]*NodeRecord
|
|
}
|
|
|
|
func NewNodeStore() *NodeStore {
|
|
return &NodeStore{
|
|
byToken: make(map[string]*NodeRecord),
|
|
byID: make(map[string]*NodeRecord),
|
|
}
|
|
}
|
|
|
|
func (s *NodeStore) Add(rec *NodeRecord) {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
s.byToken[rec.Token] = rec
|
|
s.byID[rec.ID] = rec
|
|
}
|
|
|
|
func (s *NodeStore) FindByToken(token string) (*NodeRecord, bool) {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
r, ok := s.byToken[token]
|
|
return r, ok
|
|
}
|
|
|
|
func (s *NodeStore) FindByID(id string) (*NodeRecord, bool) {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
r, ok := s.byID[id]
|
|
return r, ok
|
|
}
|
|
|
|
func (s *NodeStore) All() []*NodeRecord {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
out := make([]*NodeRecord, 0, len(s.byID))
|
|
for _, r := range s.byID {
|
|
out = append(out, r)
|
|
}
|
|
return out
|
|
}
|
|
|
|
// LoadFromConfig seeds the store from EdgeConfig.Nodes.
|
|
// ID is derived as "node-{alias}" if not provided; use UUIDs in production.
|
|
func LoadFromConfig(defs []config.NodeDefinition) (*NodeStore, error) {
|
|
s := NewNodeStore()
|
|
seenToken := make(map[string]bool)
|
|
seenAlias := make(map[string]bool)
|
|
for i, d := range defs {
|
|
if d.Token == "" {
|
|
return nil, fmt.Errorf("node[%d] alias=%q: token must not be empty", i, d.Alias)
|
|
}
|
|
if seenToken[d.Token] {
|
|
return nil, fmt.Errorf("node[%d] alias=%q: duplicate token", i, d.Alias)
|
|
}
|
|
if seenAlias[d.Alias] {
|
|
return nil, fmt.Errorf("node[%d] alias=%q: duplicate alias", i, d.Alias)
|
|
}
|
|
seenToken[d.Token] = true
|
|
seenAlias[d.Alias] = true
|
|
s.Add(&NodeRecord{
|
|
ID: "node-" + d.Alias,
|
|
Alias: d.Alias,
|
|
Token: d.Token,
|
|
Adapters: d.Adapters,
|
|
Runtime: d.Runtime,
|
|
})
|
|
}
|
|
return s, nil
|
|
}
|