mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
import { LensApiRequest } from "../router"
|
|
import { LensApi } from "../lens-api"
|
|
import { userStore } from "../../common/user-store"
|
|
import { getAppVersion } from "../../common/app-utils"
|
|
import { CoreV1Api, AuthorizationV1Api } from "@kubernetes/client-node"
|
|
import { Cluster } from "../cluster"
|
|
|
|
|
|
function selfSubjectAccessReview(authApi: AuthorizationV1Api, namespace: string) {
|
|
return authApi.createSelfSubjectAccessReview({
|
|
apiVersion: "authorization.k8s.io/v1",
|
|
kind: "SelfSubjectAccessReview",
|
|
spec: {
|
|
resourceAttributes: {
|
|
namespace: namespace,
|
|
resource: "pods",
|
|
verb: "list",
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
async function getAllowedNamespaces(cluster: Cluster) {
|
|
const api = cluster.contextHandler.kc.makeApiClient(CoreV1Api)
|
|
const authApi = cluster.contextHandler.kc.makeApiClient(AuthorizationV1Api)
|
|
try {
|
|
const namespaceList = await api.listNamespace()
|
|
const nsAccessStatuses = await Promise.all(
|
|
namespaceList.body.items.map(ns => {
|
|
return selfSubjectAccessReview(authApi, ns.metadata.name)
|
|
})
|
|
)
|
|
return namespaceList.body.items
|
|
.filter((ns, i) => nsAccessStatuses[i].body.status.allowed)
|
|
.map(ns => ns.metadata.name)
|
|
} catch(error) {
|
|
const kc = cluster.contextHandler.kc
|
|
const ctx = kc.getContextObject(kc.currentContext)
|
|
if (ctx.namespace) {
|
|
return [ctx.namespace]
|
|
} else {
|
|
return []
|
|
}
|
|
}
|
|
}
|
|
|
|
class ConfigRoute extends LensApi {
|
|
|
|
public async routeConfig(request: LensApiRequest) {
|
|
const { params, response, cluster} = request
|
|
|
|
const data = {
|
|
clusterName: cluster.contextName,
|
|
lensVersion: getAppVersion(),
|
|
lensTheme: `kontena-${userStore.getPreferences().colorTheme}`,
|
|
kubeVersion: cluster.version,
|
|
chartsEnabled: true,
|
|
isClusterAdmin: cluster.isAdmin,
|
|
allowedNamespaces: await getAllowedNamespaces(cluster)
|
|
};
|
|
|
|
this.respondJson(response, data)
|
|
}
|
|
}
|
|
|
|
export const configRoute = new ConfigRoute()
|