Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions apps/web/src/app/(authenticated)/home/Home.client.test.tsx

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion apps/web/src/app/(authenticated)/home/Home.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
type ComputeProvider,
ALL_REPOSITORIES,
DEFAULT_LAUNCH_CODING_HARNESS,
pickPreferredConfiguredComputeProvider,
SETUP_COMPUTE_PROVIDER_CATALOG,
} from '@roomote/types';
import type { RoutingDecision } from '@roomote/cloud-agents/server';
Expand Down Expand Up @@ -86,7 +87,10 @@ function resolveInitialComputeProvider(
return defaultComputeProvider;
}

return availableComputeProviders[0] ?? defaultComputeProvider;
return (
pickPreferredConfiguredComputeProvider(availableComputeProviders) ??
defaultComputeProvider
);
}

type HomeProps = {
Expand Down
109 changes: 100 additions & 9 deletions packages/db/src/lib/__tests__/compute-runtime-config.test.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

62 changes: 44 additions & 18 deletions packages/db/src/lib/compute-runtime-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { and, eq, inArray, isNull } from 'drizzle-orm';
import {
getDefaultAvailableComputeProvider,
getSetupComputeProvider,
pickPreferredConfiguredComputeProvider,
SETUP_COMPUTE_PROVIDER_CATALOG,
SETUP_COMPUTE_PROVIDER_IDS,
SHARED_WORKER_IMAGE_ENV_VAR,
deriveModalBaseImageRefDefault,
resolveEffectiveDockerWorkerImage,
Expand Down Expand Up @@ -116,10 +116,15 @@ export async function listConfiguredComputeProviders(
}

/**
* Resolves the deployment default compute provider. The persisted setup
* choice wins over the DEFAULT_COMPUTE_PROVIDER env value because compose and
* PM2 stacks always inject an env default; the admin's explicit setup choice
* is the stronger signal.
* Resolves the deployment default compute provider. Order of preference:
* 1. Persisted setup/admin default (explicit deployment choice).
* 2. DEFAULT_COMPUTE_PROVIDER env when it is a non-docker provider, or when
* docker is the env default and no cloud provider is configured. Compose
* stacks often inject DEFAULT_COMPUTE_PROVIDER=docker; a configured cloud
* provider still wins over that barrier default.
* 3. Last catalog-ordered configured cloud provider when one or more clouds
* are ready (prefer cloud over Local Docker).
* 4. Local Docker / remaining availability fallback.
*/
export async function resolveDefaultComputeProvider(
options: {
Expand All @@ -128,9 +133,9 @@ export async function resolveDefaultComputeProvider(
} = {},
): Promise<ComputeProvider> {
const runtimeEnv = options.runtimeEnv ?? process.env;
const persistedComputeConfig = await loadPersistedRuntimeComputeConfig(
options.executor ?? db,
);
const executor = options.executor ?? db;
const persistedComputeConfig =
await loadPersistedRuntimeComputeConfig(executor);
const excludedProviders = parseExcludedComputeProviders(
runtimeEnv.EXCLUDED_COMPUTE_PROVIDERS,
);
Expand All @@ -145,27 +150,48 @@ export async function resolveDefaultComputeProvider(
return persistedComputeConfig.defaultProvider;
}

const configuredProviders = await listConfiguredComputeProviders({
runtimeEnv,
executor,
});
const configuredCloudProviders = configuredProviders.filter(
(provider) => provider !== 'docker',
);
const preferredConfigured =
pickPreferredConfiguredComputeProvider(configuredProviders);

const runtimeDefault = runtimeEnv.DEFAULT_COMPUTE_PROVIDER?.trim();
if (
runtimeDefault &&
isComputeProvider(runtimeDefault) &&
!excludedProviders.has(runtimeDefault)
) {
// Env docker is a barrier default for stacks that also ship Local Docker.
// When a cloud provider is already configured, prefer that cloud instead.
if (runtimeDefault === 'docker' && configuredCloudProviders.length > 0) {
return (
preferredConfigured ??
configuredCloudProviders[configuredCloudProviders.length - 1]!
);
}

return runtimeDefault;
}

if (preferredConfigured) {
return preferredConfigured;
}

const availableProviders = await Promise.all(
SETUP_COMPUTE_PROVIDER_IDS.filter(
(provider) => !excludedProviders.has(provider),
)
.filter((provider) => provider !== 'docker')
.map(async (provider) => ({
provider,
configSatisfied: await isComputeProviderConfigured(provider, {
SETUP_COMPUTE_PROVIDER_CATALOG.map(async ({ provider }) => ({
provider,
configSatisfied:
!excludedProviders.has(provider) &&
(await isComputeProviderConfigured(provider, {
runtimeEnv,
executor: options.executor ?? db,
}),
})),
executor,
})),
})),
);

return getDefaultAvailableComputeProvider(
Expand Down
52 changes: 50 additions & 2 deletions packages/types/src/setup-compute-config.test.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading