fix: persist code agent workspace
This commit is contained in:
@@ -577,10 +577,15 @@ function validateCloudApiDbOptionalAliasArtifacts(ctx, services, workloads) {
|
||||
function validateCloudApiCodeAgentArtifacts(ctx, workloads) {
|
||||
const contract = DEV_CODE_AGENT_PROVIDER_CONTRACT;
|
||||
const secretRef = contract.secretRefs[0];
|
||||
const container = mapByServiceId(listItems(workloads)).get("hwlab-cloud-api")?.spec?.template?.spec?.containers?.[0];
|
||||
const workloadItems = mapByServiceId(listItems(workloads));
|
||||
const workload = workloadItems.get("hwlab-cloud-api");
|
||||
const templateSpec = workload?.spec?.template?.spec ?? {};
|
||||
const container = templateSpec.containers?.[0];
|
||||
const env = new Map((container?.env ?? []).map((entry) => [entry.name, entry]));
|
||||
const podContainers = mapByServiceId(listItems(workloads)).get("hwlab-cloud-api")?.spec?.template?.spec?.containers ?? [];
|
||||
const volumes = mapByServiceId(listItems(workloads)).get("hwlab-cloud-api")?.spec?.template?.spec?.volumes ?? [];
|
||||
const podContainers = templateSpec.containers ?? [];
|
||||
const initContainers = templateSpec.initContainers ?? [];
|
||||
const volumes = templateSpec.volumes ?? [];
|
||||
const workspacePvc = workloadItems.get(contract.workspace.claimName);
|
||||
expectEqual(ctx, env.get("HWLAB_CODE_AGENT_PROVIDER")?.value, contract.codeAgentProvider, "deploy/k8s/base/workloads.yaml.hwlab-cloud-api.env.HWLAB_CODE_AGENT_PROVIDER", "cloud API workload Code Agent provider");
|
||||
expectEqual(ctx, env.get("HWLAB_CODE_AGENT_MODEL")?.value, contract.model, "deploy/k8s/base/workloads.yaml.hwlab-cloud-api.env.HWLAB_CODE_AGENT_MODEL", "cloud API workload Code Agent model");
|
||||
expectEqual(ctx, env.get("HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE")?.value, contract.profiles.defaultProfile, "deploy/k8s/base/workloads.yaml.hwlab-cloud-api.env.HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE", "cloud API workload default provider profile");
|
||||
@@ -616,6 +621,7 @@ function validateCloudApiCodeAgentArtifacts(ctx, workloads) {
|
||||
expectNoProxyIncludes(ctx, env.get("no_proxy")?.value, contract.noProxyRequired, "deploy/k8s/base/workloads.yaml.hwlab-cloud-api.env.no_proxy");
|
||||
validateCodexApiForwarderArtifacts(ctx, podContainers, contract);
|
||||
validateCodexHomeMountArtifacts(ctx, container?.volumeMounts ?? [], volumes, contract);
|
||||
validateCodeAgentWorkspaceArtifacts(ctx, container?.volumeMounts ?? [], volumes, initContainers, workload?.spec?.strategy ?? null, workspacePvc, contract);
|
||||
expect(
|
||||
ctx,
|
||||
env.get("HWLAB_CODE_AGENT_OPENAI_BASE_URL")?.value !== contract.egress.forbiddenDirectBaseUrl,
|
||||
@@ -714,6 +720,75 @@ function validateCodexHomeMountArtifacts(ctx, volumeMounts, volumes, contract) {
|
||||
);
|
||||
}
|
||||
|
||||
function validateCodeAgentWorkspaceArtifacts(ctx, volumeMounts, volumes, initContainers, strategy, pvc, contract) {
|
||||
const workspace = contract.workspace;
|
||||
expect(
|
||||
ctx,
|
||||
volumeMounts.some((entry) => entry.name === workspace.volumeName && entry.mountPath === workspace.mountPath && entry.readOnly !== true),
|
||||
"code_agent_workspace_mount_missing",
|
||||
"deploy/k8s/base/workloads.yaml.hwlab-cloud-api.volumeMounts.hwlab-code-agent-workspace",
|
||||
"cloud API workload Code Agent workspace writable mount"
|
||||
);
|
||||
expect(
|
||||
ctx,
|
||||
volumes.some((entry) => entry.name === workspace.volumeName && entry.persistentVolumeClaim?.claimName === workspace.claimName),
|
||||
"code_agent_workspace_pvc_volume_missing",
|
||||
"deploy/k8s/base/workloads.yaml.hwlab-cloud-api.volumes.hwlab-code-agent-workspace",
|
||||
"cloud API workload Code Agent workspace PVC volume"
|
||||
);
|
||||
expect(
|
||||
ctx,
|
||||
pvc?.kind === "PersistentVolumeClaim" && pvc?.metadata?.name === workspace.claimName,
|
||||
"code_agent_workspace_pvc_missing",
|
||||
"deploy/k8s/base/workloads.yaml.PersistentVolumeClaim.hwlab-code-agent-workspace",
|
||||
"Code Agent workspace PVC resource"
|
||||
);
|
||||
expect(
|
||||
ctx,
|
||||
(pvc?.spec?.accessModes ?? []).includes(workspace.accessMode),
|
||||
"code_agent_workspace_pvc_access_mode_mismatch",
|
||||
"deploy/k8s/base/workloads.yaml.PersistentVolumeClaim.hwlab-code-agent-workspace.spec.accessModes",
|
||||
"Code Agent workspace PVC uses ReadWriteOnce"
|
||||
);
|
||||
expectEqual(
|
||||
ctx,
|
||||
pvc?.spec?.resources?.requests?.storage,
|
||||
workspace.storage,
|
||||
"deploy/k8s/base/workloads.yaml.PersistentVolumeClaim.hwlab-code-agent-workspace.spec.resources.requests.storage",
|
||||
"Code Agent workspace PVC requested storage"
|
||||
);
|
||||
const initContainer = initContainers.find((entry) => entry.name === workspace.initContainerName);
|
||||
expect(
|
||||
ctx,
|
||||
Boolean(initContainer),
|
||||
"code_agent_workspace_init_container_missing",
|
||||
"deploy/k8s/base/workloads.yaml.hwlab-cloud-api.initContainers.hwlab-code-agent-workspace-init",
|
||||
"cloud API workload initializes persistent Code Agent workspace"
|
||||
);
|
||||
expect(
|
||||
ctx,
|
||||
(initContainer?.volumeMounts ?? []).some((entry) => entry.name === workspace.volumeName && entry.mountPath === workspace.mountPath),
|
||||
"code_agent_workspace_init_mount_missing",
|
||||
"deploy/k8s/base/workloads.yaml.hwlab-cloud-api.initContainers.hwlab-code-agent-workspace-init.volumeMounts",
|
||||
"Code Agent workspace init container mounts the persistent workspace"
|
||||
);
|
||||
const initCommand = [...(initContainer?.command ?? []), ...(initContainer?.args ?? [])].join("\n");
|
||||
expect(
|
||||
ctx,
|
||||
initCommand.includes(workspace.sourcePath) && initCommand.includes(workspace.path) && initCommand.includes(workspace.initMarker),
|
||||
"code_agent_workspace_init_command_mismatch",
|
||||
"deploy/k8s/base/workloads.yaml.hwlab-cloud-api.initContainers.hwlab-code-agent-workspace-init.command",
|
||||
"Code Agent workspace init container uses copy-once /app bootstrap"
|
||||
);
|
||||
expectEqual(
|
||||
ctx,
|
||||
strategy?.type,
|
||||
workspace.rolloutStrategy,
|
||||
"deploy/k8s/base/workloads.yaml.hwlab-cloud-api.strategy.type",
|
||||
"cloud API uses Recreate rollout for single-writer workspace PVC"
|
||||
);
|
||||
}
|
||||
|
||||
function validateCodeAgentProxyTimeoutArtifacts(ctx, workloads) {
|
||||
const workloadItems = mapByServiceId(listItems(workloads));
|
||||
const cloudWebEnv = new Map((workloadItems.get("hwlab-cloud-web")?.spec?.template?.spec?.containers?.[0]?.env ?? []).map((entry) => [entry.name, entry.value]));
|
||||
|
||||
@@ -305,6 +305,7 @@ function inspectCodeAgentProviderDesiredState(ctx, deployService, workloadRecord
|
||||
missingSecretRefs: inspection.missingSecretRefs,
|
||||
missingEgressContract: inspection.missingEgressContract,
|
||||
missingCodexHomeContract: inspection.missingCodexHomeContract,
|
||||
missingWorkspaceContract: inspection.missingWorkspaceContract,
|
||||
missingNoProxyContract: inspection.missingNoProxyContract,
|
||||
missingForwarderContract: inspection.missingForwarderContract
|
||||
},
|
||||
@@ -444,7 +445,9 @@ function indexWorkloads(workloads) {
|
||||
...envListToObject(container?.env),
|
||||
__volumeMounts: Array.isArray(container?.volumeMounts) ? container.volumeMounts : [],
|
||||
__volumes: Array.isArray(item?.spec?.template?.spec?.volumes) ? item.spec.template.spec.volumes : [],
|
||||
__podContainers: Array.isArray(item?.spec?.template?.spec?.containers) ? item.spec.template.spec.containers : []
|
||||
__podContainers: Array.isArray(item?.spec?.template?.spec?.containers) ? item.spec.template.spec.containers : [],
|
||||
__initContainers: Array.isArray(item?.spec?.template?.spec?.initContainers) ? item.spec.template.spec.initContainers : [],
|
||||
__deploymentStrategy: item?.spec?.strategy ?? null
|
||||
},
|
||||
path: `${workloadsPath}.${item?.kind ?? "Workload"}.${item?.metadata?.name ?? serviceId}.containers[${containerIndex}]`
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user