Skip to content

Commit 6b2d8e0

Browse files
committed
feat(webapp): build compute template for migrated orgs
1 parent 8812c1c commit 6b2d8e0

1 file changed

Lines changed: 26 additions & 2 deletions

File tree

apps/webapp/app/v3/services/computeTemplateCreation.server.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import type { AuthenticatedEnvironment } from "~/services/apiAuth.server";
99
import { ServiceValidationError } from "./baseService.server";
1010
import { FailDeploymentService } from "./failDeployment.server";
1111
import { resolveComputeAccess } from "../regionAccess.server";
12+
import { isOrgMigrated, parseComputeBackingMap } from "~/runEngine/concerns/computeMigration.server";
13+
import { globalFlagsRegistry } from "~/v3/globalFlagsRegistry.server";
14+
import { getEntitlement } from "~/services/platform.v3.server";
1215

1316
type TemplateCreationMode = "required" | "shadow" | "skip";
1417

@@ -145,10 +148,10 @@ export class ComputeTemplateCreationService {
145148
where: { id: projectId },
146149
select: {
147150
defaultWorkerGroup: {
148-
select: { workloadType: true },
151+
select: { workloadType: true, masterQueue: true },
149152
},
150153
organization: {
151-
select: { featureFlags: true },
154+
select: { id: true, featureFlags: true },
152155
},
153156
},
154157
});
@@ -161,6 +164,27 @@ export class ComputeTemplateCreationService {
161164
return "required";
162165
}
163166

167+
// Migrated orgs route runs to the compute backing even though their stored
168+
// default is still the container region, so they need a compute template too.
169+
// shadow mode: never fail a deploy over a backing the org didn't opt into.
170+
const backingMap = parseComputeBackingMap(env.COMPUTE_BACKING_MAP);
171+
const defaultQueue = project.defaultWorkerGroup?.masterQueue;
172+
if (defaultQueue && backingMap[defaultQueue]) {
173+
const planType = (await getEntitlement(project.organization.id))?.plan?.type;
174+
if (!globalFlagsRegistry.isLoaded) {
175+
await globalFlagsRegistry.waitUntilReady(env.GLOBAL_FLAGS_READY_TIMEOUT_MS);
176+
}
177+
const migrated = isOrgMigrated({
178+
planType,
179+
orgId: project.organization.id,
180+
orgFeatureFlags: project.organization.featureFlags as Record<string, unknown> | null,
181+
flags: globalFlagsRegistry.current(),
182+
});
183+
if (migrated) {
184+
return "shadow";
185+
}
186+
}
187+
164188
const hasComputeAccess = await resolveComputeAccess(prisma, project.organization.featureFlags);
165189

166190
if (hasComputeAccess) {

0 commit comments

Comments
 (0)