package console import ( "github.com/carlosframework/platform/internal/hostactors" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/park" "github.com/carlosframework/platform/internal/provision" "github.com/carlosframework/platform/internal/release" "net/http" "testing" "time" ) func TestPlan13CompleteUnnamedHomeCreate(t *testing.T) { cx := newClaimCaseWith(t, func(cfg *Config) { cfg.HomeRegion = "" cfg.HibernateRegion = "eu-west-1" cfg.HibernateBucket = "data" }) d := cx.srv.cfg.ClaimAuthority.Directory roster, err := d.Read(t.Context()) if err != nil { t.Fatal(err) } for ref, b := range roster.Roster.Boxes { b.Region = "eu-west-1" roster.Roster.Boxes[ref] = b } roster.Roster.Regions["eu-west-1"] = roster.Roster.Regions["ie"] delete(roster.Roster.Regions, "ie") body, err := release.SignRootEnvelope(release.RootSigner(cx.priv), roster.Roster) if err != nil { t.Fatal(err) } if _, err = cx.rel.Put(t.Context(), hostactors.Key, body, roster.ETag); err != nil { t.Fatal(err) } manifest := titoManifest() manifest.Regions = nil enableInstances(t, cx.consoleFixture, "titogo", manifest) cx.mustAPI(t, http.MethodPost, "/api/cli/apps/bab/titogo/instances", `{"host":"acme.go.tito.io"}`) cx.readyClaims(t) rec, err := provision.GetRecord(t.Context(), cx.rel, "bab", "titogo", "acme.go.tito.io") if err != nil { t.Fatal(err) } if rec.Region != "" { t.Fatal("record lost home placement", rec.Region) } o, err := hostclaim.Read(t.Context(), cx.rel, rec.Host) if err != nil { t.Fatal(err) } if o.Absent || o.Claim.Holder == nil || o.Claim.Op.Kind != hostclaim.KindServing || o.Claim.Op.Exec == "" { t.Fatalf("create incomplete: %+v", o) } if len(o.Claim.Touched.Regions) == 0 || o.Claim.Touched.Regions[0] != park.HomeRegion { t.Fatal("lost engine region", o.Claim.Touched) } } func TestPlan13HomeRecoveryStatus(t *testing.T) { for _, region := range []string{"uk", park.HomeRegion} { t.Run(region, func(t *testing.T) { fx, token, url := moveDoorWithClaim(t, "plan13-home-status") readMoveAnswer(t, http.MethodPost, url, token, `{"region":"uk","cut":"manual"}`, http.StatusAccepted) fx.srv.cfg.HomeRegion = "uk" now := time.Now().UTC() setMove(t, fx, func(rec *provision.Record) { rec.Region = "" rec.Move.To = "" rec.Move.State = provision.MoveCommitted rec.Move.CutPhase = provision.CutFlipped rec.Move.FlippedAt = &now rec.Move.CommittedAt = &now }) rewriteClaim(t, fx, "acme.go.tito.io", func(c *hostclaim.Claim) { c.Op.Kind = hostclaim.KindRelocating c.Op.Phase = "pinning" c.Op.Exec = "none" c.Op.Participants = nil c.Op.Intent = map[string]string{"region": region, "source_box": "uk-box", "home_region": "uk"} }) a, out := readMoveAnswer(t, http.MethodGet, url+"?detail=1", token, "", http.StatusOK) if a.State != provision.MoveRelocating || waitingFor(a) != "" { t.Fatalf("home has a live box: %s", out) } }) } }