Read the foundation's ports from each node's settings, wherever a port is used (hq ADR 0100)
This commit is contained in:
@@ -2,6 +2,7 @@ package inventory
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
@@ -132,6 +133,17 @@ func (i *Inventory) assignPort(
|
||||
taken[port] = "something this machine already runs"
|
||||
}
|
||||
}
|
||||
// And every port this machine was given for a module (novox/hq ADR 0100): the foundation's
|
||||
// ports, as genesis chose them, are the node's settings and never the mesh's to hand out.
|
||||
given, err := i.givenOn(ctx, nodeID)
|
||||
if err != nil {
|
||||
return Assigned{}, err
|
||||
}
|
||||
for port, by := range given {
|
||||
if _, mine := taken[port]; !mine {
|
||||
taken[port] = by
|
||||
}
|
||||
}
|
||||
|
||||
machine := wanted
|
||||
if !fixed {
|
||||
@@ -258,3 +270,33 @@ func (i *Inventory) ReleasePorts(ctx context.Context, node, module string) error
|
||||
`delete from port_assignment where node = $1 and module = $2`, record.ID, module)
|
||||
return err
|
||||
}
|
||||
|
||||
// givenOn is every machine port a module was given on this node by its `ports` setting, and which
|
||||
// module it was given to.
|
||||
func (i *Inventory) givenOn(ctx context.Context, nodeID any) (map[int]string, error) {
|
||||
rows, err := i.store.Pool().Query(ctx,
|
||||
`select module, values->'ports' from settings
|
||||
where node = $1 and jsonb_typeof(values->'ports') = 'object'`, nodeID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
out := map[int]string{}
|
||||
for rows.Next() {
|
||||
var module string
|
||||
var raw []byte
|
||||
if err := rows.Scan(&module, &raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var given map[string]any
|
||||
if err := json.Unmarshal(raw, &given); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, v := range given {
|
||||
if at, ok := v.(float64); ok {
|
||||
out[int(at)] = module
|
||||
}
|
||||
}
|
||||
}
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user