From 2ad8dd12f59d4ddf23e102c4a886a177fb9840a9 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Mon, 17 Nov 2025 15:28:29 +0100 Subject: [PATCH 1/9] feat: handle platform data for sessions --- .../api/computeResources.generated-api.ts | 6 +++++ .../api/computeResources.openapi.json | 24 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/client/src/features/sessionsV2/api/computeResources.generated-api.ts b/client/src/features/sessionsV2/api/computeResources.generated-api.ts index 39aa9c5e9c..861bee8c2b 100644 --- a/client/src/features/sessionsV2/api/computeResources.generated-api.ts +++ b/client/src/features/sessionsV2/api/computeResources.generated-api.ts @@ -653,6 +653,7 @@ export type RemoteConfigurationFirecrest = { export type RemoteConfiguration = RemoteConfigurationFirecrest; export type IdleThreshold = number; export type HibernationThreshold = number; +export type RuntimePlatform = "linux/amd64" | "linux/arm64"; export type ResourcePoolWithIdFiltered = { quota?: QuotaWithId; classes: ResourceClassWithIdFiltered[]; @@ -664,6 +665,7 @@ export type ResourcePoolWithIdFiltered = { idle_threshold?: IdleThreshold; hibernation_threshold?: HibernationThreshold; cluster_id?: Ulid; + platform: RuntimePlatform; }; export type ResourcePoolsWithIdFiltered = ResourcePoolWithIdFiltered[]; export type CpuFilter = number; @@ -682,6 +684,7 @@ export type ResourcePoolWithId = { cluster?: { id: Ulid; }; + platform: RuntimePlatform; }; export type QuotaWithOptionalId = { cpu: Cpu; @@ -711,6 +714,7 @@ export type ResourcePool = { idle_threshold?: IdleThreshold; hibernation_threshold?: HibernationThreshold; cluster_id?: Ulid; + platform?: RuntimePlatform; }; export type ResourceClassesWithId = ResourceClassWithId[]; export type ResourcePoolPut = { @@ -723,6 +727,7 @@ export type ResourcePoolPut = { idle_threshold?: IdleThreshold; hibernation_threshold?: HibernationThreshold; cluster_id?: Ulid; + platform?: RuntimePlatform; }; export type QuotaPatch = { cpu?: Cpu; @@ -766,6 +771,7 @@ export type ResourcePoolPatch = { idle_threshold?: IdleThreshold; hibernation_threshold?: HibernationThreshold; cluster_id?: Ulid; + platform?: RuntimePlatform; }; export type ResourceClassesWithIdResponse = ResourceClassWithId[]; export type ResourceClassPatch = { diff --git a/client/src/features/sessionsV2/api/computeResources.openapi.json b/client/src/features/sessionsV2/api/computeResources.openapi.json index 0663eef916..061ae9c392 100644 --- a/client/src/features/sessionsV2/api/computeResources.openapi.json +++ b/client/src/features/sessionsV2/api/computeResources.openapi.json @@ -2019,6 +2019,9 @@ }, "cluster_id": { "$ref": "#/components/schemas/Ulid" + }, + "platform": { + "$ref": "#/components/schemas/RuntimePlatform" } }, "required": ["classes", "name", "public", "default"], @@ -2085,6 +2088,9 @@ }, "cluster_id": { "$ref": "#/components/schemas/Ulid" + }, + "platform": { + "$ref": "#/components/schemas/RuntimePlatform" } }, "example": { @@ -2133,6 +2139,9 @@ }, "cluster_id": { "$ref": "#/components/schemas/Ulid" + }, + "platform": { + "$ref": "#/components/schemas/RuntimePlatform" } }, "required": ["classes", "name", "public", "default"], @@ -2210,9 +2219,12 @@ } }, "required": ["id"] + }, + "platform": { + "$ref": "#/components/schemas/RuntimePlatform" } }, - "required": ["classes", "name", "id", "public", "default"], + "required": ["classes", "name", "id", "public", "default", "platform"], "example": { "quota": { "cpu": 50, @@ -2282,9 +2294,12 @@ }, "cluster_id": { "$ref": "#/components/schemas/Ulid" + }, + "platform": { + "$ref": "#/components/schemas/RuntimePlatform" } }, - "required": ["classes", "name", "id", "public", "default"], + "required": ["classes", "name", "id", "public", "default", "platform"], "example": { "quota": { "cpu": 50, @@ -2765,6 +2780,11 @@ "default": [], "minItems": 0 }, + "RuntimePlatform": { + "type": "string", + "description": "A runtime platform, e.g. \"linux/amd64\" or \"linux/arm64\".\n", + "enum": ["linux/amd64", "linux/arm64"] + }, "ErrorResponse": { "type": "object", "properties": { From 443ac3cb61908f6617e6e967ce6d7a8ddda94765 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Tue, 18 Nov 2025 15:25:09 +0100 Subject: [PATCH 2/9] wip --- .../features/sessionsV2/SessionImageModal.tsx | 2 +- .../SessionList/SessionLauncherCard.tsx | 20 +++++++++-- .../SessionView/EnvironmentCard.tsx | 2 +- .../SessionStatus/SessionImageBadge.tsx | 33 +++++++++++++++---- .../src/features/sessionsV2/session.utils.ts | 15 +++++++++ 5 files changed, 61 insertions(+), 11 deletions(-) diff --git a/client/src/features/sessionsV2/SessionImageModal.tsx b/client/src/features/sessionsV2/SessionImageModal.tsx index b87b6f6232..e19cb0285a 100644 --- a/client/src/features/sessionsV2/SessionImageModal.tsx +++ b/client/src/features/sessionsV2/SessionImageModal.tsx @@ -76,7 +76,7 @@ export default function SessionImageModal({ ) : ( <>
- +
{!data.connection && !data.provider ? ( <> diff --git a/client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx b/client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx index 18d0b1b3c5..bdcfaf1451 100644 --- a/client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx +++ b/client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx @@ -18,7 +18,7 @@ import { skipToken } from "@reduxjs/toolkit/query"; import cx from "classnames"; -import { useContext } from "react"; +import { useContext, useMemo } from "react"; import { CircleFill, Link45deg, Pencil, Trash } from "react-bootstrap-icons"; import { Card, CardBody, Col, DropdownItem, Row } from "reactstrap"; @@ -29,6 +29,7 @@ import { DEFAULT_APP_PARAMS } from "../../../utils/context/appParams.constants"; import PermissionsGuard from "../../permissionsV2/PermissionsGuard"; import useProjectPermissions from "../../ProjectPageV2/utils/useProjectPermissions.hook"; import { Project } from "../../projectsV2/api/projectV2.api"; +import { computeResourcesApi } from "../api/computeResources.api"; import type { SessionLauncher } from "../api/sessionLaunchersV2.api"; import { sessionLaunchersV2Api, @@ -127,7 +128,7 @@ export default function SessionLauncherCard({ "text-muted", ]; - const { data: containerImage, isLoading: loadingContainerImage } = + const { data: containerImage, isLoading: isLoadingContainerImage } = useGetSessionsImagesQuery( environment && environment.environment_kind === "CUSTOM" && @@ -136,6 +137,17 @@ export default function SessionLauncherCard({ : skipToken ); + const { data: resourcePools, isLoading: isLoadingResourcePools } = + computeResourcesApi.endpoints.getResourcePools.useQueryState({}); + const resourcePool = useMemo(() => { + if (launcher?.resource_class_id == null || resourcePools == null) { + return undefined; + } + return resourcePools.find(({ classes }) => + classes.some(({ id }) => id === launcher.resource_class_id) + ); + }, [launcher?.resource_class_id, resourcePools]); + return ( diff --git a/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx b/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx index 26759f4853..ceb914a8dd 100644 --- a/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx +++ b/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx @@ -188,7 +188,7 @@ function CustomImageEnvironmentValues({ return ( <>
- + {!isLoading && data?.accessible === false && (
{!data.connection && !data.provider ? ( diff --git a/client/src/features/sessionsV2/components/SessionStatus/SessionImageBadge.tsx b/client/src/features/sessionsV2/components/SessionStatus/SessionImageBadge.tsx index 7f2eaead09..6f9e3820e8 100644 --- a/client/src/features/sessionsV2/components/SessionStatus/SessionImageBadge.tsx +++ b/client/src/features/sessionsV2/components/SessionStatus/SessionImageBadge.tsx @@ -17,26 +17,43 @@ */ import cx from "classnames"; +import { useMemo } from "react"; import { CircleFill } from "react-bootstrap-icons"; import { Loader } from "~/components/Loader"; import RenkuBadge from "~/components/renkuBadge/RenkuBadge"; -import { ImageCheckResponse } from "../../api/sessionsV2.generated-api"; +import type { ResourcePoolWithId } from "../../api/computeResources.api"; +import type { ImageCheckResponse } from "../../api/sessionsV2.api"; +import { isImageCompatibleWith } from "../../session.utils"; interface SessionImageBadgeProps { data?: ImageCheckResponse | null; - loading: boolean; + isLoading: boolean; + + resourcePool?: ResourcePoolWithId; + isLoadingResourcePools?: boolean; } export default function SessionImageBadge({ data, - loading, + isLoading, + resourcePool, + isLoadingResourcePools, }: SessionImageBadgeProps) { + const isCompatible = useMemo(() => { + if (data == null || resourcePool == null) { + return "unknown"; + } + return isImageCompatibleWith(data, resourcePool.platform); + }, [data, resourcePool]); + return ( - {loading ? ( + {isLoading || isLoadingResourcePools ? ( <> Checking image status. @@ -55,7 +72,11 @@ export default function SessionImageBadge({ ) : ( <> - {data?.accessible + {isCompatible === false + ? `Image incompatible${ + resourcePool?.platform ? ` with ${resourcePool.platform}` : "" + }` + : data?.accessible ? "Image accessible" : data?.provider?.id && (!data?.connection || data?.connection?.status !== "connected") diff --git a/client/src/features/sessionsV2/session.utils.ts b/client/src/features/sessionsV2/session.utils.ts index 00ea9d3130..a0577a9673 100644 --- a/client/src/features/sessionsV2/session.utils.ts +++ b/client/src/features/sessionsV2/session.utils.ts @@ -18,12 +18,14 @@ import { FaviconStatus } from "../display/display.types"; import { SessionStatusState } from "../session/sessions.types"; +import type { ResourcePoolWithId } from "./api/computeResources.api"; import type { EnvironmentList as SessionEnvironmentList, SessionLauncher, SessionLauncherEnvironmentParams, SessionLauncherEnvironmentPatchParams, } from "./api/sessionLaunchersV2.api"; +import type { ImageCheckResponse } from "./api/sessionsV2.api"; import { BUILDER_PLATFORMS, DEFAULT_URL, @@ -402,3 +404,16 @@ export function validateEnvVariableName(name: string): true | string { } return true; } + +export function isImageCompatibleWith( + image: ImageCheckResponse, + platform: ResourcePoolWithId["platform"] +): boolean | "unknown" { + if (image.platforms == null) { + return "unknown"; + } + const imagePlatforms = image.platforms?.map( + ({ os, architecture }) => `${os}/${architecture}` + ); + return imagePlatforms.some((p) => p === platform); +} From 1814ef9c4a8019246e4e347d59098d1d6ffea32a Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Tue, 18 Nov 2025 15:34:54 +0100 Subject: [PATCH 3/9] wip --- .../sessionsV2/SessionView/EnvironmentCard.tsx | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx b/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx index ceb914a8dd..4229da77a7 100644 --- a/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx +++ b/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx @@ -32,6 +32,7 @@ import AppContext from "../../../utils/context/appContext"; import { DEFAULT_APP_PARAMS } from "../../../utils/context/appParams.constants"; import useAppDispatch from "../../../utils/customHooks/useAppDispatch.hook"; import { toHumanDateTime } from "../../../utils/helpers/DateTimeUtils"; +import { computeResourcesApi } from "../api/computeResources.api"; import type { SessionLauncher } from "../api/sessionLaunchersV2.api"; import { sessionLaunchersV2Api, @@ -175,6 +176,16 @@ function CustomImageEnvironmentValues({ ? { imageUrl: environment.container_image } : skipToken ); + const { data: resourcePools, isLoading: isLoadingResourcePools } = + computeResourcesApi.endpoints.getResourcePools.useQueryState({}); + const resourcePool = useMemo(() => { + if (launcher?.resource_class_id == null || resourcePools == null) { + return undefined; + } + return resourcePools.find(({ classes }) => + classes.some(({ id }) => id === launcher.resource_class_id) + ); + }, [launcher?.resource_class_id, resourcePools]); const search = useMemo(() => { return `?${new URLSearchParams({ targetProvider: data?.provider?.id ?? "", @@ -188,7 +199,12 @@ function CustomImageEnvironmentValues({ return ( <>
- + {!isLoading && data?.accessible === false && (
{!data.connection && !data.provider ? ( From c49d20d2a20e243cfd238db2837851e455e805d1 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Fri, 21 Nov 2025 09:30:05 +0100 Subject: [PATCH 4/9] badges for all --- .../SessionList/SessionLauncherCard.tsx | 20 +++--- .../SessionView/EnvironmentCard.tsx | 63 ++++++++++--------- .../components/BuildStatusComponents.tsx | 48 ++++++++++---- 3 files changed, 82 insertions(+), 49 deletions(-) diff --git a/client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx b/client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx index bdcfaf1451..808b630105 100644 --- a/client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx +++ b/client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx @@ -130,9 +130,7 @@ export default function SessionLauncherCard({ const { data: containerImage, isLoading: isLoadingContainerImage } = useGetSessionsImagesQuery( - environment && - environment.environment_kind === "CUSTOM" && - environment.container_image + environment?.container_image != null ? { imageUrl: environment.container_image } : skipToken ); @@ -215,10 +213,13 @@ export default function SessionLauncherCard({ - {isCodeEnvironment && ( + {isCodeEnvironment ? ( - {isCodeEnvironment && isLoading ? ( + {isCodeEnvironment && + (isLoading || + isLoadingContainerImage || + isLoadingResourcePools) ? ( @@ -232,7 +233,11 @@ export default function SessionLauncherCard({ ) : isCodeEnvironment && lastBuild ? ( - + ) : !hasSession ? ( - )} - {isExternalImageEnvironment && ( + ) : ( ; + return ; } return ; @@ -163,8 +163,10 @@ function CustomEnvironmentValues({ launcher }: { launcher: SessionLauncher }) { function CustomImageEnvironmentValues({ launcher, + showImageBadge, }: { launcher: SessionLauncher; + showImageBadge?: boolean; }) { const { pathname, hash } = useLocation(); const environment = launcher.environment; @@ -199,12 +201,14 @@ function CustomImageEnvironmentValues({ return ( <>
- + {showImageBadge && ( + + )} {!isLoading && data?.accessible === false && (
{!data.connection && !data.provider ? ( @@ -352,6 +356,23 @@ function CustomBuildEnvironmentValues({ } ); + const { data: imageCheck, isLoading: isLoadingContainerImage } = + useGetSessionsImagesQuery( + environment.container_image != null + ? { imageUrl: environment.container_image } + : skipToken + ); + const { data: resourcePools, isLoading: isLoadingResourcePools } = + computeResourcesApi.endpoints.getResourcePools.useQueryState({}); + const resourcePool = useMemo(() => { + if (launcher?.resource_class_id == null || resourcePools == null) { + return undefined; + } + return resourcePools.find(({ classes }) => + classes.some(({ id }) => id === launcher.resource_class_id) + ); + }, [launcher?.resource_class_id, resourcePools]); + // Invalidate launchers if the container image is not the same as the // image from the last successful build const dispatch = useAppDispatch(); @@ -384,7 +405,12 @@ function CustomBuildEnvironmentValues({ ) : ( <> - + {lastSuccessfulBuild && ( - +
)} @@ -521,25 +547,6 @@ function EnvironmentJSONArrayRowWithLabel({ ); } -function ReadyStatusBadge() { - return ( - - - Ready - - ); -} - function NotReadyStatusBadge() { return ( { + if (imageCheck == null || resourcePool == null) { + return "unknown"; + } + return isImageCompatibleWith(imageCheck, resourcePool.platform); + }, [imageCheck, resourcePool]); + const badgeIcon = - status === "in_progress" ? ( + buildStatus === "in_progress" ? ( ) : ( ); const badgeText = - status === "in_progress" + isCompatible === false + ? `Image incompatible${ + resourcePool?.platform ? ` with ${resourcePool.platform}` : "" + }` + : buildStatus === "in_progress" ? "Build in progress" - : status === "cancelled" + : buildStatus === "cancelled" ? "Build cancelled" - : status === "succeeded" + : buildStatus === "succeeded" ? "Build succeeded" : "Build failed"; const badgeColorClasses = - status === "in_progress" + isCompatible === false + ? ["border-danger", "bg-danger-subtle", "text-danger-emphasis"] + : buildStatus === "in_progress" ? ["border-warning", "bg-warning-subtle", "text-warning-emphasis"] - : status === "succeeded" + : buildStatus === "succeeded" ? ["border-success", "bg-success-subtle", "text-success-emphasis"] : ["border-danger", "bg-danger-subtle", "text-danger-emphasis"]; From 3d30c3e47e09758ac549492298cd4f686a44b83a Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Fri, 21 Nov 2025 09:45:59 +0100 Subject: [PATCH 5/9] fix --- .../features/sessionsV2/components/BuildStatusComponents.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/src/features/sessionsV2/components/BuildStatusComponents.tsx b/client/src/features/sessionsV2/components/BuildStatusComponents.tsx index e79be6c2e3..f4cfd1ab56 100644 --- a/client/src/features/sessionsV2/components/BuildStatusComponents.tsx +++ b/client/src/features/sessionsV2/components/BuildStatusComponents.tsx @@ -94,9 +94,7 @@ export function BuildStatusBadge({ const badgeText = isCompatible === false - ? `Image incompatible${ - resourcePool?.platform ? ` with ${resourcePool.platform}` : "" - }` + ? "Image incompatible" : buildStatus === "in_progress" ? "Build in progress" : buildStatus === "cancelled" From ee71342f47b50bbeae5178cef195991074ce8c17 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Fri, 28 Nov 2025 09:28:14 +0100 Subject: [PATCH 6/9] update --- client/scripts/update_api_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/scripts/update_api_spec.js b/client/scripts/update_api_spec.js index ae036591de..d2ae8e1eb9 100644 --- a/client/scripts/update_api_spec.js +++ b/client/scripts/update_api_spec.js @@ -24,7 +24,7 @@ import { parseDocument } from "yaml"; const GH_BASE_URL = "https://raw.githubusercontent.com"; const DATA_SERVICES_REPO = "SwissDataScienceCenter/renku-data-services"; -const DATA_SERVICES_RELEASE = "leafty/feat-resource-class-platforms"; +const DATA_SERVICES_RELEASE = "build/support-build-arm"; async function main() { argv.forEach((arg) => { From 46f864165830163dbfbcdad7cdc2232eaf70e531 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Fri, 28 Nov 2025 09:32:17 +0100 Subject: [PATCH 7/9] update API spec --- .../features/sessionsV2/api/computeResources.generated-api.ts | 2 +- .../src/features/sessionsV2/api/computeResources.openapi.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/features/sessionsV2/api/computeResources.generated-api.ts b/client/src/features/sessionsV2/api/computeResources.generated-api.ts index 861bee8c2b..f300ce1328 100644 --- a/client/src/features/sessionsV2/api/computeResources.generated-api.ts +++ b/client/src/features/sessionsV2/api/computeResources.generated-api.ts @@ -727,7 +727,7 @@ export type ResourcePoolPut = { idle_threshold?: IdleThreshold; hibernation_threshold?: HibernationThreshold; cluster_id?: Ulid; - platform?: RuntimePlatform; + platform: RuntimePlatform; }; export type QuotaPatch = { cpu?: Cpu; diff --git a/client/src/features/sessionsV2/api/computeResources.openapi.json b/client/src/features/sessionsV2/api/computeResources.openapi.json index 061ae9c392..4ec46b678c 100644 --- a/client/src/features/sessionsV2/api/computeResources.openapi.json +++ b/client/src/features/sessionsV2/api/computeResources.openapi.json @@ -2144,7 +2144,7 @@ "$ref": "#/components/schemas/RuntimePlatform" } }, - "required": ["classes", "name", "public", "default"], + "required": ["classes", "name", "public", "default", "platform"], "example": { "quota": { "cpu": 50, From 941ee57e0049b291898f5459342d6e3b69545673 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Fri, 28 Nov 2025 10:01:09 +0100 Subject: [PATCH 8/9] add badge to offcanvas for global envs --- .../SessionView/EnvironmentCard.tsx | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx b/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx index 64e9e12037..9d05d88192 100644 --- a/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx +++ b/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx @@ -116,6 +116,7 @@ export default function EnvironmentCard({ {environment_kind === "GLOBAL" && ( <> + {environment?.description ? (

@@ -151,6 +152,42 @@ export default function EnvironmentCard({ ); } +function GlobalEnvironmentSessionImageBadge({ + launcher, +}: { + launcher: SessionLauncher; +}) { + const environment = launcher.environment; + const { data, isLoading } = useGetSessionsImagesQuery( + environment && environment.container_image + ? { imageUrl: environment.container_image } + : skipToken + ); + const { data: resourcePools, isLoading: isLoadingResourcePools } = + computeResourcesApi.endpoints.getResourcePools.useQueryState({}); + const resourcePool = useMemo(() => { + if (launcher?.resource_class_id == null || resourcePools == null) { + return undefined; + } + return resourcePools.find(({ classes }) => + classes.some(({ id }) => id === launcher.resource_class_id) + ); + }, [launcher?.resource_class_id, resourcePools]); + + console.log({ data, resourcePool }); + + return ( +

+ +
+ ); +} + function CustomEnvironmentValues({ launcher }: { launcher: SessionLauncher }) { const { environment } = launcher; From 60c34887fe2d63cf9dfddfe7aeca6dca543c02be Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Fri, 28 Nov 2025 10:11:29 +0100 Subject: [PATCH 9/9] remove console.log --- client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx b/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx index 9d05d88192..965431306b 100644 --- a/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx +++ b/client/src/features/sessionsV2/SessionView/EnvironmentCard.tsx @@ -174,8 +174,6 @@ function GlobalEnvironmentSessionImageBadge({ ); }, [launcher?.resource_class_id, resourcePools]); - console.log({ data, resourcePool }); - return (