diff --git a/api/http/handler/handler.go b/api/http/handler/handler.go index 7e7a7ec26..3a635e9b6 100644 --- a/api/http/handler/handler.go +++ b/api/http/handler/handler.go @@ -181,6 +181,8 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.StripPrefix("/api", h.EndpointGroupHandler).ServeHTTP(w, r) case strings.HasPrefix(r.URL.Path, "/api/kubernetes"): http.StripPrefix("/api", h.KubernetesHandler).ServeHTTP(w, r) + case strings.HasPrefix(r.URL.Path, "/api/docker"): + http.StripPrefix("/api/docker", h.DockerHandler).ServeHTTP(w, r) // Helm subpath under kubernetes -> /api/endpoints/{id}/kubernetes/helm case strings.HasPrefix(r.URL.Path, "/api/endpoints/") && strings.Contains(r.URL.Path, "/kubernetes/helm"): diff --git a/app/react/docker/containers/ListView/ContainersDatatable/ContainersDatatable.tsx b/app/react/docker/containers/ListView/ContainersDatatable/ContainersDatatable.tsx index 1e25d6341..cb53b0cd3 100644 --- a/app/react/docker/containers/ListView/ContainersDatatable/ContainersDatatable.tsx +++ b/app/react/docker/containers/ListView/ContainersDatatable/ContainersDatatable.tsx @@ -2,6 +2,7 @@ import _ from 'lodash'; import { Environment } from '@/portainer/environments/types'; import type { DockerContainer } from '@/react/docker/containers/types'; +import { useShowGPUsColumn } from '@/react/docker/containers/utils'; import { TableSettingsMenu, Datatable } from '@@/datatables'; import { @@ -39,7 +40,8 @@ export function ContainersDatatable({ environment, }: Props) { const settings = useStore(); - const columns = useColumns(isHostColumnVisible); + const isGPUsColumnVisible = useShowGPUsColumn(environment.Id); + const columns = useColumns(isHostColumnVisible, isGPUsColumnVisible); const hidableColumns = _.compact( columns.filter((col) => col.canHide).map((col) => col.id) ); diff --git a/app/react/docker/containers/ListView/ContainersDatatable/columns/index.tsx b/app/react/docker/containers/ListView/ContainersDatatable/columns/index.tsx index 5341cb56d..a645e6216 100644 --- a/app/react/docker/containers/ListView/ContainersDatatable/columns/index.tsx +++ b/app/react/docker/containers/ListView/ContainersDatatable/columns/index.tsx @@ -13,7 +13,10 @@ import { stack } from './stack'; import { state } from './state'; import { gpus } from './gpus'; -export function useColumns(isHostColumnVisible: boolean) { +export function useColumns( + isHostColumnVisible: boolean, + isGPUsColumnVisible: boolean +) { return useMemo( () => _.compact([ @@ -25,10 +28,10 @@ export function useColumns(isHostColumnVisible: boolean) { created, ip, isHostColumnVisible && host, - gpus, + isGPUsColumnVisible && gpus, ports, ownership, ]), - [isHostColumnVisible] + [isHostColumnVisible, isGPUsColumnVisible] ); } diff --git a/app/react/docker/containers/utils.ts b/app/react/docker/containers/utils.ts index 43b747f20..b4a912bbe 100644 --- a/app/react/docker/containers/utils.ts +++ b/app/react/docker/containers/utils.ts @@ -1,4 +1,6 @@ import _ from 'lodash'; +import { useInfo } from 'Docker/services/system.service'; +import { EnvironmentId } from 'Portainer/environments/types'; import { ResourceControlViewModel } from '@/portainer/access-control/models/ResourceControlViewModel'; @@ -85,3 +87,12 @@ function createStatus(statusText = ''): ContainerStatus { return ContainerStatus.Running; } + +export function useShowGPUsColumn(environmentID: EnvironmentId) { + const envInfoQuery = useInfo( + environmentID, + (info) => !!info.Swarm?.NodeID && !!info.Swarm?.ControlAvailable + ); + + return envInfoQuery.data !== true && !envInfoQuery.isLoading; +} diff --git a/app/react/docker/stacks/ItemView/StackContainersDatatable.tsx b/app/react/docker/stacks/ItemView/StackContainersDatatable.tsx index dff40ac07..0bfc4b304 100644 --- a/app/react/docker/stacks/ItemView/StackContainersDatatable.tsx +++ b/app/react/docker/stacks/ItemView/StackContainersDatatable.tsx @@ -6,6 +6,7 @@ import { createStore } from '@/react/docker/containers/ListView/ContainersDatata import { useColumns } from '@/react/docker/containers/ListView/ContainersDatatable/columns'; import { ContainersDatatableActions } from '@/react/docker/containers/ListView/ContainersDatatable/ContainersDatatableActions'; import { ContainersDatatableSettings } from '@/react/docker/containers/ListView/ContainersDatatable/ContainersDatatableSettings'; +import { useShowGPUsColumn } from '@/react/docker/containers/utils'; import { Datatable, TableSettingsMenu } from '@@/datatables'; import { @@ -35,7 +36,8 @@ export interface Props { export function StackContainersDatatable({ environment, stackName }: Props) { const settings = useStore(); - const columns = useColumns(false); + const isGPUsColumnVisible = useShowGPUsColumn(environment.Id); + const columns = useColumns(false, isGPUsColumnVisible); const hidableColumns = _.compact( columns.filter((col) => col.canHide).map((col) => col.id) );