carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package hostclaim
2
3type RetainedAdmissionLoss struct {
4 Incarnation string `json:"incarnation"`
5 Location string `json:"location"`
6 Account string `json:"account"`
7 App string `json:"app"`
8 Admission AdmissionRecord `json:"admission"`
9}
10
11func retainNativeAdmissionLosses(c *Claim) error {
12 if c.Holder == nil {
13 return nil
14 }
15 h := c.Holder
16 var retained []RetainedAdmissionLoss
17 for _, a := range h.Admissions {
18 if admissionLossArchived(a) {
19 continue
20 }
21 if a.LossID != "" {
22 return ErrLossEvidencePending
23 }
24 retained = append(retained, RetainedAdmissionLoss{
25 Incarnation: h.Incarnation, Location: h.Location, Account: h.Account, App: h.App, Admission: a,
26 })
27 }
28 c.RetainedAdmissionLosses = append(c.RetainedAdmissionLosses, retained...)
29 return validateRetainedAdmissionLosses(c)
30}
31
32func validateRetainedAdmissionLosses(c *Claim) error {
33 seen := map[uint64]bool{}
34 for _, r := range c.RetainedAdmissionLosses {
35 a := r.Admission
36 if !isHex64(r.Incarnation) || r.Account == "" || r.App == "" ||
37 (r.Location != "instances/"+c.Host && r.Location != "instances/"+c.Host+"/"+r.Incarnation) ||
38 a.Session == 0 || a.Session > c.Gen || seen[a.Session] || a.Region == "" || a.LossID != "" ||
39 !admissionHasLoss(a) || !validWriteLosses(a.WritesLost, a.AdditionalWritesLost) || a.LossArchivedClaimGen != 0 {
40 return ErrMalformed
41 }
42 seen[a.Session] = true
43 }
44 return nil
45}
46