|
|
|
@@ -9,7 +9,7 @@ package main
|
|
|
|
|
//
|
|
|
|
|
// - every image a container on this machine uses, in any state;
|
|
|
|
|
// - every image this machine's declaration names — what the mesh would send it now and what it was
|
|
|
|
|
// last sent — as the artifact-store seat's `images` verb answers. **No answer, no removal**: what the
|
|
|
|
|
// last sent — as the mesh-artifact-sweep seat's `images` verb answers. **No answer, no removal**: what the
|
|
|
|
|
// declaration names is the one thing that cannot be guessed;
|
|
|
|
|
// - every image younger than the floor (seven days, the weekly prune's week);
|
|
|
|
|
// - in each line of images holding one of those, the newest image besides them: the previous
|
|
|
|
@@ -43,7 +43,7 @@ type PruneImagesAsk struct {
|
|
|
|
|
Limit int
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// declaredImages is the artifact-store seat's `images` answer (novox/hq ADR 0251 §5).
|
|
|
|
|
// declaredImages is the mesh-artifact-sweep seat's `images` answer (novox/hq ADR 0251 §5).
|
|
|
|
|
type declaredImages struct {
|
|
|
|
|
Node string `json:"node"`
|
|
|
|
|
Images []struct {
|
|
|
|
@@ -129,7 +129,7 @@ func digestOf(ref string) string {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// askDeclared asks the artifact-store seat what this machine's declarations name. An error means unknown.
|
|
|
|
|
// askDeclared asks the mesh-artifact-sweep seat what this machine's declarations name. An error means unknown.
|
|
|
|
|
func (c *Client) askDeclared() (*declaredImages, error) {
|
|
|
|
|
if c.Node == "" {
|
|
|
|
|
return nil, errors.New("the runtime did not say which machine this is (MESH_NODE is empty)")
|
|
|
|
@@ -137,20 +137,20 @@ func (c *Client) askDeclared() (*declaredImages, error) {
|
|
|
|
|
if c.Ask == nil {
|
|
|
|
|
return nil, errors.New("this bundle cannot ask the mesh")
|
|
|
|
|
}
|
|
|
|
|
raw, err := c.Ask("seat:artifact-store.images", map[string]any{"node": c.Node})
|
|
|
|
|
raw, err := c.Ask("seat:mesh-artifact-sweep.images", map[string]any{"node": c.Node})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("the artifact-store seat's images verb did not answer: %w", err)
|
|
|
|
|
return nil, fmt.Errorf("the mesh-artifact-sweep seat's images verb did not answer: %w", err)
|
|
|
|
|
}
|
|
|
|
|
answer, output, ok := answerOf(raw)
|
|
|
|
|
if !ok {
|
|
|
|
|
return nil, fmt.Errorf("the artifact-store seat refused images: %s", firstLine(output))
|
|
|
|
|
return nil, fmt.Errorf("the mesh-artifact-sweep seat refused images: %s", firstLine(output))
|
|
|
|
|
}
|
|
|
|
|
var d declaredImages
|
|
|
|
|
if err := json.Unmarshal(answer, &d); err != nil {
|
|
|
|
|
return nil, fmt.Errorf("the artifact-store seat's images answer is not readable: %v", err)
|
|
|
|
|
return nil, fmt.Errorf("the mesh-artifact-sweep seat's images answer is not readable: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if d.Node != "" && d.Node != c.Node {
|
|
|
|
|
return nil, fmt.Errorf("the artifact-store seat answered for %q, not for this machine %q", d.Node, c.Node)
|
|
|
|
|
return nil, fmt.Errorf("the mesh-artifact-sweep seat answered for %q, not for this machine %q", d.Node, c.Node)
|
|
|
|
|
}
|
|
|
|
|
return &d, nil
|
|
|
|
|
}
|
|
|
|
|