//go:build unix package hostbox import ( "context" "errors" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/hostwrite" "github.com/carlosframework/platform/internal/lease" "github.com/carlosframework/platform/internal/lease/leasetest" "github.com/carlosframework/platform/internal/park" "github.com/carlosframework/platform/internal/release" "testing" "time" ) func TestPlan13HomeQuietWindow(t *testing.T) { for _, home := range []string{"ie", ""} { t.Run("home="+home, func(t *testing.T) { source, store, obs := workFixture(t) source.HomeRegion = home _, err := hostclaim.Update(t.Context(), store, obs, func(c *hostclaim.Claim) error { c.QuietAfter = map[string]time.Time{park.HomeRegion: time.Unix(200, 0)} return nil }) if err != nil { t.Fatal(err) } work, err := source.Select(t.Context(), obs.Host, "probe") if err != nil { t.Fatal(err) } ran := false err = work.With(t.Context(), hostwrite.Identity{}, func() error { ran = true; return nil }) if home != "" && (!errors.Is(err, ErrChanged) || ran) { t.Fatalf("home: %v %v", ran, err) } if home == "" && err != nil { t.Fatalf("named: %v", err) } h := obs.Claim.Holder selected := RecordSelection{Host: obs.Host, Key: h.Key, Incarnation: h.Incarnation, Family: h.Family, ETag: "record"} r := Reconciler{HomeRegion: home, Claims: store, Box: "box", Region: "ie", Now: source.Now, CheckRecord: func(context.Context, RecordSelection) error { return nil }, CheckLocal: func(context.Context, hostclaim.Observed, RecordSelection) error { return nil }} current, err := hostclaim.Read(t.Context(), store, obs.Host) if err != nil { t.Fatal(err) } err = r.check(t.Context(), current, selected) if (err != nil) != (home != "") { t.Fatalf("reconcile home=%q: %v", home, err) } }) } } func TestPlan13RegionalHomeAcknowledgesBothNames(t *testing.T) { for _, region := range []string{park.HomeRegion, "ie", "uk"} { t.Run(region, func(t *testing.T) { claims := release.NewDirStore(t.TempDir()) bucket := leasetest.NewVersionedBucket() bucket.AddBucket("data") now := time.Unix(2000, 0).UTC() host := "home.example" inc, err := hostclaim.Incarnation("bab", "app", host, now) if err != nil { t.Fatal(err) } _, err = hostclaim.Update(t.Context(), claims, hostclaim.Observed{Host: host, Absent: true}, func(c *hostclaim.Claim) error { c.Holder = &hostclaim.Holder{Family: "instance", Key: "apps/bab/app/instances/" + host + ".json", Account: "bab", App: "app", Incarnation: inc, CreatedAt: now, Location: "instances/" + host + "/" + inc, Stamp: 1} c.Op = hostclaim.Op{Kind: hostclaim.KindParking, ID: "op"} c.Obligations = []hostclaim.Obligation{{ID: "id", Op: "op", Kind: "park-replica", Region: region, Owner: "region:" + region, Retirement: "ret", Park: &hostclaim.ParkScope{Location: c.Holder.Location, Incarnation: inc, EvidenceAt: time.Unix(1, 0).UTC(), RequestLimit: RequestLimit}}} c.Touched = hostclaim.Touched{Complete: true, Regions: []string{region}} return nil }) if err != nil { t.Fatal(err) } e := park.Engine{HomeRegion: "ie", Claims: claims, Store: bucket, Bucket: "data", Region: "ie", Leases: workerLeases{}, Now: func() time.Time { return now }, NewID: func() string { return "id2" }, Authorize: func(context.Context, hostclaim.Observed, hostclaim.Obligation) error { return nil }, View: func(_ context.Context, o hostclaim.Observed) (park.View, error) { return park.View{ClaimETag: o.ETag, Region: park.HomeRegion}, nil }} w := RegionalWorker{Regional: Regional{Engine: e, Owner: func(context.Context, hostclaim.Observed) error { return nil }}, Enrollment: enrollmentFunc(func(context.Context, string, string, time.Duration) error { return nil }), Evidence: evidenceFunc(func(context.Context, hostclaim.Observed, []lease.ObjectVersion) (string, time.Time, error) { return "", now, nil })} hosts, err := w.Census(t.Context()) if err != nil { t.Fatal(err) } if (len(hosts) == 1) != (region != "uk") { t.Fatalf("census %v", hosts) } if err = w.Run(t.Context()); err != nil { t.Fatal(err) } o, err := hostclaim.Read(t.Context(), claims, host) if err != nil { t.Fatal(err) } if (len(o.Claim.Obligations) == 0) != (region != "uk") { t.Fatalf("obligations %+v", o.Claim.Obligations) } }) } }