package console import ( "context" "net/http" "time" "github.com/carlosframework/platform/internal/domains" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/hostops" "github.com/carlosframework/platform/internal/provision" ) func (s *Server) attachClaimFirstRoute(ctx context.Context, acct *Account, app, host, channel, principal string) (attachResult, *doorRefusal) { if !s.domainProver(ctx, host, acct.Sqid)() { return attachResult{}, &doorRefusal{http.StatusConflict, verifyGuidance(s.domainChallenge(host, acct.Sqid))} } request, err := s.beginClaimCreate(ctx, acct, app, host, principal, func(now time.Time, acquisition string) (hostops.Record, error) { rec := provision.Record{Schema: 1, Host: host, App: app, Account: acct.Sqid, Channel: channel, Kind: "static", CreatedBy: principal, Acquisition: acquisition} record, err := hostops.PrepareInstance(rec, now, s.cfg.claimPlacementRegion(rec.Region)) record.VerifiedOwnership = true return record, err }) if err != nil { return attachResult{}, claimResponseRefusal(err) } defer request.Close() err = request.Authority.RecordEffects(request.Context, request.Observed, request.Record) if err == nil { _, err = s.cfg.HostClaimOps.Complete(request.Context, host, request.Observed.Claim.Op.ID) } h := request.Observed.Claim.Holder result := attachResult{Claim: domains.Claim{Schema: 1, Host: host, Account: acct.Sqid, App: app, Acquisition: h.Acquisition, RecordIncarnation: h.Incarnation, OwnershipState: "active"}, Created: true, FirstRoute: true, Channel: channel} if err != nil { fresh, readErr := hostclaim.Read(context.WithoutCancel(ctx), s.cfg.Releases, host) if readErr != nil || fresh.Absent || fresh.Claim.Holder == nil || fresh.Claim.Holder.Incarnation != h.Incarnation || fresh.Claim.Op.ID != request.Observed.Claim.Op.ID { return attachResult{}, claimResponseRefusal(hostops.ErrPending) } result.OperationID = fresh.Claim.Op.ID result.OperationPhase = fresh.Claim.Op.Phase if result.OperationPhase == "" { result.OperationPhase = fresh.Claim.Op.Kind } } s.bumpSerial(ctx) return result, nil }