The runner, the toolchain guard, the fetch, the parsers, buildcpu, the conformance kit and mesh-pack move from mesh-sdk's buildstep into modules/mesh-build-go/buildstep (own go.mod). mesh-build-go, mesh-build-node and mesh-build-image require it by a same-repository replace; what the delivery parts read (the failure contract, the fetch request, the stale sweep, the module tree shape, NewID, CapacitySetting) stays imported from mesh-sdk as sdkstep. Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package buildstep
|
|
|
|
import (
|
|
sdkstep "git.novox.be/novox/mesh-sdk/go/buildstep"
|
|
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// NodeCapacity is the node's build capacity, read from the module's settings file at path at every call, so a change
|
|
// takes effect at the next pull. No path, no file value, or a value that is not a whole number of at least 0 gives 0 and
|
|
// a value that cannot be read says why: pulling on a setting nobody can read could build on a node that must not.
|
|
func NodeCapacity(path, node string, logf func(string, ...any)) func() int {
|
|
say := func(format string, args ...any) {
|
|
if logf != nil {
|
|
logf(format, args...)
|
|
}
|
|
}
|
|
return func() int {
|
|
n, err := ReadCapacity(path)
|
|
if err != nil {
|
|
say("%v, so %s pulls nothing", err, node)
|
|
return 0
|
|
}
|
|
return n
|
|
}
|
|
}
|
|
|
|
// ReadCapacity is the capacity the settings file at path holds, and why it cannot be read when it cannot (then 0).
|
|
func ReadCapacity(path string) (int, error) {
|
|
if path == "" {
|
|
return 0, nil
|
|
}
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("the build capacity cannot be read: %w", err)
|
|
}
|
|
var s map[string]json.RawMessage
|
|
if err := json.Unmarshal(raw, &s); err != nil {
|
|
return 0, fmt.Errorf("the settings file %s is not JSON: %w", path, err)
|
|
}
|
|
return capacityOf(s[sdkstep.CapacitySetting])
|
|
}
|
|
|
|
// capacityOf is the capacity a config value holds: absent or null is 0; anything but a whole number of at least 0 is
|
|
// refused, naming it.
|
|
func capacityOf(value json.RawMessage) (int, error) {
|
|
if len(value) == 0 || string(value) == "null" {
|
|
return 0, nil
|
|
}
|
|
var n int
|
|
if err := json.Unmarshal(value, &n); err != nil || n < 0 {
|
|
return 0, fmt.Errorf("the build capacity %s is not a whole number of asks at once, 0 or more", value)
|
|
}
|
|
return n, nil
|
|
}
|