Skip to content

Commit d78ac84

Browse files
authored
feat: add onContextsPermissions to API (#451)
Signed-off-by: Philippe Martin <[email protected]>
1 parent 89b0d84 commit d78ac84

File tree

11 files changed

+40
-73
lines changed

11 files changed

+40
-73
lines changed

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

Lines changed: 26 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
/**
4062
* The subscriber for the events emitted by the Kubernetes Dashboard extension.
4163
*/
@@ -44,6 +66,10 @@ export interface KubernetesDashboardSubscriber {
4466
* Subscribes to the events emitted every time the health of the contexts changes.
4567
*/
4668
onContextsHealth(listener: (event: ContextsHealthsInfo) => void): Disposable;
69+
/**
70+
* Subscribes to the events emitted every time the permissions of the contexts change.
71+
*/
72+
onContextsPermissions(listener: (event: ContextsPermissionsInfo) => void): Disposable;
4773
/**
4874
* Disposes the subscriber and unsubscribes from all the events emitted by the Kubernetes Dashboard extension.
4975
*/

packages/channels/src/channels.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ 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';
2727
import type { AvailableContextsInfo } from './model/available-contexts-info';
28-
import type { ContextsPermissionsInfo } from './model/contexts-permissions-info';
2928
import type { CurrentContextInfo } from './model/current-context-info';
3029
import type { EndpointsInfo } from './model/endpoints-info';
3130
import type { KubernetesProvidersInfo } from './model/kubernetes-providers-info';
@@ -37,7 +36,7 @@ import type { ResourceEventsInfo } from './model/resource-events-info';
3736
import type { ResourcesCountInfo } from './model/resources-count-info';
3837
import type { UpdateResourceInfo } from './model/update-resource-info';
3938
import { createRpcChannel } from '@kubernetes-dashboard/rpc';
40-
import type { ContextsHealthsInfo } from '@podman-desktop/kubernetes-dashboard-extension-api';
39+
import type { ContextsHealthsInfo, ContextsPermissionsInfo } from '@podman-desktop/kubernetes-dashboard-extension-api';
4140

4241
// RPC channels (used by the webview to send requests to the extension)
4342
export const API_CONTEXTS = createRpcChannel<ContextsApi>('ContextsApi');

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
@@ -21,12 +21,10 @@ export * from './available-contexts-info';
2121
export * from './context-resource-events';
2222
export * from './context-resources-details';
2323
export * from './context-resources-items';
24-
export * from './contexts-permissions-info';
2524
export * from './current-context-info';
2625
export * from './endpoint';
2726
export * from './endpoints-info';
2827
export * from './endpoints-options';
29-
export * from './kubernetes-contexts-permissions';
3028
export * from './kubernetes-providers-info';
3129
export * from './kubernetes-resource-count';
3230
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
@@ -37,6 +37,7 @@ import {
3737
API_SUBSCRIBE,
3838
API_SYSTEM,
3939
CONTEXTS_HEALTHS,
40+
CONTEXTS_PERMISSIONS,
4041
IDisposable,
4142
} from '@kubernetes-dashboard/channels';
4243
import { SystemApiImpl } from './manager/system-api';
@@ -49,6 +50,7 @@ import { KubernetesProvidersManager } from '/@/manager/kubernetes-providers';
4950
import { ChannelSubscriber } from '/@/subscriber/channel-subscriber';
5051
import type {
5152
ContextsHealthsInfo,
53+
ContextsPermissionsInfo,
5254
KubernetesDashboardExtensionApi,
5355
KubernetesDashboardSubscriber,
5456
} from '@podman-desktop/kubernetes-dashboard-extension-api';
@@ -136,6 +138,9 @@ export class DashboardExtension {
136138
onContextsHealth: (listener: (event: ContextsHealthsInfo) => void): IDisposable => {
137139
return subscriber.subscribe(CONTEXTS_HEALTHS, undefined, listener);
138140
},
141+
onContextsPermissions: (listener: (event: ContextsPermissionsInfo) => void): IDisposable => {
142+
return subscriber.subscribe(CONTEXTS_PERMISSIONS, undefined, listener);
143+
},
139144
dispose: () => {
140145
subscriber.dispose();
141146
},

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-
CurrentContextInfo,
29-
ActiveResourcesCountInfo,
30-
ResourcesCountInfo,
31-
ContextsPermissionsInfo,
32-
} from '@kubernetes-dashboard/channels';
27+
import type { CurrentContextInfo, ActiveResourcesCountInfo, ResourcesCountInfo } from '@kubernetes-dashboard/channels';
3328
import { StatesMocks } from '/@/tests/state-mocks';
3429
import { DependencyMocks } from '/@/tests/dependency-mocks';
3530
import { Navigator } from '/@/navigation/navigator';
31+
import type { 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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ 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 { CurrentContextInfo, ContextsPermissionsInfo } from '@kubernetes-dashboard/channels';
26+
import type { CurrentContextInfo } from '@kubernetes-dashboard/channels';
2727
import NodeIcon from '/@/component/icons/NodeIcon.svelte';
28-
import type { ContextsHealthsInfo } from '@podman-desktop/kubernetes-dashboard-extension-api';
28+
import type { ContextsHealthsInfo, ContextsPermissionsInfo } from '@podman-desktop/kubernetes-dashboard-extension-api';
2929

3030
vi.mock(import('/@/component/connection/CheckConnection.svelte'));
3131

0 commit comments

Comments
 (0)