mesh/delivery-group group fix/154-local-network checking: 0 of 2 member(s) ready
mesh/merge-gate out of date: judged against trunk 1826b68a22b5, the trunk is now 404b4409e70e; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk 1826b68a22b5, the trunk is now 404b4409e70e; judged again on a recheck or when it is merged
mesh/delivery superseded: a newer head of the same pull request
A local service could only be declared public, which says the internet. local-network is a source and a reach: the private network and the private networks the machine reported on a link facing outside, judged here, shown by plan and node, and said in the rule set when there are none.
84 lines
3.2 KiB
Go
84 lines
3.2 KiB
Go
package inventory
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
)
|
|
|
|
// MachineAccount is what a machine said it is made of (novox/hq issue 160), from the profile it last
|
|
// reported: the architecture and kernel family the profile always carried, and the facts a node-engine that
|
|
// knows how says beside them. Read by `node`, so what a machine says of itself is visible in one place —
|
|
// collected and shown in the same breath, not collected and read by nothing (issue 160's pattern).
|
|
type MachineAccount struct {
|
|
Architecture string `json:"architecture"`
|
|
Kernel string `json:"kernel"`
|
|
// Machine is nil when the node-engine that reported is older than the one that says it.
|
|
Machine *MadeOf `json:"machine"`
|
|
}
|
|
|
|
// MadeOf is the node-engine's account of what it is made of, as it put it on the wire. A fact it could
|
|
// not determine is absent here and named in Unknown with why — never a zero.
|
|
type MadeOf struct {
|
|
ObservedAt time.Time `json:"observed_at"`
|
|
KernelRelease string `json:"kernel_release"`
|
|
Distribution string `json:"distribution"`
|
|
Version string `json:"version"`
|
|
Processor string `json:"processor"`
|
|
Cores int `json:"cores"`
|
|
Threads int `json:"threads"`
|
|
MemoryBytes int64 `json:"memory_bytes"`
|
|
Virtual string `json:"virtual"`
|
|
BootedAt *time.Time `json:"booted_at"`
|
|
Timezone string `json:"timezone"`
|
|
Filesystems []MountedFilesystem `json:"filesystems"`
|
|
// Networks is every network the machine is directly attached to on a link facing outside it, as
|
|
// link and network (novox/hq ADR 0340 §7): what a port reached from `local-network` resolves from.
|
|
Networks []AttachedNetwork `json:"networks"`
|
|
Unknown map[string]string `json:"unknown"`
|
|
}
|
|
|
|
// AttachedNetwork is one network a machine said it is attached to, and the link it is on.
|
|
type AttachedNetwork struct {
|
|
Link string `json:"link"`
|
|
Network string `json:"network"`
|
|
}
|
|
|
|
// MountedFilesystem is one local filesystem a machine has mounted.
|
|
type MountedFilesystem struct {
|
|
Mount string `json:"mount"`
|
|
Device string `json:"device"`
|
|
Type string `json:"type"`
|
|
SizeBytes int64 `json:"size_bytes"`
|
|
FreeBytes int64 `json:"free_bytes"`
|
|
}
|
|
|
|
// MachineOf is what a node last said it is made of. had is false for a node that has never reported a
|
|
// profile at all, which is a different answer from one whose node-engine does not say the facts yet.
|
|
func (i *Inventory) MachineOf(ctx context.Context, nodeName string) (account MachineAccount, had bool, err error) {
|
|
var raw []byte
|
|
err = i.store.Pool().QueryRow(ctx, `select profile from node where name = $1`, nodeName).Scan(&raw)
|
|
if errors.Is(err, pgx.ErrNoRows) {
|
|
return MachineAccount{}, false, fmt.Errorf("%w: %s", ErrNoSuchNode, nodeName)
|
|
}
|
|
if err != nil {
|
|
return MachineAccount{}, false, err
|
|
}
|
|
return machineFrom(raw)
|
|
}
|
|
|
|
func machineFrom(raw []byte) (MachineAccount, bool, error) {
|
|
if len(raw) == 0 {
|
|
return MachineAccount{}, false, nil
|
|
}
|
|
var account MachineAccount
|
|
if err := json.Unmarshal(raw, &account); err != nil {
|
|
return MachineAccount{}, false, err
|
|
}
|
|
return account, true, nil
|
|
}
|