mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
refactoring & moving rbac.ts to "common"
Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
parent
3a115ae485
commit
39316e1a54
50
src/common/rbac.ts
Normal file
50
src/common/rbac.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import { getHostedCluster } from "./cluster-store";
|
||||||
|
|
||||||
|
export type KubeResource =
|
||||||
|
"namespaces" | "nodes" | "events" | "resourcequotas" |
|
||||||
|
"services" | "secrets" | "configmaps" | "ingresses" | "networkpolicies" | "persistentvolumes" | "storageclasses" |
|
||||||
|
"pods" | "daemonsets" | "deployments" | "statefulsets" | "replicasets" | "jobs" | "cronjobs" |
|
||||||
|
"endpoints" | "customresourcedefinitions" | "horizontalpodautoscalers" | "podsecuritypolicies"
|
||||||
|
|
||||||
|
export interface KubeApiResource {
|
||||||
|
resource: KubeResource; // valid resource name
|
||||||
|
group?: string; // api-group
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: auto-populate all resources dynamically (see: kubectl api-resources -o=wide -v=7)
|
||||||
|
export const apiResources: KubeApiResource[] = [
|
||||||
|
{ resource: "configmaps" },
|
||||||
|
{ resource: "cronjobs", group: "batch" },
|
||||||
|
{ resource: "customresourcedefinitions", group: "apiextensions.k8s.io" },
|
||||||
|
{ resource: "daemonsets", group: "apps" },
|
||||||
|
{ resource: "deployments", group: "apps" },
|
||||||
|
{ resource: "endpoints" },
|
||||||
|
{ resource: "events" },
|
||||||
|
{ resource: "horizontalpodautoscalers" },
|
||||||
|
{ resource: "ingresses", group: "networking.k8s.io" },
|
||||||
|
{ resource: "jobs", group: "batch" },
|
||||||
|
{ resource: "namespaces" },
|
||||||
|
{ resource: "networkpolicies", group: "networking.k8s.io" },
|
||||||
|
{ resource: "nodes" },
|
||||||
|
{ resource: "persistentvolumes" },
|
||||||
|
{ resource: "pods" },
|
||||||
|
{ resource: "podsecuritypolicies" },
|
||||||
|
{ resource: "resourcequotas" },
|
||||||
|
{ resource: "secrets" },
|
||||||
|
{ resource: "services" },
|
||||||
|
{ resource: "statefulsets", group: "apps" },
|
||||||
|
{ resource: "storageclasses", group: "storage.k8s.io" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export function isAllowedResource(resources: KubeResource | KubeResource[]) {
|
||||||
|
if (!Array.isArray(resources)) {
|
||||||
|
resources = [resources];
|
||||||
|
}
|
||||||
|
const { allowedResources = [] } = getHostedCluster() || {};
|
||||||
|
for (const resource of resources) {
|
||||||
|
if (!allowedResources.includes(resource)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@ -11,6 +11,7 @@ import { KubeconfigManager } from "./kubeconfig-manager"
|
|||||||
import { getNodeWarningConditions, loadConfig, podHasIssues } from "../common/kube-helpers"
|
import { getNodeWarningConditions, loadConfig, podHasIssues } from "../common/kube-helpers"
|
||||||
import { getFeatures, installFeature, uninstallFeature, upgradeFeature } from "./feature-manager";
|
import { getFeatures, installFeature, uninstallFeature, upgradeFeature } from "./feature-manager";
|
||||||
import request, { RequestPromiseOptions } from "request-promise-native"
|
import request, { RequestPromiseOptions } from "request-promise-native"
|
||||||
|
import { apiResources } from "../common/rbac";
|
||||||
import logger from "./logger"
|
import logger from "./logger"
|
||||||
|
|
||||||
export enum ClusterStatus {
|
export enum ClusterStatus {
|
||||||
@ -422,30 +423,6 @@ export class Cluster implements ClusterModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected async getAllowedResources() {
|
protected async getAllowedResources() {
|
||||||
// todo: auto-populate all resources dynamically (e.g. kubectl api-resources -o=wide -v=7)
|
|
||||||
const apiResources = [
|
|
||||||
{ resource: "configmaps" },
|
|
||||||
{ resource: "cronjobs", group: "batch" },
|
|
||||||
{ resource: "customresourcedefinitions", group: "apiextensions.k8s.io" },
|
|
||||||
{ resource: "daemonsets", group: "apps" },
|
|
||||||
{ resource: "deployments", group: "apps" },
|
|
||||||
{ resource: "endpoints" },
|
|
||||||
{ resource: "events" },
|
|
||||||
{ resource: "horizontalpodautoscalers" },
|
|
||||||
{ resource: "ingresses", group: "networking.k8s.io" },
|
|
||||||
{ resource: "jobs", group: "batch" },
|
|
||||||
{ resource: "namespaces" },
|
|
||||||
{ resource: "networkpolicies", group: "networking.k8s.io" },
|
|
||||||
{ resource: "nodes" },
|
|
||||||
{ resource: "persistentvolumes" },
|
|
||||||
{ resource: "pods" },
|
|
||||||
{ resource: "podsecuritypolicies" },
|
|
||||||
{ resource: "resourcequotas" },
|
|
||||||
{ resource: "secrets" },
|
|
||||||
{ resource: "services" },
|
|
||||||
{ resource: "statefulsets", group: "apps" },
|
|
||||||
{ resource: "storageclasses", group: "storage.k8s.io" },
|
|
||||||
]
|
|
||||||
try {
|
try {
|
||||||
if (!this.allowedNamespaces.length) {
|
if (!this.allowedNamespaces.length) {
|
||||||
return [];
|
return [];
|
||||||
|
|||||||
@ -1,16 +0,0 @@
|
|||||||
import { getHostedCluster } from "../../common/cluster-store";
|
|
||||||
|
|
||||||
// todo: refactor / move to cluster-store.ts?
|
|
||||||
|
|
||||||
export function isAllowedResource(resources: string | string[]) {
|
|
||||||
if (!Array.isArray(resources)) {
|
|
||||||
resources = [resources];
|
|
||||||
}
|
|
||||||
const { allowedResources = [] } = getHostedCluster() || {};
|
|
||||||
for (const resource of resources) {
|
|
||||||
if (!allowedResources.includes(resource)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@ -13,7 +13,7 @@ import { nodesStore } from "../+nodes/nodes.store";
|
|||||||
import { podsStore } from "../+workloads-pods/pods.store";
|
import { podsStore } from "../+workloads-pods/pods.store";
|
||||||
import { clusterStore } from "./cluster.store";
|
import { clusterStore } from "./cluster.store";
|
||||||
import { eventStore } from "../+events/event.store";
|
import { eventStore } from "../+events/event.store";
|
||||||
import { isAllowedResource } from "../../api/rbac";
|
import { isAllowedResource } from "../../../common/rbac";
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
export class Cluster extends React.Component {
|
export class Cluster extends React.Component {
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import { resourceQuotaRoute, ResourceQuotas, resourceQuotaURL } from "../+config
|
|||||||
import { configURL } from "./config.route";
|
import { configURL } from "./config.route";
|
||||||
import { HorizontalPodAutoscalers, hpaRoute, hpaURL } from "../+config-autoscalers";
|
import { HorizontalPodAutoscalers, hpaRoute, hpaURL } from "../+config-autoscalers";
|
||||||
import { buildURL } from "../../navigation";
|
import { buildURL } from "../../navigation";
|
||||||
import { isAllowedResource } from "../../api/rbac"
|
import { isAllowedResource } from "../../../common/rbac"
|
||||||
|
|
||||||
export const certificatesURL = buildURL("/certificates");
|
export const certificatesURL = buildURL("/certificates");
|
||||||
export const issuersURL = buildURL("/issuers");
|
export const issuersURL = buildURL("/issuers");
|
||||||
|
|||||||
@ -11,7 +11,6 @@ import { namespaceStore } from "./namespace.store";
|
|||||||
import { _i18n } from "../../i18n";
|
import { _i18n } from "../../i18n";
|
||||||
import { FilterIcon } from "../item-object-list/filter-icon";
|
import { FilterIcon } from "../item-object-list/filter-icon";
|
||||||
import { FilterType } from "../item-object-list/page-filters.store";
|
import { FilterType } from "../item-object-list/page-filters.store";
|
||||||
import { isAllowedResource } from "../../api/rbac"
|
|
||||||
|
|
||||||
interface Props extends SelectProps {
|
interface Props extends SelectProps {
|
||||||
showIcons?: boolean;
|
showIcons?: boolean;
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { KubeObjectStore } from "../../kube-object.store";
|
|||||||
import { Namespace, namespacesApi } from "../../api/endpoints";
|
import { Namespace, namespacesApi } from "../../api/endpoints";
|
||||||
import { IQueryParams, navigation, setQueryParams } from "../../navigation";
|
import { IQueryParams, navigation, setQueryParams } from "../../navigation";
|
||||||
import { apiManager } from "../../api/api-manager";
|
import { apiManager } from "../../api/api-manager";
|
||||||
import { isAllowedResource } from "../..//api/rbac";
|
import { isAllowedResource } from "../../../common/rbac";
|
||||||
|
|
||||||
@autobind()
|
@autobind()
|
||||||
export class NamespaceStore extends KubeObjectStore<Namespace> {
|
export class NamespaceStore extends KubeObjectStore<Namespace> {
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import { Ingresses, ingressRoute, ingressURL } from "../+network-ingresses";
|
|||||||
import { NetworkPolicies, networkPoliciesRoute, networkPoliciesURL } from "../+network-policies";
|
import { NetworkPolicies, networkPoliciesRoute, networkPoliciesURL } from "../+network-policies";
|
||||||
import { namespaceStore } from "../+namespaces/namespace.store";
|
import { namespaceStore } from "../+namespaces/namespace.store";
|
||||||
import { networkURL } from "./network.route";
|
import { networkURL } from "./network.route";
|
||||||
import { isAllowedResource } from "../../api/rbac";
|
import { isAllowedResource } from "../../../common/rbac";
|
||||||
|
|
||||||
interface Props extends RouteComponentProps<{}> {
|
interface Props extends RouteComponentProps<{}> {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import { StorageClasses, storageClassesRoute, storageClassesURL } from "../+stor
|
|||||||
import { PersistentVolumeClaims, volumeClaimsRoute, volumeClaimsURL } from "../+storage-volume-claims";
|
import { PersistentVolumeClaims, volumeClaimsRoute, volumeClaimsURL } from "../+storage-volume-claims";
|
||||||
import { namespaceStore } from "../+namespaces/namespace.store";
|
import { namespaceStore } from "../+namespaces/namespace.store";
|
||||||
import { storageURL } from "./storage.route";
|
import { storageURL } from "./storage.route";
|
||||||
import { isAllowedResource } from "../../api/rbac";
|
import { isAllowedResource } from "../../../common/rbac";
|
||||||
|
|
||||||
interface Props extends RouteComponentProps<{}> {
|
interface Props extends RouteComponentProps<{}> {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import { ServiceAccounts } from "../+user-management-service-accounts";
|
|||||||
import { roleBindingsRoute, roleBindingsURL, rolesRoute, rolesURL, serviceAccountsRoute, serviceAccountsURL, usersManagementURL } from "./user-management.routes";
|
import { roleBindingsRoute, roleBindingsURL, rolesRoute, rolesURL, serviceAccountsRoute, serviceAccountsURL, usersManagementURL } from "./user-management.routes";
|
||||||
import { namespaceStore } from "../+namespaces/namespace.store";
|
import { namespaceStore } from "../+namespaces/namespace.store";
|
||||||
import { PodSecurityPolicies, podSecurityPoliciesRoute, podSecurityPoliciesURL } from "../+pod-security-policies";
|
import { PodSecurityPolicies, podSecurityPoliciesRoute, podSecurityPoliciesURL } from "../+pod-security-policies";
|
||||||
import { isAllowedResource } from "../../api/rbac";
|
import { isAllowedResource } from "../../../common/rbac";
|
||||||
|
|
||||||
interface Props extends RouteComponentProps<{}> {
|
interface Props extends RouteComponentProps<{}> {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import { cronJobStore } from "../+workloads-cronjobs/cronjob.store";
|
|||||||
import { namespaceStore } from "../+namespaces/namespace.store";
|
import { namespaceStore } from "../+namespaces/namespace.store";
|
||||||
import { PageFiltersList } from "../item-object-list/page-filters-list";
|
import { PageFiltersList } from "../item-object-list/page-filters-list";
|
||||||
import { NamespaceSelectFilter } from "../+namespaces/namespace-select";
|
import { NamespaceSelectFilter } from "../+namespaces/namespace-select";
|
||||||
import { isAllowedResource } from "../../api/rbac";
|
import { isAllowedResource } from "../../../common/rbac";
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
export class OverviewStatuses extends React.Component {
|
export class OverviewStatuses extends React.Component {
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import { cronJobStore } from "../+workloads-cronjobs/cronjob.store";
|
|||||||
import { Spinner } from "../spinner";
|
import { Spinner } from "../spinner";
|
||||||
import { Events } from "../+events";
|
import { Events } from "../+events";
|
||||||
import { KubeObjectStore } from "../../kube-object.store";
|
import { KubeObjectStore } from "../../kube-object.store";
|
||||||
import { isAllowedResource } from "../../api/rbac"
|
import { isAllowedResource } from "../../../common/rbac"
|
||||||
|
|
||||||
interface Props extends RouteComponentProps<IWorkloadsOverviewRouteParams> {
|
interface Props extends RouteComponentProps<IWorkloadsOverviewRouteParams> {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import { DaemonSets } from "../+workloads-daemonsets";
|
|||||||
import { StatefulSets } from "../+workloads-statefulsets";
|
import { StatefulSets } from "../+workloads-statefulsets";
|
||||||
import { Jobs } from "../+workloads-jobs";
|
import { Jobs } from "../+workloads-jobs";
|
||||||
import { CronJobs } from "../+workloads-cronjobs";
|
import { CronJobs } from "../+workloads-cronjobs";
|
||||||
import { isAllowedResource } from "../../api/rbac"
|
import { isAllowedResource } from "../../../common/rbac"
|
||||||
|
|
||||||
interface Props extends RouteComponentProps {
|
interface Props extends RouteComponentProps {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,7 @@ import { PodLogsDialog } from "./+workloads-pods/pod-logs-dialog";
|
|||||||
import { DeploymentScaleDialog } from "./+workloads-deployments/deployment-scale-dialog";
|
import { DeploymentScaleDialog } from "./+workloads-deployments/deployment-scale-dialog";
|
||||||
import { CustomResources } from "./+custom-resources/custom-resources";
|
import { CustomResources } from "./+custom-resources/custom-resources";
|
||||||
import { crdRoute } from "./+custom-resources";
|
import { crdRoute } from "./+custom-resources";
|
||||||
import { isAllowedResource } from "../api/rbac";
|
import { isAllowedResource } from "../../common/rbac";
|
||||||
import { AddCluster, addClusterRoute } from "./+add-cluster";
|
import { AddCluster, addClusterRoute } from "./+add-cluster";
|
||||||
import { LandingPage, landingRoute, landingURL } from "./+landing-page";
|
import { LandingPage, landingRoute, landingURL } from "./+landing-page";
|
||||||
import { ClusterSettings, clusterSettingsRoute } from "./+cluster-settings";
|
import { ClusterSettings, clusterSettingsRoute } from "./+cluster-settings";
|
||||||
|
|||||||
@ -27,7 +27,7 @@ import { crdStore } from "../+custom-resources/crd.store";
|
|||||||
import { CrdList, crdResourcesRoute, crdRoute, crdURL } from "../+custom-resources";
|
import { CrdList, crdResourcesRoute, crdRoute, crdURL } from "../+custom-resources";
|
||||||
import { CustomResources } from "../+custom-resources/custom-resources";
|
import { CustomResources } from "../+custom-resources/custom-resources";
|
||||||
import { navigation } from "../../navigation";
|
import { navigation } from "../../navigation";
|
||||||
import { isAllowedResource } from "../../api/rbac"
|
import { isAllowedResource } from "../../../common/rbac"
|
||||||
|
|
||||||
const SidebarContext = React.createContext<SidebarContextValue>({ pinned: false });
|
const SidebarContext = React.createContext<SidebarContextValue>({ pinned: false });
|
||||||
type SidebarContextValue = {
|
type SidebarContextValue = {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user