Name an ask's step key <node>.<ask id> and its watch, so the asker learns which node took it and refuses other keys (issue 1887 A1b, ADR 0525 §6)
This commit is contained in:
@@ -343,3 +343,33 @@ type KeptTaken struct {
|
||||
Digest string `json:"digest"`
|
||||
Tests int `json:"tests"`
|
||||
}
|
||||
|
||||
// AskStepKey is the key, in the build module's StepsBucket, of the step that runs an ask on node: `<node>.<ask id>`
|
||||
// (ADR 0525 §6). The node is the one that pulled the ask, which the asker learns from the key.
|
||||
func AskStepKey(node, askID string) (string, error) {
|
||||
if err := checkAskID(askID); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return StepKey(node, askID)
|
||||
}
|
||||
|
||||
// AskStepWatch is the pattern an asker watches its ask's step with, the node a wildcard: `*.<ask id>`.
|
||||
func AskStepWatch(askID string) (string, error) {
|
||||
if err := checkAskID(askID); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return "*." + askID, nil
|
||||
}
|
||||
|
||||
// ParseAskStepKey reads the node and the ask id from a step key of an ask; it refuses a key that is not `<node>.<ask
|
||||
// id>`, such as a have key `<node>.<module>` or a step key a direct tool call wrote under another id form.
|
||||
func ParseAskStepKey(key string) (node, askID string, err error) {
|
||||
node, askID, err = ParseStepKey(key)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
if err := checkAskID(askID); err != nil {
|
||||
return "", "", fmt.Errorf("delivery: %q is not an ask's step key: %w", key, err)
|
||||
}
|
||||
return node, askID, nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package delivery_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.novox.be/novox/mesh-sdk/go/buildstep"
|
||||
"git.novox.be/novox/mesh-sdk/go/delivery"
|
||||
)
|
||||
|
||||
// 1887/A1b: the ask's step key is <node>.<ask id>, watched with *.<ask id>, and its parser refuses another bucket's key.
|
||||
func TestAskStepKey(t *testing.T) {
|
||||
id := buildstep.NewID() // an ask's id is a step id
|
||||
key, err := delivery.AskStepKey("shanks", id)
|
||||
if err != nil || key != "shanks."+id {
|
||||
t.Fatalf("AskStepKey = %q, %v", key, err)
|
||||
}
|
||||
if w, err := delivery.AskStepWatch(id); err != nil || w != "*."+id {
|
||||
t.Fatalf("AskStepWatch = %q, %v", w, err)
|
||||
}
|
||||
node, got, err := delivery.ParseAskStepKey(key)
|
||||
if err != nil || node != "shanks" || got != id {
|
||||
t.Fatalf("ParseAskStepKey = %q %q %v", node, got, err)
|
||||
}
|
||||
for _, other := range []string{
|
||||
"shanks.mesh-delivery-view", // a have key
|
||||
"shanks.node", // a node's own have key
|
||||
"shanks.postgres", // a have key whose module is one token
|
||||
"mesh-delivery-builder_builds.x", // a pulse key
|
||||
"shanks",
|
||||
} {
|
||||
if _, _, err := delivery.ParseAskStepKey(other); err == nil {
|
||||
t.Errorf("parsed %q", other)
|
||||
}
|
||||
}
|
||||
if _, err := delivery.AskStepKey("shanks", "postgres"); err == nil {
|
||||
t.Error("AskStepKey took a module's name for an ask id")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user