Hear what providers retire, and let a person approve, reject and delete (hq ADR 0230)
A provider now waits for a person before retiring more than three consumers or half of what it holds, and deletes only when asked. The controller is that person's way in: it keeps waiting and rejected sets as conditions, answers them with retire approve|reject, lists and deletes retired consumers through the provider's own tools on its machine, records each act in the hand-act log, and probes for anything retired longer than thirty days (D11).
This commit is contained in:
@@ -103,16 +103,38 @@ func providerStandings(open []conditions.Condition) []conditions.Condition {
|
||||
return out
|
||||
}
|
||||
|
||||
// providerOf reads a standing's provider module and machine back from its key.
|
||||
func providerOf(c conditions.Condition) (module, node, consumer string, ok bool) {
|
||||
parts := strings.Split(c.Key, ".")
|
||||
if len(parts) != 5 || parts[0] != conditions.ScopeProvider {
|
||||
return "", "", "", false
|
||||
// providerConditions is every open condition a provider's word raised: a consumer failing (ADR 0224),
|
||||
// and a retirement waiting for a person, kept by a rejection, or cleanup waiting (ADR 0230).
|
||||
func providerConditions(open []conditions.Condition) []conditions.Condition {
|
||||
var out []conditions.Condition
|
||||
for _, c := range open {
|
||||
switch c.Kind {
|
||||
case kindProviderFailing, kindRetireWaiting, kindRetireRejected, kindCleanupWaiting:
|
||||
out = append(out, c)
|
||||
}
|
||||
}
|
||||
return parts[1], parts[2], parts[3], true
|
||||
return out
|
||||
}
|
||||
|
||||
// unassignedProviders clears the standing of every provider no longer assigned where it ran.
|
||||
// providerOf reads a provider condition's module and machine back from its key: a standing's
|
||||
// `provider.<module>.<node>.<consumer>.failing`, and a retirement's `provider.<module>.<node>.<token>`,
|
||||
// which names no consumer.
|
||||
func providerOf(c conditions.Condition) (module, node, consumer string, ok bool) {
|
||||
parts := strings.Split(c.Key, ".")
|
||||
if parts[0] != conditions.ScopeProvider {
|
||||
return "", "", "", false
|
||||
}
|
||||
switch len(parts) {
|
||||
case 5:
|
||||
return parts[1], parts[2], parts[3], true
|
||||
case 4:
|
||||
return parts[1], parts[2], "", true
|
||||
}
|
||||
return "", "", "", false
|
||||
}
|
||||
|
||||
// unassignedProviders clears the standing of every provider no longer assigned where it ran — and its
|
||||
// retirement and cleanup conditions with it (ADR 0230): nothing runs there to retire or delete anything.
|
||||
//
|
||||
// **A provider no longer assigned is not asked about** (ADR 0224 §4): nothing runs there to fail
|
||||
// anybody, and nothing there will ever say it recovered. The observation that resolves it is the
|
||||
@@ -120,7 +142,7 @@ func providerOf(c conditions.Condition) (module, node, consumer string, ok bool)
|
||||
func unassignedProviders(ctx context.Context, inv *inventory.Inventory, k *conditions.Keeper,
|
||||
open []conditions.Condition) error {
|
||||
assigned := map[string]map[string]bool{}
|
||||
for _, c := range providerStandings(open) {
|
||||
for _, c := range providerConditions(open) {
|
||||
module, node, _, ok := providerOf(c)
|
||||
if !ok {
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user