Skip to content

Commit 2bd8402

Browse files
committed
feat: add onContextsPermissions to api
Signed-off-by: Philippe Martin <[email protected]>
1 parent 82b2ca1 commit 2bd8402

File tree

11 files changed

+40
-72
lines changed

11 files changed

+40
-72
lines changed

packages/api/src/kubernetes-dashboard-extension-api.d.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,28 @@ export interface ContextsHealthsInfo {
3636
healths: ContextHealth[];
3737
}
3838

39+
export interface ContextPermission {
40+
contextName: string;
41+
// the resource name is a generic string type and not a string literal type, as we want to handle CRDs names
42+
resourceName: string;
43+
// permitted if allowed and not denied
44+
// > When multiple authorization modules are configured, each is checked in sequence.
45+
// > If any authorizer approves or denies a request, that decision is immediately returned
46+
// > and no other authorizer is consulted. If all modules have no opinion on the request,
47+
// > then the request is denied. An overall deny verdict means that the API server rejects
48+
// > the request and responds with an HTTP 403 (Forbidden) status.
49+
// (source: https://kubernetes.io/docs/reference/access-authn-authz/authorization/)
50+
permitted: boolean;
51+
// A free-form and optional text reason for the resource being allowed or denied.
52+
// We cannot rely on having a reason for every request.
53+
// For exemple on Kind cluster, a reason is given only when the access is allowed, no reason is done for denial.
54+
reason?: string;
55+
}
56+
57+
export interface ContextsPermissionsInfo {
58+
permissions: ContextPermission[];
59+
}
60+
3961
export interface AvailableContextsInfo {
4062
contextNames: string[];
4163
}
@@ -50,6 +72,7 @@ export interface CurrentContextInfo {
5072
*/
5173
export interface KubernetesDashboardSubscriber {
5274
onContextsHealth(listener: (event: ContextsHealthsInfo) => void): Disposable;
75+
onContextsPermissions(listener: (event: ContextsPermissionsInfo) => void): Disposable;
5376
onAvailableContexts(listener: (event: AvailableContextsInfo) => void): Disposable;
5477
onCurrentContext(listener: (event: CurrentContextInfo) => void): Disposable;
5578
/**

packages/channels/src/channels.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import type { PortForwardApi } from './interface/port-forward-api';
2424
import type { SubscribeApi } from './interface/subscribe-api';
2525
import type { SystemApi } from './interface/system-api';
2626
import type { ActiveResourcesCountInfo } from './model/active-resources-count-info';
27-
import type { ContextsPermissionsInfo } from './model/contexts-permissions-info';
2827
import type { EndpointsInfo } from './model/endpoints-info';
2928
import type { KubernetesProvidersInfo } from './model/kubernetes-providers-info';
3029
import type { PodLogsChunk } from './model/pod-logs-chunk';
@@ -38,6 +37,7 @@ import { createRpcChannel } from '@kubernetes-dashboard/rpc';
3837
import type {
3938
AvailableContextsInfo,
4039
ContextsHealthsInfo,
40+
ContextsPermissionsInfo,
4141
CurrentContextInfo,
4242
} from '@podman-desktop/kubernetes-dashboard-extension-api';
4343

packages/channels/src/model/contexts-permissions-info.ts

Lines changed: 0 additions & 23 deletions
This file was deleted.

packages/channels/src/model/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ export * from './active-resources-count-info';
2020
export * from './context-resource-events';
2121
export * from './context-resources-details';
2222
export * from './context-resources-items';
23-
export * from './contexts-permissions-info';
2423
export * from './endpoint';
2524
export * from './endpoints-info';
2625
export * from './endpoints-options';
27-
export * from './kubernetes-contexts-permissions';
2826
export * from './kubernetes-providers-info';
2927
export * from './kubernetes-resource-count';
3028
export * from './kubernetes-troubleshooting';

packages/channels/src/model/kubernetes-contexts-permissions.ts

Lines changed: 0 additions & 35 deletions
This file was deleted.

packages/extension/src/dashboard-extension.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
API_SYSTEM,
3939
AVAILABLE_CONTEXTS,
4040
CONTEXTS_HEALTHS,
41+
CONTEXTS_PERMISSIONS,
4142
CURRENT_CONTEXT,
4243
IDisposable,
4344
} from '@kubernetes-dashboard/channels';
@@ -52,6 +53,7 @@ import { ChannelSubscriber } from '/@/subscriber/channel-subscriber';
5253
import type {
5354
AvailableContextsInfo,
5455
ContextsHealthsInfo,
56+
ContextsPermissionsInfo,
5557
CurrentContextInfo,
5658
KubernetesDashboardExtensionApi,
5759
KubernetesDashboardSubscriber,
@@ -140,6 +142,9 @@ export class DashboardExtension {
140142
onContextsHealth: (listener: (event: ContextsHealthsInfo) => void): IDisposable => {
141143
return subscriber.subscribe(CONTEXTS_HEALTHS, undefined, listener);
142144
},
145+
onContextsPermissions: (listener: (event: ContextsPermissionsInfo) => void): IDisposable => {
146+
return subscriber.subscribe(CONTEXTS_PERMISSIONS, undefined, listener);
147+
},
143148
onAvailableContexts: (listener: (event: AvailableContextsInfo) => void): IDisposable => {
144149
return subscriber.subscribe(AVAILABLE_CONTEXTS, undefined, listener);
145150
},

packages/extension/src/dispatcher/contexts-permissions-dispatcher.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import { inject, injectable } from 'inversify';
2020
import type { DispatcherObject } from './util/dispatcher-object';
2121
import { AbsDispatcherObjectImpl } from './util/dispatcher-object';
2222
import { ContextsManager } from '/@/manager/contexts-manager';
23-
import { CONTEXTS_PERMISSIONS, type ContextsPermissionsInfo } from '@kubernetes-dashboard/channels';
23+
import { CONTEXTS_PERMISSIONS } from '@kubernetes-dashboard/channels';
24+
import type { ContextsPermissionsInfo } from '@podman-desktop/kubernetes-dashboard-extension-api';
2425

2526
@injectable()
2627
export class ContextsPermissionsDispatcher

packages/extension/src/manager/contexts-manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import type {
3434
TargetRef,
3535
Endpoint,
3636
V1Route,
37-
ContextPermission,
3837
ResourceCount,
3938
KubernetesTroubleshootingInformation,
4039
} from '@kubernetes-dashboard/channels';
@@ -76,6 +75,7 @@ import { NamespacesResourceFactory } from '/@/resources/namespaces-resource-fact
7675
import { EndpointSlicesResourceFactory } from '/@/resources/endpoint-slices-resource-factory.js';
7776
import { parseAllDocuments, stringify, type Tags } from 'yaml';
7877
import { writeFile } from 'node:fs/promises';
78+
import { ContextPermission } from '@podman-desktop/kubernetes-dashboard-extension-api';
7979

8080
const HEALTH_CHECK_TIMEOUT_MS = 5_000;
8181
const DEFAULT_NAMESPACE = 'default';

packages/webview/src/component/dashboard/DashboardResourceCard.spec.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,11 @@ import { beforeEach, describe, expect, test, vi } from 'vitest';
2424

2525
import KubernetesDashboardResourceCard from './DashboardResourceCard.svelte';
2626
import { FakeStateObject } from '/@/state/util/fake-state-object.svelte';
27-
import type {
28-
ActiveResourcesCountInfo,
29-
ResourcesCountInfo,
30-
ContextsPermissionsInfo,
31-
} from '@kubernetes-dashboard/channels';
27+
import type { ActiveResourcesCountInfo, ResourcesCountInfo } from '@kubernetes-dashboard/channels';
3228
import { StatesMocks } from '/@/tests/state-mocks';
3329
import { DependencyMocks } from '/@/tests/dependency-mocks';
3430
import { Navigator } from '/@/navigation/navigator';
35-
import type { CurrentContextInfo } from '@podman-desktop/kubernetes-dashboard-extension-api';
31+
import type { CurrentContextInfo, ContextsPermissionsInfo } from '@podman-desktop/kubernetes-dashboard-extension-api';
3632

3733
const statesMocks = new StatesMocks();
3834
const dependencyMocks = new DependencyMocks();

packages/webview/src/component/objects/KubernetesEmptyScreen.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@ import KubernetesEmptyScreen from './KubernetesEmptyScreen.svelte';
2323
import CheckConnection from '/@/component/connection/CheckConnection.svelte';
2424
import { StatesMocks } from '/@/tests/state-mocks';
2525
import { FakeStateObject } from '/@/state/util/fake-state-object.svelte';
26-
import type { ContextsPermissionsInfo } from '@kubernetes-dashboard/channels';
2726
import NodeIcon from '/@/component/icons/NodeIcon.svelte';
28-
import type { ContextsHealthsInfo, CurrentContextInfo } from '@podman-desktop/kubernetes-dashboard-extension-api';
27+
import type {
28+
ContextsHealthsInfo,
29+
CurrentContextInfo,
30+
ContextsPermissionsInfo,
31+
} from '@podman-desktop/kubernetes-dashboard-extension-api';
2932

3033
vi.mock(import('/@/component/connection/CheckConnection.svelte'));
3134

0 commit comments

Comments
 (0)